mostlyright-data 0.10.5__tar.gz → 0.10.7__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 (558) hide show
  1. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/PKG-INFO +1 -1
  2. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/pyproject.toml +1 -1
  3. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/skills/mr-data-build/SKILL.md +1 -1
  4. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_deploy.py +2 -2
  5. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_run_worker.py +174 -147
  6. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/run_execution_v4.py +26 -7
  7. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/approvals.py +3 -3
  8. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/commands.py +13 -7
  9. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/parity.py +22 -10
  10. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/propose.py +7 -2
  11. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/research.py +1 -1
  12. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/session.py +53 -24
  13. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_artifacts.py +17 -5
  14. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_query.py +2 -2
  15. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_runs.py +2 -2
  16. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_stream.py +19 -11
  17. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/hosted_run_status.py +1 -1
  18. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_required_controls.py +35 -20
  19. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/.gitignore +0 -0
  20. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/README.md +0 -0
  21. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/scripts/hatch_build.py +0 -0
  22. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/skills/mr-data-build/agents/openai.yaml +0 -0
  23. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
  24. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
  25. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/__init__.py +0 -0
  26. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
  27. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
  28. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
  29. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
  30. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
  31. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
  32. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
  33. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
  34. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
  35. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
  36. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
  37. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
  38. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
  39. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
  40. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
  41. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
  42. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
  43. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
  44. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
  45. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
  46. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
  47. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
  48. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
  49. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
  50. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
  51. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
  52. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
  53. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
  54. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
  55. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
  56. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
  57. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
  58. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
  59. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
  60. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
  61. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
  62. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
  63. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/__init__.py +0 -0
  64. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  65. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/http.py +0 -0
  66. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
  67. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  68. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  69. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  70. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
  71. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
  72. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  73. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  74. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  75. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  76. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  77. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  78. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/reference.py +0 -0
  79. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/registry.py +0 -0
  80. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  81. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/bounded_query.py +0 -0
  82. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/canonical.py +0 -0
  83. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/catalog_job.py +0 -0
  84. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/cli.py +0 -0
  85. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/contracts.py +0 -0
  86. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/coordinator.py +0 -0
  87. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/crosswalks.py +0 -0
  88. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/declared_checks.py +0 -0
  89. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/deploy.py +0 -0
  90. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/deploy_target.py +0 -0
  91. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  92. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/__init__.py +0 -0
  93. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
  94. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/agent_request.py +0 -0
  95. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/capture.py +0 -0
  96. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/contracts.py +0 -0
  97. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/lane.py +0 -0
  98. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/ocr.py +0 -0
  99. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/pdf.py +0 -0
  100. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/registry.py +0 -0
  101. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
  102. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/selections.py +0 -0
  103. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/tables.py +0 -0
  104. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
  105. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/events.py +0 -0
  106. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  107. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/formats.py +0 -0
  108. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/governors.py +0 -0
  109. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
  110. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
  111. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  112. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
  113. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
  114. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  115. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
  116. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
  117. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  118. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
  119. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  120. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
  121. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
  122. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
  123. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  124. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
  125. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
  126. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
  127. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +0 -0
  128. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_worker.py +0 -0
  129. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  130. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  131. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  132. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  133. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  134. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  135. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/inprocess_acquisition.py +0 -0
  136. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/key_seam.py +0 -0
  137. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
  138. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_contracts.py +0 -0
  139. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
  140. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
  141. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
  142. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
  143. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
  144. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
  145. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/service.py +0 -0
  146. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  147. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  148. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  149. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  150. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  151. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  152. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  153. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  154. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  155. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  156. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  157. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  158. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  159. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  160. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  161. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  162. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  163. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/notebook.py +0 -0
  164. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/offline.py +0 -0
  165. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/operation_registry.py +0 -0
  166. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/operator_setup.py +0 -0
  167. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/pipeline.py +0 -0
  168. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/plan_graph.py +0 -0
  169. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  170. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  171. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  172. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  173. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  174. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  175. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  176. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/table.py +0 -0
  177. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  178. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/progress_events.py +0 -0
  179. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  180. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
  181. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/budgets.py +0 -0
  182. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/containers.py +0 -0
  183. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  184. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  185. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
  186. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
  187. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
  188. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  189. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  190. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
  191. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
  192. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  193. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  194. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  195. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
  196. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
  197. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
  198. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  199. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  200. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
  201. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
  202. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
  203. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
  204. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
  205. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
  206. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
  207. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
  208. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
  209. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
  210. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
  211. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
  212. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/registry.py +0 -0
  213. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  214. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  215. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  216. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  217. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  218. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  219. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
  220. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  221. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
  222. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  223. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
  224. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  225. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  226. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  227. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  228. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
  229. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
  230. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
  231. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
  232. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
  233. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
  234. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
  235. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
  236. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
  237. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
  238. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
  239. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
  240. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
  241. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
  242. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
  243. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
  244. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
  245. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
  246. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  247. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  248. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
  249. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
  250. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
  251. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
  252. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
  253. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
  254. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
  255. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
  256. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
  257. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
  258. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
  259. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
  260. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
  261. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
  262. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
  263. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
  264. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  265. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  266. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
  267. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
  268. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
  269. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
  270. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
  271. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
  272. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/goes-abi-l2-cmi-window.nc +0 -0
  273. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
  274. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
  275. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
  276. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/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
  277. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
  278. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
  279. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
  280. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
  281. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
  282. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
  283. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
  284. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
  285. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
  286. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
  287. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
  288. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
  289. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
  290. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
  291. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
  292. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
  293. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
  294. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
  295. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
  296. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
  297. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  298. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
  299. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  300. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  301. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  302. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  303. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  304. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  305. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  306. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  307. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  308. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  309. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  310. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  311. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  312. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
  313. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/gfs-and-hrrr-categorical-rain.grib2 +0 -0
  314. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
  315. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
  316. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
  317. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
  318. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
  319. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
  320. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
  321. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
  322. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
  323. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
  324. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples.py +0 -0
  325. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific.py +0 -0
  326. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
  327. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
  328. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
  329. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
  330. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
  331. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
  332. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
  333. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
  334. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
  335. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
  336. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
  337. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
  338. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
  339. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
  340. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
  341. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
  342. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
  343. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
  344. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
  345. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
  346. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
  347. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  348. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
  349. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  350. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/vector.py +0 -0
  351. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
  352. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
  353. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
  354. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/recipe.py +0 -0
  355. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/repair/__init__.py +0 -0
  356. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/repair/adapters.py +0 -0
  357. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/repair/contracts.py +0 -0
  358. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
  359. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/repair/errors.py +0 -0
  360. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/review.py +0 -0
  361. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/rowset.py +0 -0
  362. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/session_probes.py +0 -0
  363. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/signing.py +0 -0
  364. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/skill_assets.py +0 -0
  365. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/source_discovery.py +0 -0
  366. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/__init__.py +0 -0
  367. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
  368. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/adapters.py +0 -0
  369. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  370. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  371. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  372. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  373. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  374. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  375. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  376. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  377. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  378. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  379. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  380. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  381. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  382. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  383. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  384. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
  385. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  386. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
  387. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
  388. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  389. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  390. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
  391. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  392. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  393. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  394. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  395. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  396. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  397. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  398. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
  399. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  400. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  401. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  402. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  403. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  404. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  405. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  406. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  407. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  408. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  409. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
  410. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  411. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  412. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  413. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  414. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/collections.py +0 -0
  415. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/contracts.py +0 -0
  416. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/dataset.py +0 -0
  417. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  418. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
  419. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/fitness.py +0 -0
  420. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/governance.py +0 -0
  421. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  422. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/integration.py +0 -0
  423. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  424. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/registry.py +0 -0
  425. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
  426. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  427. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/sports.py +0 -0
  428. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream.py +0 -0
  429. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
  430. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
  431. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
  432. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
  433. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
  434. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
  435. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
  436. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
  437. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
  438. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
  439. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
  440. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
  441. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
  442. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
  443. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
  444. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
  445. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
  446. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
  447. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
  448. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
  449. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
  450. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
  451. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
  452. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
  453. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
  454. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
  455. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
  456. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sql_transform_engine.py +0 -0
  457. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/stream_subscription_feed.py +0 -0
  458. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/stream_subscription_sealer.py +0 -0
  459. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/stream_subscription_worker.py +0 -0
  460. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/stream_venue.py +0 -0
  461. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
  462. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/studio_boundary.py +0 -0
  463. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/studio_subscription_control.py +0 -0
  464. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  465. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  466. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  467. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/download.py +0 -0
  468. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  469. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/probe.py +0 -0
  470. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/recipe.py +0 -0
  471. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/router.py +0 -0
  472. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/runs.py +0 -0
  473. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/stream.py +0 -0
  474. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
  475. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/transport.py +0 -0
  476. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4.py +0 -0
  477. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
  478. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
  479. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
  480. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
  481. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_tables.py +0 -0
  482. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
  483. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/workers.py +0 -0
  484. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  485. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  486. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/unit_flow.py +0 -0
  487. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/units.py +0 -0
  488. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  489. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/approve.py +0 -0
  490. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/attendance.py +0 -0
  491. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
  492. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/clarification.py +0 -0
  493. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  494. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  495. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
  496. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  497. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
  498. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  499. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
  500. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  501. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  502. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
  503. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
  504. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
  505. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
  506. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
  507. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
  508. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
  509. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
  510. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/document.py +0 -0
  511. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
  512. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
  513. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
  514. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  515. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
  516. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
  517. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
  518. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
  519. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
  520. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
  521. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
  522. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  523. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  524. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  525. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  526. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/diffing.py +0 -0
  527. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/headline.py +0 -0
  528. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  529. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/inventory.py +0 -0
  530. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/local_review.py +0 -0
  531. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/login.py +0 -0
  532. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  533. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/peek.py +0 -0
  534. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  535. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
  536. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/preflight.py +0 -0
  537. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/readers.py +0 -0
  538. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/remediation.py +0 -0
  539. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/render.py +0 -0
  540. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/workload.py +0 -0
  541. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_acquisition.py +0 -0
  542. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
  543. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
  544. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
  545. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_recipe.py +0 -0
  546. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
  547. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_stream_recording.py +0 -0
  548. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_transform.py +0 -0
  549. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  550. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  551. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  552. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  553. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  554. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/query.py +0 -0
  555. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  556. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  557. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  558. {mostlyright_data-0.10.5 → mostlyright_data-0.10.7}/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.10.5
