mostlyright-data 0.10.6__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.6 → mostlyright_data-0.10.7}/PKG-INFO +1 -1
  2. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/pyproject.toml +1 -1
  3. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_run_worker.py +161 -126
  4. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/run_execution_v4.py +26 -7
  5. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_required_controls.py +35 -20
  6. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/.gitignore +0 -0
  7. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/README.md +0 -0
  8. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/scripts/hatch_build.py +0 -0
  9. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/skills/mr-data-build/SKILL.md +0 -0
  10. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/skills/mr-data-build/agents/openai.yaml +0 -0
  11. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
  12. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
  13. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/__init__.py +0 -0
  14. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
  15. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
  16. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
  17. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
  18. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
  19. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
  20. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
  21. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
  22. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
  23. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
  24. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
  25. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
  26. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
  27. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
  28. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
  29. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
  30. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
  31. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
  32. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
  33. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
  34. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
  35. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
  36. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
  37. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
  38. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
  39. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
  40. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
  41. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
  42. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
  43. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
  44. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
  45. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
  46. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
  47. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
  48. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
  49. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
  50. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
  51. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/__init__.py +0 -0
  52. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  53. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/http.py +0 -0
  54. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
  55. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  56. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  57. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  58. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
  59. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
  60. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  61. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  62. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  63. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  64. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  65. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  66. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/reference.py +0 -0
  67. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/registry.py +0 -0
  68. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  69. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/bounded_query.py +0 -0
  70. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/canonical.py +0 -0
  71. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/catalog_job.py +0 -0
  72. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/cli.py +0 -0
  73. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/contracts.py +0 -0
  74. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/coordinator.py +0 -0
  75. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/crosswalks.py +0 -0
  76. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/declared_checks.py +0 -0
  77. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/deploy.py +0 -0
  78. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/deploy_target.py +0 -0
  79. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  80. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/__init__.py +0 -0
  81. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
  82. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/agent_request.py +0 -0
  83. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/capture.py +0 -0
  84. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/contracts.py +0 -0
  85. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/lane.py +0 -0
  86. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/ocr.py +0 -0
  87. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/pdf.py +0 -0
  88. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/registry.py +0 -0
  89. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
  90. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/selections.py +0 -0
  91. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/tables.py +0 -0
  92. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
  93. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/events.py +0 -0
  94. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  95. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/formats.py +0 -0
  96. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/governors.py +0 -0
  97. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
  98. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
  99. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  100. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
  101. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
  102. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  103. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
  104. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
  105. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
  106. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  107. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
  108. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  109. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
  110. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
  111. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
  112. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  113. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
  114. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
  115. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
  116. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +0 -0
  117. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/hosted_worker.py +0 -0
  118. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  119. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  120. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  121. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  122. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  123. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  124. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/inprocess_acquisition.py +0 -0
  125. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/key_seam.py +0 -0
  126. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
  127. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_contracts.py +0 -0
  128. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
  129. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
  130. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
  131. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
  132. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
  133. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
  134. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/local_search/service.py +0 -0
  135. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  136. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  137. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  138. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  139. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  140. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  141. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  142. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  143. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  144. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  145. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  146. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  147. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  148. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  149. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  150. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  151. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  152. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/notebook.py +0 -0
  153. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/offline.py +0 -0
  154. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/operation_registry.py +0 -0
  155. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/operator_setup.py +0 -0
  156. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/pipeline.py +0 -0
  157. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/plan_graph.py +0 -0
  158. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  159. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  160. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  161. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  162. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  163. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  164. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  165. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/table.py +0 -0
  166. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  167. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/progress_events.py +0 -0
  168. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  169. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
  170. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/budgets.py +0 -0
  171. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/containers.py +0 -0
  172. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  173. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  174. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
  175. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
  176. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
  177. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  178. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  179. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
  180. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
  181. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  182. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  183. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  184. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
  185. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
  186. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
  187. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  188. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  189. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
  190. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
  191. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
  192. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
  193. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
  194. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
  195. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
  196. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
  197. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
  198. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
  199. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
  200. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
  201. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/registry.py +0 -0
  202. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  203. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  204. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  205. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  206. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  207. {mostlyright_data-0.10.6 → 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
  208. {mostlyright_data-0.10.6 → 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
  209. {mostlyright_data-0.10.6 → 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
  210. {mostlyright_data-0.10.6 → 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
  211. {mostlyright_data-0.10.6 → 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
  212. {mostlyright_data-0.10.6 → 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
  213. {mostlyright_data-0.10.6 → 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
  214. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  215. {mostlyright_data-0.10.6 → 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
  216. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  217. {mostlyright_data-0.10.6 → 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
  218. {mostlyright_data-0.10.6 → 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
  219. {mostlyright_data-0.10.6 → 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
  220. {mostlyright_data-0.10.6 → 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
  221. {mostlyright_data-0.10.6 → 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
  222. {mostlyright_data-0.10.6 → 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
  223. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
  224. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
  225. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
  226. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
  227. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
  228. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
  229. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
  230. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
  231. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
  232. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
  233. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
  234. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
  235. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  236. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  237. {mostlyright_data-0.10.6 → 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
  238. {mostlyright_data-0.10.6 → 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
  239. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
  240. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
  241. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
  242. {mostlyright_data-0.10.6 → 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
  243. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
  244. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
  245. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
  246. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
  247. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
  248. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
  249. {mostlyright_data-0.10.6 → 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
  250. {mostlyright_data-0.10.6 → 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
  251. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
  252. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
  253. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  254. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  255. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
  256. {mostlyright_data-0.10.6 → 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
  257. {mostlyright_data-0.10.6 → 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
  258. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
  259. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
  260. {mostlyright_data-0.10.6 → 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
  261. {mostlyright_data-0.10.6 → 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
  262. {mostlyright_data-0.10.6 → 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
  263. {mostlyright_data-0.10.6 → 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
  264. {mostlyright_data-0.10.6 → 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
  265. {mostlyright_data-0.10.6 → 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
  266. {mostlyright_data-0.10.6 → 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
  267. {mostlyright_data-0.10.6 → 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
  268. {mostlyright_data-0.10.6 → 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
  269. {mostlyright_data-0.10.6 → 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
  270. {mostlyright_data-0.10.6 → 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
  271. {mostlyright_data-0.10.6 → 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
  272. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
  273. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
  274. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
  275. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
  276. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
  277. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
  278. {mostlyright_data-0.10.6 → 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
  279. {mostlyright_data-0.10.6 → 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
  280. {mostlyright_data-0.10.6 → 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
  281. {mostlyright_data-0.10.6 → 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
  282. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
  283. {mostlyright_data-0.10.6 → 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
  284. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
  285. {mostlyright_data-0.10.6 → 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
  286. {mostlyright_data-0.10.6 → 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
  287. {mostlyright_data-0.10.6 → 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
  288. {mostlyright_data-0.10.6 → 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
  289. {mostlyright_data-0.10.6 → 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
  290. {mostlyright_data-0.10.6 → 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
  291. {mostlyright_data-0.10.6 → 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
  292. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  293. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  294. {mostlyright_data-0.10.6 → 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
  295. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  296. {mostlyright_data-0.10.6 → 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
  297. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  298. {mostlyright_data-0.10.6 → 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
  299. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  300. {mostlyright_data-0.10.6 → 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
  301. {mostlyright_data-0.10.6 → 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
  302. {mostlyright_data-0.10.6 → 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
  303. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
  304. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
  305. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
  306. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
  307. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
  308. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
  309. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
  310. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
  311. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
  312. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
  313. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/samples.py +0 -0
  314. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific.py +0 -0
  315. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
  316. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
  317. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
  318. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
  319. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
  320. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
  321. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
  322. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
  323. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
  324. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
  325. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
  326. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
  327. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
  328. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
  329. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
  330. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
  331. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
  332. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
  333. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
  334. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
  335. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
  336. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  337. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
  338. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  339. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/vector.py +0 -0
  340. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
  341. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
  342. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
  343. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/recipe.py +0 -0
  344. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/repair/__init__.py +0 -0
  345. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/repair/adapters.py +0 -0
  346. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/repair/contracts.py +0 -0
  347. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
  348. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/repair/errors.py +0 -0
  349. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/review.py +0 -0
  350. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/rowset.py +0 -0
  351. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/session_probes.py +0 -0
  352. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/signing.py +0 -0
  353. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/skill_assets.py +0 -0
  354. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/source_discovery.py +0 -0
  355. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/__init__.py +0 -0
  356. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
  357. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/adapters.py +0 -0
  358. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  359. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  360. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  361. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  362. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  363. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  364. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  365. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  366. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  367. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  368. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  369. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  370. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  371. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  372. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  373. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
  374. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  375. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
  376. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
  377. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  378. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  379. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
  380. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  381. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  382. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  383. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  384. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  385. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  386. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  387. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
  388. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  389. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  390. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  391. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  392. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  393. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  394. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  395. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  396. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  397. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  398. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
  399. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  400. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  401. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  402. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  403. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/collections.py +0 -0
  404. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/contracts.py +0 -0
  405. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/dataset.py +0 -0
  406. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  407. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
  408. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/fitness.py +0 -0
  409. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/governance.py +0 -0
  410. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  411. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/integration.py +0 -0
  412. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  413. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/registry.py +0 -0
  414. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
  415. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  416. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/sports.py +0 -0
  417. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream.py +0 -0
  418. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
  419. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
  420. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
  421. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
  422. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
  423. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
  424. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
  425. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
  426. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
  427. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
  428. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
  429. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
  430. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
  431. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
  432. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
  433. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
  434. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
  435. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
  436. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
  437. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
  438. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
  439. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
  440. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
  441. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
  442. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
  443. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
  444. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
  445. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/sql_transform_engine.py +0 -0
  446. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/stream_subscription_feed.py +0 -0
  447. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/stream_subscription_sealer.py +0 -0
  448. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/stream_subscription_worker.py +0 -0
  449. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/stream_venue.py +0 -0
  450. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
  451. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/studio_boundary.py +0 -0
  452. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/studio_subscription_control.py +0 -0
  453. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  454. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  455. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  456. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  457. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/commands.py +0 -0
  458. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/download.py +0 -0
  459. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  460. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/parity.py +0 -0
  461. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/probe.py +0 -0
  462. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/propose.py +0 -0
  463. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/recipe.py +0 -0
  464. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/research.py +0 -0
  465. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/router.py +0 -0
  466. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/runs.py +0 -0
  467. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/session.py +0 -0
  468. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/stream.py +0 -0
  469. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
  470. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/transport.py +0 -0
  471. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4.py +0 -0
  472. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_artifacts.py +0 -0
  473. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
  474. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
  475. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
  476. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
  477. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_runs.py +0 -0
  478. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
  479. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
  480. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/v4_tables.py +0 -0
  481. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
  482. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/thin/workers.py +0 -0
  483. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  484. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  485. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/unit_flow.py +0 -0
  486. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/units.py +0 -0
  487. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  488. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/approve.py +0 -0
  489. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/attendance.py +0 -0
  490. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
  491. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/clarification.py +0 -0
  492. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  493. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  494. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
  495. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  496. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
  497. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  498. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
  499. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  500. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  501. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
  502. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
  503. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
  504. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
  505. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
  506. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
  507. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
  508. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
  509. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/document.py +0 -0
  510. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
  511. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
  512. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
  513. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  514. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
  515. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
  516. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
  517. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
  518. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
  519. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
  520. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
  521. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  522. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  523. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  524. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  525. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/diffing.py +0 -0
  526. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/headline.py +0 -0
  527. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  528. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
  529. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/inventory.py +0 -0
  530. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/local_review.py +0 -0
  531. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/login.py +0 -0
  532. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  533. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/peek.py +0 -0
  534. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  535. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
  536. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/preflight.py +0 -0
  537. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/readers.py +0 -0
  538. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/remediation.py +0 -0
  539. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/render.py +0 -0
  540. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/ux/workload.py +0 -0
  541. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_acquisition.py +0 -0
  542. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
  543. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
  544. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
  545. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_recipe.py +0 -0
  546. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
  547. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_stream_recording.py +0 -0
  548. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/v4_transform.py +0 -0
  549. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  550. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  551. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  552. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  553. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  554. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/query.py +0 -0
  555. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  556. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  557. {mostlyright_data-0.10.6 → mostlyright_data-0.10.7}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  558. {mostlyright_data-0.10.6 → 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.6
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.6"
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"
@@ -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
 
@@ -80,12 +80,10 @@ from mostlyright.data_harness.hosted_worker import (
80
80
  ArtifactPayload,
81
81
  HostedWorkerError,
82
82
  _candidate_snapshot,
83
- _decode_candidate_envelope,
84
83
  _new_transfer_client,
85
84
  _quiet_signed_transfer,
86
85
  _read_fd_once,
87
86
  _released_column_profile,
88
- _restore_candidate_members,
89
87
  _run_bounded_in_submit_order,
90
88
  _seal_producer_artifact,
91
89
  _strict_json,
@@ -106,7 +104,7 @@ from mostlyright.data_harness.inprocess_acquisition import (
106
104
  inprocess_reader_policy_digest,
107
105
  v4_parse_policy_digest,
108
106
  )
109
- from mostlyright.data_harness.recipe import RecipeError, RecipeExecution, parse_recipe_execution
107
+ from mostlyright.data_harness.recipe import RecipeError, parse_recipe_execution
110
108
  from mostlyright.data_harness.run_execution_v4 import (
111
109
  FAILED_STAGES,
112
110
  RunCallbacks,
@@ -150,7 +148,7 @@ from mostlyright.data_harness.v4_recipe import (
150
148
  source_ceilings,
151
149
  source_egress_origins,
152
150
  )
153
- 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
154
152
  from mostlyright.data_harness.v4_snapshot_artifact import SnapshotArtifactAdapter
155
153
  from mostlyright.data_harness.v4_transform import (
156
154
  SEALED_MEMBER_DIRECTORY,
@@ -675,8 +673,7 @@ def permitted_artifact_hosts(
675
673
  required them to agree refused every refresh a hosted deployment dispatched.
676
674
 
677
675
  This is defence in depth and it is not the authentication: the predecessor's bytes are still
678
- authenticated end to end by ``candidate_digest``, checked by ``_decode_candidate_envelope``
679
- and again by ``pipeline.verify_candidate`` on the restored tree.
676
+ authenticated end to end by ``candidate_digest``, checked before the receipt is read.
680
677
  """
681
678
 
682
679
  session = job.artifact_session
@@ -708,7 +705,7 @@ def _download_signed_bytes(
708
705
 
709
706
  A v4 signed session carries no expected size and no expected digest: the digest that
710
707
  authenticates these bytes is the block's ``candidate_digest``, checked by
711
- ``_decode_candidate_envelope`` and again by ``pipeline.verify_candidate`` on the restored tree.
708
+ :func:`restore_predecessor_record` before the receipt is read.
712
709
 
713
710
  BOTH ADDRESS CHECKS RUN BEFORE THE STREAM OPENS, so a refused session costs no bytes.
714
711
  """
@@ -745,130 +742,165 @@ def _download_signed_bytes(
745
742
  return b"".join(chunks)
746
743
 
747
744
 
748
- def restore_predecessor_tree(
749
- job: RunExecution, *, transfer: Any, root: Path, studio_origin: str = ""
750
- ) -> Path:
751
- """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
+ """
752
761
 
753
- This mirrors ``hosted_worker._restore_predecessor_input`` step for step -- redeem the session,
754
- download bounded by ``MAX_CANDIDATE_ENVELOPE_BYTES``, ``_decode_candidate_envelope``,
755
- ``_restore_candidate_members``, ``pipeline.verify_candidate``, compare the digest -- with the
756
- v3 ``predecessor_artifact_handle`` replaced by the v4 block's
757
- ``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]
758
772
 
759
- THE RESTORED TREE IS THE AUTHORITY AND THE BLOCK IS ONLY THE COORDINATE. The block says where
760
- to look; what is found there says what it is. A block whose ``candidate_digest`` disagrees with
761
- the verified tree is a refusal and never a correction, and ``table_id`` and
762
- ``table_version_number`` are read from the tree's own sealed ``recipe-execution.json`` rather
763
- than from the block -- which is what stops a spoofed block rebinding a run to a version it did
764
- not come from (T-401-24).
765
773
 
766
- Six failure points, one code, and the detail names which one: an absent block, a session that
767
- will not answer, a download over its bound, an envelope that will not decode, a tree that will
768
- 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.
769
776
 
770
- ``studio_origin`` is the DEPLOYMENT's Studio origin, not anything the job document said, and it
771
- is what lets :func:`permitted_artifact_hosts` judge both signed addresses against a policy the
772
- 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.
773
779
  """
774
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
+
775
802
  block = job.predecessor
776
- if block is None:
777
- raise _predecessor_refusal(f"a {job.mode} run carries no predecessor block")
778
- raw = _download_signed_bytes(
779
- transfer,
780
- block.artifact_download_session,
781
- maximum=MAX_CANDIDATE_ENVELOPE_BYTES,
782
- permitted_hosts=permitted_artifact_hosts(job, studio_origin=studio_origin),
783
- )
803
+ assert block is not None
784
804
  try:
785
- members = _decode_candidate_envelope(raw, block.candidate_digest)
786
- except HostedWorkerError as error:
805
+ value = json.loads(raw.decode("utf-8"))
806
+ except (UnicodeDecodeError, ValueError) as error:
787
807
  raise _predecessor_refusal(
788
- f"the predecessor candidate envelope will not decode: {error.detail}"
808
+ "the predecessor receipt will not decode: not a JSON document"
789
809
  ) from error
790
- previous = root / "predecessor"
791
- previous.mkdir(mode=0o700)
792
- _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
+ )
793
824
  try:
794
- verified = pipeline.verify_candidate(previous)
795
- 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:
796
832
  raise _predecessor_refusal(
797
- f"the restored predecessor tree will not replay-verify: {type(error).__name__}"
833
+ "the predecessor receipt's table member is not readable"
798
834
  ) from error
799
- if "sha256:" + verified.candidate_digest != block.candidate_digest:
835
+ if table_version_id != block.table_version_id:
800
836
  raise _predecessor_refusal(
801
- "the restored predecessor tree's digest disagrees with the predecessor block"
837
+ "the predecessor block and the sealed receipt name different table versions"
802
838
  )
803
- 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
+ )
804
867
 
805
868
 
806
- def predecessor_lock_inputs(previous_run_dir: Path) -> tuple[RecipeExecution, dict[str, str]]:
807
- """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.
808
873
 
809
- ``recipe-execution.json`` supplies ``table_id`` and ``table_version_number``. Reading them from
810
- the tree rather than from the job document is the whole of "the restored tree is the
811
- 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.
812
880
 
813
- **WHAT A SOURCE'S COMMITTED STATE IS DEPENDS ON WHAT THE PREDECESSOR SEALED, AND BOTH ANSWERS
814
- ARE READ RATHER THAN COMPOSED.** A tree built from a versioned-source chain records a
815
- ``committed_state_digest`` per source in ``evidence/recipe-acquisition.json`` -- the cursor the
816
- chain committed at -- and that member is where the chain is re-checked from. A tree built from
817
- a registered document runs no versioned source and seals no such member; what it does seal, per
818
- relation, is the digest of the exact member the relation was read from. That digest is the
819
- honest answer to "what state was this source committed at", because for this lane the bytes ARE
820
- 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.
821
884
 
822
- Neither is invented. A tree carrying neither member refuses, because a successor bound to a
823
- 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.
824
888
  """
825
889
 
826
- _, snapshot = _candidate_snapshot(previous_run_dir)
827
- try:
828
- execution = parse_recipe_execution(json.loads(snapshot["recipe-execution.json"]))
829
- except (KeyError, RecipeError, ValueError) as error:
830
- raise _predecessor_refusal(
831
- "the restored predecessor tree carries no readable sealed execution"
832
- ) from error
833
- states = _committed_source_states(snapshot)
834
- 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:
835
900
  raise _predecessor_refusal(
836
- "the restored predecessor tree carries no committed source state"
901
+ "the predecessor receipt's digest disagrees with the predecessor block"
837
902
  )
838
- return execution, states
839
-
840
-
841
- #: Where one predecessor member records a source's committed state, and under which key. Written
842
- #: as a table because there are exactly two sealed shapes and the difference between them is which
843
- #: member exists, not how it is read.
844
- _COMMITTED_STATE_MEMBERS: tuple[tuple[str, str], ...] = (
845
- ("evidence/recipe-acquisition.json", "committed_state_digest"),
846
- ("evidence/sources.json", "sha256"),
847
- )
848
-
849
-
850
- def _committed_source_states(snapshot: Mapping[str, bytes]) -> dict[str, str] | None:
851
- """The per-source committed state one restored tree records, or ``None`` if it records none."""
852
-
853
- for member, key in _COMMITTED_STATE_MEMBERS:
854
- raw = snapshot.get(member)
855
- if raw is None:
856
- continue
857
- decoded = json.loads(raw)
858
- sources = decoded.get("sources") if isinstance(decoded, Mapping) else decoded
859
- if not isinstance(sources, list):
860
- continue
861
- states: dict[str, str] = {}
862
- for item in sources:
863
- if not isinstance(item, Mapping):
864
- continue
865
- source_id = item.get("source_id")
866
- digest = item.get(key)
867
- if isinstance(source_id, str) and isinstance(digest, str):
868
- states[source_id] = digest
869
- if states:
870
- return states
871
- return None
903
+ return _decode_predecessor_receipt(raw, job)
872
904
 
873
905
 
874
906
  # ------------------------------------------------------------------------------------------------
@@ -981,6 +1013,7 @@ def _receipt_document(
981
1013
  verified: pipeline.VerifiedCandidate,
982
1014
  coverage: Sequence[V4AcquisitionCoverage],
983
1015
  raw_members: Sequence[Mapping[str, Any]],
1016
+ snapshot: Mapping[str, bytes],
984
1017
  ) -> bytes:
985
1018
  """The composed v4 receipt: one entry per source, the coverage, and the raw tar's members.
986
1019
 
@@ -1031,6 +1064,10 @@ def _receipt_document(
1031
1064
  "media_type": RAW_SNAPSHOT_MEDIA_TYPE,
1032
1065
  "members": [dict(member) for member in raw_members],
1033
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),
1034
1071
  }
1035
1072
  )
1036
1073
 
@@ -1040,7 +1077,7 @@ def v4_artifact_payloads(
1040
1077
  candidate_run_dir: Path,
1041
1078
  *,
1042
1079
  coverage: Sequence[V4AcquisitionCoverage] = (),
1043
- predecessor_run_dir: Path | None = None,
1080
+ predecessor: PredecessorRecord | None = None,
1044
1081
  ) -> tuple[pipeline.VerifiedCandidate, list[ArtifactPayload]]:
1045
1082
  """Derive all five v4 artifacts from the sealed candidate tree, in layout order.
1046
1083
 
@@ -1078,17 +1115,14 @@ def v4_artifact_payloads(
1078
1115
  stage="persist",
1079
1116
  )
1080
1117
  verified, snapshot = _candidate_snapshot(candidate_run_dir)
1081
- # The restored predecessor tree, for the drift control a refresh is held to. Read through the
1082
- # same replay-verifying door as the candidate: what is compared is what was sealed.
1083
- predecessor_snapshot = (
1084
- None if predecessor_run_dir is None else _candidate_snapshot(predecessor_run_dir)[1]
1085
- )
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.
1086
1120
  run_required_controls(
1087
1121
  job,
1088
1122
  verified=verified,
1089
1123
  snapshot=snapshot,
1090
1124
  coverage=coverage,
1091
- predecessor_snapshot=predecessor_snapshot,
1125
+ predecessor=predecessor,
1092
1126
  )
1093
1127
  candidate_digest = "sha256:" + verified.candidate_digest
1094
1128
  # The tar is built BEFORE the receipt, because the receipt states the tar's members: the
@@ -1107,7 +1141,7 @@ def v4_artifact_payloads(
1107
1141
  candidate_digest=candidate_digest,
1108
1142
  ),
1109
1143
  "preview": _table_preview(snapshot["data/table.parquet"], candidate_digest),
1110
- "receipt": _receipt_document(job, verified, coverage, raw_members),
1144
+ "receipt": _receipt_document(job, verified, coverage, raw_members, snapshot),
1111
1145
  "raw_snapshot": _raw_snapshot_tar(snapshot, raw_paths),
1112
1146
  }
1113
1147
  return verified, [
@@ -2562,9 +2596,9 @@ def run_v4(
2562
2596
  with ExitStack() as stack:
2563
2597
  root = Path(stack.enter_context(tempfile.TemporaryDirectory(prefix="mr-v4-run-"))).resolve()
2564
2598
  try:
2565
- previous_run_dir: Path | None = None
2566
- predecessor_execution: RecipeExecution | None = None
2567
- 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
2568
2602
  # THE DECLARED CHECKS ARE PARSED FIRST, BEFORE A BYTE IS FETCHED OR RESTORED.
2569
2603
  # `parse_declared_checks` is entirely static -- it validates every check's kind, its
2570
2604
  # exact parameter set, its domains and every column it names against the plan's own
@@ -2597,10 +2631,11 @@ def run_v4(
2597
2631
  if job.mode in {"refresh", "backfill"}:
2598
2632
  if transfer is None:
2599
2633
  transfer = stack.enter_context(_closing(_new_transfer_client()))
2600
- previous_run_dir = restore_predecessor_tree(
2601
- job, transfer=transfer, root=root, studio_origin=origin
2634
+ predecessor = restore_predecessor_record(
2635
+ job, transfer=transfer, studio_origin=origin
2602
2636
  )
2603
- predecessor_execution, source_states = predecessor_lock_inputs(previous_run_dir)
2637
+ predecessor_execution = predecessor
2638
+ source_states = predecessor.source_states
2604
2639
 
2605
2640
  approval, execution = synthesize_execution_lock(
2606
2641
  job,
@@ -2712,7 +2747,7 @@ def run_v4(
2712
2747
  job,
2713
2748
  output_dir,
2714
2749
  coverage=coverage_log.entries(),
2715
- predecessor_run_dir=previous_run_dir,
2750
+ predecessor=predecessor,
2716
2751
  )
2717
2752
  _upload_all(
2718
2753
  job,
@@ -3082,6 +3117,7 @@ __all__ = [
3082
3117
  "RECEIPT_DOCUMENT_SCHEMA",
3083
3118
  "V4_ARTIFACT_LAYOUT",
3084
3119
  "ArtifactSealer",
3120
+ "PredecessorRecord",
3085
3121
  "StudioArtifactSealer",
3086
3122
  "StudioCredentialRedeemer",
3087
3123
  "StudioRunCallbacks",
@@ -3089,9 +3125,8 @@ __all__ = [
3089
3125
  "artifact_id_for",
3090
3126
  "build_v4_candidate",
3091
3127
  "permitted_artifact_hosts",
3092
- "predecessor_lock_inputs",
3093
3128
  "recipe_governance",
3094
- "restore_predecessor_tree",
3129
+ "restore_predecessor_record",
3095
3130
  "run_v4",
3096
3131
  "run_worker_main",
3097
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
 
@@ -75,7 +75,7 @@ import json
75
75
  from collections.abc import Mapping, Sequence
76
76
  from dataclasses import dataclass
77
77
  from types import MappingProxyType
78
- from typing import Any
78
+ from typing import Any, Protocol
79
79
 
80
80
  from mostlyright.data_harness import pipeline
81
81
  from mostlyright.data_harness.canonical import sha256_bytes
@@ -210,28 +210,39 @@ def _exact_candidate_replay(
210
210
  # ------------------------------------------------------------------------------------------------
211
211
 
212
212
 
213
+ class PredecessorShape(Protocol):
214
+ """The sealed shape a predecessor stated; the authenticated receipt record reads it."""
215
+
216
+ @property
217
+ def columns(self) -> tuple[tuple[str, str], ...]: ...
218
+
219
+ @property
220
+ def row_count(self) -> int | None: ...
221
+
222
+
213
223
  def _recipe_drift(
214
224
  job: Any,
215
225
  snapshot: Mapping[str, bytes],
216
- predecessor: Mapping[str, bytes] | None,
226
+ predecessor: PredecessorShape | None,
217
227
  ) -> ControlOutcome:
218
- """NOT_APPLICABLE on a first version; APPLIED on a refresh, against the restored predecessor.
228
+ """NOT_APPLICABLE on a first version; APPLIED on a refresh, against the predecessor record.
219
229
 
220
230
  Every finding the older engine's drift report can raise is a comparison against a PREDECESSOR
221
231
  version -- a column set that lost a column, a column whose type moved, a row count outside the
222
232
  envelope a refresh policy stated. A ``sample`` or ``full`` creates version one and has nothing
223
233
  on the other side of any of the three, so the control does not apply and the outcome says why.
224
234
 
225
- A ``refresh`` continues from a predecessor this worker restored and replay-verified, and the
226
- comparison it can honestly make is the one both sealed trees state exactly: the column set and
227
- the closed logical type of every column, read from each tree's ``evidence/profile.json``. A
228
- column that disappeared, appeared or changed type is drift and the version is refused. The row
229
- count is reported and NOT judged: the registered document has no member for a row-count
230
- envelope, so any bound applied here would be one nobody set.
231
-
232
- **THE PRECONDITION IS CHECKED EVERY RUN.** A refresh that reaches the seal with no restored
233
- predecessor in hand is a worker fault -- something moved and this control was not handed the
234
- tree -- and is refused rather than sealed as compared to nothing.
235
+ A ``refresh`` continues from a predecessor whose sealed receipt this worker authenticated, and
236
+ the comparison it can honestly make is the one both sealed records state exactly: the column
237
+ set and the closed logical type of every column -- the receipt's ``table.columns`` on one side
238
+ and this tree's ``evidence/profile.json`` on the other. A column that disappeared, appeared or
239
+ changed type is drift and the version is refused. The row count is reported and NOT judged:
240
+ the registered document has no member for a row-count envelope, so any bound applied here
241
+ would be one nobody set.
242
+
243
+ **THE PRECONDITION IS CHECKED EVERY RUN.** A refresh that reaches the seal with no
244
+ authenticated predecessor in hand is a worker fault -- something moved and this control was
245
+ not handed the record -- and is refused rather than sealed as compared to nothing.
235
246
  """
236
247
 
237
248
  mode = engine_execution_mode(job)
@@ -248,10 +259,10 @@ def _recipe_drift(
248
259
  raise _void(
249
260
  "RECIPE_DRIFT",
250
261
  f"this run continues from a predecessor as a {job.mode}, and the seal was handed no "
251
- "restored predecessor tree to compare the successor with",
262
+ "authenticated predecessor record to compare the successor with",
252
263
  )
253
- before = _profile_shape(predecessor, "the restored predecessor")
254
- after = _profile_shape(snapshot, "this version")
264
+ before = _ProfileShape(columns=tuple(predecessor.columns), row_count=predecessor.row_count)
265
+ after = profile_shape(snapshot, "this version")
255
266
  if before.columns != after.columns:
256
267
  lost = [name for name, _ in before.columns if name not in dict(after.columns)]
257
268
  added = [name for name, _ in after.columns if name not in dict(before.columns)]
@@ -287,8 +298,12 @@ class _ProfileShape:
287
298
  row_count: int | None
288
299
 
289
300
 
290
- def _profile_shape(snapshot: Mapping[str, bytes], label: str) -> _ProfileShape:
291
- """The sealed column set and row count a tree's ``evidence/profile.json`` states."""
301
+ def profile_shape(snapshot: Mapping[str, bytes], label: str) -> _ProfileShape:
302
+ """The sealed column set and row count a tree's ``evidence/profile.json`` states.
303
+
304
+ Public because the receipt states this shape for the version it seals, so a later refresh
305
+ can compare against it without a tree to read: one reader for both sides of the comparison.
306
+ """
292
307
 
293
308
  try:
294
309
  profile = json.loads(snapshot["evidence/profile.json"])
@@ -574,7 +589,7 @@ def run_required_controls(
574
589
  verified: pipeline.VerifiedCandidate,
575
590
  snapshot: Mapping[str, bytes],
576
591
  coverage: Sequence[Any],
577
- predecessor_snapshot: Mapping[str, bytes] | None = None,
592
+ predecessor: PredecessorShape | None = None,
578
593
  ) -> tuple[ControlOutcome, ...]:
579
594
  """Evaluate every required control's disposition for one sealed version, in inventory order.
580
595
 
@@ -592,7 +607,7 @@ def run_required_controls(
592
607
  reader looks for them in.
593
608
  """
594
609
 
595
- drift = _recipe_drift(job, snapshot, predecessor_snapshot)
610
+ drift = _recipe_drift(job, snapshot, predecessor)
596
611
  temporal = _temporal_integrity(job)
597
612
  outcomes = (
598
613
  _exact_candidate_replay(verified, snapshot),