mostlyright-data 0.30.6__tar.gz → 0.31.1__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 (136) hide show
  1. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/PKG-INFO +1 -1
  2. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/SKILL.md +24 -0
  3. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/5-draft-one-recipe-document-one-call.md +1 -0
  4. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/commands.md +2 -1
  5. mostlyright_data-0.31.1/skills/mr-data-build/references/enriching-with-small-models.md +158 -0
  6. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/preparing-table-search.md +45 -2
  7. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/source-credentials.md +3 -2
  8. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/sources.md +14 -6
  9. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/dataset-categories-v1.json +12 -5
  10. mostlyright_data-0.31.1/src/mostlyright/data_harness/thin/enrichment.py +700 -0
  11. mostlyright_data-0.31.1/src/mostlyright/data_harness/thin/matching_benchmark.py +701 -0
  12. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/recipe.py +1 -1
  13. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/router.py +22 -2
  14. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/run_prefix.py +1 -0
  15. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/runs.py +27 -1
  16. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/stream.py +8 -0
  17. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/table_search_contract.json +29 -2
  18. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4.py +9 -2
  19. mostlyright_data-0.31.1/src/mostlyright/data_harness/thin/v4_matching.py +586 -0
  20. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_public.py +18 -0
  21. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_query.py +9 -3
  22. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_runs.py +5 -0
  23. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_search.py +707 -18
  24. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_search_contract.py +28 -9
  25. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/vocabulary.py +15 -1
  26. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/render.py +1 -0
  27. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/.gitignore +0 -0
  28. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/README.md +0 -0
  29. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/pyproject.toml +0 -0
  30. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/scripts/hatch_build.py +0 -0
  31. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/agents/openai.yaml +0 -0
  32. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/1-open-the-page-and-the-link-to-it-in-the-first-message.md +0 -0
  33. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/2-brief-two-to-four-questions-each-with-a-recommended-answer.md +0 -0
  34. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/3-probe-read-a-source-before-committing-to-it.md +0 -0
  35. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/4-decide-say-what-you-chose-what-you-refused-and-ask-one-question.md +0 -0
  36. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/6-build-one-run-sized-to-acquire-every-measured-source-whole.md +0 -0
  37. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/7-interrogate-ask-the-run-what-it-actually-delivered.md +0 -0
  38. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/8-fix-revise-the-document-and-register-it-again.md +0 -0
  39. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/9-present-only-what-survived-inspection-with-caveats.md +0 -0
  40. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/agent-protocol.md +0 -0
  41. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/autonomous-delivery.md +0 -0
  42. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/before-the-first-tool-call.md +0 -0
  43. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/boundaries.md +0 -0
  44. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/cloud-authentication-preflight.md +0 -0
  45. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/cross-repository-protocol-reference.md +0 -0
  46. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/installation-parity.md +0 -0
  47. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/live-run.md +0 -0
  48. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/making-a-table-incremental.md +0 -0
  49. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/narrating-the-run.md +0 -0
  50. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/not-hosted-yet.md +0 -0
  51. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/one-install.md +0 -0
  52. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/patterns.md +0 -0
  53. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/prediction-labels.md +0 -0
  54. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/promote.md +0 -0
  55. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/readers.md +0 -0
  56. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/receipts.md +0 -0
  57. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/recipe-test.md +0 -0
  58. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/recording-a-stream-venue.md +0 -0
  59. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/recovering-an-import-failure.md +0 -0
  60. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/reference-pages.md +0 -0
  61. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/required-protocol.md +0 -0
  62. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/the-one-thing-to-say-about-the-skill-itself.md +0 -0
  63. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/transforms.md +0 -0
  64. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/user-communication-contract.md +0 -0
  65. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/references/writing-a-decision-record.md +0 -0
  66. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/skills/mr-data-build/scripts/write_research_notebook.py +0 -0
  67. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/__init__.py +0 -0
  68. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/agent_protocol.py +0 -0
  69. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/canonical.py +0 -0
  70. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/formats.py +0 -0
  71. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/hosted_crawler_protocol.py +0 -0
  72. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/key_seam.py +0 -0
  73. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/page_coverage.py +0 -0
  74. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/part_check_evidence.py +0 -0
  75. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/session_probes.py +0 -0
  76. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/skill_assets.py +0 -0
  77. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/table_manifest.py +0 -0
  78. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/__init__.py +0 -0
  79. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/acquire.py +0 -0
  80. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/acquire_cancel.py +0 -0
  81. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/activity.py +0 -0
  82. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/approvals.py +0 -0
  83. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/backoff.py +0 -0
  84. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/categories.py +0 -0
  85. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/commands.py +0 -0
  86. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/download.py +0 -0
  87. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/fast_features.py +0 -0
  88. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/narrative.py +0 -0
  89. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/parity.py +0 -0
  90. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/probe.py +0 -0
  91. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/progress_rate.py +0 -0
  92. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/progress_vocabulary.py +0 -0
  93. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/propose.py +0 -0
  94. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/recipe_brief.py +0 -0
  95. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/recipe_explain.py +0 -0
  96. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/recipe_forecast.py +0 -0
  97. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/recipe_lint.py +0 -0
  98. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/recipe_test.py +0 -0
  99. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/refresh_rehearsal.py +0 -0
  100. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/release_check.py +0 -0
  101. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/research.py +0 -0
  102. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/run_diagnose.py +0 -0
  103. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/session.py +0 -0
  104. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/stream_venue.py +0 -0
  105. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/studio_capabilities.py +0 -0
  106. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/support.py +0 -0
  107. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/transport.py +0 -0
  108. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/user_agent.py +0 -0
  109. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_artifacts.py +0 -0
  110. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_catalog.py +0 -0
  111. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_connected.py +0 -0
  112. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_connections.py +0 -0
  113. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_dataset_covers.py +0 -0
  114. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_datasets.py +0 -0
  115. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_handoff.py +0 -0
  116. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_narrative.py +0 -0
  117. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_reader.py +0 -0
  118. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_secrets.py +0 -0
  119. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_stream.py +0 -0
  120. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/thin/v4_tables.py +0 -0
  121. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/__init__.py +0 -0
  122. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/attendance.py +0 -0
  123. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/clarification.py +0 -0
  124. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/cloud_auth.py +0 -0
  125. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/commands/__init__.py +0 -0
  126. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/commands/auth.py +0 -0
  127. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/commands/clarify.py +0 -0
  128. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/commands/login.py +0 -0
  129. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/commands/whoami.py +0 -0
  130. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/credential_native.py +0 -0
  131. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/credential_store.py +0 -0
  132. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/credentials.py +0 -0
  133. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/login.py +0 -0
  134. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/path_kind.py +0 -0
  135. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/plain_file.py +0 -0
  136. {mostlyright_data-0.30.6 → mostlyright_data-0.31.1}/src/mostlyright/data_harness/ux/remediation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mostlyright-data
