mostlyright-data 0.29.8__tar.gz → 0.29.9__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 (122) hide show
  1. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/PKG-INFO +1 -1
  2. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/pyproject.toml +1 -1
  3. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/recipe.py +6 -5
  4. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/recipe_explain.py +9 -7
  5. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4.py +39 -10
  6. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_query.py +1 -2
  7. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/.gitignore +0 -0
  8. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/README.md +0 -0
  9. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/scripts/hatch_build.py +0 -0
  10. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/SKILL.md +0 -0
  11. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/agents/openai.yaml +0 -0
  12. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/1-open-the-page-and-the-link-to-it-in-the-first-message.md +0 -0
  13. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/2-brief-two-to-four-questions-each-with-a-recommended-answer.md +0 -0
  14. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/3-probe-read-a-source-before-committing-to-it.md +0 -0
  15. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/4-decide-say-what-you-chose-what-you-refused-and-ask-one-question.md +0 -0
  16. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/5-draft-one-recipe-document-one-call.md +0 -0
  17. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/6-build-one-run-sized-to-acquire-every-measured-source-whole.md +0 -0
  18. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/7-interrogate-ask-the-run-what-it-actually-delivered.md +0 -0
  19. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/8-fix-revise-the-document-and-register-it-again.md +0 -0
  20. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/9-present-only-what-survived-inspection-with-caveats.md +0 -0
  21. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/agent-protocol.md +0 -0
  22. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/autonomous-delivery.md +0 -0
  23. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/before-the-first-tool-call.md +0 -0
  24. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/boundaries.md +0 -0
  25. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/cloud-authentication-preflight.md +0 -0
  26. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/commands.md +0 -0
  27. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/cross-repository-protocol-reference.md +0 -0
  28. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/installation-parity.md +0 -0
  29. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/live-run.md +0 -0
  30. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/making-a-table-incremental.md +0 -0
  31. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/narrating-the-run.md +0 -0
  32. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/not-hosted-yet.md +0 -0
  33. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/one-install.md +0 -0
  34. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/prediction-labels.md +0 -0
  35. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/preparing-table-search.md +0 -0
  36. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/promote.md +0 -0
  37. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/readers.md +0 -0
  38. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/receipts.md +0 -0
  39. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/recording-a-stream-venue.md +0 -0
  40. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/recovering-an-import-failure.md +0 -0
  41. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/reference-pages.md +0 -0
  42. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/required-protocol.md +0 -0
  43. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/source-credentials.md +0 -0
  44. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/sources.md +0 -0
  45. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/the-one-thing-to-say-about-the-skill-itself.md +0 -0
  46. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/transforms.md +0 -0
  47. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/user-communication-contract.md +0 -0
  48. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/references/writing-a-decision-record.md +0 -0
  49. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
  50. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/__init__.py +0 -0
  51. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/agent_protocol.py +0 -0
  52. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/canonical.py +0 -0
  53. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/formats.py +0 -0
  54. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  55. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/key_seam.py +0 -0
  56. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/page_coverage.py +0 -0
  57. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/part_check_evidence.py +0 -0
  58. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/session_probes.py +0 -0
  59. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/skill_assets.py +0 -0
  60. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/table_manifest.py +0 -0
  61. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  62. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  63. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  64. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/activity.py +0 -0
  65. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  66. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/categories.py +0 -0
  67. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/commands.py +0 -0
  68. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/dataset-categories-v1.json +0 -0
  69. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/download.py +0 -0
  70. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/fast_features.py +0 -0
  71. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  72. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/parity.py +0 -0
  73. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/probe.py +0 -0
  74. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/progress_rate.py +0 -0
  75. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/progress_vocabulary.py +0 -0
  76. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/propose.py +0 -0
  77. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/recipe_brief.py +0 -0
  78. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/recipe_forecast.py +0 -0
  79. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/recipe_lint.py +0 -0
  80. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/research.py +0 -0
  81. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/router.py +0 -0
  82. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/run_diagnose.py +0 -0
  83. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/runs.py +0 -0
  84. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/session.py +0 -0
  85. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/stream.py +0 -0
  86. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
  87. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/studio_capabilities.py +0 -0
  88. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/transport.py +0 -0
  89. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/user_agent.py +0 -0
  90. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_artifacts.py +0 -0
  91. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_catalog.py +0 -0
  92. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_connected.py +0 -0
  93. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_connections.py +0 -0
  94. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
  95. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_datasets.py +0 -0
  96. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
  97. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
  98. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_public.py +0 -0
  99. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_reader.py +0 -0
  100. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_runs.py +0 -0
  101. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_search.py +0 -0
  102. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
  103. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
  104. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/v4_tables.py +0 -0
  105. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/thin/vocabulary.py +0 -0
  106. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  107. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/attendance.py +0 -0
  108. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/clarification.py +0 -0
  109. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  110. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  111. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  112. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
  113. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  114. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  115. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  116. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  117. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  118. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/login.py +0 -0
  119. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  120. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  121. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/remediation.py +0 -0
  122. {mostlyright_data-0.29.8 → mostlyright_data-0.29.9}/src/mostlyright/data_harness/ux/render.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyright-data
