mostlyright-data 0.9.5__tar.gz → 0.9.6__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.5 → mostlyright_data-0.9.6}/PKG-INFO +12 -13
  2. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/README.md +11 -12
  3. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/pyproject.toml +1 -1
  4. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/cli.py +46 -10
  5. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_session_worker.py +163 -18
  6. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_worker.py +145 -23
  7. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/pipeline.py +9 -0
  8. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/progress_events.py +75 -2
  9. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/serving.py +17 -4
  10. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/session_probes.py +26 -3
  11. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/acquire.py +16 -6
  12. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/download.py +80 -11
  13. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/stream.py +6 -1
  14. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/.gitignore +0 -0
  15. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/scripts/hatch_build.py +0 -0
  16. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/__init__.py +0 -0
  17. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/__init__.py +0 -0
  18. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/http.py +0 -0
  19. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/parsing.py +0 -0
  20. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/ranges.py +0 -0
  21. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/result_download.py +0 -0
  22. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/retention_admission.py +0 -0
  23. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/sandbox.py +0 -0
  24. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/acquisition/url_policy.py +0 -0
  25. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/agent_runtime.py +0 -0
  26. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/assets/logo-ink.svg +0 -0
  27. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/__init__.py +0 -0
  28. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/pandas_backend.py +0 -0
  29. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/polars_backend.py +0 -0
  30. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/protocol.py +0 -0
  31. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/reference.py +0 -0
  32. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/registry.py +0 -0
  33. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/backends/restrictions.py +0 -0
  34. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/canonical.py +0 -0
  35. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/catalog_job.py +0 -0
  36. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/contracts.py +0 -0
  37. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/coordinator.py +0 -0
  38. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/deploy.py +0 -0
  39. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/deploy_target.py +0 -0
  40. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/deployment_evidence.py +0 -0
  41. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/event_presentation.py +0 -0
  42. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/events.py +0 -0
  43. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/fast_delimited.py +0 -0
  44. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/fleet.py +0 -0
  45. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/formats.py +0 -0
  46. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/governors.py +0 -0
  47. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_bootstrap.py +0 -0
  48. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler.py +0 -0
  49. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_container_smoke.py +0 -0
  50. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_fetch.py +0 -0
  51. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_job.py +0 -0
  52. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  53. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_dataset.py +0 -0
  54. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_deploy.py +0 -0
  55. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_handoff.py +0 -0
  56. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_ingestion_contract.py +0 -0
  57. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_ingestion_job.py +0 -0
  58. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_ingestion_job_smoke.py +0 -0
  59. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_session_container_smoke.py +0 -0
  60. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/hosted_session_worker_job_smoke.py +0 -0
  61. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/__init__.py +0 -0
  62. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/contracts.py +0 -0
  63. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/faults.py +0 -0
  64. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/gcs_store.py +0 -0
  65. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/spool.py +0 -0
  66. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ingestion/store.py +0 -0
  67. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/key_seam.py +0 -0
  68. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/linux_process_boundary.py +0 -0
  69. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_contracts.py +0 -0
  70. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/__init__.py +0 -0
  71. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/build_index.py +0 -0
  72. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/contracts.py +0 -0
  73. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/query_trace.py +0 -0
  74. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/retrieval.py +0 -0
  75. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/sealed.py +0 -0
  76. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/local_search/service.py +0 -0
  77. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/CONTRACT.md +0 -0
  78. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/__init__.py +0 -0
  79. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/chrome.py +0 -0
  80. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/code_body.py +0 -0
  81. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/document.py +0 -0
  82. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/frame.py +0 -0
  83. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/interactive.py +0 -0
  84. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/markdown_body.py +0 -0
  85. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/mr_components.py +0 -0
  86. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_data.py +0 -0
  87. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_rich.py +0 -0
  88. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_source.py +0 -0
  89. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_stage.py +0 -0
  90. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/outputs_text.py +0 -0
  91. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/parse.py +0 -0
  92. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/status.py +0 -0
  93. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/nbrender/tokens.py +0 -0
  94. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/notebook.py +0 -0
  95. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/offline.py +0 -0
  96. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/operation_registry.py +0 -0
  97. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/operator_setup.py +0 -0
  98. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/plan_graph.py +0 -0
  99. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/__init__.py +0 -0
  100. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/contracts.py +0 -0
  101. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/engine.py +0 -0
  102. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/errors.py +0 -0
  103. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/gates.py +0 -0
  104. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/joins.py +0 -0
  105. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/profile.py +0 -0
  106. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/table.py +0 -0
  107. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/preparation/transforms.py +0 -0
  108. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/__init__.py +0 -0
  109. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/containers.py +0 -0
  110. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/contracts.py +0 -0
  111. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/delimited.py +0 -0
  112. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/__init__.py +0 -0
  113. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/admission.py +0 -0
  114. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/decode.py +0 -0
  115. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/geometry.py +0 -0
  116. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/grib2/portable_math.py +0 -0
  117. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/json_tabular.py +0 -0
  118. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/parquet_tabular.py +0 -0
  119. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/registry.py +0 -0
  120. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/README.md +0 -0
  121. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/cities.csv.gz +0 -0
  122. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.0.0/cities_one_stream/expected.json +0 -0
  123. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/cities.csv.gz +0 -0
  124. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.gzip/1.1.0/cities_one_stream/expected.json +0 -0
  125. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/cities.tar +0 -0
  126. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.0.0/cities_beside_a_directory_entry/expected.json +0 -0
  127. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/cities.tar +0 -0
  128. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.tar/1.1.0/cities_beside_a_directory_entry/expected.json +0 -0
  129. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/cities.zip +0 -0
  130. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.0.0/cities_beside_a_second_member/expected.json +0 -0
  131. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  132. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.1.0/dwd_semicolon_station_member/expected.json +0 -0
  133. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/dwd-station.zip +0 -0
  134. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/archive.zip/1.2.0/dwd_semicolon_station_member/expected.json +0 -0
  135. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/cities.csv +0 -0
  136. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/an_ordinary_comma_separated_table/expected.json +0 -0
  137. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/cities.tsv +0 -0
  138. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.0.0/quoted_fields_holding_the_delimiter/expected.json +0 -0
  139. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/expected.json +0 -0
  140. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/delimited_text/1.1.0/an_hourly_observation_table_served_as_plain_text/observations.csv +0 -0
  141. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/expected.json +0 -0
  142. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/json.tabular/1.0.0/nested_hourly_observations/stations.json +0 -0
  143. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/expected.json +0 -0
  144. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/json.tabular/1.1.0/an_observation_stream_served_as_plain_text/observations.ndjson +0 -0
  145. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/expected.json +0 -0
  146. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/parquet.tabular/1.0.0/two_columns/prices.parquet +0 -0
  147. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/cities.xlsx +0 -0
  148. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/an_ordinary_table_beside_a_second_sheet/expected.json +0 -0
  149. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  150. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.0.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  151. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/expected.json +0 -0
  152. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/spreadsheet.xlsx/1.1.0/shares_the_workbook_had_already_computed/shares.xlsx +0 -0
  153. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/README.md +0 -0
  154. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/expected.json +0 -0
  155. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/gfs_2m_temperature/gfs-2m-temperature.grib2 +0 -0
  156. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/expected.json +0 -0
  157. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  158. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/expected.json +0 -0
  159. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/1.0.0/hrrr_categorical_rain/hrrr-categorical-rain.grib2 +0 -0
  160. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/expected.json +0 -0
  161. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples/weather.grib2/2.0.0/hrrr_2m_temperature/hrrr-2m-temperature.grib2 +0 -0
  162. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/samples.py +0 -0
  163. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/spreadsheet.py +0 -0
  164. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/readers/tabular.py +0 -0
  165. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/recipe.py +0 -0
  166. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/__init__.py +0 -0
  167. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/adapters.py +0 -0
  168. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/contracts.py +0 -0
  169. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/coordinator.py +0 -0
  170. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/repair/errors.py +0 -0
  171. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/review.py +0 -0
  172. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/rowset.py +0 -0
  173. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/serving_edge.py +0 -0
  174. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/serving_http.py +0 -0
  175. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/signing.py +0 -0
  176. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/source_discovery.py +0 -0
  177. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/__init__.py +0 -0
  178. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/_adapter_steps.py +0 -0
  179. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/adapters.py +0 -0
  180. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/authenticated_https.py +0 -0
  181. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/authenticated_https_v2.py +0 -0
  182. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/cadence.py +0 -0
  183. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/cadence_emission.py +0 -0
  184. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/cadence_history.py +0 -0
  185. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/__init__.py +0 -0
  186. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/admission.py +0 -0
  187. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/authoring.py +0 -0
  188. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/authoring_policy.py +0 -0
  189. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/authoring_shards.py +0 -0
  190. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/bounded_io.py +0 -0
  191. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/channel.py +0 -0
  192. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/channel_client.py +0 -0
  193. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/contracts.py +0 -0
  194. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/coverage.py +0 -0
  195. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/delta.py +0 -0
  196. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/embedding.py +0 -0
  197. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/entry_v2.py +0 -0
  198. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/fill.py +0 -0
  199. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/fill_partitions.py +0 -0
  200. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/fill_staging.py +0 -0
  201. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/gating.py +0 -0
  202. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/generation_receipt.py +0 -0
  203. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/__init__.py +0 -0
  204. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/ckan.py +0 -0
  205. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/datagov_v4.py +0 -0
  206. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/protocol.py +0 -0
  207. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/sdmx.py +0 -0
  208. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/harvest/stac.py +0 -0
  209. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/health.py +0 -0
  210. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/hosted_catalog.py +0 -0
  211. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/identity_history.py +0 -0
  212. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/neural.py +0 -0
  213. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/packed_catalog.py +0 -0
  214. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/packed_retrieval.py +0 -0
  215. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/packed_writer.py +0 -0
  216. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/query_trace.py +0 -0
  217. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/recommend.py +0 -0
  218. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/retrieval.py +0 -0
  219. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/retrieval_manifest.py +0 -0
  220. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/rights_decisions.py +0 -0
  221. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/sealed.py +0 -0
  222. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/search.py +0 -0
  223. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/streaming_delta.py +0 -0
  224. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/catalog/update.py +0 -0
  225. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/collections.py +0 -0
  226. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/contracts.py +0 -0
  227. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/deletion.py +0 -0
  228. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/fitness.py +0 -0
  229. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/governance.py +0 -0
  230. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/hosted.py +0 -0
  231. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/integration.py +0 -0
  232. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/range_reader.py +0 -0
  233. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/registry.py +0 -0
  234. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/rights_rule.py +0 -0
  235. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/source_cadence_vectors.v1.json +0 -0
  236. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/sports.py +0 -0
  237. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream.py +0 -0
  238. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_capture_session.py +0 -0
  239. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_connector.py +0 -0
  240. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_connectors/polymarket.clob-market.v1.json +0 -0
  241. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_recorder.py +0 -0
  242. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_registry.py +0 -0
  243. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_rotation.py +0 -0
  244. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_series.py +0 -0
  245. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/sources/stream_transport.py +0 -0
  246. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/studio_boundary.py +0 -0
  247. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  248. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  249. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  250. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/commands.py +0 -0
  251. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  252. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/parity.py +0 -0
  253. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/propose.py +0 -0
  254. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/research.py +0 -0
  255. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/router.py +0 -0
  256. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/runs.py +0 -0
  257. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/session.py +0 -0
  258. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/transport.py +0 -0
  259. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
  260. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/thin/workers.py +0 -0
  261. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ucum/TABLE-PIN.json +0 -0
  262. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ucum/ucum-subset.v1.json +0 -0
  263. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/unit_flow.py +0 -0
  264. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/units.py +0 -0
  265. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  266. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/approve.py +0 -0
  267. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/author_yaml.py +0 -0
  268. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  269. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  270. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/approve.py +0 -0
  271. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  272. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/author.py +0 -0
  273. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_author.py +0 -0
  274. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_fill.py +0 -0
  275. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_harvest.py +0 -0
  276. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_publish.py +0 -0
  277. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_search.py +0 -0
  278. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/catalog_update.py +0 -0
  279. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy.py +0 -0
  280. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy_dataset.py +0 -0
  281. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy_plan.py +0 -0
  282. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/deploy_status.py +0 -0
  283. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/diff.py +0 -0
  284. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/index.py +0 -0
  285. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/inventory.py +0 -0
  286. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/list_builds.py +0 -0
  287. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  288. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/peek.py +0 -0
  289. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/plan_check.py +0 -0
  290. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/preflight.py +0 -0
  291. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/record.py +0 -0
  292. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/review_setup.py +0 -0
  293. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/search.py +0 -0
  294. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/show.py +0 -0
  295. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  296. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  297. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  298. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  299. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/diffing.py +0 -0
  300. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/headline.py +0 -0
  301. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/hosted_acquisition.py +0 -0
  302. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/hosted_run_status.py +0 -0
  303. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/inventory.py +0 -0
  304. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/local_review.py +0 -0
  305. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/login.py +0 -0
  306. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  307. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/peek.py +0 -0
  308. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  309. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/plan_check.py +0 -0
  310. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/preflight.py +0 -0
  311. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/readers.py +0 -0
  312. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/remediation.py +0 -0
  313. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/render.py +0 -0
  314. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/ux/workload.py +0 -0
  315. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/viewer.py +0 -0
  316. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/__init__.py +0 -0
  317. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/authoring.py +0 -0
  318. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/contracts.py +0 -0
  319. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/materialize.py +0 -0
  320. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/observations.py +0 -0
  321. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/query.py +0 -0
  322. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/reducer.py +0 -0
  323. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/sdk.py +0 -0
  324. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/store.py +0 -0
  325. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/src/mostlyright/data_harness/visual_run/transport.py +0 -0
  326. {mostlyright_data-0.9.5 → mostlyright_data-0.9.6}/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.5