3
- Version: 0.30.6
3
+ Version: 0.31.1
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/
@@ -9,6 +9,11 @@ Build the dataset the user requested, verify its contents, and report its actual
9
9
  Use hosted commands with `--json` and returned identifiers. This core workflow governs the
10
10
  references. Load the reference for the current stage only, not the entire library before starting.
11
11
 
12
+ Every build also improves the table beyond what was asked: derive what a rule can settle, and
13
+ offer the small models (classify, extract, match) for the judgement no rule can make. Do not
14
+ wait for the person to name a model. Steps 3, 4, 5, 8 and 10 say where, and
15
+ [enriching with small models](references/enriching-with-small-models.md) says how.
16
+
12
17
  ## Four gates
13
18
 
14
19
  Every build passes these four gates in order. Do not skip one. The numbered steps below carry
@@ -102,6 +107,10 @@ step 6. The stage 3 reference holds its rule. Gate 4 is step 6.
102
107
  [brief reference](references/2-brief-two-to-four-questions-each-with-a-recommended-answer.md).
103
108
  In an unattended session use the established brief, record assumptions within its scope,
104
109
  and do not wait for an absent person.
110
+ Run `mr-data models --json` once and add one line of enhancements to the brief message: at
111
+ most three, each saying what it would add, with your recommendation, as
112
+ [enriching](references/enriching-with-small-models.md#where-the-loop-runs) describes. A
113
+ judgement the request already names, such as a label per row, is part of the build.
105
114
 
106
115
  ## Research, register, build
107
116
 
@@ -109,6 +118,11 @@ step 6. The stage 3 reference holds its rule. Gate 4 is step 6.
109
118
  from publisher claims. Read [source inspection](references/3-probe-read-a-source-before-committing-to-it.md)
110
119
  for supported bounded paths and limitations. A missing capability is not evidence that the
111
120
  source is invalid. Never claim inspected rows when only documentation was read.
121
+ Read the sampled rows column by column for what would improve them: text stored as numbers or
122
+ dates, coded text with a published format, code lists, names to join on, free text a label
123
+ would summarise, pages or documents holding facts no column holds. Sort each by
124
+ [the ladder](references/enriching-with-small-models.md#the-ladder-a-rule-first-a-model-for-the-rest):
125
+ a rule first, a model for the rest.
112
126
  5. State the selected sources, joins, coverage and material limitations. Ask for a decision only
113
127
  if existing authorization does not cover it. Read the
114
128
  [recipe reference](references/5-draft-one-recipe-document-one-call.md) before authoring fields.
@@ -120,6 +134,10 @@ step 6. The stage 3 reference holds its rule. Gate 4 is step 6.
120
134
  rules. If semantic search or JEV interpretation into filters/sorts is explicitly required,
121
135
  do not register or queue a recipe that omits it; report the capability limit and wait.
122
136
  Do not add search to existing recipes or rebuild existing datasets without an explicit request.
137
+ Put the deterministic derivations found in step 4 into the first revision. Add a classify
138
+ or extract source when the brief asked for that judgement or the person accepted the offer,
139
+ from the binding `mr-data models` lists, and let a rule settle every row it can before the
140
+ model reads the rest ([writing a classify source](references/enriching-with-small-models.md#writing-a-classify-source)).
123
141
  Bind `dataset.id`, describe columns, declare checks and units, and register with
124
142
  `mr-data recipe RECIPE.json --json`. Repair all lint findings before queuing work.
125
143
  The server returns the recipe digest; do not compute or invent it.
@@ -210,6 +228,9 @@ merely to obtain a green run. Read [recovery details](references/agent-protocol.
210
228
  coverage instead, as [receipts](references/receipts.md) describes. Carry the
211
229
  correction into step 10. Read
212
230
  [verification](references/7-interrogate-ask-the-run-what-it-actually-delivered.md).
231
+ Then run `mr-data models suggest RUN_ID --json`. It reads the run's preview and names where
232
+ the table could use a deterministic derivation or a model call, and whether this deployment
233
+ serves that model. Confirm each lead against the rows before you offer it.
213
234
  9. Any truncated source means a preview, not the requested complete dataset. Inspect coverage
214
235
  even when the run succeeded. Untruncated acquisition does not prove publisher pagination, nested
215
236
  records or population coverage is complete. A null coverage window does not mean all history was acquired.
@@ -230,6 +251,8 @@ merely to obtain a green run. Read [recovery details](references/agent-protocol.
230
251
  Search preparation runs independently: pending or failed indexing never means the data build
231
252
  failed, and declared metadata alone never proves observed search quality.
232
253
  Report rows and coverage actually verified, checks, limitations and the stable dataset link.
254
+ End with what would make the table better: the remaining enhancements, deterministic ones
255
+ first, each naming the column it reads and what it would add, and the model that would do it.
233
256
  Read [delivery](references/9-present-only-what-survived-inspection-with-caveats.md) for details.
234
257
 
235
258
  ## Source-specific references
@@ -240,6 +263,7 @@ merely to obtain a green run. Read [recovery details](references/agent-protocol.
240
263
  | Reader coordinate and options | [Readers](references/readers.md) |
241
264
  | Connector or collection | [Sources](references/sources.md) |
242
265
  | One request per row of another source, such as a decision model scoring each row | [Per-row requests](references/sources.md#authoring-a-per-row-request) |
266
+ | Which small models this deployment serves, the rule-first ladder, and classify and extract sources | [Enriching with small models](references/enriching-with-small-models.md) |
243
267
  | SQL and joins | [Transforms](references/transforms.md) |
244
268
  | Source credentials | [Credentials](references/source-credentials.md) |
245
269
  | Live stream recording | [Streams](references/recording-a-stream-venue.md) |
@@ -141,6 +141,7 @@ The allowed IDs and labels are:
141
141
  | `people-society` | People & Society |
142
142
  | `health-medicine` | Health & Medicine |
143
143
  | `science-research` | Science & Research |
144
+ | `ai-models` | AI & Models |
144
145
  | `technology` | Technology |
145
146
  | `energy` | Energy |
146
147
  | `agriculture-food` | Agriculture & Food |
@@ -1,6 +1,6 @@
1
1
  ## Commands
2
2
 
3
- These thirty-eight are the whole surface, alongside `acquire-slices`, which names a capability
3
+ These thirty-nine are the whole surface, alongside `acquire-slices`, which names a capability
4
4
  gap rather than doing anything, and `export-hosted-candidate`, which is a backend operator step.
5
5
 
6
6
  Every command that takes a run identifier also takes its first eight or more characters,
@@ -41,6 +41,7 @@ run in full.
41
41
  | `mr-data parts` | List one table version's parts — the identifier, the row count, the byte size and the recorded bounds of each — so a training loader can shard them across workers and read a table no single file should hold. `--version` names a version rather than the live one, and `--from`/`--to` keep only the parts a value range cannot rule out. Nothing is downloaded by listing them; the pattern is under [Reading a table that is made of parts](7-interrogate-ask-the-run-what-it-actually-delivered.md#reading-a-table-that-is-made-of-parts). |
42
42
  | `mr-data diff` | Compare two runs and say what changed. |
43
43
  | `mr-data connections` | List saved workspace connections and their current recipe coordinates; `--dataset ID` filters to connections granted to that dataset. No credential values are returned. |
44
+ | `mr-data models` | List the small models a recipe can call on this deployment: each task (classify, extract, match), whether it is served, and each binding's route, pinned model, rate, today's usage and a request body to start from. `models suggest RUN_ID` reads the preview one run sealed and names, column by column, a deterministic derivation or a model call that would improve the table, with whether its model is served. Both read only and spend no model call. [Enriching with small models](enriching-with-small-models.md) says what to do with the answer. |
44
45
  | `mr-data keys` | Enrol a source credential by name, list the names with their created and rotated times, and delete one. `keys set` reads the value from a file or from standard input and never from the command line; no command prints a value back. |
45
46
  | `mr-data stream` | Record a public `wss://` venue so a build can read it. `stream document register --file F` admits the connector document, `stream registry create --digest D` admits a set of them, `stream probe` listens briefly and seals nothing, `stream capture --seconds N` records a bounded window, and `stream subscribe` keeps recording. `stream subscription {show|pause|resume|stop} ID` retains the legacy full-record interface. `stream subscription quiescence ID` reads the bounded server-computed proof; `pause-cas` and `resume-cas` read its ETag and make one conditional bounded write. An ambiguous CAS failure is not retried until a fresh invocation observes the resource again. `stream status ID` reads a capture or probe, and `stream recordings --document-digest D` names what a build could read and until when. `--seconds` is at most 600. `mr-data run` takes no duration: a build reads sealed batches and is bounded by them. |
46
47
  | `mr-data open` | Mint a single-use, short-lived address that continues this session in a browser at one dashboard path, and print it. `--open` hands it to the platform opener. The credential decides who mints: a device credential — what `mr-data login` stores — mints at Cloud, and a personal access token mints at Studio. |
@@ -0,0 +1,158 @@
1
+ ## Enriching with small models
2
+
3
+ Mostly Right builds the pipeline with an agent and then improves the table with small models
4
+ where code is not enough. Offering those improvements is part of every build. Do not wait for
5
+ the person to name a model: most people do not know which ones exist. Look for where the table
6
+ could be better while you probe, say what you found, and recommend what to add.
7
+
8
+ ### What this deployment serves
9
+
10
+ Run `mr-data models --json` once per session, before the brief message. It lists three tasks and
11
+ whether each is served here, read from Studio's platform credential listing.
12
+
13
+ | Task | What it does | Binding |
14
+ | --- | --- | --- |
15
+ | classify | Labels each row from a text column with yes/no or choice questions: a topic, a category, a sentiment, a flag no keyword rule decides. Each answer carries a probability per label. | `classify` (Clef, self-hosted) first; `openrouter-decisions` (TypeSafe's Jev) answers the same questions |
16
+ | extract | Pulls named fields (names, amounts, dates, places) out of page or document text into columns. Every value appears verbatim in the input or is dropped. | `extract` (the extraction model, NuExtract-based) |
17
+ | match | Links the same entity across tables or within one. | none yet: `planned` |
18
+
19
+ Each served binding comes with its route, its pinned `model`, its rate, today's usage and quota,
20
+ and a `request_template`. Copy `origin`, `method`, `path_template` and `model` from the listing
21
+ exactly, and write the same origin as the source's `connector.origin` and as the only entry of
22
+ `pages.allowed_origins`. Clef's and the extraction model's origins are this deployment's own
23
+ service addresses, which no one can guess: the platform credential is chosen by that route and pin, so a guessed origin or a model
24
+ alias is refused at registration with `PLATFORM_CREDENTIAL_UNBOUND`. The person enrols no key.
25
+ The person pays nothing for these calls. They count against the workspace's daily quota, which
26
+ `mr-data recipe forecast` reports. Prefer `classify` over `openrouter-decisions` for new work:
27
+ Mostly Right pays OpenRouter per Jev call, and Clef answers the same request body.
28
+
29
+ Each binding also comes with a `pages_template`: `request_timeout_seconds` 120 and `retries` 3.
30
+ Write both into the collection's `pages`. Clef and the extraction model scale to zero when idle,
31
+ and their first instance takes three to five minutes to load. Studio starts loading it when the
32
+ run is admitted, and until the service has answered once it spreads each member's attempts over
33
+ six minutes rather than seconds. The longer timeout and the fourth attempt let the last one land
34
+ after a slow start. Size `limits.max_requests` at `pages.max_fetches_per_run` times four. A run
35
+ that still fails says `it never answered, likely a 3 to 5 minute cold start` in its
36
+ `ROW_REQUEST_UNAVAILABLE` detail: tell the person the model was starting up and run it again, which keeps every saved
37
+ answer.
38
+
39
+ A task listed `not_served` or `planned` is offered as coming, never written into a recipe. For
40
+ `match`, join on a normalized deterministic key now and say that model matching for the rows the
41
+ key cannot settle is coming.
42
+
43
+ ### The ladder: a rule first, a model for the rest
44
+
45
+ Improve the table with code wherever a rule can decide, and spend a model call only on the
46
+ judgement no rule can make. Both are improvements to offer.
47
+
48
+ **Deterministic, in the transform, no model:**
49
+
50
+ - Cast text to its real type: numbers, booleans, dates and timestamps in UTC.
51
+ - Decode a published format into columns with `regexp_extract`: a METAR weather report, a
52
+ vehicle identification number, an ICD or NAICS code, a postcode.
53
+ - Map a documented code list to readable labels with a `CASE`, from the publisher's own list.
54
+ - Derive categories a published standard defines from columns the table already has. The FAA
55
+ flight category (VFR, MVFR, IFR, LIFR) follows from ceiling and visibility; fog or thunderstorm
56
+ flags follow from the present-weather codes.
57
+ - Build a normalized key (lowercase, trimmed, punctuation and legal suffixes such as Inc, LLC and
58
+ Ltd removed) for an exact join or a dedupe.
59
+
60
+ **A model, through a per-row source:**
61
+
62
+ - classify: what a row's text is about, whether it states something, its sentiment or intent,
63
+ which of the person's categories it belongs to.
64
+ - extract: facts stated in prose, a page or a document that no column holds.
65
+ - match, once served: two records that are the same entity under different spellings.
66
+
67
+ **Both together.** When a rule settles most rows, settle those in the transform and let the
68
+ model label the rest, then `coalesce` the rule's label with the model's in the transform. Say
69
+ which rows each label came from in the column description. Where Studio serves it, the rule can
70
+ also keep the rows it settled from being sent at all: see [Needs Studio 4.14](#needs-studio-414).
71
+
72
+ ### Where the loop runs
73
+
74
+ 1. **Brief (step 3).** Read what the table is for and which judgements the person named. Run
75
+ `mr-data models --json`. In the brief message add one line of enhancements: at most three,
76
+ each saying what it adds in the person's words, with your recommendation. A judgement the
77
+ brief already asks for ("which reports mention fog", "tag each filing by sector") is part of
78
+ the build, not an offer.
79
+ 2. **Probe (step 4).** Read the sampled rows column by column with the ladder: each free-text,
80
+ coded, name and document column. Note which rule or model would improve it.
81
+ 3. **Draft (step 5).** Write the deterministic derivations into the first revision: they cost
82
+ nothing and are checked like any other column. Write a model source when the brief asked for
83
+ that judgement or the person accepted the offer. In an unattended build, add a model source
84
+ only for a judgement the brief names, and record the others as offers.
85
+ 4. **Test (gate 3).** A model source is tested on the scratch table like any per-row source, with
86
+ `pages.stop_at_budget: true` and a small `pages.max_fetches_per_run`. Read a few answers
87
+ against the rows they label before the full.
88
+ 5. **After the run (step 8).** Run `mr-data models suggest RUN_ID --json`. It reads the run's
89
+ preview and names, column by column, a deterministic derivation or a model call that would
90
+ improve the table, each with `model_status` for the model it needs. It spends no call. Read
91
+ it as leads: confirm each against the rows before offering it.
92
+ 6. **Deliver (step 10).** End the report with what would make the table better: the remaining
93
+ offers, deterministic ones first, each with the column it reads and what it would add. One
94
+ concrete sentence each, not a menu of everything possible.
95
+
96
+ ### Writing a classify source
97
+
98
+ A classify source is a [per-row request](sources.md#authoring-a-per-row-request) over the source
99
+ that holds the text. Start from the listing's `request_template` and fill in:
100
+
101
+ - `parameters` and the `{text_column}` placeholder in `state`: rename both to the upstream
102
+ source's column that holds the text. The template's `text_column` and `id` are placeholders,
103
+ and registration refuses a parameter or carried column the upstream does not have.
104
+ - `questions`: one entry per column you want. A `choice` question names its labels as keys of
105
+ `criteria` (1 to 64); include a "none fits" label so a row is never forced into a wrong one. A
106
+ `noul` question answers one statement true or false, and its `criteria` may describe only
107
+ `true` and `false`. A `score` question rates the text on a list of 1 to 64 levels. Keep the
108
+ instructions to one sentence about the text alone. `state` takes at most 65,536 characters.
109
+ - `carry_columns`: the upstream key and the columns the transform needs, so the transform reads
110
+ this source alone.
111
+ - Answers are reused: a request already answered under the same pin and question is not sent
112
+ again, so a refresh pays only for new rows.
113
+
114
+ The Reader reads each label's probability by JSON pointer, as the Jev example in
115
+ [per-row requests](sources.md#authoring-a-per-row-request) shows. Declare each probability column
116
+ `required: false`, rank them in the transform, and keep the top label and its probability. A
117
+ table that publishes a model's label names the model pin in the column description and keeps the
118
+ probability beside the label.
119
+
120
+ ### Writing an extract source
121
+
122
+ An extract source has the same per-row shape with the extraction body
123
+ ([the extract binding](https://mostlyright.md/docs/reference/sources/)):
124
+
125
+ - `input` is `{"view": "input", "text": "{text_column}"}`. `text` is the only placeholder, and it
126
+ names a column of the upstream source, never of the transform. Give it visible text, not raw
127
+ HTML: read the page in the upstream source with a Reader such as `html.web_extract`
128
+ ([Readers](readers.md)).
129
+ - `fields` is a literal list of 1 to 64 `{name, description}` entries. Changing it changes the
130
+ source's capture identity, so settle the list in the brief.
131
+ - `one: true` asks for a single object per row, for a detail page; leave it out for a list of
132
+ records per row.
133
+
134
+ Each answer is grounded: every value appears verbatim in the input, and `spans` say where. A row
135
+ whose text states none of the fields returns no record, which is an answer, not a failure.
136
+
137
+ ### Saying it
138
+
139
+ Name the model by what it does, not by its binding: "a small classification model reads each
140
+ report and labels the weather regime", "a small extraction model pulls the issuer and the amount
141
+ out of each filing". Say how many rows it would read, that it costs the person nothing, and what
142
+ the new columns would be called. Never say a model was used when the table has no source that
143
+ called it, and never present a model's label as fact: it is a label with a probability.
144
+
145
+ ### Needs Studio 4.14
146
+
147
+ Check first: run `mr-data recipe explain RECIPE.json --json` and read `studio_capabilities`. Use
148
+ this only when `row_filter` (and, for the second item, `per_row_revisit_interval`) is true there.
149
+ When it is false, the answer is "not available on this Studio yet": every upstream row is sent,
150
+ and the transform settles which label wins.
151
+
152
+ - State the deterministic rule as the per-row source's `row_filter`, the negation of the rows the
153
+ rule settles, so those rows cost no call
154
+ ([filter before paying](making-a-table-incremental.md#filter-before-paying-row_filter)). It
155
+ must never drop a row the transform keeps.
156
+ - Where the per-row interval is served too, state `pages.revisit` as a long interval, up to a
157
+ year: the model is pinned and the question fixed, so an answer does not change and should be
158
+ carried forward ([a freshness bound](making-a-table-incremental.md#a-freshness-bound-on-per-row-answers)).
@@ -16,10 +16,16 @@ meaning-based retrieval over descriptions, and a planner that turns a sentence i
16
16
  | `search propose --recipe FILE` | Returns a starter spec. It never edits the file. |
17
17
  | `search validate` | Checks a spec and its evaluation cases against the pinned Studio contract, then asks Studio. |
18
18
  | `search locate` | Turns a title, a year or an id into the `[part, row]` locator an evaluation case needs. |
19
+ | `search sample` | Reads up to 100 rows of a sealed version, with `--columns` to project. |
20
+ | `search values` | Lists the most frequent values of one `--column`, with `--prefix` to narrow them. |
21
+ | `search preview` | Runs `--query` or a `--plan` file as an unranked scan under a revision's spec, activated or not. |
19
22
  | `search configure` | Stores a draft revision of the spec, with its evaluation cases. |
23
+ | `search add-cases` | Declares a new revision that adds `--cases` to the draft or to `--revision`. |
24
+ | `search evaluate` | Reports where a revision's evaluation measurement stands. It starts nothing. |
20
25
  | `search build` | Queues a search build for a sealed version, or for one revision with `--revision`. |
21
26
  | `search status` | Reports package readiness, job progress and the failure reason. |
22
27
  | `search try` | Runs one query against the table's live search and prints rows, plan and timings. |
28
+ | `search query` | Searches a public table through Cloud's search route, as its page and MCP do. |
23
29
  | `search activate` | Switches the version's live search to a built generation. |
24
30
  | `search rollback` | Switches back to an earlier generation. |
25
31
  | `search explain` | Shows how Studio parses one query into filters and sorts. |
@@ -28,6 +34,15 @@ meaning-based retrieval over descriptions, and a planner that turns a sentence i
28
34
  Exit codes are stable. 0 means complete. 1 means failed or invalid. 3 means still running or
29
35
  served by the fallback scan. 4 means ambiguous.
30
36
 
37
+ `sample`, `values` and `preview` need Studio 4.41 and a warm worker. They queue one bounded query
38
+ and wait for its rows the way `mr-data query` does. A read still running exits 3; run the same
39
+ command again to read the same query back. `QUERY_NO_WARM_EXECUTOR` means no worker holds the
40
+ workspace: open one with `mr-data probe`, wait the `retry_after_seconds` it names, and retry.
41
+ `evaluate` exits 0 on `passed` and `not_required`, 1 on `failed`, `build_failed` and
42
+ `measurement_failed`, and 3 on `no_cases` and while the revision is unbuilt, building or
43
+ unmeasured. An older
44
+ Studio answers these verbs with `THIN_SEARCH_CAPABILITY_UNAVAILABLE`.
45
+
31
46
  ## 1. Check the capability
32
47
 
33
48
  Probe the deployment before you add `table.search` to a recipe:
@@ -129,8 +144,8 @@ An alias maps a phrase to an exact filter. Use one for each category value a use
129
144
  {"phrase": "tv show", "column": "media_type", "operator": "eq", "value": "tv"}
130
145
  ```
131
146
 
132
- Phrases are unique and casefolded. Take the values from the built table with `mr-data query`, not
133
- from documentation. Ordered comparisons need a numeric or date column. `contains` needs a text
147
+ Phrases are unique and casefolded. Take the values from the built table with
148
+ `mr-data search values TABLE_ID --column genres` or `mr-data query`, not from documentation. Ordered comparisons need a numeric or date column. `contains` needs a text
134
149
  column. Decimal values travel as strings. Never invent a meaning such as "best" when the brief
135
150
  does not name a metric. Leave that word unresolved, or add an explicit alias such as
136
151
  "highest rated".
@@ -311,6 +326,8 @@ mr-data search build TABLE_ID --version VERSION_ID --revision REVISION_ID --json
311
326
  mr-data search status --job JOB_ID --json
312
327
  ```
313
328
 
329
+ To add cases to the draft without restating its spec, run `mr-data search add-cases TABLE_ID
330
+ --version VERSION_ID --cases more-cases.json --json`. It answers the new revision; build that one.
314
331
  Leave out `--spec` to declare the `table.search` spec of the recipe that sealed the version.
315
332
  Use that to add evaluation cases without retyping the spec. Without `--spec` the client cannot
316
333
  check locally that semantic cases include a paraphrase and a hard negative. Studio checks them
@@ -354,6 +371,32 @@ Add `"engine": "resident"` and `"settled": true` to `search` to use the live pac
354
371
  does. Public query prints Cloud stage durations under `result.timings`, the HTTP status and the
355
372
  request ID. Keep a refusal's `detail` with its request ID.
356
373
 
374
+ ## 15. Search a table the way its page does
375
+
376
+ A public table with a ready search package answers through Cloud's search route. The dataset
377
+ page, the Public API's `POST /api/v2/public/tables/{id}/search`, MCP `search_table` and this verb
378
+ all reach the same search service with the same plans. There is no scan fallback.
379
+
380
+ ```sh
381
+ mr-data search query PUBLIC_TABLE_ID --query "incepton" --json
382
+ mr-data search query PUBLIC_TABLE_ID --query "dun" --unsettled --page-size 5 --json
383
+ mr-data search query PUBLIC_TABLE_ID --query "dune" --count --json
384
+ mr-data search query PUBLIC_TABLE_ID --query "dune" --plan plan.json --cursor NEXT_CURSOR --json
385
+ ```
386
+
387
+ A query is settled by default, so the planner runs. `--unsettled` answers as the search box does
388
+ while someone types, without the planner. `--page-size` is 1 to 100 (default 20). `--count` asks
389
+ for the number of matching rows. To read the next page, save the answer's `plan` to a file and
390
+ pass it with `--plan` beside `--cursor NEXT_CURSOR`; a cursor continues one plan.
391
+
392
+ The answer carries the rows as `{row_id, fields}`, the applied `plan`, the `planner` report, the
393
+ `retrieval` mode, `next_cursor`, the `package` it read, which `service` answered, the stage
394
+ timings under `service_timings_ms` and Cloud's `Server-Timing` under `cloud_timings_ms`.
395
+
396
+ A table without a ready package is refused with Cloud's `search_unavailable` and a reason:
397
+ `preparing` (retry after the time it gives), `not_public`, `no_package`, or Studio's own reason.
398
+ A plan or cursor the service refuses answers `invalid_plan` with diagnostics.
399
+
357
400
  ## Rules
358
401
 
359
402
  - Never emulate search locally, and never claim readiness from a declaration.
@@ -38,8 +38,9 @@ A [per-row request](sources.md#authoring-a-per-row-request) presents a key by it
38
38
  `request.auth` says. A saved connection cannot stand in for it.
39
39
  - `platform` presents a key Mostly Right holds, so the user enrols nothing.
40
40
 
41
- The platform key serves OpenRouter's decisions endpoint for TypeSafe's Jev decision model today,
42
- pinned to `typesafe/jev-1.13`. Do not ask the user for an OpenRouter key to use it. A user who
41
+ The platform key serves every binding `mr-data models --json` lists: Clef for classification,
42
+ the extraction model where it is served, and OpenRouter's decisions endpoint for TypeSafe's Jev
43
+ decision model, pinned to `typesafe/jev-1.13`. Do not ask the user for a key to use any of them. A user who
43
44
  prefers their own key enrols it with `mr-data keys set`. The source then states
44
45
  `opaque_reference`, `credential.secret_name` and `"auth": {"kind": "bearer"}`.
45
46
 
@@ -251,11 +251,15 @@ breaks a rule above.
251
251
  | `opaque_reference` | `credential.secret_name` and `request.auth` | a key the user enrolled with `mr-data keys set` |
252
252
  | `platform` | no `credential` and no `auth` | an endpoint Mostly Right holds a key for |
253
253
 
254
- The platform credential needs no key from anyone, and any subscribed workspace may use it. It serves
255
- one binding today: `POST https://openrouter.ai/api/alpha/decisions`, with `/model` set to
256
- `typesafe/jev-1.13`. Pin that exact model. A floating alias such as `~typesafe/jev-latest` is
257
- refused at registration with `PLATFORM_CREDENTIAL_UNBOUND`. Keep the origin, method and path
258
- exact, state no query and no literal header, and write `/model` as a literal. Write no other body
254
+ The platform credential needs no key from anyone, and any subscribed workspace may use it. Each
255
+ binding is one route and one pinned model, and `mr-data models --json` lists the ones this
256
+ deployment serves: Clef for classification (`classify`), TypeSafe's Jev through OpenRouter
257
+ (`openrouter-decisions`, `POST https://openrouter.ai/api/alpha/decisions` with `/model` set to
258
+ `typesafe/jev-1.13`) and, where it is served, the extraction model (`extract`). Pin the exact
259
+ model the listing names. A floating alias such as `~typesafe/jev-latest` is refused at
260
+ registration with `PLATFORM_CREDENTIAL_UNBOUND`. Keep the origin, method and path exactly as
261
+ listed, state no query and no literal header, and write `/model` as a literal.
262
+ [Enriching with small models](enriching-with-small-models.md) says when to offer each. Write no other body
259
263
  member whose name differs from `model` only in case. A user who holds their own OpenRouter key can
260
264
  present it with `opaque_reference` instead.
261
265
 
@@ -287,7 +291,11 @@ The worker retries 408, 429 and every 5xx but 501 and 505. It also retries when
287
291
  arrived: a transport, resolver or TLS failure, or a response refused before its status was
288
292
  checked, such as a compressed body or a malformed header, whatever its status. It sends a request
289
293
  at most `pages.retries` more times, then fails the run with `ROW_REQUEST_UNAVAILABLE`. A
290
- `Retry-After` longer than 60 seconds fails the run at once, and more retries cannot help it. When
294
+ `Retry-After` longer than 60 seconds fails the run at once, and more retries cannot help it. A
295
+ platform credential's source that calls this deployment's own model service (Clef, the
296
+ extraction model) waits longer before that service has answered once: a failure
297
+ with no answer, or a 502, 503 or 504 without `Retry-After`, is that service's cold start, and the
298
+ attempts left are spread so the last goes out six minutes after the first. When
291
299
  the request presents a key, a checked 401 or 403 stops the source with
292
300
  `ROW_REQUEST_CREDENTIAL_REFUSED`, and a checked 402 with `ROW_REQUEST_PAYMENT_REQUIRED`. Any
293
301
  other answer the upstream gave fails that one member, and the run goes on. That covers another
@@ -13,7 +13,7 @@
13
13
  "id": "crypto",
14
14
  "label": "Crypto",
15
15
  "definition": "Cryptocurrencies, blockchain networks, DeFi and digital-asset markets.",
16
- "exclusions": "Use Finance for conventional securities, banking and non-crypto prediction markets.",
16
+ "exclusions": "Use Finance for conventional securities, banking and other non-crypto financial markets.",
17
17
  "examples": "Bitcoin prices; Ethereum transactions; DeFi lending"
18
18
  },
19
19
  {
@@ -21,7 +21,7 @@
21
21
  "label": "Finance",
22
22
  "definition": "Banking, securities, investment, insurance and financial-market activity.",
23
23
  "exclusions": "Crypto assets belong to Crypto; economy-wide indicators belong to Economics & Business.",
24
- "examples": "Stock prices; interest-rate products; prediction-market order books"
24
+ "examples": "Stock prices; interest-rate products; exchange trade records"
25
25
  },
26
26
  {
27
27
  "id": "economics-business",
@@ -58,12 +58,19 @@
58
58
  "exclusions": "Use the subject-specific category for weather, health, technology or other covered research.",
59
59
  "examples": "Astronomical observations; particle experiments; research publications"
60
60
  },
61
+ {
62
+ "id": "ai-models",
63
+ "label": "AI & Models",
64
+ "definition": "AI systems, specialized and frontier models, evaluations, training-run metadata, agent traces and model-related corpora.",
65
+ "exclusions": "General software, internet and telecommunications measurements belong to Technology. A dataset about a non-AI subject stays in that subject even when a model was used to build it.",
66
+ "examples": "Frontier-model benchmark scores; model cards; agent-workflow traces"
67
+ },
61
68
  {
62
69
  "id": "technology",
63
70
  "label": "Technology",
64
- "definition": "Software, computing, AI, internet and telecommunications.",
65
- "exclusions": "Blockchain belongs to Crypto; media consumption and gaming belong to Arts, Media & Entertainment.",
66
- "examples": "Software packages; internet performance; AI benchmarks"
71
+ "definition": "Software, computing, internet and telecommunications.",
72
+ "exclusions": "AI systems, models, evaluations and agent traces belong to AI & Models. Blockchain belongs to Crypto; media consumption and gaming belong to Arts, Media & Entertainment.",
73
+ "examples": "Software packages; internet performance; package registries"
67
74
  },
68
75
  {
69
76
  "id": "energy",