3
- Version: 0.29.8
3
+ Version: 0.29.9
4
4
  Summary: Mostly Right hosted CLI for reviewed 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.29.8"
3
+ version = "0.29.9"
4
4
  description = "Mostly Right hosted CLI for reviewed datasets"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -80,11 +80,9 @@ SHOW_SCHEMA = f"{THIN_SCHEMA_PREFIX}-recipe-read.v1"
80
80
  READINESS_SCHEMA = f"{THIN_SCHEMA_PREFIX}-recipe-readiness.v1"
81
81
  PROPOSE_SCHEMA = f"{THIN_SCHEMA_PREFIX}-recipe-propose.v1"
82
82
 
83
- #: The bound on the document. The same number the authoring lane bounded one of its six documents
84
- #: by -- four times the contract's own 262144-byte ceiling on a canonical recipe -- rather than a
85
- #: second number chosen here, because this document is those six documents in one and the ceiling
86
- #: it has to clear is the canonical form's.
87
- MAX_DOCUMENT_BYTES = 4 * 262_144
83
+ #: A plain input file may occupy up to Studio's 2 MiB body ceiling. Before submission,
84
+ #: the complete canonical UTF-8 request envelope must also fit that ceiling.
85
+ MAX_DOCUMENT_BYTES = v4.MAX_RECIPE_REQUEST_BYTES
88
86
 
89
87
  #: ``recipe.schema.json#/$defs/recipe_document``'s required members, in the order the schema lists
90
88
  #: them. Checked here before the network, for the reason every early refusal in this client
