mostlyright-data 0.18.1__tar.gz → 0.18.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (566) hide show
  1. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/PKG-INFO +1 -1
  2. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/pyproject.toml +1 -1
  3. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connector.py +14 -5
  4. mostlyright_data-0.18.2/src/mostlyright/data_harness/sources/stream_numbers.py +338 -0
  5. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_segment_spill.py +27 -5
  6. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_subscription_feed.py +78 -6
  7. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_subscription_worker.py +99 -3
  8. mostlyright_data-0.18.1/src/mostlyright/data_harness/sources/stream_numbers.py +0 -93
  9. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/.gitignore +0 -0
  10. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/README.md +0 -0
  11. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/scripts/hatch_build.py +0 -0
  12. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/skills/mr-data-build/SKILL.md +0 -0
  13. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/skills/mr-data-build/agents/openai.yaml +0 -0
  14. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
  15. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/skills/mr-data-build/scripts/write_visual_run.py +0 -0
  16. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/__init__.py +0 -0
  17. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/LICENSE +0 -0
  18. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/PROVENANCE.json +0 -0
  19. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/__init__.py +0 -0
  20. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/__init__.pyi +0 -0
  21. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/_version.py +0 -0
  22. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/__init__.py +0 -0
  23. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/cal_rec_boxes/main.py +0 -0
  24. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/__init__.py +0 -0
  25. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/main.py +0 -0
  26. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_cls/utils.py +0 -0
  27. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/__init__.py +0 -0
  28. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/main.py +0 -0
  29. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_det/utils.py +0 -0
  30. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/__init__.py +0 -0
  31. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/main.py +0 -0
  32. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/typings.py +0 -0
  33. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/ch_ppocr_rec/utils.py +0 -0
  34. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/config.yaml +0 -0
  35. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/inference_engine/__init__.py +0 -0
  36. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/inference_engine/base.py +0 -0
  37. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/__init__.py +0 -0
  38. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/main.py +0 -0
  39. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/inference_engine/onnxruntime/provider_config.py +0 -0
  40. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/main.py +0 -0
  41. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_det_small.onnx +0 -0
  42. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/models/PP-OCRv6_rec_small.onnx +0 -0
  43. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/models/ch_ppocr_mobile_v2.0_cls_mobile.onnx +0 -0
  44. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/py.typed +0 -0
  45. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/__init__.py +0 -0
  46. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/load_image.py +0 -0
  47. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/log.py +0 -0
  48. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/model_resolver.py +0 -0
  49. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/output.py +0 -0
  50. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/parse_parameters.py +0 -0
  51. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/process_img.py +0 -0
  52. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/typings.py +0 -0
  53. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/_vendor/rapidocr/utils/utils.py +0 -0
  54. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/__init__.py +0 -0
  55. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  56. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/derived_credentials.py +0 -0
  57. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/http.py +0 -0
  58. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
  59. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  60. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  61. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  62. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
  63. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/sandbox_bootstrap.py +0 -0
  64. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
  65. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  66. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  67. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  68. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  69. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  70. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  71. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/reference.py +0 -0
  72. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/registry.py +0 -0
  73. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  74. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/bounded_query.py +0 -0
  75. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/bounded_scratch_sink.py +0 -0
  76. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/canonical.py +0 -0
  77. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/catalog_job.py +0 -0
  78. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/cli.py +0 -0
  79. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/compact_worker.py +0 -0
  80. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/contracts.py +0 -0
  81. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/coordinator.py +0 -0
  82. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/crosswalks.py +0 -0
  83. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/declared_checks.py +0 -0
  84. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/delta.py +0 -0
  85. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/delta_checks.py +0 -0
  86. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/delta_classifier.py +0 -0
  87. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/delta_persist.py +0 -0
  88. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/delta_recompute.py +0 -0
  89. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/delta_rows.py +0 -0
  90. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/deploy.py +0 -0
  91. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/deploy_target.py +0 -0
  92. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  93. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/__init__.py +0 -0
  94. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/_worker_capability.py +0 -0
  95. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/capture.py +0 -0
  96. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/contracts.py +0 -0
  97. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/lane.py +0 -0
  98. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/ocr.py +0 -0
  99. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/pdf.py +0 -0
  100. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/registry.py +0 -0
  101. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/sandbox.py +0 -0
  102. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/selections.py +0 -0
  103. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/tables.py +0 -0
  104. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/documents/vendor_rapidocr.py +0 -0
  105. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/events.py +0 -0
  106. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  107. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/fetch_egress_smoke.py +0 -0
  108. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/formats.py +0 -0
  109. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/governors.py +0 -0
  110. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
  111. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
  112. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  113. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
  114. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
  115. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  116. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
  117. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  118. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
  119. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  120. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_ingestion_worker.py +0 -0
  121. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_rlimit_as_container_smoke.py +0 -0
  122. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_run_worker.py +0 -0
  123. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
  124. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
  125. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  126. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_stream_recorder_container_smoke.py +0 -0
  127. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_stream_recorder_job.py +0 -0
  128. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_stream_subscription_container_smoke.py +0 -0
  129. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_stream_subscription_worker.py +0 -0
  130. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/hosted_worker.py +0 -0
  131. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/incremental_slice_executor.py +0 -0
  132. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/incremental_worker.py +0 -0
  133. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  134. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  135. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  136. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  137. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  138. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  139. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/inprocess_acquisition.py +0 -0
  140. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/key_seam.py +0 -0
  141. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/legacy_table_recovery.py +0 -0
  142. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/legacy_table_recovery_contract.py +0 -0
  143. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
  144. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/local_contracts.py +0 -0
  145. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  146. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  147. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  148. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  149. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  150. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  151. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  152. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  153. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  154. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  155. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  156. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  157. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  158. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  159. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  160. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  161. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  162. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/notebook.py +0 -0
  163. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/offline.py +0 -0
  164. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/operation_registry.py +0 -0
  165. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/operator_setup.py +0 -0
  166. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/page_coverage.py +0 -0
  167. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/part_check_evidence.py +0 -0
  168. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/pipeline.py +0 -0
  169. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/plan_graph.py +0 -0
  170. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  171. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  172. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  173. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  174. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  175. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  176. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  177. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/table.py +0 -0
  178. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  179. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/progress_events.py +0 -0
  180. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  181. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/_openpyxl.py +0 -0
  182. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/budgets.py +0 -0
  183. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/configurable_delimited.py +0 -0
  184. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/containers.py +0 -0
  185. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  186. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  187. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/geojson_vector.py +0 -0
  188. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/geopackage.py +0 -0
  189. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/geoparquet.py +0 -0
  190. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  191. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  192. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/collection.py +0 -0
  193. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/collection_reader.py +0 -0
  194. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  195. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  196. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  197. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/grib_eccodes.py +0 -0
  198. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/html_tabular.py +0 -0
  199. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/html_web_extract.py +0 -0
  200. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  201. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  202. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/pcaxis_px.py +0 -0
  203. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/protobuf_tabular.py +0 -0
  204. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/__init__.py +0 -0
  205. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/_bytes.py +0 -0
  206. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/decode.py +0 -0
  207. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/family.py +0 -0
  208. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/jpeg2000.py +0 -0
  209. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/profiles.py +0 -0
  210. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/rendered.py +0 -0
  211. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/safe.py +0 -0
  212. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/sentinel_safe.py +0 -0
  213. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/raster/tiff.py +0 -0
  214. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/registry.py +0 -0
  215. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  216. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  217. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  218. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  219. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  220. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  221. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
  222. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  223. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
  224. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  225. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
  226. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  227. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  228. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  229. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  230. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
  231. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
  232. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
  233. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
  234. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
  235. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
  236. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/2.0.0/publisher_preamble/expected.json +0 -0
  237. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/delimited_text/2.0.0/publisher_preamble/indices.csv +0 -0
  238. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/expected.json +0 -0
  239. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/geojson.vector/1.0.0/czech_capital/places.geojson +0 -0
  240. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/expected.json +0 -0
  241. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/geopackage.vector/1.0.0/epsg_4326_feature/places.gpkg +0 -0
  242. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/expected.json +0 -0
  243. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/geoparquet.vector/1.0.0/primary_wkb_point/places.parquet +0 -0
  244. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/expected.json +0 -0
  245. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/html.tabular/1.0.0/sanitized_table/table.html +0 -0
  246. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/expected.json +0 -0
  247. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.0.0/json_ld_scorecards/scorecards.html +0 -0
  248. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.1.0/article_text_order/article.html +0 -0
  249. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/html.web_extract/1.1.0/article_text_order/expected.json +0 -0
  250. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/expected.json +0 -0
  251. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/image.rendered/1.0.0/tiny_png/tiny-rendered.png +0 -0
  252. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  253. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  254. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
  255. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
  256. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/eccodes-bufr4.bufr +0 -0
  257. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/meteorology.bufr/1.0.0/eccodes_bufr4_subset/expected.json +0 -0
  258. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/expected.json +0 -0
  259. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/meteorology.grib/1.0.0/eccodes_grib1_origin/regular-ll-surface.grib1 +0 -0
  260. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/expected.json +0 -0
  261. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/microdata.sas_xpt/1.0.0/two_raw_columns/survey.xpt +0 -0
  262. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/expected.json +0 -0
  263. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/microdata.spss_sav/1.0.0/two_raw_columns/survey.sav +0 -0
  264. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/expected.json +0 -0
  265. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/microdata.stata_dta/1.0.0/two_raw_columns/stata.dta +0 -0
  266. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/expected.json +0 -0
  267. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/official.pcaxis_px/1.0.0/population_by_region_and_year/population.px +0 -0
  268. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/expected.json +0 -0
  269. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/official.sdmx_json/1.0.0/compact_population_series/population.json +0 -0
  270. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  271. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  272. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/expected.json +0 -0
  273. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/gtfs-realtime.desc +0 -0
  274. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/protobuf.tabular/1.0.0/gtfs_realtime_trip_updates/trip-updates.pb +0 -0
  275. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/expected.json +0 -0
  276. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/raster.geospatial/1.0.0/tiny_geotiff/tiny-geospatial.tif +0 -0
  277. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/expected.json +0 -0
  278. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.goes_abi_l2/1.0.0/authored_cmi_window/goes-abi-l2-cmi-window.nc +0 -0
  279. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/expected.json +0 -0
  280. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd/1.0.0/authored_b13_single_bzip2/himawari-b13-0101-bzip2.dat +0 -0
  281. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/expected.json +0 -0
  282. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.himawari_hsd_complete/1.0.0/authored_b13_three_segment_scan/himawari-hsd-b13-complete.zip +0 -0
  283. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/expected.json +0 -0
  284. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.msg_seviri_l15/1.0.0/authored_calibrated_complete_visir/msg-seviri-l15.zip +0 -0
  285. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/expected.json +0 -0
  286. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.sentinel_safe/1.0.0/authored_b02_scl_window/sentinel-safe-b02-scl.zip +0 -0
  287. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/expected.json +0 -0
  288. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/satellite.xrit_image/1.0.0/authored_complete_raw_counts/xrit-complete-image.zip +0 -0
  289. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/expected.json +0 -0
  290. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.fits/1.0.0/tiny_primary_window/tiny-primary.fits +0 -0
  291. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/expected.json +0 -0
  292. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf4/1.0.0/authored_temperature_window/temperature.hdf +0 -0
  293. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/expected.json +0 -0
  294. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf5/1.0.0/authored_temperature_window/temperature.h5 +0 -0
  295. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/expected.json +0 -0
  296. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_grid_temperature_window/nasa-hdfeos2-grid.hdf +0 -0
  297. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/expected.json +0 -0
  298. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.hdf_eos2/1.0.0/authored_swath_temperature_window/nasa-hdfeos2-swath.hdf +0 -0
  299. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/expected.json +0 -0
  300. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.netcdf/1.0.0/authored_classic_temperature_window/temperature-classic.nc +0 -0
  301. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/expected.json +0 -0
  302. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/scientific.zarr/1.0.0/authored_v3_temperature_window/temperature-zarr-v3.zip +0 -0
  303. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  304. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
  305. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  306. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  307. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  308. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  309. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  310. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  311. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  312. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  313. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  314. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  315. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  316. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  317. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  318. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/expected.json +0 -0
  319. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/weather.grib2/3.0.0/gfs_and_hrrr_categorical_rain/gfs-and-hrrr-categorical-rain.grib2 +0 -0
  320. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/expected.json +0 -0
  321. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/plain_filing_fact/filing.xml +0 -0
  322. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/expected.json +0 -0
  323. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xbrl.facts/1.0.0/xml_inline_fact/filing.xhtml +0 -0
  324. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/expected.json +0 -0
  325. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/pacer_rss_feed/feed.xml +0 -0
  326. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/expected.json +0 -0
  327. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/sec_form_d_filing/filing.xml +0 -0
  328. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/agenda.xml +0 -0
  329. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples/xml.tabular/1.0.0/unified_agenda_extract/expected.json +0 -0
  330. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/samples.py +0 -0
  331. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific.py +0 -0
  332. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/__init__.py +0 -0
  333. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/container.py +0 -0
  334. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/goes.py +0 -0
  335. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4.py +0 -0
  336. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf4_bridge.py +0 -0
  337. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/hdf5.py +0 -0
  338. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/native.py +0 -0
  339. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/netcdf.py +0 -0
  340. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/profiles.py +0 -0
  341. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/raw.py +0 -0
  342. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_arrays/zarr.py +0 -0
  343. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_catalog.py +0 -0
  344. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/__init__.py +0 -0
  345. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/asset_sets.py +0 -0
  346. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/formats.py +0 -0
  347. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/hsd.py +0 -0
  348. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/native.py +0 -0
  349. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/profiles.py +0 -0
  350. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/reader.py +0 -0
  351. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/scientific_segmented/xrit.py +0 -0
  352. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/sdmx_json.py +0 -0
  353. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  354. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/statistical_microdata.py +0 -0
  355. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  356. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/vector.py +0 -0
  357. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/vector_wkb.py +0 -0
  358. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/xbrl_facts.py +0 -0
  359. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/readers/xml_tabular.py +0 -0
  360. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/recipe.py +0 -0
  361. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/review.py +0 -0
  362. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/rowset.py +0 -0
  363. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/run_execution_v4.py +0 -0
  364. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/run_phase_timing.py +0 -0
  365. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/session_probes.py +0 -0
  366. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/signing.py +0 -0
  367. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/skill_assets.py +0 -0
  368. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_bootstrap.py +0 -0
  369. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_bundle_writer.py +0 -0
  370. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_discovery.py +0 -0
  371. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_history_candidate_child.py +0 -0
  372. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_history_transform_child.py +0 -0
  373. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_inventory.py +0 -0
  374. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_partition.py +0 -0
  375. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_raw_inventory.py +0 -0
  376. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/source_state_index.py +0 -0
  377. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/__init__.py +0 -0
  378. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
  379. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/adapters.py +0 -0
  380. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  381. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  382. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/authenticated_https_v3.py +0 -0
  383. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  384. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  385. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  386. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  387. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  388. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  389. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  390. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  391. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  392. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  393. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  394. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  395. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  396. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  397. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
  398. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
  399. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  400. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  401. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
  402. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  403. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  404. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  405. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  406. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  407. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  408. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  409. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  410. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  411. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  412. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  413. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  414. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  415. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  416. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  417. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  418. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  419. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  420. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  421. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  422. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  423. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/collections.py +0 -0
  424. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/contracts.py +0 -0
  425. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/dataset.py +0 -0
  426. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  427. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/document_projection.py +0 -0
  428. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/fitness.py +0 -0
  429. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/governance.py +0 -0
  430. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  431. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/integration.py +0 -0
  432. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/page_collections.py +0 -0
  433. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  434. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/registry.py +0 -0
  435. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
  436. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  437. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/sports.py +0 -0
  438. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream.py +0 -0
  439. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
  440. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.array-frames.v4.json +0 -0
  441. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.cursor-resume.v3.json +0 -0
  442. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.json-keepalive.v4.json +0 -0
  443. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-ed25519.v2.json +0 -0
  444. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac.v2.json +0 -0
  445. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac384.v2.json +0 -0
  446. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame-hmac512.v2.json +0 -0
  447. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-frame.v2.json +0 -0
  448. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header-rsa.v2.json +0 -0
  449. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-header.v2.json +0 -0
  450. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage-jwt.v2.json +0 -0
  451. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-permessage.v2.json +0 -0
  452. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-prelude.v2.json +0 -0
  453. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-query.v2.json +0 -0
  454. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subprotocol.v2.json +0 -0
  455. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-subscribe.v2.json +0 -0
  456. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.keyed-urlpath.v2.json +0 -0
  457. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.loose-frames.v4.json +0 -0
  458. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/fixture.text-keepalive.v4.json +0 -0
  459. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
  460. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_credential.py +0 -0
  461. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_prelude.py +0 -0
  462. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
  463. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
  464. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
  465. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_segment_recorder.py +0 -0
  466. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
  467. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_signing.py +0 -0
  468. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
  469. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/sql_transform_engine.py +0 -0
  470. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_order_vector.py +0 -0
  471. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_recovery_objects.py +0 -0
  472. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_subscription_sealer.py +0 -0
  473. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_venue.py +0 -0
  474. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/stream_venue_staging.py +0 -0
  475. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/studio_boundary.py +0 -0
  476. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/studio_subscription_control.py +0 -0
  477. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/table_manifest.py +0 -0
  478. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/table_parts.py +0 -0
  479. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/table_profile.py +0 -0
  480. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  481. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  482. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  483. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/activity.py +0 -0
  484. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  485. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/categories.py +0 -0
  486. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/collection_plan.py +0 -0
  487. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/commands.py +0 -0
  488. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/dataset-categories-v1.json +0 -0
  489. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/download.py +0 -0
  490. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  491. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/parity.py +0 -0
  492. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/probe.py +0 -0
  493. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/propose.py +0 -0
  494. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/recipe.py +0 -0
  495. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/research.py +0 -0
  496. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/router.py +0 -0
  497. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/runs.py +0 -0
  498. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/session.py +0 -0
  499. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/stream.py +0 -0
  500. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
  501. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/transport.py +0 -0
  502. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/user_agent.py +0 -0
  503. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4.py +0 -0
  504. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_artifacts.py +0 -0
  505. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_catalog.py +0 -0
  506. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_connections.py +0 -0
  507. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
  508. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_datasets.py +0 -0
  509. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
  510. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
  511. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_query.py +0 -0
  512. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_runs.py +0 -0
  513. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
  514. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
  515. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/v4_tables.py +0 -0
  516. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
  517. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/thin/workers.py +0 -0
  518. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  519. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  520. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/unit_flow.py +0 -0
  521. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/units.py +0 -0
  522. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  523. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/attendance.py +0 -0
  524. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/clarification.py +0 -0
  525. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  526. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  527. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  528. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  529. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  530. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  531. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
  532. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  533. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
  534. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  535. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  536. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  537. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  538. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/headline.py +0 -0
  539. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  540. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/local_review.py +0 -0
  541. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/login.py +0 -0
  542. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  543. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  544. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/readers.py +0 -0
  545. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/remediation.py +0 -0
  546. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/ux/render.py +0 -0
  547. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_acquisition.py +0 -0
  548. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_check_dialect.py +0 -0
  549. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_closed_source.py +0 -0
  550. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_document_pin.py +0 -0
  551. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_reader_pin.py +0 -0
  552. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_recipe.py +0 -0
  553. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_required_controls.py +0 -0
  554. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_snapshot_artifact.py +0 -0
  555. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_stream_recording.py +0 -0
  556. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_transform.py +0 -0
  557. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/v4_window.py +0 -0
  558. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  559. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  560. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  561. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  562. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  563. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  564. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  565. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  566. {mostlyright_data-0.18.1 → mostlyright_data-0.18.2}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyright-data
