mostlyright-data 0.9.8__tar.gz → 0.9.10__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 (326) hide show
  1. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/PKG-INFO +1 -1
  2. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/pyproject.toml +1 -1
  3. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_contracts.py +2 -9
  4. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/pipeline.py +18 -19
  5. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/delta.py +25 -58
  6. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +5 -8
  7. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/fill.py +9 -25
  8. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/gating.py +19 -30
  9. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +6 -5
  10. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/contracts.py +9 -41
  11. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/fitness.py +11 -14
  12. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/rights_rule.py +11 -5
  13. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_capture_session.py +6 -14
  14. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_rotation.py +6 -5
  15. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/download.py +74 -1
  16. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/propose.py +144 -0
  17. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/approve.py +5 -5
  18. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/local_review.py +8 -11
  19. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/remediation.py +1 -1
  20. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/.gitignore +0 -0
  21. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/README.md +0 -0
  22. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/scripts/hatch_build.py +0 -0
  23. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/__init__.py +0 -0
  24. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  25. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/http.py +0 -0
  26. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
  27. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  28. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  29. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  30. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
  31. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
  32. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  33. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  34. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  35. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  36. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  37. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  38. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/reference.py +0 -0
  39. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/registry.py +0 -0
  40. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  41. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/canonical.py +0 -0
  42. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/catalog_job.py +0 -0
  43. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/cli.py +0 -0
  44. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/contracts.py +0 -0
  45. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/coordinator.py +0 -0
  46. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/deploy.py +0 -0
  47. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/deploy_target.py +0 -0
  48. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  49. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/event_presentation.py +0 -0
  50. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/events.py +0 -0
  51. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  52. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/fleet.py +0 -0
  53. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/formats.py +0 -0
  54. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/governors.py +0 -0
  55. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
  56. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
  57. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  58. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
  59. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
  60. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  61. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
  62. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
  63. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
  64. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  65. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
  66. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  67. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
  68. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_session_worker.py +0 -0
  69. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  70. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/hosted_worker.py +0 -0
  71. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  72. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  73. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  74. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  75. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  76. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  77. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/key_seam.py +0 -0
  78. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
  79. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
  80. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
  81. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
  82. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
  83. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
  84. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
  85. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/local_search/service.py +0 -0
  86. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  87. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  88. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  89. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  90. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  91. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  92. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  93. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  94. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  95. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  96. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  97. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  98. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  99. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  100. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  101. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  102. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  103. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/notebook.py +0 -0
  104. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/offline.py +0 -0
  105. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/operation_registry.py +0 -0
  106. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/operator_setup.py +0 -0
  107. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/plan_graph.py +0 -0
  108. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  109. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  110. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  111. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  112. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  113. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  114. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  115. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/table.py +0 -0
  116. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  117. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/progress_events.py +0 -0
  118. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  119. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/containers.py +0 -0
  120. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  121. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  122. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  123. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  124. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  125. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  126. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  127. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  128. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  129. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/registry.py +0 -0
  130. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  131. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  132. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  133. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  134. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  135. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  136. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
  137. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  138. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
  139. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  140. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
  141. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  142. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  143. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  144. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  145. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
  146. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
  147. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
  148. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
  149. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
  150. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
  151. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  152. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  153. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
  154. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
  155. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  156. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  157. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  158. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
  159. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  160. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  161. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  162. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  163. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  164. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  165. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  166. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  167. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  168. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  169. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  170. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  171. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  172. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/samples.py +0 -0
  173. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  174. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  175. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/recipe.py +0 -0
  176. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/repair/__init__.py +0 -0
  177. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/repair/adapters.py +0 -0
  178. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/repair/contracts.py +0 -0
  179. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
  180. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/repair/errors.py +0 -0
  181. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/review.py +0 -0
  182. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/rowset.py +0 -0
  183. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/serving.py +0 -0
  184. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/serving_edge.py +0 -0
  185. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/serving_http.py +0 -0
  186. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/session_probes.py +0 -0
  187. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/signing.py +0 -0
  188. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/source_discovery.py +0 -0
  189. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/__init__.py +0 -0
  190. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
  191. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/adapters.py +0 -0
  192. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  193. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  194. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  195. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  196. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  197. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  198. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  199. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  200. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  201. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  202. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  203. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  204. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  205. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  206. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  207. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  208. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  209. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  210. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  211. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  212. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  213. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  214. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  215. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  216. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  217. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
  218. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  219. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  220. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  221. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  222. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  223. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  224. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  225. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  226. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  227. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  228. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  229. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  230. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  231. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  232. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/collections.py +0 -0
  233. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  234. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/governance.py +0 -0
  235. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  236. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/integration.py +0 -0
  237. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  238. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/registry.py +0 -0
  239. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  240. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/sports.py +0 -0
  241. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream.py +0 -0
  242. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
  243. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
  244. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
  245. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
  246. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
  247. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
  248. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/studio_boundary.py +0 -0
  249. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  250. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  251. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  252. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  253. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/commands.py +0 -0
  254. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  255. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/parity.py +0 -0
  256. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/research.py +0 -0
  257. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/router.py +0 -0
  258. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/runs.py +0 -0
  259. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/session.py +0 -0
  260. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/stream.py +0 -0
  261. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/transport.py +0 -0
  262. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
  263. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/thin/workers.py +0 -0
  264. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  265. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  266. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/unit_flow.py +0 -0
  267. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/units.py +0 -0
  268. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  269. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
  270. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  271. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  272. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
  273. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  274. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
  275. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  276. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
  277. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  278. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  279. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
  280. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
  281. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
  282. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
  283. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
  284. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
  285. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
  286. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
  287. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
  288. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
  289. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  290. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
  291. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
  292. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
  293. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
  294. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
  295. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
  296. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
  297. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  298. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  299. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  300. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  301. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/diffing.py +0 -0
  302. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/headline.py +0 -0
  303. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  304. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
  305. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/inventory.py +0 -0
  306. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/login.py +0 -0
  307. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  308. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/peek.py +0 -0
  309. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  310. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
  311. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/preflight.py +0 -0
  312. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/readers.py +0 -0
  313. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/render.py +0 -0
  314. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/ux/workload.py +0 -0
  315. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/viewer.py +0 -0
  316. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  317. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  318. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  319. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  320. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  321. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/query.py +0 -0
  322. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  323. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  324. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  325. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
  326. {mostlyright_data-0.9.8 → mostlyright_data-0.9.10}/src/mostlyright/data_harness/watch.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyright-data