3
+ Version: 0.10.7
4
4
  Summary: Mostly Right CLI for reproducible, reviewed Parquet datasets
5
5
  Project-URL: Homepage, https://mostlyright.md/
6
6
  Project-URL: Documentation, https://mostlyright.md/docs/guides/cli/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mostlyright-data"
3
- version = "0.10.5"
3
+ version = "0.10.7"
4
4
  description = "Mostly Right CLI for reproducible, reviewed Parquet datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13,<3.14"
@@ -50,7 +50,7 @@ routine stages, predict duration or throughput, or expose raw state names. Write
50
50
  professional product language and lead with the outcome or decision.
51
51
 
52
52
  For hosted work, register the Dataset first and open its canonical page immediately in the host's
53
- in-app browser: `mr-data open /dashboard/datasets/DATASET_ID` mints a single-use address for it, and
53
+ in-app browser: `mr-data open /datasets/DATASET_ID` mints a single-use address for it, and
54
54
  when that address cannot be minted, carry on without it rather than blocking.
55
55
  Keep that one Dataset tab for research, approval, building, verification, and delivery. Do not
56
56
  replace it with a standalone Run, approval, or notebook page unless the user explicitly requests
@@ -2256,7 +2256,7 @@ def _activation_receipt(
2256
2256
  "recipe_proposal_id": state["resources"]["proposal"]["recipe_proposal_id"],
2257
2257
  "state": str(store.path),
2258
2258
  "dashboard_url": (
2259
- f"{_service_url(cloud_url, 'Cloud URL', allow_loopback_http=False)}/dashboard/datasets"
2259
+ f"{_service_url(cloud_url, 'Cloud URL', allow_loopback_http=False)}/dashboard/team"
2260
2260
  ),
2261
2261
  # The queued Run is not a released version, and this receipt is where somebody learns that
2262
2262
  # for the first time. Its sibling above has always ended by naming the next command; this
@@ -2274,7 +2274,7 @@ def cloud_dashboard_url(cloud_url: str, page: str) -> str:
2274
2274
  """
2275
2275
 
2276
2276
  origin = _service_url(cloud_url, "Cloud URL", allow_loopback_http=False)
2277
- return f"{origin}/dashboard/workspace/{page}"
2277
+ return f"{origin}/dashboard/{page}"
2278
2278
 
2279
2279
 
2280
2280
  def _bind_cloud_dataset(
@@ -18,8 +18,8 @@ takes it:
18
18
  :func:`_raw_snapshot_tar`.
19
19
  * **The ``cache`` field lives on the v4 ``receipt`` artifact, never on a sealed acquisition
20
20
  receipt.** See :func:`_receipt_document`.
21
- * **The restored predecessor tree is the authority; the job's ``predecessor`` block is only a
22
- coordinate.** See :func:`restore_predecessor_tree`.
21
+ * **The authenticated predecessor receipt is the authority; the job's ``predecessor`` block is
22
+ only a coordinate.** See :func:`restore_predecessor_record`.
23
23
 
24
24
  TWO SEAMS THIS REPOSITORY DOES NOT OWN, both named here so a reader does not go looking:
25
25
 
@@ -56,7 +56,6 @@ from dataclasses import dataclass, field, replace
56
56
  from pathlib import Path
57
57
  from types import FrameType, MappingProxyType
58
58
  from typing import Any, ClassVar, NoReturn, Protocol
59
- from urllib.parse import urlsplit
60
59
  from uuid import UUID, uuid5
61
60
 
62
61
  from mostlyright.data_harness import pipeline, progress_events
@@ -81,12 +80,10 @@ from mostlyright.data_harness.hosted_worker import (
81
80
  ArtifactPayload,
82
81
  HostedWorkerError,
83
82
  _candidate_snapshot,
84
- _decode_candidate_envelope,
85
83
  _new_transfer_client,
86
84
  _quiet_signed_transfer,
87
85
  _read_fd_once,
88
86
  _released_column_profile,
89
- _restore_candidate_members,
90
87
  _run_bounded_in_submit_order,
91
88
  _seal_producer_artifact,
92
89
  _strict_json,
@@ -107,7 +104,7 @@ from mostlyright.data_harness.inprocess_acquisition import (
107
104
  inprocess_reader_policy_digest,
108
105
  v4_parse_policy_digest,
109
106
  )
110
- from mostlyright.data_harness.recipe import RecipeError, RecipeExecution, parse_recipe_execution
107
+ from mostlyright.data_harness.recipe import RecipeError, parse_recipe_execution
111
108
  from mostlyright.data_harness.run_execution_v4 import (
112
109
  FAILED_STAGES,
113
110
  RunCallbacks,
@@ -151,7 +148,7 @@ from mostlyright.data_harness.v4_recipe import (
151
148
  source_ceilings,
152
149
  source_egress_origins,
153
150
  )
154
- from mostlyright.data_harness.v4_required_controls import run_required_controls
151
+ from mostlyright.data_harness.v4_required_controls import profile_shape, run_required_controls
155
152
  from mostlyright.data_harness.v4_snapshot_artifact import SnapshotArtifactAdapter
156
153
  from mostlyright.data_harness.v4_transform import (
157
154
  SEALED_MEMBER_DIRECTORY,
@@ -658,29 +655,25 @@ def permitted_artifact_hosts(
658
655
  studio_origin: str = "",
659
656
  environ: Mapping[str, str] | None = None,
660
657
  ) -> frozenset[str]:
661
- """The one host this run's artifact bytes -- its own and its predecessor's -- may come from.
658
+ """The hosts this run's predecessor bytes may come from: the deployment's own policy.
662
659
 
663
- TWO RULES, AND THE FIRST ONE IS THE DEPLOYMENT'S. ``hosted_worker.signed_storage_hosts`` names
664
- the places this fleet's Studio actually signs sessions: the object-storage origin
660
+ THE RULE IS THE DEPLOYMENT'S. ``hosted_worker.signed_storage_hosts`` names the places this
661
+ fleet's Studio actually signs sessions: the object-storage origin
665
662
  (:data:`~mostlyright.data_harness.hosted_worker.SIGNED_STORAGE_HOST`), the configured Studio
666
663
  origin its local backend serves ``/_signed-artifacts/`` from, and whatever
667
664
  :data:`~mostlyright.data_harness.hosted_worker.ENV_SIGNED_STORAGE_HOSTS` adds. Every one of
668
665
  those is read from the environment or from the coordinator's own configuration, so NOTHING an
669
666
  author of a job document can write moves them.
670
667
 
671
- THE SECOND RULE IS THE DOCUMENT'S OWN CONSISTENCY, and it is second on purpose. The permitted
672
- set is still exactly the host ``artifact_session`` names -- the upload session this run will PUT
673
- its five sealed artifacts to -- so a predecessor download and this run's own uploads have to
674
- agree about where this run's bytes live. That agreement used to be the WHOLE rule, and as the
675
- whole rule it was vacuous: ``artifact_session`` reaches no upload (the seal mints its own
676
- per-artifact sessions through :class:`StudioArtifactSealer`), so moving it cost an attacker
677
- nothing at all and a document naming an internal host in BOTH members passed. Anchoring the
678
- agreement inside the deployment's policy is what turns it back into a constraint: the sibling
679
- member can only be moved to somewhere Studio genuinely signs.
668
+ The document's own ``artifact_session`` has to sit inside that policy too, and it is checked
669
+ here so a document naming somewhere Studio does not sign is refused before a byte moves. It is
670
+ NOT the anchor the predecessor download is narrowed to: that member is the
671
+ ``artifacts:reserve`` route on Studio's own origin, while a predecessor's sealed bundle is
672
+ signed on the object store. The two are different hosts by design, and an earlier rule that
673
+ required them to agree refused every refresh a hosted deployment dispatched.
680
674
 
681
675
  This is defence in depth and it is not the authentication: the predecessor's bytes are still
682
- authenticated end to end by ``candidate_digest``, checked by ``_decode_candidate_envelope``
683
- and again by ``pipeline.verify_candidate`` on the restored tree.
676
+ authenticated end to end by ``candidate_digest``, checked before the receipt is read.
684
677
  """
685
678
 
686
679
  session = job.artifact_session
@@ -697,10 +690,7 @@ def permitted_artifact_hosts(
697
690
  # NEVER THE URL, for the reason `_download_signed_bytes` records: the address carries a
698
691
  # credential in its query string and `signed_storage_refusal` is written never to echo it.
699
692
  raise _host_refusal(f"this run's artifact session is not one Studio signs: {reason}")
700
- host = urlsplit(session.signed_url).hostname
701
- if not host: # pragma: no cover - `signed_storage_refusal` already required a host.
702
- raise _host_refusal("this run's artifact session names no host")
703
- return frozenset({host.lower()})
693
+ return policy
704
694
 
705
695
 
706
696
  def _download_signed_bytes(
@@ -715,7 +705,7 @@ def _download_signed_bytes(
715
705
 
716
706
  A v4 signed session carries no expected size and no expected digest: the digest that
717
707
  authenticates these bytes is the block's ``candidate_digest``, checked by
718
- ``_decode_candidate_envelope`` and again by ``pipeline.verify_candidate`` on the restored tree.
708
+ :func:`restore_predecessor_record` before the receipt is read.
719
709
 
720
710
  BOTH ADDRESS CHECKS RUN BEFORE THE STREAM OPENS, so a refused session costs no bytes.
721
711
  """
@@ -752,130 +742,165 @@ def _download_signed_bytes(
752
742
  return b"".join(chunks)
753
743
 
754
744
 
755
- def restore_predecessor_tree(
756
- job: RunExecution, *, transfer: Any, root: Path, studio_origin: str = ""
757
- ) -> Path:
758
- """Download, decode, restore and replay-verify the predecessor's sealed candidate tree.
745
+ @dataclass(frozen=True)
746
+ class PredecessorRecord:
747
+ """What a refresh continues from: the predecessor's sealed receipt, read once and authenticated.
748
+
749
+ THE RECEIPT IS THE AUTHORITY AND THE BLOCK IS ONLY THE COORDINATE. Studio stamps the receipt's
750
+ own digest onto the run as ``candidate_digest`` (``docs/V4-WORKER-PROTOCOL.md``, *Callbacks*),
751
+ and the predecessor block carries that digest beside a signed session for those exact bytes.
752
+ So the bytes are authenticated end to end by the digest, and every fact below is read out of
753
+ them rather than out of the block: the table version the successor numbers itself after, the
754
+ sealed column shape the drift control compares against, and the committed state of every
755
+ source, which for a registered document is the digest of the bytes that were read.
756
+
757
+ A v4 run uploads five artifacts and never the sealed tree itself, so there is no tree to
758
+ restore and replay-verify here; ``candidate_digest`` on the record is the tree's digest as
759
+ the predecessor stated it, carried for the successor's own sealed execution.
760
+ """
759
761
 
760
- This mirrors ``hosted_worker._restore_predecessor_input`` step for step -- redeem the session,
761
- download bounded by ``MAX_CANDIDATE_ENVELOPE_BYTES``, ``_decode_candidate_envelope``,
762
- ``_restore_candidate_members``, ``pipeline.verify_candidate``, compare the digest -- with the
763
- v3 ``predecessor_artifact_handle`` replaced by the v4 block's
764
- ``predecessor.artifact_download_session``.
762
+ run_id: UUID
763
+ workspace_id: UUID
764
+ recipe_digest: str
765
+ candidate_digest: str
766
+ table_id: str
767
+ table_version_id: str
768
+ table_version_number: int
769
+ columns: tuple[tuple[str, str], ...]
770
+ row_count: int | None
771
+ source_states: Mapping[str, str]
765
772
 
766
- THE RESTORED TREE IS THE AUTHORITY AND THE BLOCK IS ONLY THE COORDINATE. The block says where
767
- to look; what is found there says what it is. A block whose ``candidate_digest`` disagrees with
768
- the verified tree is a refusal and never a correction, and ``table_id`` and
769
- ``table_version_number`` are read from the tree's own sealed ``recipe-execution.json`` rather
770
- than from the block -- which is what stops a spoofed block rebinding a run to a version it did
771
- not come from (T-401-24).
772
773
 
773
- Six failure points, one code, and the detail names which one: an absent block, a session that
774
- will not answer, a download over its bound, an envelope that will not decode, a tree that will
775
- not verify, and a digest that disagrees.
774
+ def _receipt_table_record(snapshot: Mapping[str, bytes]) -> dict[str, Any]:
775
+ """The ``table`` member of a receipt: the sealed execution's version and the sealed shape.
776
776
 
777
- ``studio_origin`` is the DEPLOYMENT's Studio origin, not anything the job document said, and it
778
- is what lets :func:`permitted_artifact_hosts` judge both signed addresses against a policy the
779
- document's author cannot move.
777
+ Both are read out of the sealed tree through the same door the artifacts are, so a receipt
778
+ states what was sealed and nothing the build happened to hold in memory.
780
779
  """
781
780
 
781
+ try:
782
+ execution = parse_recipe_execution(json.loads(snapshot["recipe-execution.json"]))
783
+ except (KeyError, RecipeError, ValueError) as error:
784
+ raise RunExecutionError(
785
+ "ARTIFACT_PERSIST_FAILED",
786
+ failure_detail("the sealed tree carries no readable execution to state in the receipt"),
787
+ stage="persist",
788
+ ) from error
789
+ shape = profile_shape(snapshot, "this version")
790
+ return {
791
+ "table_id": execution.table_id,
792
+ "table_version_id": execution.table_version_id,
793
+ "table_version_number": execution.table_version_number,
794
+ "columns": [{"name": name, "logical_type": kind} for name, kind in shape.columns],
795
+ "row_count": shape.row_count,
796
+ }
797
+
798
+
799
+ def _decode_predecessor_receipt(raw: bytes, job: RunExecution) -> PredecessorRecord:
800
+ """Read the authenticated receipt bytes into the record, or refuse by name."""
801
+
782
802
  block = job.predecessor
783
- if block is None:
784
- raise _predecessor_refusal(f"a {job.mode} run carries no predecessor block")
785
- raw = _download_signed_bytes(
786
- transfer,
787
- block.artifact_download_session,
788
- maximum=MAX_CANDIDATE_ENVELOPE_BYTES,
789
- permitted_hosts=permitted_artifact_hosts(job, studio_origin=studio_origin),
790
- )
803
+ assert block is not None
791
804
  try:
792
- members = _decode_candidate_envelope(raw, block.candidate_digest)
793
- except HostedWorkerError as error:
805
+ value = json.loads(raw.decode("utf-8"))
806
+ except (UnicodeDecodeError, ValueError) as error:
794
807
  raise _predecessor_refusal(
795
- f"the predecessor candidate envelope will not decode: {error.detail}"
808
+ "the predecessor receipt will not decode: not a JSON document"
796
809
  ) from error
797
- previous = root / "predecessor"
798
- previous.mkdir(mode=0o700)
799
- _restore_candidate_members(members, previous)
810
+ if not isinstance(value, Mapping) or value.get("schema_version") != RECEIPT_DOCUMENT_SCHEMA:
811
+ raise _predecessor_refusal(
812
+ f"the predecessor receipt will not decode: not a {RECEIPT_DOCUMENT_SCHEMA} document"
813
+ )
814
+ if str(value.get("run_id")) != str(block.run_id):
815
+ raise _predecessor_refusal("the predecessor receipt names a different run than the block")
816
+ if str(value.get("workspace_id")) != str(job.workspace_id):
817
+ raise _predecessor_refusal("the predecessor receipt names a different workspace")
818
+ table = value.get("table")
819
+ if not isinstance(table, Mapping):
820
+ raise _predecessor_refusal(
821
+ "the predecessor receipt states no table version, so a successor cannot number "
822
+ "itself after it; rebuild the table with a full run on this worker first"
823
+ )
800
824
  try:
801
- verified = pipeline.verify_candidate(previous)
802
- except Exception as error:
825
+ table_id = str(table["table_id"])
826
+ table_version_id = str(table["table_version_id"])
827
+ table_version_number = int(table["table_version_number"])
828
+ columns = tuple(
829
+ (str(entry["name"]), str(entry["logical_type"])) for entry in table["columns"]
830
+ )
831
+ except (KeyError, TypeError, ValueError) as error:
803
832
  raise _predecessor_refusal(
804
- f"the restored predecessor tree will not replay-verify: {type(error).__name__}"
833
+ "the predecessor receipt's table member is not readable"
805
834
  ) from error
806
- if "sha256:" + verified.candidate_digest != block.candidate_digest:
835
+ if table_version_id != block.table_version_id:
807
836
  raise _predecessor_refusal(
808
- "the restored predecessor tree's digest disagrees with the predecessor block"
837
+ "the predecessor block and the sealed receipt name different table versions"
809
838
  )
810
- return previous
839
+ if table_version_number < 1:
840
+ raise _predecessor_refusal("the predecessor receipt states no positive table version")
841
+ row_count = table.get("row_count")
842
+ sources = value.get("sources")
843
+ states: dict[str, str] = {}
844
+ if isinstance(sources, list):
845
+ for item in sources:
846
+ if isinstance(item, Mapping):
847
+ source_id = item.get("source_id")
848
+ digest = item.get("digest")
849
+ if isinstance(source_id, str) and isinstance(digest, str):
850
+ states[source_id] = digest
851
+ candidate_digest = value.get("candidate_digest")
852
+ recipe_digest = value.get("recipe_digest")
853
+ if not isinstance(candidate_digest, str) or not isinstance(recipe_digest, str):
854
+ raise _predecessor_refusal("the predecessor receipt states no digests")
855
+ return PredecessorRecord(
856
+ run_id=block.run_id,
857
+ workspace_id=job.workspace_id,
858
+ recipe_digest=recipe_digest,
859
+ candidate_digest=candidate_digest,
860
+ table_id=table_id,
861
+ table_version_id=table_version_id,
862
+ table_version_number=table_version_number,
863
+ columns=columns,
864
+ row_count=row_count if isinstance(row_count, int) else None,
865
+ source_states=MappingProxyType(states),
866
+ )
811
867
 
812
868
 
813
- def predecessor_lock_inputs(previous_run_dir: Path) -> tuple[RecipeExecution, dict[str, str]]:
814
- """Read the two facts the execution lock needs out of the RESTORED tree.
869
+ def restore_predecessor_record(
870
+ job: RunExecution, *, transfer: Any, studio_origin: str = ""
871
+ ) -> PredecessorRecord:
872
+ """Download and authenticate the predecessor's sealed receipt, and read the record from it.
815
873
 
816
- ``recipe-execution.json`` supplies ``table_id`` and ``table_version_number``. Reading them from
817
- the tree rather than from the job document is the whole of "the restored tree is the
818
- authority".
874
+ Studio's predecessor session names the predecessor's ``receipt`` artifact -- the
875
+ ``candidate_evidence`` root a refresh resolves from -- and the block's ``candidate_digest`` is
876
+ that receipt's own digest. The bytes are authenticated by the digest BEFORE they are read, so
877
+ a block that disagrees with what the session serves is a refusal and never a correction, and a
878
+ spoofed block cannot rebind a run to a version it did not come from (T-401-24): the version
879
+ coordinates are read from the authenticated receipt and cross-checked against the block.
819
880
 
820
- **WHAT A SOURCE'S COMMITTED STATE IS DEPENDS ON WHAT THE PREDECESSOR SEALED, AND BOTH ANSWERS
821
- ARE READ RATHER THAN COMPOSED.** A tree built from a versioned-source chain records a
822
- ``committed_state_digest`` per source in ``evidence/recipe-acquisition.json`` -- the cursor the
823
- chain committed at -- and that member is where the chain is re-checked from. A tree built from
824
- a registered document runs no versioned source and seals no such member; what it does seal, per
825
- relation, is the digest of the exact member the relation was read from. That digest is the
826
- honest answer to "what state was this source committed at", because for this lane the bytes ARE
827
- the state: there is no cursor, no watermark and nothing else the predecessor advanced.
881
+ Six failure points, one code, and the detail names which one: an absent block, a session that
882
+ will not answer, a download over its bound, a digest that disagrees, a receipt that will not
883
+ decode, and a receipt naming another run, workspace or table version.
828
884
 
829
- Neither is invented. A tree carrying neither member refuses, because a successor bound to a
830
- state nobody recorded would be a version claiming a predecessor it cannot name.
885
+ ``studio_origin`` is the DEPLOYMENT's Studio origin, not anything the job document said, and it
886
+ is what lets :func:`permitted_artifact_hosts` judge the signed address against a policy the
887
+ document's author cannot move.
831
888
  """
832
889
 
833
- _, snapshot = _candidate_snapshot(previous_run_dir)
834
- try:
835
- execution = parse_recipe_execution(json.loads(snapshot["recipe-execution.json"]))
836
- except (KeyError, RecipeError, ValueError) as error:
837
- raise _predecessor_refusal(
838
- "the restored predecessor tree carries no readable sealed execution"
839
- ) from error
840
- states = _committed_source_states(snapshot)
841
- if states is None:
890
+ block = job.predecessor
891
+ if block is None:
892
+ raise _predecessor_refusal(f"a {job.mode} run carries no predecessor block")
893
+ raw = _download_signed_bytes(
894
+ transfer,
895
+ block.artifact_download_session,
896
+ maximum=MAX_CANDIDATE_ENVELOPE_BYTES,
897
+ permitted_hosts=permitted_artifact_hosts(job, studio_origin=studio_origin),
898
+ )
899
+ if "sha256:" + hashlib.sha256(raw).hexdigest() != block.candidate_digest:
842
900
  raise _predecessor_refusal(
843
- "the restored predecessor tree carries no committed source state"
901
+ "the predecessor receipt's digest disagrees with the predecessor block"
844
902
  )
845
- return execution, states
846
-
847
-
848
- #: Where one predecessor member records a source's committed state, and under which key. Written
849
- #: as a table because there are exactly two sealed shapes and the difference between them is which
850
- #: member exists, not how it is read.
851
- _COMMITTED_STATE_MEMBERS: tuple[tuple[str, str], ...] = (
852
- ("evidence/recipe-acquisition.json", "committed_state_digest"),
853
- ("evidence/sources.json", "sha256"),
854
- )
855
-
856
-
857
- def _committed_source_states(snapshot: Mapping[str, bytes]) -> dict[str, str] | None:
858
- """The per-source committed state one restored tree records, or ``None`` if it records none."""
859
-
860
- for member, key in _COMMITTED_STATE_MEMBERS:
861
- raw = snapshot.get(member)
862
- if raw is None:
863
- continue
864
- decoded = json.loads(raw)
865
- sources = decoded.get("sources") if isinstance(decoded, Mapping) else decoded
866
- if not isinstance(sources, list):
867
- continue
868
- states: dict[str, str] = {}
869
- for item in sources:
870
- if not isinstance(item, Mapping):
871
- continue
872
- source_id = item.get("source_id")
873
- digest = item.get(key)
874
- if isinstance(source_id, str) and isinstance(digest, str):
875
- states[source_id] = digest
876
- if states:
877
- return states
878
- return None
903
+ return _decode_predecessor_receipt(raw, job)
879
904
 
880
905
 
881
906
  # ------------------------------------------------------------------------------------------------
@@ -988,6 +1013,7 @@ def _receipt_document(
988
1013
  verified: pipeline.VerifiedCandidate,
989
1014
  coverage: Sequence[V4AcquisitionCoverage],
990
1015
  raw_members: Sequence[Mapping[str, Any]],
1016
+ snapshot: Mapping[str, bytes],
991
1017
  ) -> bytes:
992
1018
  """The composed v4 receipt: one entry per source, the coverage, and the raw tar's members.
993
1019
 
@@ -1038,6 +1064,10 @@ def _receipt_document(
1038
1064
  "media_type": RAW_SNAPSHOT_MEDIA_TYPE,
1039
1065
  "members": [dict(member) for member in raw_members],
1040
1066
  },
1067
+ # THE VERSION AND THE SHAPE THIS RUN SEALED, so a later refresh can number itself
1068
+ # after this version and hold its columns against these, reading the authenticated
1069
+ # receipt alone: a v4 run uploads no sealed tree for a successor to restore.
1070
+ "table": _receipt_table_record(snapshot),
1041
1071
  }
1042
1072
  )
1043
1073
 
@@ -1047,7 +1077,7 @@ def v4_artifact_payloads(
1047
1077
  candidate_run_dir: Path,
1048
1078
  *,
1049
1079
  coverage: Sequence[V4AcquisitionCoverage] = (),
1050
- predecessor_run_dir: Path | None = None,
1080
+ predecessor: PredecessorRecord | None = None,
1051
1081
  ) -> tuple[pipeline.VerifiedCandidate, list[ArtifactPayload]]:
1052
1082
  """Derive all five v4 artifacts from the sealed candidate tree, in layout order.
1053
1083
 
@@ -1085,17 +1115,14 @@ def v4_artifact_payloads(
1085
1115
  stage="persist",
1086
1116
  )
1087
1117
  verified, snapshot = _candidate_snapshot(candidate_run_dir)
1088
- # The restored predecessor tree, for the drift control a refresh is held to. Read through the
1089
- # same replay-verifying door as the candidate: what is compared is what was sealed.
1090
- predecessor_snapshot = (
1091
- None if predecessor_run_dir is None else _candidate_snapshot(predecessor_run_dir)[1]
1092
- )
1118
+ # The authenticated predecessor record, for the drift control a refresh is held to: the
1119
+ # sealed shape it states is what this version's sealed shape is compared with.
1093
1120
  run_required_controls(
1094
1121
  job,
1095
1122
  verified=verified,
1096
1123
  snapshot=snapshot,
1097
1124
  coverage=coverage,
1098
- predecessor_snapshot=predecessor_snapshot,
1125
+ predecessor=predecessor,
1099
1126
  )
1100
1127
  candidate_digest = "sha256:" + verified.candidate_digest
1101
1128
  # The tar is built BEFORE the receipt, because the receipt states the tar's members: the
@@ -1114,7 +1141,7 @@ def v4_artifact_payloads(
1114
1141
  candidate_digest=candidate_digest,
1115
1142
  ),
1116
1143
  "preview": _table_preview(snapshot["data/table.parquet"], candidate_digest),
1117
- "receipt": _receipt_document(job, verified, coverage, raw_members),
1144
+ "receipt": _receipt_document(job, verified, coverage, raw_members, snapshot),
1118
1145
  "raw_snapshot": _raw_snapshot_tar(snapshot, raw_paths),
1119
1146
  }
1120
1147
  return verified, [
@@ -2569,9 +2596,9 @@ def run_v4(
2569
2596
  with ExitStack() as stack:
2570
2597
  root = Path(stack.enter_context(tempfile.TemporaryDirectory(prefix="mr-v4-run-"))).resolve()
2571
2598
  try:
2572
- previous_run_dir: Path | None = None
2573
- predecessor_execution: RecipeExecution | None = None
2574
- source_states: dict[str, str] | None = None
2599
+ predecessor: PredecessorRecord | None = None
2600
+ predecessor_execution: PredecessorRecord | None = None
2601
+ source_states: Mapping[str, str] | None = None
2575
2602
  # THE DECLARED CHECKS ARE PARSED FIRST, BEFORE A BYTE IS FETCHED OR RESTORED.
2576
2603
  # `parse_declared_checks` is entirely static -- it validates every check's kind, its
2577
2604
  # exact parameter set, its domains and every column it names against the plan's own
@@ -2604,10 +2631,11 @@ def run_v4(
2604
2631
  if job.mode in {"refresh", "backfill"}:
2605
2632
  if transfer is None:
2606
2633
  transfer = stack.enter_context(_closing(_new_transfer_client()))
2607
- previous_run_dir = restore_predecessor_tree(
2608
- job, transfer=transfer, root=root, studio_origin=origin
2634
+ predecessor = restore_predecessor_record(
2635
+ job, transfer=transfer, studio_origin=origin
2609
2636
  )
2610
- predecessor_execution, source_states = predecessor_lock_inputs(previous_run_dir)
2637
+ predecessor_execution = predecessor
2638
+ source_states = predecessor.source_states
2611
2639
 
2612
2640
  approval, execution = synthesize_execution_lock(
2613
2641
  job,
@@ -2719,7 +2747,7 @@ def run_v4(
2719
2747
  job,
2720
2748
  output_dir,
2721
2749
  coverage=coverage_log.entries(),
2722
- predecessor_run_dir=previous_run_dir,
2750
+ predecessor=predecessor,
2723
2751
  )
2724
2752
  _upload_all(
2725
2753
  job,
@@ -2833,12 +2861,11 @@ def _resolved_sealer(
2833
2861
  transport=stack.enter_context(_closing(_new_transfer_client())),
2834
2862
  transfer=transfer,
2835
2863
  base_url=base_url,
2836
- # THE DEPLOYMENT'S POLICY, NOT THE DOCUMENT'S OWN HOST. `permitted_artifact_hosts` narrows
2837
- # this set to the one host the job's `artifact_session` names, which is right for the
2838
- # predecessor download -- both are bytes of the same run -- and wrong here: that member is
2864
+ # THE DEPLOYMENT'S POLICY, NOT THE DOCUMENT'S OWN HOST. The job's `artifact_session` is
2839
2865
  # the `artifacts:reserve` route on Studio's own origin, while the session it answers with
2840
2866
  # is signed on the object store. The two are DIFFERENT hosts by design, and the rule the
2841
- # answer has to satisfy is the one `signed_storage_hosts` reads out of deployment facts.
2867
+ # answer has to satisfy is the one `signed_storage_hosts` reads out of deployment facts --
2868
+ # the same rule `permitted_artifact_hosts` applies to the predecessor download.
2842
2869
  permitted_hosts=signed_storage_hosts(studio_origin=base_url, environ=os.environ),
2843
2870
  )
2844
2871
 
@@ -3090,6 +3117,7 @@ __all__ = [
3090
3117
  "RECEIPT_DOCUMENT_SCHEMA",
3091
3118
  "V4_ARTIFACT_LAYOUT",
3092
3119
  "ArtifactSealer",
3120
+ "PredecessorRecord",
3093
3121
  "StudioArtifactSealer",
3094
3122
  "StudioCredentialRedeemer",
3095
3123
  "StudioRunCallbacks",
@@ -3097,9 +3125,8 @@ __all__ = [
3097
3125
  "artifact_id_for",
3098
3126
  "build_v4_candidate",
3099
3127
  "permitted_artifact_hosts",
3100
- "predecessor_lock_inputs",
3101
3128
  "recipe_governance",
3102
- "restore_predecessor_tree",
3129
+ "restore_predecessor_record",
3103
3130
  "run_v4",
3104
3131
  "run_worker_main",
3105
3132
  "seal_coordinate",
@@ -1407,10 +1407,28 @@ def _refuse_unbindable_watermark(job: RunExecution) -> None:
1407
1407
  )
1408
1408
 
1409
1409
 
1410
+ class PredecessorExecution(Protocol):
1411
+ """The three facts the lock reads off a predecessor: its table, its version, its number.
1412
+
1413
+ Satisfied by the engine's own ``RecipeExecution`` and by the worker's authenticated
1414
+ ``PredecessorRecord`` alike, so the lock is indifferent to which sealed member they were read
1415
+ from.
1416
+ """
1417
+
1418
+ @property
1419
+ def table_id(self) -> str: ...
1420
+
1421
+ @property
1422
+ def table_version_id(self) -> str: ...
1423
+
1424
+ @property
1425
+ def table_version_number(self) -> int: ...
1426
+
1427
+
1410
1428
  def synthesize_execution_lock(
1411
1429
  job: RunExecution,
1412
1430
  *,
1413
- predecessor_execution: RecipeExecution | None = None,
1431
+ predecessor_execution: PredecessorExecution | None = None,
1414
1432
  predecessor_source_states: Mapping[str, str] | None = None,
1415
1433
  trusted_clock: str | None = None,
1416
1434
  ) -> tuple[RecipeApproval, RecipeExecution]:
@@ -1422,18 +1440,19 @@ def synthesize_execution_lock(
1422
1440
  keeps ``pipeline._RECIPE_STATIC_FILES`` intact and the synthesized documents are still sealed
1423
1441
  into the candidate as honest evidence of what ran.
1424
1442
 
1425
- ``predecessor_execution`` is the ``RecipeExecution`` parsed out of the RESTORED predecessor
1426
- tree's sealed ``recipe-execution.json``, not out of the job document: the sealed member is the
1427
- authority and the block is only the coordinate. 401-04 restores the tree, parses that member
1428
- and passes it in. A non-``initial`` call without it refuses ``PREDECESSOR_UNAVAILABLE`` rather
1443
+ ``predecessor_execution`` is read out of the predecessor's AUTHENTICATED sealed receipt (the
1444
+ ``table`` member it states), not out of the job document: the sealed member is the authority
1445
+ and the block is only the coordinate. The driver downloads the receipt, authenticates it by
1446
+ the block's digest and passes the record in. A non-``initial`` call without it refuses
1447
+ ``PREDECESSOR_UNAVAILABLE`` rather
1429
1448
  than guessing a version number, and the one value that appears in both places --
1430
1449
  ``table_version_id`` -- is cross-checked, so a spoofed block cannot rebind a run to a tree it
1431
1450
  did not come from. (``candidate_digest`` has no counterpart on ``RecipeExecution``: the
1432
1451
  ``predecessor_candidate_digest`` member there names the predecessor's OWN predecessor, not
1433
1452
  itself. Authenticating the digest against the restored tree is 401-04's, where the tree is.)
1434
1453
 
1435
- ``predecessor_source_states`` carries the per-source ``committed_state_digest`` read from the
1436
- predecessor tree's sealed ``evidence/recipe-acquisition.json``.
1454
+ ``predecessor_source_states`` carries the per-source committed state read from the same
1455
+ receipt: for a registered document, the digest of the bytes each source was read as.
1437
1456
  ``_validate_recipe_execution`` requires one for every source of a non-``initial`` execution,
1438
1457
  and the job document carries none, so 401-04 supplies them from the same restored tree.
1439
1458
 
@@ -60,7 +60,7 @@ from mostlyright.data_harness.thin.runs import StudioApiClient, new_idempotency_
60
60
  from mostlyright.data_harness.thin.session import (
61
61
  StudioSession,
62
62
  open_studio_session,
63
- run_dashboard_url,
63
+ run_record_dashboard_url,
64
64
  )
65
65
  from mostlyright.data_harness.thin.transport import ThinLaneError
66
66
  from mostlyright.data_harness.ux.credentials import resolve_cloud_credentials
@@ -785,7 +785,7 @@ def _confirm_table_recipe(
785
785
  payload["build"] = {
786
786
  "state": "run_already_queued",
787
787
  "run_id": run_id,
788
- "dashboard_url": run_dashboard_url(selected.session.cloud_url, run_id),
788
+ "dashboard_url": run_record_dashboard_url(selected.session.cloud_url, run, run_id),
789
789
  "watch_command": f"mr-data watch {run_id} --hosted",
790
790
  "note": (
791
791
  "The confirmation started the first hosted Build in the same act; there is "
@@ -823,7 +823,7 @@ def _what_follows_an_approved_recipe(
823
823
  return {
824
824
  "state": "run_already_queued",
825
825
  "run_id": run_id,
826
- "dashboard_url": run_dashboard_url(client.session.cloud_url, run_id),
826
+ "dashboard_url": run_record_dashboard_url(client.session.cloud_url, run, run_id),
827
827
  "watch_command": f"mr-data watch {run_id} --hosted",
828
828
  "note": (
829
829
  "The confirmation started the first hosted Build in the same act; there is "