3
+ Version: 0.9.6
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/
@@ -81,12 +81,11 @@ Description-Content-Type: text/markdown
81
81
 
82
82
  # mostlyright-data
83
83
 
84
- Mostly Right turns historical and live public data—weather, economic releases, financial reports,
85
- and satellite data—into consistent datasets for analysis and prediction. Each dataset includes
86
- source links, timestamps, and check results.
84
+ Browse datasets built by our community or create your own with agents that find the sources and
85
+ configure the pipeline. Mostly Right keeps the dataset live.
87
86
 
88
- `mostlyright-data` is the command-line client. It starts hosted research and build work, follows
89
- run status, and downloads completed Parquet datasets.
87
+ `mostlyright-data` is the command-line client. It opens hosted research sessions, starts and
88
+ follows hosted dataset runs, and downloads verified datasets after they finish.
90
89
 
91
90
  ## Requirements
92
91
 
@@ -119,20 +118,20 @@ mr-data --help
119
118
  Use `mr-data research-open`, `mr-data research-status`, and `mr-data research-close` for hosted
120
119
  research sessions. `research-status` shows the current state.
121
120
 
122
- ## Local tools
121
+ ## Local execution
123
122
 
124
- The optional local tools require Linux:
123
+ The local execution lane runs only on Linux:
125
124
 