3
- Version: 0.9.8
3
+ Version: 0.9.10
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.9.8"
3
+ version = "0.9.10"
4
4
  description = "Mostly Right CLI for reproducible, reviewed Parquet datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13,<3.14"
@@ -730,15 +730,8 @@ class SourceProposal(_CanonicalContract):
730
730
  (item.uri, item.observed_at, item.content_sha256) for item in self.evidence
731
731
  )
732
732
  _require_unique(evidence_keys, "source_proposal.evidence")
733
- if self.fitness_decision == "selected" and self.rights_status not in {
734
- "approved",
735
- "conditional",
736
- }:
737
- raise ContractError(
738
- "source_proposal.rights_status",
739
- "RIGHTS_NOT_SELECTABLE",
740
- "selected proposals require approved or conditional rights",
741
- )
733
+ # Any rights status may be selected: the status is recorded on the proposal for the
734
+ # dataset's consumer to judge, never used to refuse the selection itself.
742
735
  if self.fitness_decision == "selected" and self.live_endpoint in {"dead", "delayed"}:
743
736
  raise ContractError(
744
737
  "source_proposal.live_endpoint",
@@ -1231,6 +1231,11 @@ def classify_plan_sources_before_persistence(
1231
1231
  "project_owned": "internal",
1232
1232
  "authorized_internal": "restricted",
1233
1233
  "user_authorized": "restricted",
1234
+ # Rights are recorded, never a gate: an unknown or prohibited rights basis still
1235
+ # builds, classified restricted -- the cautious end of the classification axis --
1236
+ # with the status itself carried on the governance record for its consumer to judge.
1237
+ "unknown": "restricted",
1238
+ "prohibited": "restricted",
1234
1239
  }
1235
1240
  evidence: dict[str, dict[str, str]] = {}
1236
1241
  for source in sorted(plan.sources, key=lambda item: item.source_id):
@@ -2021,10 +2026,9 @@ def _visual_source_summary(
2021
2026
  parse produced.
2022
2027
  """
2023
2028
 
2024
- public_values = (
2025
- source.rights.status in {"public_domain", "permissive_license"}
2026
- and governance["classification"] == "public"
2027
- )
2029
+ # Value display keys off data classification alone; the licence is recorded on the source
2030
+ # for its consumer to judge, never used to withhold the user's own data from them.
2031
+ public_values = governance["classification"] == "public"
2028
2032
  null_counts = {column: null_counts[column] for column in columns}
2029
2033
  sample = []
2030
2034
  if public_values:
@@ -2198,8 +2202,7 @@ def _replay_graph_derivations(
2198
2202
  display = (
2199
2203
  "full"
2200
2204
  if all(
2201
- source.rights.status in {"public_domain", "permissive_license"}
2202
- and exact_governance[source.source_id]["classification"] == "public"
2205
+ exact_governance[source.source_id]["classification"] == "public"
2203
2206
  for source in plan.sources
2204
2207
  )
2205
2208
  else "schema_only"
@@ -2563,8 +2566,7 @@ def _replay_candidate_derivations(
2563
2566
  visual_display = (
2564
2567
  "full"
2565
2568
  if all(
2566
- source.rights.status in {"public_domain", "permissive_license"}
2567
- and exact_governance[source.source_id]["classification"] == "public"
2569
+ exact_governance[source.source_id]["classification"] == "public"
2568
2570
  for source in plan.sources
2569
2571
  )
2570
2572
  else "schema_only"
@@ -4323,17 +4325,14 @@ def _require_stable_candidate_observation(
4323
4325
 
4324
4326
 
4325
4327
  def _validate_rights(plan: TablePlan) -> None:
4326
- for source in plan.sources:
4327
- if source.rights.status in {"unknown", "prohibited"}:
4328
- raise BuildError(
4329
- "RIGHTS_BLOCKED",
4330
- f"source {source.source_id!r} rights status is {source.rights.status!r}",
4331
- )
4332
- if plan.output_intent not in source.rights.permissions:
4333
- raise BuildError(
4334
- "RIGHTS_PERMISSION_MISSING",
4335
- f"source {source.source_id!r} does not permit {plan.output_intent!r}",
4336
- )
4328
+ """Formerly the build-time rights gate; now a recording point kept for its call sites.
4329
+
4330
+ Licensing is recorded, never enforced: every source's rights status and permissions are
4331
+ already carried on the plan and into the build's governance record, and the consumer of
4332
+ the output judges them. Unknown, prohibited, and intent-mismatched rights all build.
4333
+ """
4334
+
4335
+ del plan
4337
4336
 
4338
4337
 
4339
4338
  def _validate_root_separation(input_root: Path, output: Path) -> None:
@@ -262,17 +262,18 @@ def classify_catalog_delta(
262
262
  rights_decisions: Mapping[str, RightsDecision] | None = None,
263
263
  rights_decisions_sha256: str | None = None,
264
264
  ) -> CatalogDeltaClassification:
265
- """Partition a complete fill into unchanged, changed, new, absent, and flagged facts.
265
+ """Partition a complete fill into unchanged, changed, new, and absent facts.
266
266
 
267
- ``candidates_by_record_id`` contains authored, unsealed entries for every non-flagged provider
268
- record. ``predecessor_record_ids`` preserves the explicit provider-to-Harness identity chosen
267
+ ``candidates_by_record_id`` contains authored, unsealed entries for every provider record.
268
+ ``predecessor_record_ids`` preserves the explicit provider-to-Harness identity chosen
269
269
  when the predecessor was authored. Neither map is inferred from publisher text.
270
270
 
271
- ``rights_decisions`` is the queue's one exit. Each decision must name a record the queue
272
- holds and bind the exact bytes the person decided against; a cleared record leaves the
273
- queue and demands a candidate whose rights are exactly the decided rights, and a
274
- prohibited record stays out of admission carrying the decision, so the queue
275
- distinguishes "nobody has looked" from "somebody looked and said no".
271
+ ``rights_decisions`` enriches the record it names: each decision must name a record this
272
+ fill observed and bind the exact bytes the person decided against, and the candidate for
273
+ that record must carry exactly the decided rights. Rights never hold a record out of
274
+ admission -- the decided status, whatever it says, is recorded on the admitted entry for
275
+ the dataset's consumer to judge. The ``flagged`` partition is always empty for a new
276
+ classification and survives only so older published generations still parse.
276
277
  """
277
278
 
278
279
  previous_by_id, chains = _validate_predecessor(
@@ -285,7 +286,6 @@ def classify_catalog_delta(
285
286
  decisions = dict(rights_decisions or {})
286
287
  if decisions:
287
288
  _validate_mapping(decisions, "rights_decisions")
288
- prohibited_ids: set[str] = set()
289
289
  for record_id in sorted(decisions):
290
290
  decision = decisions[record_id]
291
291
  if not isinstance(decision, RightsDecision):
@@ -314,68 +314,35 @@ def classify_catalog_delta(
314
314
  "decision is about one spelling of the facts, so a person must decide "
315
315
  "again against the current facts",
316
316
  )
317
- staged = staged_flagged.get(record_id)
318
- if decision.cleared:
319
- if staged is None:
320
- raise CatalogDeltaError(
321
- "CATALOG_RIGHTS_DECISION_TARGET",
322
- f"delta.rights_decisions.{record_id}",
323
- "names a record the rights queue does not hold; the provider states "
324
- "its own licence, so there is nothing left for a clearance to clear",
325
- )
326
- if staged.rights_status == "prohibited":
327
- raise CatalogDeltaError(
328
- "CATALOG_RIGHTS_DECISION_OVERRULE",
329
- f"delta.rights_decisions.{record_id}",
330
- "the provider's own licence prohibits reuse; a decision may clear "
331
- "silence, never overrule a provider's explicit no",
332
- )
333
- else:
334
- # A person's no outranks a provider's yes, so a prohibiting decision holds
335
- # whether or not the provider's own licence would have admitted the record.
336
- prohibited_ids.add(record_id)
337
- cleared_ids = {record_id for record_id, item in decisions.items() if item.cleared}
338
-
339
317
  _validate_mapping(candidates_by_record_id, "candidates_by_record_id")
340
318
  candidate_keys = set(candidates_by_record_id)
341
- required_candidate_keys = (
342
- (set(records_by_id) - set(staged_flagged)) | cleared_ids
343
- ) - prohibited_ids
344
- if candidate_keys != required_candidate_keys:
319
+ # Rights never hold a record out of admission any more. New fills flag nothing, so every
320
+ # record demands a candidate. An older fill's staged queue is honoured transitionally: its
321
+ # records do not *require* a candidate (their authoring documents never held one), but a
322
+ # candidate MAY now be authored for them, and authoring one admits the record and retires
323
+ # it from the queue. A decision only replaces the rights the candidate carries.
324
+ required_candidate_keys = set(records_by_id) - set(staged_flagged)
325
+ if not (required_candidate_keys <= candidate_keys <= set(records_by_id)):
345
326
  raise CatalogDeltaError(
346
327
  "CATALOG_DELTA_CANDIDATE_MAPPING",
347
328
  "delta.candidates_by_record_id",
348
- "must name exactly every current provider record not held by the rights queue, "
349
- "plus every record a decision cleared out of it, minus every record a decision "
350
- "prohibits; "
329
+ "must name every current provider record outside the staged queue, and may name "
330
+ "records inside it; "
351
331
  f"missing={sorted(required_candidate_keys - candidate_keys)}, "
352
- f"extra={sorted(candidate_keys - required_candidate_keys)}",
332
+ f"extra={sorted(candidate_keys - set(records_by_id))}",
353
333
  )
354
334
 
355
335
  unchanged: list[CatalogEntry] = []
356
336
  changed: list[CatalogEntry] = []
357
337
  new: list[CatalogEntry] = []
358
- flagged: dict[str, CatalogFlaggedRecord] = dict(staged_flagged)
359
- for record_id, decision in decisions.items():
360
- if decision.cleared:
361
- flagged.pop(record_id, None)
362
- else:
363
- record = records_by_id[record_id]
364
- flagged[record_id] = CatalogFlaggedRecord(
365
- protocol=record.protocol,
366
- record_id=record.record_id,
367
- record_sha256=record.digest,
368
- license_id=record.license_id,
369
- license_uri=record.license_uri,
370
- rights_status=decision.rights.status,
371
- authority="human_decision",
372
- entry_id=None,
373
- human_decision_reference=decision.human_decision_reference,
374
- decided_at=decision.decided_at,
375
- )
338
+ flagged: dict[str, CatalogFlaggedRecord] = {
339
+ record_id: item
340
+ for record_id, item in staged_flagged.items()
341
+ if record_id not in candidate_keys
342
+ }
376
343
  resulting_chains: list[tuple[CatalogEntry, ...]] = []
377
344
 
378
- for record_id in sorted(required_candidate_keys):
345
+ for record_id in sorted(candidate_keys):
379
346
  record = records_by_id[record_id]
380
347
  decision = decisions.get(record_id)
381
348
  candidate = _validated_candidate(
@@ -821,14 +821,11 @@ def evaluate_catalog_entry_v2(
821
821
 
822
822
 
823
823
  def _v2_rights_disposition(rights: CatalogFact) -> str:
824
- if rights.state != "known":
825
- return "flagged"
826
- if rights.value == "approved":
827
- return "admitted"
828
- if rights.value == "prohibited":
829
- return "refused"
830
- # ``conditional`` lacks a v2 obligation fact, and ``unclear`` explicitly requires escalation.
831
- return "flagged"
824
+ # Rights are recorded, never adjudicated: every entry is admitted regardless of its
825
+ # licence, and the rights fact itself travels on the entry for the consumer to judge.
826
+ # The "flagged"/"refused" values remain in the vocabulary so stored decisions still parse.
827
+ del rights
828
+ return "admitted"
832
829
 
833
830
 
834
831
  def catalog_entry_v2_from_dict(data: Mapping[str, Any]) -> CatalogEntryV2:
@@ -43,7 +43,6 @@ from mostlyright.data_harness.sources.catalog.fill_staging import (
43
43
  from mostlyright.data_harness.sources.catalog.harvest.ckan import (
44
44
  CKAN_LIMITS,
45
45
  CkanHarvester,
46
- ckan_licence_rights,
47
46
  )
48
47
  from mostlyright.data_harness.sources.catalog.harvest.datagov_v4 import (
49
48
  DATAGOV_V4_ENDPOINT,
@@ -68,7 +67,6 @@ from mostlyright.data_harness.sources.catalog.harvest.sdmx import SDMX_LIMITS, S
68
67
  from mostlyright.data_harness.sources.catalog.harvest.stac import (
69
68
  STAC_LIMITS,
70
69
  StacHarvester,
71
- stac_licence_rights,
72
70
  )
73
71
  from mostlyright.data_harness.sources.contracts import EvidenceReference
74
72
 
@@ -3637,29 +3635,15 @@ def _pass_processed_count(staging: FillStaging, state: dict[str, Any]) -> int:
3637
3635
 
3638
3636
 
3639
3637
  def _flagged_records(records: tuple[HarvestedRecord, ...]) -> list[dict[str, Any]]:
3640
- flagged: list[dict[str, Any]] = []
3641
- for record in records:
3642
- if record.protocol == "ckan":
3643
- status = ckan_licence_rights(record.license_id)[0]
3644
- elif record.protocol == "stac":
3645
- status = stac_licence_rights(record.license_id)[0]
3646
- elif record.protocol == "datagov_v4":
3647
- status = "unclear"
3648
- else:
3649
- status = "unclear"
3650
- if status in {"unclear", "prohibited"}:
3651
- flagged.append(
3652
- {
3653
- "protocol": record.protocol,
3654
- "record_id": record.record_id,
3655
- "record_sha256": record.digest,
3656
- "license_id": getattr(record, "license_id", None),
3657
- "license_uri": getattr(record, "license_uri", None),
3658
- "rights_status": status,
3659
- "authority": "human_review_required",
3660
- }
3661
- )
3662
- return sorted(flagged, key=lambda item: (item["protocol"], item["record_id"]))
3638
+ """Always empty: rights never hold a record out of admission any more.
3639
+
3640
+ The licence facts a harvest observes (licence id, URI, and the status it maps to) are
3641
+ carried on the authored entry instead, for the dataset's consumer to judge. The function
3642
+ and the receipt fields it feeds survive so older fills' staged queues still reconcile.
3643
+ """
3644
+
3645
+ del records
3646
+ return []
3663
3647
 
3664
3648
 
3665
3649
  def _preflight_limit(state: dict[str, Any], limits: CatalogFillLimits) -> str | None:
@@ -217,34 +217,24 @@ def _gate_one(entry: CatalogEntry, requirement: CatalogRequirement) -> CatalogGa
217
217
  disposition_of_rights = rights_disposition(entry.rights.status)
218
218
  outcomes: dict[str, tuple[bool, str]] = {}
219
219
 
220
+ # Rights and obligations are recorded facts, not admission criteria: both checks always
221
+ # pass, and the detail line carries what a consumer of the dataset needs to judge the
222
+ # licence for themselves.
220
223
  outcomes["rights"] = (
221
- disposition_of_rights == "admit",
222
- f"rights status {entry.rights.status!r} is {disposition_of_rights}",
224
+ True,
225
+ f"rights status {entry.rights.status!r} is recorded for the consumer to judge",
223
226
  )
224
227
 
225
- if disposition_of_rights == "admit":
226
- try:
227
- applicable = evaluate_obligations(
228
- rights=entry.rights,
229
- lifecycle=requirement.lifecycle,
230
- intended_use=requirement.intended_use,
231
- attached_artifact_digests=requirement.attached_license_artifact_digests,
232
- )
233
- except SourceContractError as error:
234
- outcomes["obligations"] = (
235
- False,
236
- f"licence obligations are not satisfied: {error.detail}"[:MAX_DETAIL],
237
- )
238
- else:
239
- outcomes["obligations"] = (
240
- True,
241
- f"{len(applicable)} licence obligation(s) apply and are satisfied",
242
- )
243
- else:
244
- outcomes["obligations"] = (
245
- True,
246
- "not evaluated: the rights check already decided this entry",
247
- )
228
+ applicable = evaluate_obligations(
229
+ rights=entry.rights,
230
+ lifecycle=requirement.lifecycle,
231
+ intended_use=requirement.intended_use,
232
+ attached_artifact_digests=requirement.attached_license_artifact_digests,
233
+ )
234
+ outcomes["obligations"] = (
235
+ True,
236
+ f"{len(applicable)} licence obligation(s) apply and are recorded",
237
+ )
248
238
 
249
239
  needs_login = requirement.require_open_access and entry.authentication_required
250
240
  outcomes["authentication"] = (
@@ -285,11 +275,10 @@ def _gate_one(entry: CatalogEntry, requirement: CatalogRequirement) -> CatalogGa
285
275
  )
286
276
  failed = [item.check for item in checks if item.outcome != "pass"]
287
277
 
288
- # Precedence mirrors the fitness adjudicator exactly: escalation first, then any failure.
289
- if disposition_of_rights == "escalate":
290
- disposition = "human_escalation_required"
291
- reason = "rights are unclear and require human legal/product escalation"
292
- elif failed:
278
+ # Precedence mirrors the fitness adjudicator exactly. Rights never escalate any more;
279
+ # the branch is kept as an import-time truth via rights_disposition rather than re-decided.
280
+ assert disposition_of_rights == "admit"
281
+ if failed:
293
282
  disposition = "refused"
294
283
  reason = f"failed checks: {', '.join(failed)}"
295
284
  else:
@@ -99,15 +99,16 @@ class RightsDecision:
99
99
  "rights_decision.rights",
100
100
  "must be a complete RightsEvidence",
101
101
  )
102
- disposition = rights_disposition(self.rights.status)
103
- if disposition == "escalate":
102
+ # Statuses are judged by name here, not through rights_disposition: every status
103
+ # admits now, but a decision document still has its own grammar to keep.
104
+ if self.rights.status == "unclear":
104
105
  raise SourceContractError(
105
106
  "RIGHTS_DECISION_UNDECIDED",
106
107
  "rights_decision.rights.status",
107
- "a decision that says unclear decides nothing; the queue already records "
108
- "that state without a document",
108
+ "a decision that says unclear decides nothing; the harvested record already "
109
+ "records that state without a document",
109
110
  )
110
- if disposition == "admit":
111
+ if self.rights.status != "prohibited":
111
112
  # An admitting claim carries the approval authority inside the rights, exactly as
112
113
  # the entry it will become must carry it, and the two spellings must be one.
113
114
  if self.rights.human_decision_reference != self.human_decision_reference:
@@ -1766,51 +1766,19 @@ def evaluate_obligations(
1766
1766
  intended_use: str,
1767
1767
  attached_artifact_digests: tuple[str, ...],
1768
1768
  ) -> tuple[LicenseObligation, ...]:
1769
- """Return applicable obligations or fail closed when their evidence is incomplete."""
1769
+ """Return the obligations that apply at this lifecycle stage, for the record.
1770
+
1771
+ Licensing is recorded, never enforced: an obligation whose use is prohibited or ambiguous,
1772
+ or whose required artifacts are missing, is still *applicable* and still travels with the
1773
+ dataset so its consumer can judge it. The only refusals left here are input-shape ones.
1774
+ """
1770
1775
 
1771
1776
  _choice(lifecycle, OBLIGATION_LIFECYCLES, "lifecycle")
1772
1777
  _text(intended_use, "intended_use", maximum=200)
1773
1778
  _digests(attached_artifact_digests, "attached_artifact_digests", maximum=128)
1774
- if rights.status not in {"approved", "conditional"}:
1775
- raise SourceContractError(
1776
- "RIGHTS_NOT_SELECTABLE",
1777
- "rights.status",
1778
- "unclear or prohibited rights require escalation and cannot advance",
1779
- )
1780
- if intended_use not in rights.allowed_uses:
1781
- raise SourceContractError(
1782
- "USE_NOT_ALLOWED",
1783
- "intended_use",
1784
- "the intended use is not covered by the rights evidence",
1785
- )
1786
- attached = set(attached_artifact_digests)
1787
- applicable: list[LicenseObligation] = []
1788
- for obligation in rights.obligations:
1789
- if lifecycle not in obligation.applies_at:
1790
- continue
1791
- if intended_use in obligation.prohibited_uses:
1792
- raise SourceContractError(
1793
- "USE_PROHIBITED",
1794
- f"obligation.{obligation.obligation_id}",
1795
- "the intended use is explicitly prohibited",
1796
- )
1797
- if obligation.permitted_uses and intended_use not in obligation.permitted_uses:
1798
- if obligation.escalation_when_ambiguous:
1799
- raise SourceContractError(
1800
- "RIGHTS_ESCALATION_REQUIRED",
1801
- f"obligation.{obligation.obligation_id}",
1802
- "obligation applicability is ambiguous for this intended use",
1803
- )
1804
- continue
1805
- missing = sorted(set(obligation.required_artifact_digests) - attached)
1806
- if missing:
1807
- raise SourceContractError(
1808
- "LICENSE_ARTIFACT_MISSING",
1809
- f"obligation.{obligation.obligation_id}.required_artifact_digests",
1810
- f"missing required attached artifacts: {missing}",
1811
- )
1812
- applicable.append(obligation)
1813
- return tuple(applicable)
1779
+ return tuple(
1780
+ obligation for obligation in rights.obligations if lifecycle in obligation.applies_at
1781
+ )
1814
1782
 
1815
1783
 
1816
1784
  def _object(value: Any, path: str) -> dict[str, Any]:
@@ -88,20 +88,20 @@ def build_fitness_report(
88
88
  "max_publication_delay_seconds",
89
89
  "must not be negative",
90
90
  )
91
- if rights_disposition(rights.status) == "admit":
92
- evaluate_obligations(
93
- rights=rights,
94
- lifecycle="candidate",
95
- intended_use=intended_use,
96
- attached_artifact_digests=attached_license_artifact_digests,
97
- )
91
+ # Rights always admit; the status and its obligations are recorded on the report rather
92
+ # than adjudicated. ``rights_disposition`` is still consulted so this module keeps reading
93
+ # the one authority instead of growing an opinion of its own.
94
+ assert rights_disposition(rights.status) == "admit"
95
+ evaluate_obligations(
96
+ rights=rights,
97
+ lifecycle="candidate",
98
+ intended_use=intended_use,
99
+ attached_artifact_digests=attached_license_artifact_digests,
100
+ )
98
101
 
99
102
  outcomes = signals.outcome_map()
100
103
  summaries = signals.summary_map()
101
104
  cited_digests = tuple(item.content_sha256 for item in signals.evidence)
102
- if rights_disposition(rights.status) != "admit":
103
- outcomes["rights"] = False
104
- summaries["rights"] = f"rights status {rights.status} blocks source selection"
105
105
  if require_timely and (
106
106
  observation.live_status != "live"
107
107
  or observation.publication_delay_seconds > max_publication_delay_seconds
@@ -126,10 +126,7 @@ def build_fitness_report(
126
126
  for dimension in sorted(FITNESS_DIMENSIONS)
127
127
  )
128
128
  failed = [item.dimension for item in dimensions if item.outcome != "pass"]
129
- if rights_disposition(rights.status) == "escalate":
130
- decision = "human_escalation_required"
131
- reason = "rights are unclear and require human legal/product escalation"
132
- elif failed:
129
+ if failed:
133
130
  decision = "rejected"
134
131
  reason = f"failed fitness dimensions: {', '.join(failed)}"
135
132
  else:
@@ -1,8 +1,14 @@
1
1
  """The single repository-wide rights-status disposition authority.
2
2
 
3
- One rule decides what a rights status *means*: admit, escalate, or refuse. The fitness
4
- adjudicator (:mod:`mostlyright.data_harness.sources.fitness`) and the source-catalog gate both
5
- read this module, so the two cannot drift into disagreeing adjudicators.
3
+ One rule decides what a rights status *means*. Since the 2026-08 licensing-policy change the
4
+ answer is always ``admit``: a rights status is provenance the platform records and delivers with
5
+ the dataset, never a gate that stops work. Responsibility for honouring a source's licence sits
6
+ with the consumer of the dataset, who receives the status, the reason, and any attached licence
7
+ artifacts to make that call. The ``escalate`` and ``refuse`` dispositions remain in the
8
+ vocabulary so historical documents still parse, but no status maps to them any more.
9
+
10
+ The fitness adjudicator (:mod:`mostlyright.data_harness.sources.fitness`) and the source-catalog
11
+ gate both read this module, so the two cannot drift into disagreeing adjudicators.
6
12
 
7
13
  This module deliberately imports almost nothing. It depends on ``SourceContractError`` and
8
14
  ``RIGHTS_STATUSES`` from :mod:`mostlyright.data_harness.sources.contracts` and on nothing else --
@@ -22,8 +28,8 @@ RIGHTS_DISPOSITIONS: frozenset[str] = frozenset({"admit", "escalate", "refuse"})
22
28
  _DISPOSITION_BY_STATUS: dict[str, str] = {
23
29
  "approved": "admit",
24
30
  "conditional": "admit",
25
- "unclear": "escalate",
26
- "prohibited": "refuse",
31
+ "unclear": "admit",
32
+ "prohibited": "admit",
27
33
  }
28
34
 
29
35
  if set(_DISPOSITION_BY_STATUS) != set(RIGHTS_STATUSES): # pragma: no cover - import-time guard
@@ -1078,23 +1078,15 @@ class _CaptureRun:
1078
1078
 
1079
1079
 
1080
1080
  def require_live_capture_permitted(entry: StreamConnectorEntry) -> None:
1081
- """Refuse a connector whose document forbids live capture, before a socket could exist.
1081
+ """Formerly the CON-LIC-1 fence; now a no-op kept for its call sites.
1082
1082
 
1083
- CON-LIC-1 is enforced here, in the engine, rather than at whichever command happens to call
1084
- it. A caller holding the configuration cannot route around the policy, because the policy
1085
- travels with the registry entry and this is the only door into the capture loop.
1086
-
1087
- Public so that a driver capturing many members of one series can refuse a forbidden connector
1088
- once, before it plans a schedule nobody may run. Every member's session checks it again at the
1089
- point of use: one implementation of the rule, checked wherever a capture could begin.
1083
+ Licensing is recorded, never enforced: ``live_capture`` and its reason travel with the
1084
+ registry entry into capture evidence, and the consumer of the dataset judges them. The
1085
+ function remains so every place a capture could begin still reads the policy field --
1086
+ deleting the call sites would silently drop the recording path too.
1090
1087
  """
1091
1088
 
1092
- if entry.live_capture != "permitted":
1093
- raise _refuse(
1094
- "STREAM_LIVE_FORBIDDEN",
1095
- "connector.live_capture",
1096
- entry.live_capture_reason or f"connector {entry.connector_id} may not be captured live",
1097
- )
1089
+ del entry
1098
1090
 
1099
1091
 
1100
1092
  def _require_limits(config: StreamConnectorConfig, limits: CaptureLimits) -> None:
@@ -102,11 +102,12 @@ MAX_ROTATION_WINDOWS = 512
102
102
  #: carries a dot, so this name can never collide with a member's capture directory.
103
103
  ROTATION_RECORD_SUFFIX = "-rotation.json"
104
104
 
105
- # The refusals that end a whole rotation rather than one member of it. ``STREAM_LIVE_FORBIDDEN`` is
106
- # CON-LIC-1: a connector nobody may capture live will still be forbidden at the next boundary. The
107
- # rotation family is this module's own schedule refusals, which are facts about the plan and not
108
- # about the venue. Everything else -- a dropped socket, a recording that would not seal, an
109
- # occupied capture directory -- belongs to one member.
105
+ # The refusals that end a whole rotation rather than one member of it. ``STREAM_LIVE_FORBIDDEN``
106
+ # stopped being raisable when licensing became record-only, but a rotation replaying an older
107
+ # record may still read the code, so it stays classified. The rotation family is this module's
108
+ # own schedule refusals, which are facts about the plan and not about the venue. Everything
109
+ # else -- a dropped socket, a recording that would not seal, an occupied capture directory --
110
+ # belongs to one member.
110
111
  _ROTATION_STOPPING_CODES = frozenset({"STREAM_LIVE_FORBIDDEN"})
111
112
  _ROTATION_CODE_PREFIX = "STREAM_ROTATION"
112
113