3
- Version: 0.18.1
3
+ Version: 0.18.2
4
4
  Summary: Mostly Right CLI for reproducible, reviewed Parquet datasets
5
5
  Project-URL: Homepage, https://mostlyright.md/
6
6
  Project-URL: Documentation, https://mostlyright.md/docs/guides/cli/
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mostlyright-data"
3
- version = "0.18.1"
3
+ version = "0.18.2"
4
4
  description = "Mostly Right CLI for reproducible, reviewed Parquet datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -57,7 +57,6 @@ from mostlyright.data_harness.canonical import (
57
57
  CanonicalJSONError,
58
58
  canonical_json_bytes,
59
59
  canonical_sha256,
60
- parse_json,
61
60
  )
62
61
  from mostlyright.data_harness.sources.authenticated_https import _canonical_origin
63
62
  from mostlyright.data_harness.sources.authenticated_https_v2 import (
@@ -69,7 +68,7 @@ from mostlyright.data_harness.sources.authenticated_https_v2 import (
69
68
  _parse_request,
70
69
  )
71
70
  from mostlyright.data_harness.sources.contracts import SourceContractError
72
- from mostlyright.data_harness.sources.stream_numbers import parse_json_numbers_as_text
71
+ from mostlyright.data_harness.sources.stream_numbers import parse_frame_json
73
72
 
74
73
  STREAM_CONNECTOR_VERSION = "harness-stream-connector.v1"
75
74
  STREAM_CONNECTOR_VERSION_V2 = "harness-stream-connector.v2"
@@ -860,11 +859,21 @@ class StreamConnectorConfig:
860
859
  The single reader every caller that reads a frame of this venue picks up, so a capture, a
861
860
  credential acknowledgement and a probe cannot disagree about whether ``0.5`` is a message
862
861
  or a decode error.
862
+
863
+ BOTH READINGS GO THROUGH THE FRAME READER, which differs from the document reader in one
864
+ bound and one only: how many JSON members one frame may carry. A frame is bounded by bytes
865
+ where it was assembled, and a venue asked about a large roster answers the whole roster in
866
+ one array; the canonical member ceiling was written for what this build seals, and applying
867
+ it here refused an answer this build had asked for. Whether that array IS a batch is this
868
+ document's word (``frame_shape``), and the reader is told it, because a batch is sealed
869
+ element by element and a single message is sealed whole: each is held at the read to what
870
+ its seal will hold it to. See
871
+ :func:`~mostlyright.data_harness.sources.stream_numbers.parse_frame_json`.
863
872
  """
864
873
 
865
- if self.numbers == NUMBERS_TEXT:
866
- return parse_json_numbers_as_text(text)
867
- return parse_json(text)
874
+ return parse_frame_json(
875
+ text, numbers_as_text=self.numbers == NUMBERS_TEXT, batches=self.admits_array_frames
876
+ )
868
877
 
869
878
  @property
870
879
  def ignores_untyped_messages(self) -> bool:
@@ -0,0 +1,338 @@
1
+ """Read a venue frame, in either number reading, under the bounds a frame actually has.
2
+
3
+ The text reading is a third reading beside :func:`parse_json` and :func:`parse_foreign_json`, for
4
+ a document whose numbers have to survive being sealed. A venue that writes a price as ``0.5``
5
+ writes a fractional number, and :func:`parse_json` refuses one because nothing fractional may
6
+ reach a digest;
7
+ :func:`parse_foreign_json` reads it as a float, which may be inspected but never written, so a frame
8
+ read that way could not become a recorded line. Neither answer is available to a reader whose
9
+ whole job is to keep the frame.
10
+
11
+ So the number is kept as the literal its sender wrote. ``parse_int`` and ``parse_float`` are
12
+ handed the exact text JSON's own grammar matched -- ``0.5``, ``-3``, ``1e9`` -- and that text is the
13
+ value. No precision is chosen, because none is computed: the string that comes back is the string
14
+ that went in, so ``0.10`` and ``0.1`` stay the two different things the venue said them as, and a
15
+ seventy-seven-digit integer keeps all seventy-seven digits. The result holds a string wherever a
16
+ number stood and is therefore an ordinary value of the canonical data model:
17
+ :func:`~mostlyright.data_harness.canonical.canonical_json_bytes` seals it and :func:`parse_json`
18
+ reads it back unchanged.
19
+
20
+ Everything else is exactly as strict as the canonical reader. ``NaN`` and ``Infinity`` are still
21
+ refused, and so are duplicate object keys, byte-order marks, non-strict UTF-8, unpaired surrogates,
22
+ and the depth and string-length bounds. The reader lives beside the canonical module rather than
23
+ inside it because that module's bytes are a cross-system pin.
24
+
25
+ THE MEMBER BOUND IS THE ONE THING A FRAME DOES NOT SHARE WITH A DOCUMENT, and
26
+ :func:`parse_frame_json` is the reader that says so, for BOTH number readings. A frame is already
27
+ bounded, by bytes, at the transport that assembled it; the canonical member ceiling was written for
28
+ what this build seals and digests, where a hundred thousand members is far past anything authored
29
+ here. A venue asked about a roster of sixteen hundred members answers all sixteen hundred in one
30
+ array, and a count written for a different kind of document refused the answer it had been asked
31
+ for. See :data:`MAX_FRAME_MEMBERS` for where the frame's ceiling comes from instead, and
32
+ :func:`parse_frame_json` for why nothing it admits is ever sealed as one value.
33
+ """
34
+
35
+ from __future__ import annotations
36
+
37
+ import json
38
+ import math
39
+ from collections.abc import Callable
40
+ from typing import Any
41
+
42
+ from mostlyright.data_harness.canonical import (
43
+ MAX_CANONICAL_DEPTH,
44
+ MAX_CANONICAL_INTEGER,
45
+ MAX_CANONICAL_MEMBERS,
46
+ MAX_CANONICAL_STRING_LENGTH,
47
+ CanonicalJSONError,
48
+ _parse_integer,
49
+ _reject_constant,
50
+ _reject_duplicate_pairs,
51
+ _reject_fraction,
52
+ _validate_unicode,
53
+ )
54
+
55
+ __all__ = [
56
+ "MAX_FRAME_MEMBERS",
57
+ "MAX_MESSAGE_MEMBERS",
58
+ "RECORDED_LINE_WRAPPER_MEMBERS",
59
+ "parse_frame_json",
60
+ ]
61
+
62
+ #: The largest number of JSON members one frame off a socket may be read as.
63
+ #:
64
+ #: A FRAME IS NOT A DOCUMENT THIS BUILD WRITES, and the canonical member ceiling was written for
65
+ #: one that is. :data:`~mostlyright.data_harness.canonical.MAX_CANONICAL_MEMBERS` bounds what may
66
+ #: be sealed, digested and read back, where a hundred thousand members is already far past
67
+ #: anything this repository authors. A frame is a venue's own answer to a subscription, and a
68
+ #: venue that is asked about sixteen hundred members may answer all sixteen hundred in one array,
69
+ #: each an object of a few dozen members with nested sides of its own. That frame is bounded
70
+ #: already -- by bytes, at the transport, where an assembled message past
71
+ #: ``MAX_MESSAGE_BYTES`` is refused before a reader ever sees it -- and bounding it a second time
72
+ #: by a count written for a different kind of document refuses an answer the venue was asked for.
73
+ #:
74
+ #: So the ceiling here is DERIVED FROM THE BOUND THAT ALREADY HOLDS rather than chosen: the
75
+ #: smallest JSON member is two bytes (``[]`` is one member in one pair of bytes, and every member
76
+ #: inside a container costs at least a delimiter and a character), so a frame of at most N bytes
77
+ #: cannot hold more than N // 2 members. The count therefore adds no capacity the byte bound did
78
+ #: not already grant -- it stays a real ceiling for a reader walking a value that is not bytes,
79
+ #: while never being the bound that decides a frame. The relationship is asserted against the
80
+ #: transport's own constant in the connector's tests; it is not imported, because the reader of a
81
+ #: frame's bytes has no business reaching the socket that assembled them.
82
+ MAX_FRAME_MEMBERS = (8 * 1024 * 1024) // 2
83
+
84
+ #: How many JSON members the WIDEST line this build writes adds around the message it carries.
85
+ #:
86
+ #: A venue message is written down more than once on its way to a table. The capture session
87
+ #: and the segment recorder write it as ``{"epoch": …, "message": …, "received_at": …}``, three
88
+ #: members it did not bring; the Recorder then seals it as one line of exactly the members
89
+ #: ``sources.stream.SEALED_FRAME_KEYS`` names -- the line object and seven scalar siblings
90
+ #: beside ``message`` -- which is eight. The ceiling below is derived from the widest of those,
91
+ #: because a message that fits the first line and not the last is admitted at the read and
92
+ #: refused at the seal, which is the failure this module exists to remove. The number is stated
93
+ #: here rather than imported, for the reason the frame ceiling states its own: this reader has
94
+ #: no business reaching the Recorder, and the tests hold the two equal so a key added to the
95
+ #: sealed line moves this or fails the build.
96
+ RECORDED_LINE_WRAPPER_MEMBERS = 8
97
+
98
+ #: The largest number of JSON members ONE MESSAGE may carry and still be sealed as one line.
99
+ #:
100
+ #: The frame ceiling above is about what a venue may answer with; this is about what this build
101
+ #: may write down, and it is the canonical ceiling less the widest line's wrapper. A message is
102
+ #: sealed by the canonical writer as one recorded line and read back by the strict reader as one,
103
+ #: so a message past this count is one the seal refuses whatever the read admitted. THE READ
104
+ #: THEREFORE HOLDS IT TOO: a frame that is one message is read under this ceiling exactly as it
105
+ #: always was, and a batch frame's elements are each read under it, because each becomes one
106
+ #: line. Only the batch as a whole may exceed it, up to the frame ceiling, because a batch is
107
+ #: never sealed whole. Nothing this reader admits is refused one step later for its size.
108
+ MAX_MESSAGE_MEMBERS = MAX_CANONICAL_MEMBERS - RECORDED_LINE_WRAPPER_MEMBERS
109
+
110
+
111
+ def parse_frame_json(
112
+ value: str | bytes | bytearray | memoryview, *, numbers_as_text: bool, batches: bool
113
+ ) -> Any:
114
+ """Read ONE FRAME off a socket, in either number reading, bounded the way a frame is bounded.
115
+
116
+ The two readings are the same reader here on purpose. Whether ``0.5`` is a message or a decode
117
+ error is the venue document's statement and is answered by ``numbers_as_text``; how large an
118
+ answer a venue may give is not a number-reading question at all, and a frame ceiling that
119
+ applied to only one of the two readings would be a build where a venue's answer was admitted
120
+ or refused according to how its prices are spelled.
121
+
122
+ EVERY OTHER BOUND IS THE CANONICAL ONE, UNCHANGED: duplicate object keys, byte-order marks,
123
+ non-strict UTF-8, ``NaN``/``Infinity``, out-of-range integers, unpaired surrogates, the
124
+ sixty-four-level nesting bound and the string-length bound all refuse exactly what they refuse
125
+ for a document. Only the member count differs, and it differs by what will be sealed.
126
+
127
+ ``batches`` is the document's word on whether an array frame is a batch of messages, and it
128
+ decides which ceiling holds over what. A frame that is ONE MESSAGE is read under
129
+ :data:`MAX_MESSAGE_MEMBERS`, because it becomes one recorded line and a line past the canonical
130
+ ceiling is one the seal refuses -- which is the count a frame was always read under, less the
131
+ widest line's wrapper. A frame that is a BATCH is read under :data:`MAX_FRAME_MEMBERS` as a
132
+ whole and under :data:`MAX_MESSAGE_MEMBERS` per element, because ``_admit_batch``
133
+ and the hosted feed's ``_frame_messages`` write each element as its own line with its own
134
+ sequence and the frame's arrival time, and the strict reader that reads a recording back
135
+ (``stream_recorder``) reads those LINES, one message each. So a frame carrying a venue's whole
136
+ roster becomes a thousand-odd ordinary documents, every one of them under the canonical
137
+ member ceiling, and that ceiling goes on holding over everything this build writes and
138
+ digests. A refusal for size is raised HERE, at the read every lane already guards, and
139
+ never one step later at a write no lane guards; the transport bounds the bytes, and every
140
+ place a frame is written down afterwards holds whatever the transport admitted.
141
+ """
142
+
143
+ return _read(
144
+ value,
145
+ number=_number_literal if numbers_as_text else None,
146
+ max_members=MAX_MESSAGE_MEMBERS,
147
+ batch_ceiling=MAX_FRAME_MEMBERS if batches else None,
148
+ )
149
+
150
+
151
+ def _read(
152
+ value: str | bytes | bytearray | memoryview,
153
+ *,
154
+ number: Callable[[str], str] | None,
155
+ max_members: int,
156
+ batch_ceiling: int | None = None,
157
+ ) -> Any:
158
+ """The one reading both entry points are, differing only in numbers and in member ceiling.
159
+
160
+ ``max_members`` bounds whatever is read as ONE VALUE: a document, a message, or one element
161
+ of a batch. With a ``batch_ceiling``, a top-level array is a batch -- walked one element at a
162
+ time, each under ``max_members`` with a count of its own, and the array as a whole held to
163
+ the batch ceiling beside them; anything that is not a top-level array is one value as
164
+ before. The paths and the depth are exactly what one walk over the whole array would have
165
+ named, so a refusal reads the same whichever way the array was walked.
166
+ """
167
+
168
+ if isinstance(value, str):
169
+ text = value
170
+ elif isinstance(value, (bytes, bytearray, memoryview)):
171
+ raw = bytes(value)
172
+ if raw.startswith(b"\xef\xbb\xbf"):
173
+ raise CanonicalJSONError("JSON_BOM", "$", "UTF-8 byte-order marks are not allowed")
174
+ try:
175
+ text = raw.decode("utf-8", errors="strict")
176
+ except UnicodeDecodeError as exc:
177
+ raise CanonicalJSONError(
178
+ "JSON_UTF8",
179
+ "$",
180
+ f"input is not strict UTF-8 at byte {exc.start}",
181
+ ) from None
182
+ else:
183
+ raise CanonicalJSONError(
184
+ "JSON_INPUT_TYPE",
185
+ "$",
186
+ "JSON input must be text or a bytes-like value",
187
+ )
188
+
189
+ if text.startswith("\ufeff"):
190
+ raise CanonicalJSONError("JSON_BOM", "$", "Unicode byte-order marks are not allowed")
191
+ try:
192
+ parsed = json.loads(
193
+ text,
194
+ object_pairs_hook=_reject_duplicate_pairs,
195
+ parse_int=number or _parse_integer,
196
+ parse_float=number or _reject_fraction,
197
+ parse_constant=_reject_constant,
198
+ )
199
+ except CanonicalJSONError:
200
+ raise
201
+ except json.JSONDecodeError as exc:
202
+ raise CanonicalJSONError(
203
+ "JSON_SYNTAX",
204
+ "$",
205
+ f"invalid JSON at line {exc.lineno}, column {exc.colno}",
206
+ ) from None
207
+ if batch_ceiling is None or not isinstance(parsed, list):
208
+ return _normalize(parsed, "$", depth=0, members=[0], max_members=max_members)
209
+ total = 1
210
+ for index, element in enumerate(parsed):
211
+ counted = [0]
212
+ _normalize(element, f"$[{index}]", depth=1, members=counted, max_members=max_members)
213
+ total += counted[0]
214
+ if total > batch_ceiling:
215
+ raise CanonicalJSONError("JSON_MEMBERS", "$", f"value exceeds {batch_ceiling} members")
216
+ return parsed
217
+
218
+
219
+ def _normalize(
220
+ value: Any,
221
+ path: str,
222
+ *,
223
+ depth: int,
224
+ members: list[int],
225
+ max_members: int,
226
+ ) -> Any:
227
+ """:func:`~mostlyright.data_harness.canonical._normalize_json`, with the ceiling as an argument.
228
+
229
+ Written here rather than reached for there because the canonical module's BYTES ARE A
230
+ CROSS-SYSTEM PIN and may not move to grow a parameter. Every bound below is the canonical
231
+ one, spelled the same way and raising the same code at the same path; ``max_members`` is the
232
+ only thing this walk is told rather than knows. That the two agree is not asserted by reading
233
+ them side by side -- ``tests/test_canonical.py`` walks a corpus through both and requires the
234
+ same value or the same refusal from each.
235
+
236
+ IT VALIDATES IN PLACE AND BUILDS NOTHING. The canonical walk returns a fresh tree because it
237
+ is handed arbitrary Python values -- tuples, ordered mappings, whatever a caller composed --
238
+ and has to hand back the one shape it seals. This walk is handed only what ``json.loads``
239
+ just built from a frame, which is already that shape, so a second tree of it would be the
240
+ same value at twice the cost. The cost matters because the frame is a venue's: eight
241
+ mebibytes of two-byte containers is millions of objects, and the parse that builds them is
242
+ the peak a hostile frame can reach in this process -- the same peak the canonical reader has
243
+ always reached on such a frame before its own count could trip -- and this walk does not
244
+ raise it. The parse is bounded by the transport's byte bound and by nothing else; nothing
245
+ here pretends the member count bounds memory, because it never did.
246
+
247
+ The fractional-number branch is here for the canonical module's non-finite refusal only.
248
+ A frame is read either strictly, where a fraction is refused at the scanner before this walk
249
+ ever sees it, or as text, where it never became a float; no caller of this reader admits one,
250
+ so the foreign-document allowance has nothing to correspond to, but a float that did arrive
251
+ would be refused with the same code the canonical walk gives it.
252
+ """
253
+
254
+ if depth > MAX_CANONICAL_DEPTH:
255
+ raise CanonicalJSONError(
256
+ "JSON_DEPTH",
257
+ path,
258
+ f"nesting exceeds {MAX_CANONICAL_DEPTH} levels",
259
+ )
260
+ members[0] += 1
261
+ if members[0] > max_members:
262
+ raise CanonicalJSONError(
263
+ "JSON_MEMBERS",
264
+ path,
265
+ f"value exceeds {max_members} members",
266
+ )
267
+
268
+ if value is None or type(value) is bool:
269
+ return value
270
+ if type(value) is int:
271
+ if not -MAX_CANONICAL_INTEGER - 1 <= value <= MAX_CANONICAL_INTEGER:
272
+ raise CanonicalJSONError(
273
+ "JSON_INTEGER_RANGE",
274
+ path,
275
+ "integer is outside the signed 64-bit range",
276
+ )
277
+ return value
278
+ if type(value) is float:
279
+ if not math.isfinite(value):
280
+ raise CanonicalJSONError(
281
+ "JSON_NONFINITE",
282
+ path,
283
+ "non-finite JSON numbers are unsupported",
284
+ )
285
+ raise CanonicalJSONError(
286
+ "JSON_NONINTEGER_NUMBER",
287
+ path,
288
+ "non-integer JSON numbers are unsupported",
289
+ )
290
+ if isinstance(value, str):
291
+ if len(value) > MAX_CANONICAL_STRING_LENGTH:
292
+ raise CanonicalJSONError(
293
+ "JSON_STRING_LENGTH",
294
+ path,
295
+ f"string exceeds {MAX_CANONICAL_STRING_LENGTH} code points",
296
+ )
297
+ _validate_unicode(value, path)
298
+ return value
299
+ if isinstance(value, dict):
300
+ if any(not isinstance(key, str) for key in value):
301
+ raise CanonicalJSONError(
302
+ "JSON_OBJECT_KEY",
303
+ path,
304
+ "object keys must all be strings",
305
+ )
306
+ for key, item in value.items():
307
+ _validate_unicode(key, f"{path}.<key>")
308
+ child = f"{path}.{key}" if key else f"{path}['']"
309
+ _normalize(item, child, depth=depth + 1, members=members, max_members=max_members)
310
+ return value
311
+ if isinstance(value, list):
312
+ for index, item in enumerate(value):
313
+ _normalize(
314
+ item,
315
+ f"{path}[{index}]",
316
+ depth=depth + 1,
317
+ members=members,
318
+ max_members=max_members,
319
+ )
320
+ return value
321
+ # A tuple is the one shape the canonical walk copies into a list. A walk that copies nothing
322
+ # cannot, and ``json.loads`` never produces one, so it is refused rather than half-handled.
323
+ raise CanonicalJSONError(
324
+ "JSON_VALUE_TYPE",
325
+ path,
326
+ f"unsupported value type {type(value).__name__}",
327
+ )
328
+
329
+
330
+ def _number_literal(value: str) -> str:
331
+ """Return a JSON number exactly as it was written, as text.
332
+
333
+ The hook JSON's own scanner hands the matched literal to, so this is the sender's spelling and
334
+ not a rendering of something parsed out of it. Nothing is widened, narrowed or rounded on the
335
+ way through, because nothing is converted.
336
+ """
337
+
338
+ return value
@@ -20,7 +20,11 @@ every frame to disk as it goes -- and this is what lets the pending prefix reach
20
20
  of waiting in RAM for the rest of the segment.
21
21
 
22
22
  The file is an ordinary append log, one canonical JSON object per line, raw frame bytes carried in
23
- base64 because a provider frame is bytes and a line is text. It is written with the work root's
23
+ base64 because a provider frame is bytes and a line is text -- in a LIST of pieces, because a
24
+ canonical string is bounded at ``MAX_CANONICAL_STRING_LENGTH`` code points and a frame the
25
+ transport admits may be eight mebibytes: every frame the feed accepted has to be one this file
26
+ can hold, whatever its size, or a segment fails at its high-water mark for one frame that had
27
+ nowhere else to go. It is written with the work root's
24
28
  own permissions, it is never delivered anywhere, and it is discarded the moment the segment it
25
29
  belongs to is sealed or abandoned. Nothing about it is evidence: the evidence is what the
26
30
  recorder seals from it.
@@ -40,6 +44,7 @@ from collections.abc import Iterator, Sequence
40
44
  from pathlib import Path
41
45
 
42
46
  from mostlyright.data_harness.canonical import (
47
+ MAX_CANONICAL_STRING_LENGTH,
43
48
  CanonicalJSONError,
44
49
  canonical_json_bytes,
45
50
  parse_json,
@@ -53,6 +58,10 @@ from mostlyright.data_harness.stream_subscription_worker import (
53
58
  #: The file one spilled segment lives in, beneath its own directory.
54
59
  SPILL_FILE_NAME = "frames.ndjson"
55
60
 
61
+ #: How many raw bytes one piece of a spilled frame carries: what one canonical string holds in
62
+ #: base64, which writes four characters for every three bytes. Derived so the two cannot drift.
63
+ SPILL_PIECE_BYTES = (MAX_CANONICAL_STRING_LENGTH // 4) * 3
64
+
56
65
  #: The exact members one spilled record carries. Equality in both directions, so a record written
57
66
  #: by a build that knew about one more field is refused rather than partly read.
58
67
  _RECORD_MEMBERS = frozenset(
@@ -149,7 +158,16 @@ class SegmentSpill:
149
158
  landed_bytes = 0
150
159
  try:
151
160
  for frame in frames:
152
- _write(descriptor, canonical_json_bytes(_record(frame)) + b"\n")
161
+ try:
162
+ line = canonical_json_bytes(_record(frame))
163
+ except CanonicalJSONError as error:
164
+ # Unreachable for any frame the transport admits, since the pieces are cut to
165
+ # what one canonical string holds; kept so a refusal here is this module's
166
+ # own word rather than an escaping reader error.
167
+ raise StreamSubscriptionError(
168
+ "STREAM_SUBSCRIPTION_SEGMENT_INVALID", "spilled frame could not be written"
169
+ ) from error
170
+ _write(descriptor, line + b"\n")
153
171
  landed += 1
154
172
  landed_bytes += len(frame.raw)
155
173
  # Once, after the batch rather than after every frame: the durability this needs is
@@ -204,10 +222,14 @@ _SAFE_ID_CHARACTERS = frozenset("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU
204
222
 
205
223
 
206
224
  def _record(frame: StreamFrame) -> dict[str, object]:
225
+ pieces = [
226
+ base64.b64encode(frame.raw[start : start + SPILL_PIECE_BYTES]).decode("ascii")
227
+ for start in range(0, len(frame.raw), SPILL_PIECE_BYTES)
228
+ ]
207
229
  return {
208
230
  "provider_event_id": frame.provider_event_id,
209
231
  "cursor": frame.cursor,
210
- "raw": base64.b64encode(frame.raw).decode("ascii"),
232
+ "raw": pieces,
211
233
  "received_at": frame.received_at,
212
234
  "connection_epoch": frame.connection_epoch,
213
235
  "snapshot": frame.snapshot,
@@ -226,12 +248,12 @@ def _frame(line: bytes) -> StreamFrame:
226
248
  "STREAM_SUBSCRIPTION_SEGMENT_INVALID", "spilled frame does not carry its exact members"
227
249
  )
228
250
  raw = value["raw"]
229
- if not isinstance(raw, str):
251
+ if not isinstance(raw, list) or not all(isinstance(piece, str) for piece in raw):
230
252
  raise StreamSubscriptionError(
231
253
  "STREAM_SUBSCRIPTION_SEGMENT_INVALID", "spilled frame carries no readable payload"
232
254
  )
233
255
  try:
234
- decoded = base64.b64decode(raw, validate=True)
256
+ decoded = b"".join(base64.b64decode(piece, validate=True) for piece in raw)
235
257
  except (binascii.Error, ValueError) as error:
236
258
  raise StreamSubscriptionError(
237
259
  "STREAM_SUBSCRIPTION_SEGMENT_INVALID", "spilled frame carries no readable payload"
@@ -11,15 +11,16 @@ from __future__ import annotations
11
11
  import asyncio
12
12
  import contextlib
13
13
  import logging
14
+ import re
14
15
  import threading
15
16
  import time
16
- from collections.abc import Callable
17
+ from collections.abc import Callable, Iterator
17
18
  from concurrent.futures import Future
18
19
  from dataclasses import replace
19
20
  from datetime import UTC, datetime
20
21
  from typing import Any
21
22
 
22
- from mostlyright.data_harness.canonical import canonical_json_bytes
23
+ from mostlyright.data_harness.canonical import CanonicalJSONError, canonical_json_bytes
23
24
  from mostlyright.data_harness.sources.contracts import SourceContractError
24
25
  from mostlyright.data_harness.sources.stream_capture_session import (
25
26
  is_keepalive_reply,
@@ -44,7 +45,9 @@ from mostlyright.data_harness.stream_subscription_worker import (
44
45
  CursorReplayUnavailable,
45
46
  FrameMemoryBudget,
46
47
  StreamFrame,
48
+ StreamReadingRefused,
47
49
  StreamSubscriptionError,
50
+ _logged_refusal_detail,
48
51
  )
49
52
 
50
53
  LOGGER = logging.getLogger(__name__)
@@ -726,9 +729,68 @@ class ThreadedConnectorFeed:
726
729
 
727
730
 
728
731
  def _typed_error(error: BaseException) -> StreamSubscriptionError:
732
+ """One coded failure for whatever ended a read, keeping what a strict-JSON refusal said.
733
+
734
+ THE CLASS NAME ALONE THREW AWAY THE ONLY THING THAT NAMED THE CAUSE. A strict-JSON refusal
735
+ states the bound it hit, the path it hit it at and the code for it; every one of those was
736
+ dropped, and what reached the log was a class name shared by every reading failure there is.
737
+ A subscription that failed on a document bound and one that failed on a truncated frame were
738
+ indistinguishable from the outside, so both looked like a venue being down.
739
+
740
+ THAT REFUSAL IS THE ONLY ONE WHOSE WORDS ARE KEPT, and it is kept under its own type so the
741
+ claim line can tell it apart. Its sentence is this build's: a code, a bound and where in the
742
+ frame the bound tripped. Any other exception's ``str`` is somebody else's sentence -- a
743
+ socket library quoting the request it sent, a venue's text quoting back what the subscribe
744
+ frame carried -- and is reduced to its class name exactly as it always was.
745
+
746
+ THE PATH IS CUT TO ITS TOP-LEVEL INDEX, AND THE SENTENCE IS KEPT ONLY FOR THE CODES WHOSE
747
+ SENTENCE HOLDS NO VENUE TEXT. A refusal's path names the venue's own keys on the way down,
748
+ and three of the strict reader's refusals quote the venue back -- the duplicate key it found,
749
+ the number literal it would not read -- so a venue that reflects what this run presented as a
750
+ key or a value would have that text in a log line through the one route this build composes
751
+ itself. So only what is this build's is kept: the ``$`` and, for a batch, which element -- a
752
+ number -- with an ellipsis where the venue's spelling was; and the sentence only under a code
753
+ :data:`_REFUSALS_STATED_IN_THIS_BUILDS_WORDS` lists, where it is a bound, a count or a
754
+ position and nothing quoted. That is what an operator needs: which element, which bound,
755
+ which code. The whole line is then scrubbed ONCE, at the length a record carries, so nothing
756
+ is cut twice.
757
+ """
758
+
729
759
  if isinstance(error, StreamSubscriptionError):
730
760
  return error
731
- return StreamSubscriptionError("STREAM_SUBSCRIPTION_FEED_FAILED", type(error).__name__)
761
+ name = type(error).__name__
762
+ if not isinstance(error, CanonicalJSONError):
763
+ return StreamSubscriptionError("STREAM_SUBSCRIPTION_FEED_FAILED", name)
764
+ where = _TOP_LEVEL_INDEX.match(error.path)
765
+ prefix = "$" if where is None else where.group(0)
766
+ shaped = prefix if prefix == error.path else f"{prefix}..."
767
+ words = f" {error.detail}" if error.code in _REFUSALS_STATED_IN_THIS_BUILDS_WORDS else ""
768
+ said = _logged_refusal_detail(f"{name}: {shaped}:{words} [{error.code}]")
769
+ return StreamReadingRefused("STREAM_SUBSCRIPTION_FEED_FAILED", said)
770
+
771
+
772
+ #: The part of a refusal's path this build wrote: the root, and for a batch the element's index.
773
+ _TOP_LEVEL_INDEX = re.compile(r"^\$(\[\d+\])?")
774
+
775
+ #: The strict reader's refusals whose sentence is a bound, a count or a position and quotes
776
+ #: nothing the venue wrote. A duplicate key names the key and a number refusal names the literal,
777
+ #: so those carry their code alone. Closed on purpose: a code not listed here says its name.
778
+ _REFUSALS_STATED_IN_THIS_BUILDS_WORDS = frozenset(
779
+ {
780
+ "JSON_BOM",
781
+ "JSON_DEPTH",
782
+ "JSON_INPUT_TYPE",
783
+ "JSON_INTEGER_RANGE",
784
+ "JSON_MEMBERS",
785
+ "JSON_NONCANONICAL",
786
+ "JSON_OBJECT_KEY",
787
+ "JSON_STRING_LENGTH",
788
+ "JSON_SYNTAX",
789
+ "JSON_UNICODE",
790
+ "JSON_UTF8",
791
+ "JSON_VALUE_TYPE",
792
+ }
793
+ )
732
794
 
733
795
 
734
796
  def _put_end_if_possible(queue: asyncio.Queue[StreamFrame | BaseException | object]) -> None:
@@ -803,7 +865,7 @@ def _reconnect_delay(attempt: int) -> float:
803
865
 
804
866
  def _frame_messages(
805
867
  config: StreamConnectorConfig, decoded: Any, raw: bytes
806
- ) -> tuple[tuple[dict[str, Any], bytes], ...]:
868
+ ) -> Iterator[tuple[dict[str, Any], bytes]]:
807
869
  """The messages one text frame carries, each with the bytes that are its own.
808
870
 
809
871
  One object, unless the connector declares that a frame may be a batch. An array frame is the
@@ -815,6 +877,14 @@ def _frame_messages(
815
877
  carries no type to classify and no id to extract, and the capture lane of the same document
816
878
  has always refused it, so admitting it here would be the two lanes disagreeing about one
817
879
  frame.
880
+
881
+ EVERY ELEMENT IS CHECKED BEFORE ANY IS RENDERED, AND EACH IS RENDERED ONLY WHEN ASKED FOR.
882
+ The check is a walk over the batch that allocates nothing, so a malformed element refuses
883
+ the frame before a byte of it is handed on; the rendering is a generator, because a batch
884
+ may now hold a venue's whole roster and rendering all of it at once would put every
885
+ element's bytes in memory beside the frame's, outside the claim's ledger, before the first
886
+ one had been offered to it. Rendered one at a time, the resident cost is the frame plus the
887
+ element in hand, and the ledger sees each element as it always has.
818
888
  """
819
889
 
820
890
  if config.admits_array_frames and isinstance(decoded, list):
@@ -824,13 +894,15 @@ def _frame_messages(
824
894
  "STREAM_SUBSCRIPTION_FRAME_INVALID",
825
895
  f"provider batch element {index} is not a non-empty object",
826
896
  )
827
- return tuple((element, canonical_json_bytes(element)) for element in decoded)
897
+ for element in decoded:
898
+ yield element, canonical_json_bytes(element)
899
+ return
828
900
  if not isinstance(decoded, dict) or not decoded:
829
901
  raise StreamSubscriptionError(
830
902
  "STREAM_SUBSCRIPTION_FRAME_INVALID",
831
903
  "provider text frame is not a non-empty object",
832
904
  )
833
- return ((decoded, raw),)
905
+ yield decoded, raw
834
906
 
835
907
 
836
908
  def subscription_for_cursor(