@@ -1187,6 +1185,9 @@ def register(
1187
1185
  """
1188
1186
 
1189
1187
  document = read_document(Path(args.target))
1188
+ # UUIDs have fixed wire length. Refuse an oversized envelope before credentials,
1189
+ # capability reads or delegation writes; the actual client checks it again.
1190
+ v4.recipe_registration_body(document, "00000000-0000-0000-0000-000000000000")
1190
1191
  # New grammar must be refused as unserved before local lint can diagnose its shape.
1191
1192
  keyless = any(
1192
1193
  capability == "keyless_window" for _, capability in recipe_explain.gated_grammar(document)
@@ -39,6 +39,7 @@ from mostlyright.data_harness.thin.transport import ThinLaneError
39
39
  from mostlyright.data_harness.thin.v4 import (
40
40
  EXPLAIN_AND_FORECAST_REQUEST_VERSION,
41
41
  StudioV4Client,
42
+ check_recipe_request_size,
42
43
  identifier,
43
44
  )
44
45
 
@@ -1231,17 +1232,18 @@ def explain_document_at_studio(
1231
1232
  nothing, which is what makes it safe to ask before a registration.
1232
1233
  """
1233
1234
 
1235
+ body = {
1236
+ "schema_version": ROUTES_REQUEST_VERSION,
1237
+ "workspace_id": str(client.session.workspace_id),
1238
+ "document": dict(document),
1239
+ }
1240
+ check_recipe_request_size(body)
1234
1241
  try:
1235
- # The one inherited `_call` (thin/v4.py): the route rides the same transport, byte
1236
- # ceiling and refusal translation as every other V4 call.
1242
+ # The one inherited `_call` carries the ordinary response ceiling.
1237
1243
  answer = client._call(
1238
1244
  "POST",
1239
1245
  EXPLAIN_REFRESH_PATH,
1240
- body={
1241
- "schema_version": ROUTES_REQUEST_VERSION,
1242
- "workspace_id": str(client.session.workspace_id),
1243
- "document": dict(document),
1244
- },
1246
+ body=body,
1245
1247
  expected=(200,),
1246
1248
  )
1247
1249
  except ThinLaneError as refusal:
@@ -39,6 +39,7 @@ from collections.abc import Mapping
39
39
  from typing import Any
40
40
  from uuid import UUID
41
41
 
42
+ from mostlyright.data_harness.canonical import canonical_json_bytes
42
43
  from mostlyright.data_harness.thin.runs import StudioApiClient
43
44
  from mostlyright.data_harness.thin.transport import ThinLaneError
44
45
 
@@ -915,6 +916,35 @@ def identifier(value: str, field: str) -> str:
915
916
  raise ThinLaneError("THIN_REQUEST_INVALID", f"{value!r} is not a {field}") from error
916
917
 
917
918
 
919
+ # Studio's API request-body middleware accepts at most 2 MiB. Bound the complete
920
+ # UTF-8 wire envelope, not the recipe's character count or its formatted file size.
921
+ MAX_RECIPE_REQUEST_BYTES = 2 * 1024 * 1024
922
+ # A GET recipe includes the document plus identifiers and registration metadata.
923
+ # Give that envelope 1 MiB headroom; ordinary JSON routes retain their 1 MiB cap.
924
+ MAX_RECIPE_RESPONSE_BYTES = MAX_RECIPE_REQUEST_BYTES + 1024 * 1024
925
+
926
+
927
+ def check_recipe_request_size(body: Mapping[str, Any]) -> None:
928
+ size = len(canonical_json_bytes(body))
929
+ if size > MAX_RECIPE_REQUEST_BYTES:
930
+ raise ThinLaneError(
931
+ "THIN_RECIPE_REQUEST_TOO_LARGE",
932
+ f"the serialized recipe request is {size} bytes; Studio accepts at most "
933
+ f"{MAX_RECIPE_REQUEST_BYTES} bytes including its request envelope. "
934
+ "Reduce the recipe before submitting it",
935
+ )
936
+
937
+
938
+ def recipe_registration_body(document: Mapping[str, Any], workspace_id: str) -> dict[str, Any]:
939
+ body = {
940
+ "workspace_id": workspace_id,
941
+ "document": dict(document),
942
+ "require_category": True,
943
+ }
944
+ check_recipe_request_size(body)
945
+ return body
946
+
947
+
918
948
  class StudioV4Client(StudioApiClient):
919
949
  """The V4 routes, over the transport and the hardening :class:`StudioApiClient` already has.
920
950
 
@@ -993,11 +1023,7 @@ class StudioV4Client(StudioApiClient):
993
1023
  return self._call(
994
1024
  "POST",
995
1025
  CREATE_RECIPE_PATH,
996
- body={
997
- "workspace_id": str(self.session.workspace_id),
998
- "document": dict(document),
999
- "require_category": True,
1000
- },
1026
+ body=recipe_registration_body(document, str(self.session.workspace_id)),
1001
1027
  expected=(201,),
1002
1028
  )
1003
1029
 
@@ -1008,6 +1034,7 @@ class StudioV4Client(StudioApiClient):
1008
1034
  "GET",
1009
1035
  GET_RECIPE_PATH.format(recipe_id=identifier(recipe_id, "recipe identifier")),
1010
1036
  expected=(200,),
1037
+ maximum=MAX_RECIPE_RESPONSE_BYTES,
1011
1038
  )
1012
1039
 
1013
1040
  def recipe_readiness(
@@ -1049,14 +1076,16 @@ class StudioV4Client(StudioApiClient):
1049
1076
  def explain_recipe_refresh(self, document: Mapping[str, Any]) -> dict[str, Any]:
1050
1077
  """Judge one unregistered recipe document for refresh, and read what this Studio serves."""
1051
1078
 
1079
+ body = {
1080
+ "schema_version": EXPLAIN_AND_FORECAST_REQUEST_VERSION,
1081
+ "workspace_id": str(self.session.workspace_id),
1082
+ "document": dict(document),
1083
+ }
1084
+ check_recipe_request_size(body)
1052
1085
  return self._call(
1053
1086
  "POST",
1054
1087
  EXPLAIN_RECIPE_REFRESH_PATH,
1055
- body={
1056
- "schema_version": EXPLAIN_AND_FORECAST_REQUEST_VERSION,
1057
- "workspace_id": str(self.session.workspace_id),
1058
- "document": dict(document),
1059
- },
1088
+ body=body,
1060
1089
  expected=(200,),
1061
1090
  )
1062
1091
 
@@ -54,7 +54,6 @@ from mostlyright.data_harness.thin.session import (
54
54
  )
55
55
  from mostlyright.data_harness.thin.transport import ThinLaneError, UrlLibTransport
56
56
  from mostlyright.data_harness.thin.v4 import (
57
- GET_RECIPE_PATH,
58
57
  GET_RUN_PATH,
59
58
  GET_RUN_QUERY_PATH,
60
59
  RUN_QUERY_PATH,
@@ -278,7 +277,7 @@ class StudioV4QueryClient(StudioV4Client):
278
277
  def recipe_source_ids(self, recipe_id: str) -> list[str]:
279
278
  """The sources a recipe registered, which a session opened for its dataset may probe."""
280
279
 
281
- record = self._call("GET", GET_RECIPE_PATH.format(recipe_id=recipe_id), expected=(200,))
280
+ record = self.recipe(recipe_id)
282
281
  listed = record.get("source_ids")
283
282
  sources = (
284
283
  [item for item in listed if isinstance(item, str) and item]