126
125
  ```bash
127
126
  python -m pip install "mostlyright-data[local]"
128
127
  ```
129
128
 
130
- They build and check worker inputs. They are not required for the hosted client.
129
+ It builds and checks worker inputs. It is not required for the hosted client.
131
130
 
132
131
  ## Documentation
133
132
 
134
133
  - [CLI guide](https://mostlyright.md/docs/guides/cli/)
135
- - [Research sessions](https://mostlyright.md/docs/guides/research/)
134
+ - [Hosted research sessions](https://mostlyright.md/docs/guides/hosted-research/)
136
135
  - [Credentials](https://mostlyright.md/docs/guides/credentials/)
137
136
  - [Public datasets](https://mostlyright.md/docs/guides/use-public-datasets/)
138
137
 
@@ -141,11 +140,11 @@ Use `mr-data --help` for the full command list and options. Commands that suppor
141
140
 
142
141
  For local builds, `--input-root` and `--output` may use relative paths.
143
142
 
144
- ## Limits and behavior
143
+ ## Behavior and limits
145
144
 
146
145
  - `mr-data review --local RUN_DIR` exits 1 when a check fails.
147
- - The weather Reader accepts one extracted GRIB2 record. It refuses a multi-record GFS or HRRR file.
148
- - Hosted credential-free acquisition is limited to one single-address public HTTPS object. Bounded collections require both local attestations.
146
+ - The weather reader accepts one extracted GRIB2 record. It refuses a multi-record GFS or HRRR file.
147
+ - Hosted credential-free acquisition supports one single-address public HTTPS object. Bounded collections require both local attestations.
149
148
 
150
149
  ## Verification
151
150
 
@@ -1,11 +1,10 @@
1
1
  # mostlyright-data
2
2
 
3
- Mostly Right turns historical and live public data—weather, economic releases, financial reports,
4
- and satellite data—into consistent datasets for analysis and prediction. Each dataset includes
5
- source links, timestamps, and check results.
3
+ Browse datasets built by our community or create your own with agents that find the sources and
4
+ configure the pipeline. Mostly Right keeps the dataset live.
6
5
 
7
- `mostlyright-data` is the command-line client. It starts hosted research and build work, follows
8
- run status, and downloads completed Parquet datasets.
6
+ `mostlyright-data` is the command-line client. It opens hosted research sessions, starts and
7
+ follows hosted dataset runs, and downloads verified datasets after they finish.
9
8
 
10
9
  ## Requirements
11
10
 
@@ -38,20 +37,20 @@ mr-data --help
38
37
  Use `mr-data research-open`, `mr-data research-status`, and `mr-data research-close` for hosted
39
38
  research sessions. `research-status` shows the current state.
40
39
 
41
- ## Local tools
40
+ ## Local execution
42
41
 
43
- The optional local tools require Linux:
42
+ The local execution lane runs only on Linux:
44
43
 
45
44
  ```bash
46
45
  python -m pip install "mostlyright-data[local]"
47
46
  ```
48
47
 
49
- They build and check worker inputs. They are not required for the hosted client.
48
+ It builds and checks worker inputs. It is not required for the hosted client.
50
49
 
51
50
  ## Documentation
52
51
 
53
52
  - [CLI guide](https://mostlyright.md/docs/guides/cli/)
54
- - [Research sessions](https://mostlyright.md/docs/guides/research/)
53
+ - [Hosted research sessions](https://mostlyright.md/docs/guides/hosted-research/)
55
54
  - [Credentials](https://mostlyright.md/docs/guides/credentials/)
56
55
  - [Public datasets](https://mostlyright.md/docs/guides/use-public-datasets/)
57
56
 
@@ -60,11 +59,11 @@ Use `mr-data --help` for the full command list and options. Commands that suppor
60
59
 
61
60
  For local builds, `--input-root` and `--output` may use relative paths.
62
61
 
63
- ## Limits and behavior
62
+ ## Behavior and limits
64
63
 
65
64
  - `mr-data review --local RUN_DIR` exits 1 when a check fails.
66
- - The weather Reader accepts one extracted GRIB2 record. It refuses a multi-record GFS or HRRR file.
67
- - Hosted credential-free acquisition is limited to one single-address public HTTPS object. Bounded collections require both local attestations.
65
+ - The weather reader accepts one extracted GRIB2 record. It refuses a multi-record GFS or HRRR file.
66
+ - Hosted credential-free acquisition supports one single-address public HTTPS object. Bounded collections require both local attestations.
68
67
 
69
68
  ## Verification
70
69
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mostlyright-data"
3
- version = "0.9.5"
3
+ version = "0.9.6"
4
4
  description = "Mostly Right CLI for reproducible, reviewed Parquet datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13,<3.14"
@@ -96,7 +96,6 @@ from mostlyright.data_harness.offline import (
96
96
  )
97
97
  from mostlyright.data_harness.pipeline import (
98
98
  _VERIFY_ALLOWLISTED_ENGINES,
99
- MAX_ROWS,
100
99
  SOURCE_PROPOSAL_SET_VERSION,
101
100
  BuildError,
102
101
  ResourceLimits,
@@ -106,7 +105,10 @@ from mostlyright.data_harness.pipeline import (
106
105
  verify_candidate, # noqa: F401 - retained for compatibility/security-route monkeypatch tests
107
106
  )
108
107
  from mostlyright.data_harness.plan_graph import (
108
+ HARD_MAX_INTERMEDIATE_ROWS,
109
+ HARD_MAX_OUTPUT_ROWS,
109
110
  HARD_MAX_RETAINED_BYTES,
111
+ HARD_MAX_SOURCE_ROWS,
110
112
  GraphResourcePolicy,
111
113
  )
112
114
  from mostlyright.data_harness.readers.contracts import ReaderError
@@ -393,17 +395,44 @@ def _selected_graph_limits(
393
395
  max_intermediate_rows: int | None,
394
396
  max_retained_bytes: int | None,
395
397
  ) -> ResourceLimits | None:
396
- """Select only explicitly raised graph dimensions; keep every other row cap at 100k."""
398
+ """Narrow the trusted graph policy by exactly the dimensions the operator named.
399
+
400
+ These flags are a NARROWING instrument and nothing else. The baseline is what a build with no
401
+ flags at all already runs under -- ``GraphResourcePolicy()``, whose defaults are the engine's
402
+ own hard ceilings -- so an unnamed dimension keeps that ceiling and a named one lowers only
403
+ itself. The invariant is worth stating because it is what makes the flags safe to reach for:
404
+ for every dimension, the policy this returns is at most the no-flag default, and equals it
405
+ unless the flag naming that dimension was supplied.
406
+
407
+ It used to default every row dimension to ``pipeline.MAX_ROWS`` instead. That is the v1 plan's
408
+ row policy, not the graph engine's, and it is 1/100th of ``HARD_MAX_SOURCE_ROWS``: naming a
409
+ byte budget alone silently cut a v2 build's row ceiling to 100k, which is the opposite of what
410
+ an operator raising a budget is asking for. ``build`` only reaches this function for a v2 plan
411
+ -- a graph flag on a v1 plan is refused as ``GRAPH_POLICY_V1`` before the build starts -- so
412
+ there is no v1 caller whose 100k cap this could be speaking for.
413
+
414
+ ``--graph-max-rows`` sets the source AND output ceilings, as its help says: one number for
415
+ "how many rows this build may read and release". The intermediate ceiling is separate because
416
+ the engine's own contract separates them (``HARD_MAX_INTERMEDIATE_ROWS`` is four times
417
+ ``HARD_MAX_SOURCE_ROWS``, sized for a union of several year-scale sources), so an operator who
418
+ wants a narrower working set says so with the flag that means it.
419
+ """
397
420
 
398
421
  if max_rows is None and max_intermediate_rows is None and max_retained_bytes is None:
399
422
  return None
400
- selected_rows = max_rows or MAX_ROWS
423
+ selected_rows = max_rows or HARD_MAX_SOURCE_ROWS
401
424
  return ResourceLimits(
425
+ # The v1 field, carried for a v2 build so `_replay_graph_derivations` streams sources under
426
+ # the policy rather than under the 100k default. It re-derives the same value from
427
+ # `graph_policy` anyway; agreeing here keeps the two from reading differently.
402
428
  max_rows=selected_rows,
403
429
  graph_policy=GraphResourcePolicy(
404
430
  max_source_rows=selected_rows,
405
- max_intermediate_rows=max_intermediate_rows or selected_rows,
406
- max_output_rows=selected_rows,
431
+ max_intermediate_rows=max_intermediate_rows or HARD_MAX_INTERMEDIATE_ROWS,
432
+ # `min` because the two ceilings are equal today and are not the same contract: a
433
+ # source ceiling that ever rose above the output one must not raise the output one
434
+ # with it.
435
+ max_output_rows=min(selected_rows, HARD_MAX_OUTPUT_ROWS),
407
436
  max_retained_bytes=max_retained_bytes or HARD_MAX_RETAINED_BYTES,
408
437
  ),
409
438
  )
@@ -1834,22 +1863,29 @@ def _parser(
1834
1863
  build.add_argument("--producer-principal", required=True, help=_BUILT_BY)
1835
1864
  build.add_argument("--producer-attempt", required=True, help=_BUILD_ATTEMPT)
1836
1865
  build.add_argument("--research-dir", type=Path, help="existing visual research directory")
1866
+ # ⚠ THE ARGPARSE MAXIMA ARE THE ENGINE'S OWN HARD CEILINGS, and deliberately not a second,
1867
+ # smaller policy. `GraphResourcePolicy.__post_init__` is the single enforcement point -- it
1868
+ # refuses anything above a ceiling whatever route the value arrived by -- so a smaller number
1869
+ # here would not be a safety property, only a cap the CLI applies and the library does not.
1870
+ # The previous maxima (1M rows, 2M intermediate, 256 MiB retained) were 1/10th, 1/20th and
1871
+ # 1/64th of the ceilings they front, with nothing written down deriving them, and they made
1872
+ # the year-scale capacity the graph engine documents unreachable from the command line.
1837
1873
  build.add_argument(
1838
1874
  "--graph-max-rows",
1839
- type=_integer_between(1, 1_000_000),
1840
- metavar="1..1000000",
1875
+ type=_integer_between(1, HARD_MAX_SOURCE_ROWS),
1876
+ metavar=f"1..{HARD_MAX_SOURCE_ROWS}",
1841
1877
  help="trusted graph source/output row ceiling (v2 plans only)",
1842
1878
  )
1843
1879
  build.add_argument(
1844
1880
  "--graph-max-intermediate-rows",
1845
- type=_integer_between(1, 2_000_000),
1881
+ type=_integer_between(1, HARD_MAX_INTERMEDIATE_ROWS),
1846
1882
  default=None,
1847
- metavar="1..2000000",
1883
+ metavar=f"1..{HARD_MAX_INTERMEDIATE_ROWS}",
1848
1884
  help="trusted graph intermediate row ceiling",
1849
1885
  )
1850
1886
  build.add_argument(
1851
1887
  "--graph-max-retained-bytes",
1852
- type=_integer_between(1, 256 * 1024 * 1024),
1888
+ type=_integer_between(1, HARD_MAX_RETAINED_BYTES),
1853
1889
  default=None,
1854
1890
  metavar="BYTES",
1855
1891
  help="trusted graph retained-byte ceiling",
@@ -233,6 +233,50 @@ MAX_SESSION_CAPABILITY_REMAINING_SECONDS = 30 * 60
233
233
  #: parent-side parser a fixed-memory boundary if a child is compromised.
234
234
  MAX_SESSION_SUPERVISOR_MESSAGE_BYTES = 128 * 1024
235
235
 
236
+ # **THE SESSION'S OWN PROGRESS BUDGET, and why it is not the producer's.**
237
+ #
238
+ # ``progress_events.MAX_PROGRESS_EVENTS_PER_ATTEMPT = 512`` bounds a stream whose shape a RECIPE
239
+ # fixes: one record per source, per artifact and per stage. A correct producer cannot approach it,
240
+ # so reaching it means a caller is looping -- which is exactly what that paragraph says, and none
241
+ # of it is edited here.
242
+ #
243
+ # A session has no such shape. Its stream is TWO records per probe (`source_probe_started` and
244
+ # `source_probe_settled`) over a conversation whose length nobody knows when it opens, so the
245
+ # producer's number bought 255 probes and then went dark -- silently, and taking `attempt_finished`
246
+ # with it, which left every watcher holding a start that never ends (#334). Both halves of that are
247
+ # fixed below: the budget is derived from what actually bounds a session, and the terminal record
248
+ # is not spendable by probe traffic.
249
+ #
250
+ # The derivation. ``MAX_SESSION_CAPABILITY_REMAINING_SECONDS`` is the hard ceiling on how long a
251
+ # session may run at all, and the interactive follow-up budget a warm sandbox pool exists to meet
252
+ # is 100 ms at its fastest (see ``DEFAULT_WARM_POOL_SIZE``). Half an hour of back-to-back probes at
253
+ # that floor is the most probes a session can physically raise; a session that emits more records
254
+ # than that is looping, and costs Studio nothing when it does.
255
+ MIN_PROBE_ROUND_TRIP_SECONDS = 0.1
256
+ MAX_SESSION_PROBES = int(MAX_SESSION_CAPABILITY_REMAINING_SECONDS / MIN_PROBE_ROUND_TRIP_SECONDS)
257
+ #: Never spent by probe traffic: the terminal `attempt_finished` a watcher pairs with
258
+ #: `attempt_started`, and the one `attempt_failed` diagnostic that reports how many records the
259
+ #: budget dropped. Reserving them is what makes "the stream always ends, and says why it thinned"
260
+ #: a property of the emitter rather than of the session being short enough.
261
+ RESERVED_SESSION_PROGRESS_EVENTS = 2
262
+ #: Two records per probe, plus the opening `attempt_started`, plus the two reserved above.
263
+ MAX_SESSION_PROGRESS_EVENTS_PER_ATTEMPT = (
264
+ 2 * MAX_SESSION_PROBES + 1 + RESERVED_SESSION_PROGRESS_EVENTS
265
+ )
266
+ #: The names the reserved slots are for. Both are terminal narration and neither is emitted by the
267
+ #: probe loop, so no amount of probe traffic can consume the slot the other one needs.
268
+ TERMINAL_SESSION_PROGRESS_EVENTS = frozenset({"attempt_finished", "attempt_failed"})
269
+ #: THE PAIR, which the budget spends as one thing. A watcher's whole use for this stream is that a
270
+ #: start it sees will be followed by an end -- `_answer_probe` already emits both halves under one
271
+ #: condition for that reason -- so a budget that could admit a start and then refuse its settlement
272
+ #: would reintroduce the dangling start by the back door. A start therefore costs TWO slots, its own
273
+ #: and the settlement it promises, and a settlement whose start was admitted is never refused.
274
+ PROBE_PROGRESS_STARTED = "source_probe_started"
275
+ PROBE_PROGRESS_SETTLED = "source_probe_settled"
276
+ #: The code the disarm diagnostic settles under. A token, because it reaches a timeline as a
277
+ #: progress fact and `progress_events` drops a record whose fact is prose.
278
+ PROGRESS_BUDGET_EXHAUSTED_CODE = "SESSION_PROGRESS_BUDGET_EXHAUSTED"
279
+
236
280
  _UTC_TIMESTAMP = re.compile(
237
281
  r"^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(?:\.[0-9]{1,6})?Z$"
238
282
  )
@@ -1407,7 +1451,9 @@ class StudioSessionAcquisitionReader:
1407
1451
  filename=filename,
1408
1452
  # The bytes are whole or they are refused. Studio clamps the source to the session
1409
1453
  # ceiling before it crawls, and a truncated table would make every count a probe
1410
- # reports quietly wrong, so there is no partial answer to flag here.
1454
+ # reports quietly wrong, so there is no partial answer to flag here. This is the
1455
+ # STARTING value of the probe envelope's `truncated`, not the whole of it: an answer
1456
+ # that drops columns or rows of its own raises the flag where it drops them.
1411
1457
  truncated=False,
1412
1458
  origin="studio.session-acquisition",
1413
1459
  )
@@ -1540,6 +1586,12 @@ class ProbeExecutor:
1540
1586
  "content_bytes": len(source.content),
1541
1587
  "data_format": parsed.data_format,
1542
1588
  "sandbox_policy_digest": result.policy_digest,
1589
+ # The parse's own width, before any answer narrows it. Set here rather than in each
1590
+ # per-kind answer so it is the SOURCE's number in every one of them, and so an answer
1591
+ # that returns fewer columns has its denominator beside it rather than nowhere.
1592
+ "column_count": len(parsed.columns),
1593
+ # The source's own flag is the starting value and not the final one: the per-kind
1594
+ # answers below raise it when they drop columns or rows of their own.
1543
1595
  "truncated": bool(source.truncated),
1544
1596
  }
1545
1597
  body = self._answer(probe_kind, normalized, parsed, envelope)
@@ -1576,6 +1628,12 @@ class ProbeExecutor:
1576
1628
  # Deliberately no cell values. `source_inspect` answers "what shape is this", and a client
1577
1629
  # that wants values asks `sample_rows` -- which is a separate probe, separately visible on
1578
1630
  # the session's event stream, so "who looked at the data" stays answerable.
1631
+ described = columns[: session_probes.MAX_PROFILE_COLUMNS]
1632
+ # The probe whose ONE job is to report a source's shape must not misreport it. A source
1633
+ # wider than `MAX_PROFILE_COLUMNS` is still answered -- the first 256 columns are the useful
1634
+ # answer -- but `truncated` says the list is a prefix and `column_count` says of what.
1635
+ if len(described) < len(columns):
1636
+ envelope["truncated"] = True
1579
1637
  return {
1580
1638
  **envelope,
1581
1639
  "schema_digest": parsed.schema_digest,
@@ -1584,7 +1642,7 @@ class ProbeExecutor:
1584
1642
  "name": name,
1585
1643
  "inferred_type": session_probes.inferred_type([row[index] for row in scanned]),
1586
1644
  }
1587
- for index, name in enumerate(columns[: session_probes.MAX_PROFILE_COLUMNS])
1645
+ for index, name in enumerate(described)
1588
1646
  ],
1589
1647
  }
1590
1648
 
@@ -1595,7 +1653,9 @@ class ProbeExecutor:
1595
1653
  rows: Sequence[Sequence[Any]],
1596
1654
  envelope: dict[str, Any],
1597
1655
  ) -> dict[str, Any]:
1598
- selected = self._selected_columns(request, columns)
1656
+ selected, columns_dropped = self._selected_columns(request, columns)
1657
+ if columns_dropped:
1658
+ envelope["truncated"] = True
1599
1659
  indices = [columns.index(name) for name in selected]
1600
1660
  window = rows[request["offset"] : request["offset"] + request["limit"]]
1601
1661
  envelope["rows_scanned"] = request["offset"] + len(window)
@@ -1617,9 +1677,10 @@ class ProbeExecutor:
1617
1677
  # monotone predicate, and the search returns the same maximal prefix the popping loop
1618
1678
  # walked down to. Two details of the old loop are semantics rather than mechanics, and are
1619
1679
  # preserved exactly: a body that fits whole is returned with `truncated` UNTOUCHED (the
1620
- # envelope's own value, from the source), and the flag is set BEFORE the fitting is
1621
- # measured, because `true` and `false` are not the same width and the byte count has to be
1622
- # the one the answer will actually be sent as.
1680
+ # envelope's own value -- the source's flag, and now also the projection's, raised above
1681
+ # when it dropped columns), and the flag is set BEFORE the fitting is measured, because
1682
+ # `true` and `false` are not the same width and the byte count has to be the one the answer
1683
+ # will actually be sent as.
1623
1684
  rows = body["rows"]
1624
1685
  if not rows or len(canonical_json_bytes(body)) <= session_probes.PROBE_RESULT_MAX_BYTES:
1625
1686
  return body
@@ -1642,7 +1703,9 @@ class ProbeExecutor:
1642
1703
  scanned: Sequence[Sequence[Any]],
1643
1704
  envelope: dict[str, Any],
1644
1705
  ) -> dict[str, Any]:
1645
- selected = self._selected_columns(request, columns)
1706
+ selected, columns_dropped = self._selected_columns(request, columns)
1707
+ if columns_dropped:
1708
+ envelope["truncated"] = True
1646
1709
  profiles: list[dict[str, Any]] = []
1647
1710
  for name in selected:
1648
1711
  index = columns.index(name)
@@ -1733,16 +1796,27 @@ class ProbeExecutor:
1733
1796
 
1734
1797
  def _selected_columns(
1735
1798
  self, request: Mapping[str, Any], columns: Sequence[str]
1736
- ) -> tuple[str, ...]:
1799
+ ) -> tuple[tuple[str, ...], bool]:
1800
+ """Return the projection and whether choosing it DROPPED columns from the source.
1801
+
1802
+ A caller who names columns gets exactly those and nothing was dropped: that is a
1803
+ projection, and reporting it as truncation would make `truncated` mean "you did not ask
1804
+ for every column", which is true of almost every probe and tells nobody anything. A caller
1805
+ who names none is offered the source's columns and gets at most `MAX_PROFILE_COLUMNS` of
1806
+ them -- and that IS a drop, because the answer is a prefix of what was offered and used to
1807
+ say `truncated: false` while being one.
1808
+ """
1809
+
1737
1810
  requested = request.get("columns")
1738
1811
  if requested is None:
1739
- return tuple(columns[: session_probes.MAX_PROFILE_COLUMNS])
1812
+ selected = tuple(columns[: session_probes.MAX_PROFILE_COLUMNS])
1813
+ return selected, len(selected) < len(columns)
1740
1814
  unknown = [name for name in requested if name not in columns]
1741
1815
  if unknown:
1742
1816
  raise SessionWorkerError(
1743
1817
  "PROBE_COLUMN_UNKNOWN", f"source has no column named {unknown[0]!r}"
1744
1818
  )
1745
- return tuple(requested)
1819
+ return tuple(requested), False
1746
1820
 
1747
1821
 
1748
1822
  def _probe_failure_code(error: BaseException) -> str:
@@ -2648,11 +2722,7 @@ class SessionSupervisor:
2648
2722
  self._claim_loop(authority, models, lease, executor, progress, deadline)
2649
2723
  finally:
2650
2724
  self._stop.set()
2651
- progress.emit(
2652
- "attempt_finished",
2653
- {"outcome": self.outcome.terminal_state or "stopped"},
2654
- )
2655
- progress.close()
2725
+ progress.finish(self.outcome.terminal_state or "stopped")
2656
2726
  try:
2657
2727
  sandbox.close_warm_pool()
2658
2728
  except Exception:
@@ -2947,6 +3017,13 @@ class _SessionProgress:
2947
3017
  append was refused has lost the thing it exists for. Records go out one at a time rather than
2948
3018
  batched, because a session's whole product claim is that a probe is visible immediately, and a
2949
3019
  250 ms coalescing window is a quarter of the follow-up budget.
3020
+
3021
+ THE BUDGET IS THE SESSION'S OWN (``MAX_SESSION_PROGRESS_EVENTS_PER_ATTEMPT``), and running out
3022
+ of it thins the stream rather than ending it: ordinary records past the budget are counted and
3023
+ dropped, the probe pair is dropped whole rather than half, and the two reserved slots still
3024
+ carry the terminal `attempt_finished` and one `attempt_failed` diagnostic naming the exact
3025
+ number dropped. Silently disarming the whole sink at the producer's 512 was the shape this
3026
+ replaces, and it took the terminal record with it. See :meth:`_claim_budget`.
2950
3027
  """
2951
3028
 
2952
3029
  def __init__(
@@ -2965,21 +3042,61 @@ class _SessionProgress:
2965
3042
  self._batch = 0
2966
3043
  self._pending: list[Any] = []
2967
3044
  self._armed = True
3045
+ self._dropped = 0
3046
+ self._unsettled_starts = 0
2968
3047
 
2969
3048
  @property
2970
3049
  def armed(self) -> bool:
2971
3050
  return self._armed
2972
3051
 
3052
+ @property
3053
+ def dropped(self) -> int:
3054
+ """How many records the budget refused. Reported on the timeline by :meth:`finish`."""
3055
+
3056
+ return self._dropped
3057
+
3058
+ def _claim_budget(self, name: str) -> bool:
3059
+ """Decide whether one record fits, SPENDING its slots when it does.
3060
+
3061
+ Three rules, in the order they are read:
3062
+
3063
+ * Terminal narration draws on the whole budget, so a probe loop can never spend the record
3064
+ that ends the stream or the one that explains why it thinned.
3065
+ * A settlement whose start was admitted is never refused. The pair is what a watcher reads
3066
+ this stream for; a start with no end is indistinguishable from a probe still running,
3067
+ forever, which is precisely the failure the budget must not reintroduce.
3068
+ * Everything else stops short of the reserved slots -- and a probe START costs two of them,
3069
+ its own and the settlement it has just promised, so the pair is admitted whole or not at
3070
+ all.
3071
+ """
3072
+
3073
+ if name in TERMINAL_SESSION_PROGRESS_EVENTS:
3074
+ return self._sequence < MAX_SESSION_PROGRESS_EVENTS_PER_ATTEMPT
3075
+ if name == PROBE_PROGRESS_SETTLED:
3076
+ if self._unsettled_starts <= 0:
3077
+ return False
3078
+ self._unsettled_starts -= 1
3079
+ return True
3080
+ ordinary = MAX_SESSION_PROGRESS_EVENTS_PER_ATTEMPT - RESERVED_SESSION_PROGRESS_EVENTS
3081
+ cost = 2 if name == PROBE_PROGRESS_STARTED else 1
3082
+ if self._sequence + cost > ordinary:
3083
+ return False
3084
+ if name == PROBE_PROGRESS_STARTED:
3085
+ self._unsettled_starts += 1
3086
+ return True
3087
+
2973
3088
  def emit(self, name: str, facts: Mapping[str, Any]) -> None:
2974
3089
  if self._deadline is not None and self._deadline.expired():
3090
+ # A different reason from the budget, and it really is a disarm: the lease is gone, so
3091
+ # an append would be refused rather than merely unwanted, and there is no terminal
3092
+ # record left to reserve a slot for.
2975
3093
  self._armed = False
2976
3094
  self._pending.clear()
2977
3095
  return
2978
3096
  if not self._armed:
2979
3097
  return
2980
- if self._sequence >= progress_events.MAX_PROGRESS_EVENTS_PER_ATTEMPT:
2981
- self._armed = False
2982
- self._pending.clear()
3098
+ if not self._claim_budget(name):
3099
+ self._dropped += 1
2983
3100
  return
2984
3101
  try:
2985
3102
  self._sequence += 1
@@ -3035,6 +3152,34 @@ class _SessionProgress:
3035
3152
  except Exception:
3036
3153
  LOGGER.debug("session progress append failed", exc_info=True)
3037
3154
 
3155
+ def finish(self, outcome: str) -> None:
3156
+ """Spend the reserved slots, in the one order that reads correctly, and close.
3157
+
3158
+ The drop diagnostic goes out BEFORE `attempt_finished` so the terminal record stays the
3159
+ last thing on the timeline, and it is emitted here rather than at the moment the budget ran
3160
+ out because only here is the number final: a diagnostic sent on the first refusal could
3161
+ only have said "one".
3162
+
3163
+ It travels as `attempt_failed` -> `diagnostic_emitted`, which is the vocabulary's narration
3164
+ ABOUT a failure and not a claim that the session failed -- the session's own outcome is the
3165
+ `attempt_finished` record immediately after it, unchanged.
3166
+ """
3167
+
3168
+ if self._dropped:
3169
+ self.emit(
3170
+ "attempt_failed",
3171
+ {
3172
+ "code": PROGRESS_BUDGET_EXHAUSTED_CODE,
3173
+ "detail": (
3174
+ f"{self._dropped} progress records were dropped after this session "
3175
+ f"reached its budget of {MAX_SESSION_PROGRESS_EVENTS_PER_ATTEMPT} "
3176
+ "records; every probe was still answered and reported"
3177
+ ),
3178
+ },
3179
+ )
3180
+ self.emit("attempt_finished", {"outcome": outcome})
3181
+ self.close()
3182
+
3038
3183
  def close(self) -> None:
3039
3184
  try:
3040
3185
  self.flush()