rag-wright 0.7.0__tar.gz → 0.9.0__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 (1020) hide show
  1. {rag_wright-0.7.0 → rag_wright-0.9.0}/.claude/skills/authoring-a-capability/SKILL.md +15 -8
  2. {rag_wright-0.7.0 → rag_wright-0.9.0}/.claude/skills/building-an-ingestion-capability/SKILL.md +28 -3
  3. {rag_wright-0.7.0 → rag_wright-0.9.0}/.claude/skills/creating-evals/SKILL.md +115 -37
  4. {rag_wright-0.7.0 → rag_wright-0.9.0}/.claude/skills/laya/SKILL.md +9 -7
  5. {rag_wright-0.7.0/src/rag_wright/.agents → rag_wright-0.9.0/.claude}/skills/qwen-vllm-modal/SKILL.md +34 -15
  6. {rag_wright-0.7.0/src/rag_wright/.agents → rag_wright-0.9.0/.claude}/skills/setfit/SKILL.md +7 -4
  7. {rag_wright-0.7.0/src/rag_wright/.agents → rag_wright-0.9.0/.claude}/skills/using-the-rag-wright-engine/SKILL.md +78 -9
  8. {rag_wright-0.7.0 → rag_wright-0.9.0}/.env.example +3 -2
  9. rag_wright-0.9.0/.release-please-manifest.json +3 -0
  10. {rag_wright-0.7.0 → rag_wright-0.9.0}/CHANGELOG.md +33 -0
  11. {rag_wright-0.7.0 → rag_wright-0.9.0}/CLAUDE.md +12 -2
  12. {rag_wright-0.7.0 → rag_wright-0.9.0}/PKG-INFO +6 -3
  13. {rag_wright-0.7.0 → rag_wright-0.9.0}/README.md +4 -2
  14. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/ArcadeDB_Local.md +15 -7
  15. rag_wright-0.9.0/docs/adr/0134-skills-for-product-developers-are-linked-per-project-never-globally.md +39 -0
  16. rag_wright-0.9.0/docs/adr/0135-the-seam-gives-each-event-loop-its-own-async-http-client.md +29 -0
  17. rag_wright-0.9.0/docs/adr/0136-spreadsheet-tables-are-glued-back-across-blank-rows.md +38 -0
  18. rag_wright-0.9.0/docs/adr/0137-generated-answers-state-their-support-and-none-is-an-abstention.md +34 -0
  19. rag_wright-0.9.0/docs/adr/0138-the-engine-reaches-pdfium-through-one-locked-door.md +39 -0
  20. rag_wright-0.9.0/docs/adr/0139-the-agent-harness-substrate-is-engine-scope.md +95 -0
  21. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/README.md +9 -3
  22. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/api/README.md +151 -7
  23. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/api/pack_sdk.md +19 -1
  24. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/configuration.md +31 -4
  25. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/domain-adaptation/README.md +14 -7
  26. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/domain-adaptation/_engine-gaps.md +25 -3
  27. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/domain-adaptation/authoring-capabilities.md +3 -2
  28. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/domain-adaptation/classification-and-decision-models.md +7 -6
  29. rag_wright-0.9.0/docs/domain-adaptation/evals-from-expert-files.md +46 -0
  30. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/domain-adaptation/kg-construction.md +34 -1
  31. rag_wright-0.9.0/docs/evals.md +51 -0
  32. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/installation.md +38 -20
  33. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/playbook.md +6 -6
  34. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/quickstart.md +1 -1
  35. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/releasing.md +1 -1
  36. rag_wright-0.9.0/docs/specs/evals/plan.md +118 -0
  37. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/public-surface/plan.md +15 -0
  38. rag_wright-0.9.0/docs/specs/public-surface/rulewright-arcadedb-separation.md +67 -0
  39. rag_wright-0.9.0/docs/specs/public-surface/rulewright-migration-0.8.0.md +62 -0
  40. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/templates/product-starter/CLAUDE.md.template +98 -26
  41. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/templates/product-starter/README.md +13 -6
  42. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/templates/product-starter/playbook.md.template +59 -16
  43. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/workspaces.md +23 -0
  44. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/condensed_pipeline.py +1 -1
  45. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/contract_parity_live.py +2 -2
  46. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/cuad_highlight.py +1 -1
  47. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/full_pipeline_rerank.py +1 -1
  48. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/function_ceiling.py +1 -1
  49. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/function_property_rerank.py +1 -1
  50. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/function_rerank.py +1 -1
  51. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/ground_discriminator_rerank.py +1 -1
  52. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/kg_primary.py +1 -1
  53. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/kg_property_rerank.py +1 -1
  54. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/listwise_rerank.py +1 -1
  55. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/relational_eval.py +14 -2
  56. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/residual_decision_gold.py +1 -1
  57. {rag_wright-0.7.0 → rag_wright-0.9.0}/pyproject.toml +4 -1
  58. {rag_wright-0.7.0 → rag_wright-0.9.0}/release-please-config.json +4 -1
  59. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/measure_generation_robustness.py +24 -13
  60. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/refresh_framework_graph.sh +1 -1
  61. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/.agents/skills/authoring-a-capability/SKILL.md +15 -8
  62. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/.agents/skills/building-an-ingestion-capability/SKILL.md +28 -3
  63. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/.agents/skills/creating-evals/SKILL.md +115 -37
  64. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/.agents/skills/laya/SKILL.md +9 -7
  65. {rag_wright-0.7.0/.claude → rag_wright-0.9.0/src/rag_wright/.agents}/skills/qwen-vllm-modal/SKILL.md +34 -15
  66. {rag_wright-0.7.0/.claude → rag_wright-0.9.0/src/rag_wright/.agents}/skills/setfit/SKILL.md +7 -4
  67. {rag_wright-0.7.0/.claude → rag_wright-0.9.0/src/rag_wright/.agents}/skills/using-the-rag-wright-engine/SKILL.md +78 -9
  68. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/api/__init__.py +30 -7
  69. rag_wright-0.9.0/src/rag_wright/api/agents.py +31 -0
  70. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/api/config.py +8 -3
  71. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/api/documents.py +14 -0
  72. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/api/workspace.py +64 -6
  73. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/answer_generator.py +25 -10
  74. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/document_parse.py +17 -7
  75. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/parsing.py +18 -15
  76. rag_wright-0.9.0/src/rag_wright/capabilities/sheet_tables.py +174 -0
  77. rag_wright-0.9.0/src/rag_wright/contracts/evals.py +140 -0
  78. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/corpus/document_parser.py +7 -1
  79. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/corpus/embedded.py +24 -30
  80. rag_wright-0.9.0/src/rag_wright/evals/__init__.py +11 -0
  81. rag_wright-0.9.0/src/rag_wright/evals/gold.py +219 -0
  82. rag_wright-0.9.0/src/rag_wright/evals/langfuse_backend.py +109 -0
  83. rag_wright-0.9.0/src/rag_wright/evals/runner.py +139 -0
  84. rag_wright-0.9.0/src/rag_wright/evals/scorers.py +477 -0
  85. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/ingestion/__init__.py +2 -2
  86. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/ingestion/evaluate.py +104 -30
  87. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/models/profiles.py +15 -0
  88. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/models/seam.py +130 -0
  89. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/models/tracing.py +19 -0
  90. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/pack_sdk/__init__.py +4 -1
  91. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/mcp/compliance_server.py +1 -1
  92. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/subgraphs/compliance_check.py +9 -7
  93. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/subgraphs/compliance_ingestion.py +5 -5
  94. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/mcp/intra_document_qa_server.py +1 -1
  95. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/mcp/relational_qa_server.py +1 -1
  96. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/mcp/typed_property_retrieval_server.py +1 -1
  97. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/subgraphs/contract_ingestion_pipeline.py +5 -5
  98. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/subgraphs/intra_document_qa.py +4 -4
  99. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/subgraphs/relational_qa.py +3 -3
  100. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/subgraphs/typed_property_retrieval.py +5 -4
  101. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/skills/generation/SKILL.md +7 -6
  102. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/store/arcadedb.py +29 -6
  103. rag_wright-0.9.0/src/rag_wright/util/pdfium.py +58 -0
  104. {rag_wright-0.7.0 → rag_wright-0.9.0}/tasks.md +14 -4
  105. rag_wright-0.9.0/tests/api/test_agent_chat_model.py +213 -0
  106. rag_wright-0.9.0/tests/api/test_agent_chat_model_live.py +32 -0
  107. rag_wright-0.9.0/tests/api/test_drop_workspace.py +95 -0
  108. rag_wright-0.9.0/tests/api/test_drop_workspace_live.py +26 -0
  109. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_open_workspace_reconfig.py +1 -1
  110. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_pack_sdk.py +4 -1
  111. rag_wright-0.9.0/tests/api/test_pdf_page_count.py +42 -0
  112. rag_wright-0.9.0/tests/api/test_public_gaps_ps38.py +77 -0
  113. rag_wright-0.9.0/tests/arch/test_lock_version.py +30 -0
  114. rag_wright-0.9.0/tests/arch/test_pdfium_door.py +80 -0
  115. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/arch/test_shipped_skills.py +21 -0
  116. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_answer_generator.py +39 -0
  117. rag_wright-0.9.0/tests/evals/test_gold_contracts.py +87 -0
  118. rag_wright-0.9.0/tests/evals/test_gold_import.py +146 -0
  119. rag_wright-0.9.0/tests/evals/test_langfuse_backend.py +165 -0
  120. rag_wright-0.9.0/tests/evals/test_runner.py +124 -0
  121. rag_wright-0.9.0/tests/evals/test_scorer_parity.py +311 -0
  122. rag_wright-0.9.0/tests/evals/test_scorers_a.py +116 -0
  123. rag_wright-0.9.0/tests/evals/test_scorers_b.py +82 -0
  124. rag_wright-0.9.0/tests/evals/test_scorers_c.py +101 -0
  125. rag_wright-0.9.0/tests/evals/test_scorers_d.py +96 -0
  126. rag_wright-0.9.0/tests/ingestion/test_aevaluate.py +105 -0
  127. rag_wright-0.9.0/tests/ingestion/test_sheet_continuations.py +143 -0
  128. rag_wright-0.9.0/tests/models/test_seam_event_loops.py +84 -0
  129. rag_wright-0.9.0/tests/scripts/test_generation_robustness_errors.py +17 -0
  130. rag_wright-0.9.0/tests/skills/test_creating_evals_skill_example.py +57 -0
  131. rag_wright-0.9.0/tests/store/test_store_create_flag.py +121 -0
  132. rag_wright-0.9.0/tests/util/__init__.py +0 -0
  133. {rag_wright-0.7.0 → rag_wright-0.9.0}/uv.lock +3 -1
  134. rag_wright-0.7.0/.release-please-manifest.json +0 -3
  135. {rag_wright-0.7.0 → rag_wright-0.9.0}/.claude/settings.json +0 -0
  136. {rag_wright-0.7.0 → rag_wright-0.9.0}/.claude/skills/classifier-opportunity-analysis/SKILL.md +0 -0
  137. {rag_wright-0.7.0 → rag_wright-0.9.0}/.claude/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -0
  138. {rag_wright-0.7.0 → rag_wright-0.9.0}/.claude/skills/qwen-vllm-modal/scripts/rw_gate.py +0 -0
  139. {rag_wright-0.7.0 → rag_wright-0.9.0}/.github/workflows/publish.yml +0 -0
  140. {rag_wright-0.7.0 → rag_wright-0.9.0}/.github/workflows/release-please.yml +0 -0
  141. {rag_wright-0.7.0 → rag_wright-0.9.0}/.gitignore +0 -0
  142. {rag_wright-0.7.0 → rag_wright-0.9.0}/LICENSE +0 -0
  143. {rag_wright-0.7.0 → rag_wright-0.9.0}/SPEC.md +0 -0
  144. {rag_wright-0.7.0 → rag_wright-0.9.0}/conftest.py +0 -0
  145. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/ARCHITECTURE_OVERVIEW.md +0 -0
  146. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/OBSERVABILITY.md +0 -0
  147. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0001-stack-and-library-choices.md +0 -0
  148. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0002-validation-corpus-cuad-edgar.md +0 -0
  149. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0003-ard-registration-and-capability-kinds.md +0 -0
  150. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0004-entity-disambiguation.md +0 -0
  151. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0005-relational-golden-set.md +0 -0
  152. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0006-model-profile.md +0 -0
  153. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0007-arcadedb-store-schema.md +0 -0
  154. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0008-unified-framework-index-docs-grounding.md +0 -0
  155. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0009-rlm-chunking-retained-as-configurable-capability.md +0 -0
  156. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0010-transformers-pinned-below-5-for-flagembedding-reranker.md +0 -0
  157. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0011-cuad-not-a-retrieval-benchmark-acord-for-queries.md +0 -0
  158. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0012-entity-mention-confidence-no-proximity-edges.md +0 -0
  159. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0013-entity-resolution-matching-strategy.md +0 -0
  160. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0014-split-generation-and-vision-to-text.md +0 -0
  161. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0015-rlm-dynamic-subagents-and-granted-subagents.md +0 -0
  162. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0016-rlm-defined-by-required-capabilities-enforced-as-tests.md +0 -0
  163. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0017-dynamic-dispatch-trigger-as-typed-flag.md +0 -0
  164. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0018-rlm-method-is-the-orchestrator-system-prompt.md +0 -0
  165. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0019-recursion-is-optional-for-chunking-required-for-synthesis.md +0 -0
  166. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0020-serialize-interpreter-sessions-per-process-ki1.md +0 -0
  167. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0021-capability-interface-governed-typed-io.md +0 -0
  168. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0022-fr-k-embedding-free-okf-navigation-experimental.md +0 -0
  169. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0023-cheap-model-for-okf-enrichment.md +0 -0
  170. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0024-reader-parallelism-lives-in-python-not-the-interpreter.md +0 -0
  171. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0025-retrieval-pivot-function-classify-property-graph-rerank.md +0 -0
  172. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0026-property-schema-and-extended-function-taxonomy.md +0 -0
  173. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0027-openrouter-provider-routing-by-throughput.md +0 -0
  174. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0028-deterministic-grounding-judge-and-flash-pro-cascade.md +0 -0
  175. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0029-retrieval-pipeline-domain-portability-and-adaptation.md +0 -0
  176. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0030-model-training-standard-modal-reusable-checkpointed.md +0 -0
  177. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0031-single-call-chunking-for-structured-contracts.md +0 -0
  178. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0032-nl-to-type-two-step-reason-emit-on-gemma.md +0 -0
  179. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0033-unified-contract-kg-three-legs-one-graph.md +0 -0
  180. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0034-granite-json-schema-structured-output-profile.md +0 -0
  181. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0035-graph-extraction-rebacked-with-gp1b-retire-hybrid.md +0 -0
  182. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0036-party-clause-link-party-to-edge.md +0 -0
  183. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0037-clause-template-is-authoritative-code-not-generated.md +0 -0
  184. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0038-full-cuad-kg-on-gcp-gpu-vm-and-gcs-backup.md +0 -0
  185. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0039-self-hosted-open-model-stack-on-modal-a100.md +0 -0
  186. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0040-neuro-symbolic-extraction-fidelity-ontology-shacl-validation.md +0 -0
  187. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0041-capability-kind-rubric-and-agent-skill-runtime-tiers.md +0 -0
  188. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0042-clause-level-span-id-provenance-and-content-hash-backfill.md +0 -0
  189. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0043-retire-cross-corpus-retrieval-standardize-on-leg-b.md +0 -0
  190. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0044-is-exception-to-derived-carveout-relationship.md +0 -0
  191. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0045-client-side-tag-parse-structured-output.md +0 -0
  192. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0046-acord-unified-into-one-production-kg.md +0 -0
  193. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0047-retire-precomputed-clause-function-gate.md +0 -0
  194. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0048-ingest-llm-classifier-nondestructive-reclassify.md +0 -0
  195. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0049-generic-customer-lens-for-ingestion.md +0 -0
  196. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0050-async-langgraph-ingestion.md +0 -0
  197. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0051-schema-bootstrap-and-feedback-driven-ontology-evolution.md +0 -0
  198. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0052-engine-product-split-graphwright-parked.md +0 -0
  199. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0053-answer-prose-output-hygiene.md +0 -0
  200. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0054-remove-auto-tag-from-generator-evidence.md +0 -0
  201. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0055-confidence-out-of-band.md +0 -0
  202. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0056-bound-structured-retry-wall-clock.md +0 -0
  203. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0057-async-engine-architecture.md +0 -0
  204. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0058-structure-first-chunking.md +0 -0
  205. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0059-recall-decoupled-from-classification-and-visible-partial-loss.md +0 -0
  206. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0060-scope-compliance-check-to-named-policy-sources.md +0 -0
  207. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0061-subject-document-compliance-per-section.md +0 -0
  208. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0062-tiered-ocr-scan-quality-vlm-escalation.md +0 -0
  209. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0063-per-sentence-compliance-subject-facts.md +0 -0
  210. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0064-typed-properties-out-of-band-on-evidence.md +0 -0
  211. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0065-deontic-applicability-gates-query-side.md +0 -0
  212. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0066-ontology-ttl-single-source-of-truth.md +0 -0
  213. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0067-domain-pack-retargeting.md +0 -0
  214. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0068-recall-first-actor-gate-ontology-role-disjointness.md +0 -0
  215. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0069-reading-order-chunking-tables-figures-retrievable.md +0 -0
  216. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0070-text-layer-first-parsing-no-false-vlm-escalation.md +0 -0
  217. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0071-defragmentation-reconstruct-paragraphs-from-line-items.md +0 -0
  218. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0072-extract-guard-furniture-and-deterministic-failure.md +0 -0
  219. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0073-born-digital-threshold-sparse-pages-no-vlm-escalation.md +0 -0
  220. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0074-retry-transient-extraction-failures.md +0 -0
  221. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0075-per-page-vlm-escalation.md +0 -0
  222. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0076-thread-safe-shared-embedder-reranker.md +0 -0
  223. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0077-concurrent-function-classification-across-chunks.md +0 -0
  224. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0078-dedicated-extraction-executor.md +0 -0
  225. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0079-product-default-granite-4.2-openrouter-routing.md +0 -0
  226. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0080-nested-tag-parse-and-degrade.md +0 -0
  227. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0081-function-independent-tagparse-clause-extraction.md +0 -0
  228. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0082-symbolic-gate-function-independent.md +0 -0
  229. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0083-executor-hop-trace-context-capture.md +0 -0
  230. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0084-gleaning-off-on-the-query-leg.md +0 -0
  231. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0085-query-constraint-extraction-tagparse.md +0 -0
  232. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0086-streaming-cost-capture.md +0 -0
  233. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0087-retrieval-relevance-score-on-rankedspan.md +0 -0
  234. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0088-per-span-relevance-verdict.md +0 -0
  235. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0089-structured-output-generation-tracing.md +0 -0
  236. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0090-affiliate-of-extraction.md +0 -0
  237. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0091-retire-partyto-edge.md +0 -0
  238. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0092-idempotent-write-graph.md +0 -0
  239. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0093-entities-by-name-seam.md +0 -0
  240. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0094-workspace-document-scope.md +0 -0
  241. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0095-span-page-provenance.md +0 -0
  242. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0096-carveout-keyword-normalization.md +0 -0
  243. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0097-caller-configurable-ingest-extraction-models.md +0 -0
  244. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0098-invoke-time-document-scope.md +0 -0
  245. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0099-mcp-tools-never-take-a-model-supplied-tenant.md +0 -0
  246. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0100-profile-based-model-routing.md +0 -0
  247. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0101-untagged-spans-reach-extraction-aspect-gate-removed.md +0 -0
  248. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0102-open-descriptive-list-dims-retain-verbatim.md +0 -0
  249. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0103-a-clause-is-a-provision-not-a-span.md +0 -0
  250. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0104-dense-floor-protection-in-leg-b.md +0 -0
  251. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0105-in-band-model-usage-accounting.md +0 -0
  252. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0106-document-signals-off-the-citation.md +0 -0
  253. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0107-requirement-page-provenance.md +0 -0
  254. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0108-qwen3-27b-single-a100-serving-profile.md +0 -0
  255. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0109-vllm-cold-start-reduction.md +0 -0
  256. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0110-fp8-kv-cache-16k-single-a100.md +0 -0
  257. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0111-pin-qwen3-27b-deepinfra-bf16.md +0 -0
  258. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0112-relax-deepagents-pin-to-floor.md +0 -0
  259. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0113-llm-span-instrumentation-for-latency-attribution.md +0 -0
  260. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0114-setfit-default-clause-function-classifier.md +0 -0
  261. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0115-classifier-only-step3a-property-extraction.md +0 -0
  262. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0116-soft-function-scoping-classifier-lane.md +0 -0
  263. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0117-engine-api-layer-and-capability-runtime.md +0 -0
  264. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0118-engine-core-api-vs-ard-adapter-free-impl-ref-client.md +0 -0
  265. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0119-jev-typed-decision-model-for-compliance-closed-set-fields.md +0 -0
  266. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0120-rlm-sub-agent-identity-dynamic-dispatch-trigger.md +0 -0
  267. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0121-spacy-optional-extra-model-runtime-download.md +0 -0
  268. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0122-provision-boundary-deterministic-plus-decision-model-residue.md +0 -0
  269. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0123-batched-releases-release-please-and-consumer-dependabot.md +0 -0
  270. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0124-generic-ingestion-builder-and-hooks.md +0 -0
  271. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0125-qwen-openrouter-unpinned.md +0 -0
  272. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0126-unit-representative-hook-and-the-reference-vote.md +0 -0
  273. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0127-retire-the-okf-code.md +0 -0
  274. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0128-two-public-tiers-api-and-pack-sdk.md +0 -0
  275. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0129-laya-temperatures-and-the-sklearn-floor.md +0 -0
  276. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0130-deploy-the-self-hosted-model-server-from-the-engine.md +0 -0
  277. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0131-model-server-hardening-after-rulewright-review.md +0 -0
  278. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0132-model-server-cold-start-from-a-gpu-snapshot.md +0 -0
  279. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/adr/0133-model-call-deadline-follows-the-timeout-and-a-thinking-cap.md +0 -0
  280. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/architecture/foundations-and-adding-a-domain.md +0 -0
  281. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/architecture.md +0 -0
  282. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/README.md +0 -0
  283. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/design/deontic-applicability-routing.md +0 -0
  284. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/design/ingestion-neuro-symbolic-gaps.md +0 -0
  285. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/design/semantic-subject-segmentation.md +0 -0
  286. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/design/unify-subject-preprocessing.md +0 -0
  287. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0037-closed-vocab-drops-verbatim-values-to-other.md +0 -0
  288. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0038-a-clause-node-is-now-created-per-sentence-so-98-percent-of-spans-become-clauses.md +0 -0
  289. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0039-the-provision-detector-reads-text-but-docling-puts-the-section-number-in-marker.md +0 -0
  290. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0040-covered-subject-is-asked-of-every-provision-so-verbatim-retention-fills-it-with-noise.md +0 -0
  291. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0041-VERIFICATION-dense-floor.md +0 -0
  292. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0041-leg-b-discards-the-best-dense-matches-on-some-queries.md +0 -0
  293. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0042-usage-is-captured-per-call-but-never-returned-so-cost-needs-a-langfuse-round-trip.md +0 -0
  294. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0043-a-requirement-carries-no-page-provenance-so-a-finding-cannot-point-into-its-policy.md +0 -0
  295. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0044-document-signals-scaffolding-is-shown-to-the-user-as-a-quote-from-their-document.md +0 -0
  296. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0045-a-fixed-money-cap-records-no-cap-quantum-so-the-amount-is-only-prose.md +0 -0
  297. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0046-appending-a-natural-follow-up-to-a-question-drops-the-clause-type.md +0 -0
  298. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0047-an-exact-deepagents-pin-transitively-pins-every-consumer.md +0 -0
  299. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/engine-issues/0048-the-pinned-endpoints-latency-tail-makes-agent-runs-undebuggable-from-either-side.md +0 -0
  300. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-07-20_graphwright_capability_interface_reply.md +0 -0
  301. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-07-20b_graphwright_interface_confirmation.md +0 -0
  302. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-07-20c_graphwright_ingestion_interfaces.md +0 -0
  303. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-08-30_subject_compliance_final_rulewright.md +0 -0
  304. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-01_issue-0013-recall-first-actor-gate_rulewright.md +0 -0
  305. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-01_ontology-source-of-truth_rulewright.md +0 -0
  306. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-03_issue-0014-table-retrievability_rulewright.md +0 -0
  307. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-04_bulk-ingestion-wall_rulewright.md +0 -0
  308. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-04_issue-0016-thread-safe-embedder_rulewright.md +0 -0
  309. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-05_observability-langfuse_rulewright.md +0 -0
  310. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-05_tagparse-ingestion-and-granite-4.2_rulewright.md +0 -0
  311. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-09_affiliate-of-extraction_rulewright.md +0 -0
  312. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-09_issue-0028-partyto-retired_rulewright.md +0 -0
  313. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-09_issue-0029-idempotent-write-graph_rulewright.md +0 -0
  314. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-09_issue-0030-entities-by-name_rulewright.md +0 -0
  315. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-09_observability-and-retrieval-floor_rulewright.md +0 -0
  316. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-09_relevance-verdict_rulewright.md +0 -0
  317. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-09_rename-run-ad-compliance-check_rulewright.md +0 -0
  318. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-09_structured-output-cost-tracing_rulewright.md +0 -0
  319. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-10_ingest-models-caller-configurable_rulewright.md +0 -0
  320. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-failclosed-and-nodrift_rulewright.md +0 -0
  321. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-validate-ingested-set_rulewright.md +0 -0
  322. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-10_issue-0031-workspace-document-scope_rulewright.md +0 -0
  323. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-10_issue-0032-span-page-provenance_rulewright.md +0 -0
  324. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-10_issue-0033-carveout-normalization_rulewright.md +0 -0
  325. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-10_issue-0034-invoke-time-document-scope_rulewright.md +0 -0
  326. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-11_issue-0035-followup-derived-guard_rulewright.md +0 -0
  327. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-11_issue-0035-mcp-no-model-tenant_rulewright.md +0 -0
  328. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-11_profile-based-model-routing_rulewright.md +0 -0
  329. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-11_qwen-default-modal-or_rulewright.md +0 -0
  330. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-11_qwen-everywhere-config_rulewright.md +0 -0
  331. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-12_clause-granularity_0036-0039_rulewright.md +0 -0
  332. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-12_closed-vocab_0037-0040_rulewright.md +0 -0
  333. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-12_dense-floor-protection_0041_rulewright.md +0 -0
  334. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-13_in-band-usage_0042_rulewright.md +0 -0
  335. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-14_document-signals-off-citation_0044_rulewright.md +0 -0
  336. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-14_requirement-page-provenance_0043_rulewright.md +0 -0
  337. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-16_qwen3-27b-single-a100-serving-profile_rulewright.md +0 -0
  338. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-18_fp8-accuracy-eval-configB_rulewright.md +0 -0
  339. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-18_fp8-kv-16k-single-a100_rulewright.md +0 -0
  340. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-20_deepagents-pin-relaxed_0047_rulewright.md +0 -0
  341. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-20_llm-span-instrumentation_0048_rulewright.md +0 -0
  342. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-answers_from_rulewright.md +0 -0
  343. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-scoping-questions_rulewright.md +0 -0
  344. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/misc/.gitkeep +0 -0
  345. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/plans/Corpus_Acquisition.md +0 -0
  346. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/plans/async-migration.md +0 -0
  347. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/plans/demo_plan.md +0 -0
  348. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/plans/gp1b_docling_graph_plan.md +0 -0
  349. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/plans/unified_contract_kg_ontology_bridge.md +0 -0
  350. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/plans/unified_contract_kg_plan.md +0 -0
  351. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/results/2026-07-24-t58-property-graph-population.md +0 -0
  352. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/results/2026-07-25-t58b-full-pipeline-rerank.md +0 -0
  353. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/archive/results/2026-07-25-t58b-topk-ordering-levers.md +0 -0
  354. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/concepts.md +0 -0
  355. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/contract_pipeline_explainer.md +0 -0
  356. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/corpus_ingest_recipe.md +0 -0
  357. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/domain-adaptation/entity-resolution.md +0 -0
  358. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/domain-adaptation/ontology-authoring.md +0 -0
  359. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/classifier_model_ab.md +0 -0
  360. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/compliance_demo.md +0 -0
  361. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/compliance_gate_cc7.md +0 -0
  362. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/compliance_rung2_cc7.md +0 -0
  363. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/cuad_highlighting_cu-d1.md +0 -0
  364. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/dg_model_ab.md +0 -0
  365. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/function_gate_recall.md +0 -0
  366. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/generation_robustness_b_vs_c.md +0 -0
  367. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/nl_to_type_cu-d2.md +0 -0
  368. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/ocr_benchmark.md +0 -0
  369. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/prod1_readiness.md +0 -0
  370. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/prod2_readiness.md +0 -0
  371. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/query_side_model_ab.md +0 -0
  372. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/silver_granite_vs_gemma4.md +0 -0
  373. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/silver_provider_routing.md +0 -0
  374. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/eval/silver_selfhosted_gemma4_26b.md +0 -0
  375. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/product/capability_profiles.md +0 -0
  376. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/product/contracts_product_roadmap.md +0 -0
  377. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/product/engine-api-migration-handoff.md +0 -0
  378. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/product/engine_async_api.md +0 -0
  379. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/product/new-domain-build-sequence.md +0 -0
  380. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/product/seam-adaptation-guide.md +0 -0
  381. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/proposals/compliance-ingest-classifier-decomposition.md +0 -0
  382. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/proposals/de-domaining-and-capability-runtime.md +0 -0
  383. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/proposals/new-domain-developer-journey.md +0 -0
  384. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/proposals/ontology-induction.md +0 -0
  385. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/reference-pack.md +0 -0
  386. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/engine-platform/SPEC.md +0 -0
  387. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/engine-platform/TASKS.md +0 -0
  388. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/engine-prep/plan.md +0 -0
  389. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/ingestion-hooks/ing5-doc-audit.md +0 -0
  390. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/ingestion-hooks/ing8-breaking-changes.md +0 -0
  391. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/ingestion-hooks/plan.md +0 -0
  392. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/ingestion-hooks/rulewright-migration-0.2.0.md +0 -0
  393. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/public-surface/rulewright-migration-0.3.0.md +0 -0
  394. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/public-surface/rulewright-migration-0.4.0.md +0 -0
  395. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/public-surface/rulewright-migration-0.5.0.md +0 -0
  396. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/public-surface/rulewright-migration-0.6.0.md +0 -0
  397. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/public-surface/rulewright-migration-0.7.0.md +0 -0
  398. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/specs/public-surface/rulewright-reply-2026-10-10-laya-and-sklearn.md +0 -0
  399. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/templates/product-starter/dependabot.yml +0 -0
  400. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/upstream/laya-temperature-range-mismatch.md +0 -0
  401. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/vendor/arcadedb/arcadedb-buckets-schema.md +0 -0
  402. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/vendor/arcadedb/arcadedb-docs-extraction.json +0 -0
  403. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/vendor/arcadedb/arcadedb-vector-embeddings.md +0 -0
  404. {rag_wright-0.7.0 → rag_wright-0.9.0}/docs/vendor/arcadedb/arcadedb-vector-search-tutorial.md +0 -0
  405. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/__init__.py +0 -0
  406. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/acord.py +0 -0
  407. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/acord_retrieval.py +0 -0
  408. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/boundary_residue_gold.py +0 -0
  409. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/build_golden.py +0 -0
  410. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/compliance_demo/policy/community_conduct_policy.md +0 -0
  411. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/compliance_demo/subjects/post_borderline.txt +0 -0
  412. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/compliance_demo/subjects/post_compliant.txt +0 -0
  413. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/compliance_demo/subjects/post_violation.txt +0 -0
  414. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/contractnli_judge.py +0 -0
  415. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/embedded_eval.py +0 -0
  416. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/gate1_chunker_ab.py +0 -0
  417. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/gate2_hybrid_rerank.py +0 -0
  418. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/golden/relational/set.json +0 -0
  419. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/golden.py +0 -0
  420. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/harness.py +0 -0
  421. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/ingestion_live_smoke.py +0 -0
  422. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/multihop.py +0 -0
  423. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/nl_to_type.py +0 -0
  424. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/segmenter_eval.py +0 -0
  425. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/semantic_judge_gold.py +0 -0
  426. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/test_acord.py +0 -0
  427. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/test_acord_retrieval.py +0 -0
  428. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/test_harness.py +0 -0
  429. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/test_multihop_set.py +0 -0
  430. {rag_wright-0.7.0 → rag_wright-0.9.0}/eval/unit_grouper_eval.py +0 -0
  431. {rag_wright-0.7.0 → rag_wright-0.9.0}/examples/model_server.py +0 -0
  432. {rag_wright-0.7.0 → rag_wright-0.9.0}/examples/quickstart.py +0 -0
  433. {rag_wright-0.7.0 → rag_wright-0.9.0}/plan.md +0 -0
  434. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ab_model_overlap.py +0 -0
  435. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/acord_unify.py +0 -0
  436. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/acquire_acord.py +0 -0
  437. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/acquire_cuad.py +0 -0
  438. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/acquire_ecfr.py +0 -0
  439. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/acquire_edgar.py +0 -0
  440. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/acquire_ftc_255.py +0 -0
  441. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/acquire_prod1_corpus.py +0 -0
  442. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/audit_reclass_flips.py +0 -0
  443. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/author_leg_a_silver_key.py +0 -0
  444. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/backfill_affiliations.py +0 -0
  445. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/backfill_clause_span_id.py +0 -0
  446. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/backfill_edge_source_doc_id.py +0 -0
  447. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/backup_kg_to_gcs.sh +0 -0
  448. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/bootstrap_template_capture.py +0 -0
  449. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/bootstrap_typed_edges.py +0 -0
  450. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/build_api_docs.py +0 -0
  451. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/build_api_docs.sh +0 -0
  452. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/build_cuad_clause_cache.py +0 -0
  453. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/build_function_routing_map.py +0 -0
  454. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_assemble_v2.py +0 -0
  455. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_assemble_v3.py +0 -0
  456. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_generate_hard_negatives.py +0 -0
  457. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_generate_hard_positives.py +0 -0
  458. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_generate_training.py +0 -0
  459. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_hybrid.py +0 -0
  460. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_hybrid2.py +0 -0
  461. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_jev_actor.py +0 -0
  462. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_jev_claimtypes.py +0 -0
  463. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_jev_operative.py +0 -0
  464. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_label_spans.py +0 -0
  465. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_laya_prep.py +0 -0
  466. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_laya_train.py +0 -0
  467. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_prep_operative.py +0 -0
  468. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_relabel_rubric.py +0 -0
  469. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_relabel_rubric2.py +0 -0
  470. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/cic1_train_operative.py +0 -0
  471. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/compare_extraction_models.py +0 -0
  472. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/compliance_actor_gate_smoke.py +0 -0
  473. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/compliance_engine_smoke.py +0 -0
  474. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/compliance_policy_demo.py +0 -0
  475. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/curate_taxonomy_gaps.py +0 -0
  476. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/dg_model_ab.py +0 -0
  477. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/diagnose_acord_knn_expansion.py +0 -0
  478. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/diagnose_acord_knn_rerank.py +0 -0
  479. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/diagnose_acord_leg_pool.py +0 -0
  480. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/diagnose_acord_legs.py +0 -0
  481. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/diagnose_acord_pool.py +0 -0
  482. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/diagnose_acord_relstructure.py +0 -0
  483. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/diagnose_acord_retrieval.py +0 -0
  484. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/distill/eval_all.py +0 -0
  485. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/distill/eval_ce.py +0 -0
  486. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/distill/eval_listwise_b.py +0 -0
  487. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/distill/export_ce_dataset.py +0 -0
  488. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/distill/extract_features.py +0 -0
  489. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/distill/listwise_variants.py +0 -0
  490. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/distill/relational_features.py +0 -0
  491. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/distill/train_ce.py +0 -0
  492. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/distill/train_modal.py +0 -0
  493. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/enrich_edgar_candidates.py +0 -0
  494. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/eval_chunking_ab.py +0 -0
  495. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/eval_classifier_guided_vs_tagparse.py +0 -0
  496. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/eval_compliance_gold.py +0 -0
  497. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/extract_arcadedb_docs.py +0 -0
  498. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/fetch_reference_models.py +0 -0
  499. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/generate_contract_python.py +0 -0
  500. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/git_post_commit_graphify.sh +0 -0
  501. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/granite_chunker_assess.py +0 -0
  502. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/graph_status.sh +0 -0
  503. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ingest_acord.py +0 -0
  504. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ingest_compliance_async_prod2.py +0 -0
  505. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ingest_compliance_document_prod2.py +0 -0
  506. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ingest_compliance_prod2.py +0 -0
  507. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ingest_cuad.py +0 -0
  508. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ingest_cuad_full.py +0 -0
  509. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ingest_ftc_compliance.py +0 -0
  510. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ingest_prod1.py +0 -0
  511. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ingest_prod1_async.py +0 -0
  512. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ingest_smoke.py +0 -0
  513. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/install_git_hooks.sh +0 -0
  514. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/label_new_functions.py +0 -0
  515. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/legb_function_gate_recall.py +0 -0
  516. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/make_compliance_fixtures.py +0 -0
  517. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/make_compliance_gold.py +0 -0
  518. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/mcp_compliance_agent_demo.py +0 -0
  519. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/mcp_intra_document_qa_smoke.py +0 -0
  520. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/mcp_query_legs_agent_demo.py +0 -0
  521. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/measure_silver.py +0 -0
  522. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/merge_docs_into_framework.py +0 -0
  523. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/migrate_entity_cik_to_canonical_id.py +0 -0
  524. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/migrate_silver_evidence_autotag.py +0 -0
  525. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/migrate_silver_evidence_remove_autotag.py +0 -0
  526. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/migrate_span_fields.py +0 -0
  527. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/mine_scarce_functions.py +0 -0
  528. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_arcadedb.py +0 -0
  529. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_backfill.py +0 -0
  530. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_exception_linking.py +0 -0
  531. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_gemma4_vllm.py +0 -0
  532. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_gemma4_vllm_snapshot.py +0 -0
  533. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_granite_server.py +0 -0
  534. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_granite_throughput.py +0 -0
  535. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_granite_vllm_server.py +0 -0
  536. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_query_app.py +0 -0
  537. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_qwen3_27b_bench.py +0 -0
  538. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_qwen3_27b_snapshot.py +0 -0
  539. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_qwen3_vllm_server.py +0 -0
  540. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/modal_stack_a100.py +0 -0
  541. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ocr_benchmark.py +0 -0
  542. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ocr_preprocess.py +0 -0
  543. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/ontology_dimension_check.py +0 -0
  544. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/phase_a_leg_validate.py +0 -0
  545. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/populate_clause_kg.py +0 -0
  546. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/populate_entity_graph.py +0 -0
  547. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/populate_entity_graph_extracted.py +0 -0
  548. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/populate_property_store.py +0 -0
  549. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/prep_relational_verification.py +0 -0
  550. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/publish_manifests.py +0 -0
  551. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/reclassify_kg.py +0 -0
  552. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/revert_reclass_flips.py +0 -0
  553. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/run_acord_retrieval.py +0 -0
  554. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/run_clause_exception_linking.py +0 -0
  555. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/semantic_judge_live_validate.py +0 -0
  556. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/semantic_judge_probe.py +0 -0
  557. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/snapshot_leg_a_eval.py +0 -0
  558. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/stack_correctness_validate.py +0 -0
  559. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/table_retrieval_smoke.py +0 -0
  560. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/train_function_classifier.py +0 -0
  561. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/train_legalbert_function.py +0 -0
  562. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/train_legalbert_modal.py +0 -0
  563. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/typed_rerank_validate.py +0 -0
  564. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/verify_wheel_install.sh +0 -0
  565. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/vllm_extraction_ab.py +0 -0
  566. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/vllm_kg_query_validate.py +0 -0
  567. {rag_wright-0.7.0 → rag_wright-0.9.0}/scripts/vllm_raw_diagnostic.py +0 -0
  568. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/.agents/skills/classifier-opportunity-analysis/SKILL.md +0 -0
  569. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -0
  570. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/rw_gate.py +0 -0
  571. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/__init__.py +0 -0
  572. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/api/answers.py +0 -0
  573. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/api/discover.py +0 -0
  574. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/api/ids.py +0 -0
  575. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/api/invoke.py +0 -0
  576. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/api/kg.py +0 -0
  577. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/api/mcp.py +0 -0
  578. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/api/tracing.py +0 -0
  579. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/api/usage.py +0 -0
  580. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/__init__.py +0 -0
  581. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/ard.py +0 -0
  582. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/chunk_read.py +0 -0
  583. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/chunk_write.py +0 -0
  584. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/disambiguation.py +0 -0
  585. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/document_scope.py +0 -0
  586. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/embedding.py +0 -0
  587. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/embedding_profiles.py +0 -0
  588. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/entity_resolution.py +0 -0
  589. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/fusion.py +0 -0
  590. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/graph_query.py +0 -0
  591. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/graph_storage.py +0 -0
  592. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/hybrid_search.py +0 -0
  593. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/invoke.py +0 -0
  594. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/jev_decision.py +0 -0
  595. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/manifests.py +0 -0
  596. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/registry.py +0 -0
  597. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/remote_encoders.py +0 -0
  598. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/reranking.py +0 -0
  599. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/retrieval_core.py +0 -0
  600. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/rlm_chunking.py +0 -0
  601. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/rlm_synthesis.py +0 -0
  602. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/scan_quality.py +0 -0
  603. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/span_relevance_judgment.py +0 -0
  604. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/vision_to_text.py +0 -0
  605. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/capabilities/vlm_ocr.py +0 -0
  606. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/contracts/__init__.py +0 -0
  607. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/contracts/chunk.py +0 -0
  608. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/contracts/extraction.py +0 -0
  609. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/contracts/graph.py +0 -0
  610. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/contracts/identifiers.py +0 -0
  611. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/contracts/ingestion.py +0 -0
  612. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/contracts/provenance.py +0 -0
  613. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/contracts/span.py +0 -0
  614. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/corpus/__init__.py +0 -0
  615. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/corpus/canonicalize.py +0 -0
  616. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/corpus/http.py +0 -0
  617. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/ingestion/builder.py +0 -0
  618. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/ingestion/group.py +0 -0
  619. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/ingestion/layout.py +0 -0
  620. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/ingestion/segment.py +0 -0
  621. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/ingestion/tables.py +0 -0
  622. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/models/__init__.py +0 -0
  623. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/models/model_servers.py +0 -0
  624. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/models/tag_structured.py +0 -0
  625. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/models/usage.py +0 -0
  626. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/models/weights.py +0 -0
  627. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/ontology/__init__.py +0 -0
  628. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/ontology/pack_schema.py +0 -0
  629. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/ontology/registry.py +0 -0
  630. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/__init__.py +0 -0
  631. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/__init__.py +0 -0
  632. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/capabilities/__init__.py +0 -0
  633. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/capabilities/assertion_extraction.py +0 -0
  634. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/capabilities/claim_extraction.py +0 -0
  635. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/capabilities/compliance_judgment.py +0 -0
  636. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/capabilities/compliance_store.py +0 -0
  637. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/capabilities/requirement_extraction.py +0 -0
  638. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/invokers.py +0 -0
  639. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/mcp/__init__.py +0 -0
  640. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/ontology/__init__.py +0 -0
  641. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/ontology/compliance_bridge.ttl +0 -0
  642. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/ontology/loader.py +0 -0
  643. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/ontology/packs/ftc_16cfr255.ttl +0 -0
  644. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/pack.py +0 -0
  645. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/schemas/__init__.py +0 -0
  646. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/schemas/compliance.py +0 -0
  647. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/skills/__init__.py +0 -0
  648. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/skills/claim_extraction/SKILL.md +0 -0
  649. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/skills/claim_extraction/__init__.py +0 -0
  650. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/skills/claim_extraction/template.py +0 -0
  651. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/skills/compliance_judgment/SKILL.md +0 -0
  652. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/skills/generic_compliance_judgment/SKILL.md +0 -0
  653. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/SKILL.md +0 -0
  654. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/__init__.py +0 -0
  655. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/template.py +0 -0
  656. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/subgraphs/__init__.py +0 -0
  657. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/compliance/subgraphs/requirement_extraction.py +0 -0
  658. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/__init__.py +0 -0
  659. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/capabilities/__init__.py +0 -0
  660. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/capabilities/clause_exception_linking.py +0 -0
  661. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_serve.py +0 -0
  662. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_store.py +0 -0
  663. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/capabilities/dg_extraction.py +0 -0
  664. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/capabilities/graph_extraction.py +0 -0
  665. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/capabilities/highlight_serve.py +0 -0
  666. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/capabilities/property_boosted_retrieval.py +0 -0
  667. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/capabilities/query_function_classifier.py +0 -0
  668. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/capabilities/query_understanding.py +0 -0
  669. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/corpus/__init__.py +0 -0
  670. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/corpus/cuad.py +0 -0
  671. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/corpus/cuad_ingestion.py +0 -0
  672. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/corpus/edgar.py +0 -0
  673. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/corpus/gcs_ingestion.py +0 -0
  674. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/corpus/selection.py +0 -0
  675. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/mcp/__init__.py +0 -0
  676. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/mcp/session_store.py +0 -0
  677. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/ontology/__init__.py +0 -0
  678. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/ontology/_generated_template_meta.py +0 -0
  679. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/ontology/_generated_vocab.py +0 -0
  680. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/ontology/clause_template.py +0 -0
  681. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/ontology/codegen.py +0 -0
  682. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/ontology/contract_bridge.ttl +0 -0
  683. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/ontology/contract_taxonomy.py +0 -0
  684. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/ontology/derive.py +0 -0
  685. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/ontology/loader.py +0 -0
  686. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/ontology/template_introspect.py +0 -0
  687. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/options.py +0 -0
  688. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/pack.py +0 -0
  689. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/schemas/__init__.py +0 -0
  690. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/schemas/contract_meta.py +0 -0
  691. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/schemas/function.py +0 -0
  692. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/schemas/function_routing.py +0 -0
  693. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/schemas/highlight.py +0 -0
  694. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/schemas/jurisdiction.py +0 -0
  695. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/schemas/ontology.py +0 -0
  696. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/schemas/property.py +0 -0
  697. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/schemas/query_intent.py +0 -0
  698. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/schemas/value_match.py +0 -0
  699. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/skills/__init__.py +0 -0
  700. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/skills/corpus_ingest/SKILL.md +0 -0
  701. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/SKILL.md +0 -0
  702. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/__init__.py +0 -0
  703. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/skills/guidance/__init__.py +0 -0
  704. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/skills/guidance/chunking.md +0 -0
  705. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/skills/guidance/generation.md +0 -0
  706. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/skills/guidance/relevance.md +0 -0
  707. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/__init__.py +0 -0
  708. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/boundary.py +0 -0
  709. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/clause_function_classifier.py +0 -0
  710. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/clause_kg_extractor.py +0 -0
  711. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/cuad_labels.py +0 -0
  712. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/dim_classifier.py +0 -0
  713. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/dim_fleet.json +0 -0
  714. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/function_classifier.py +0 -0
  715. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/function_families.py +0 -0
  716. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/hybrid_classifier.py +0 -0
  717. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/legalbert_classifier.py +0 -0
  718. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/model_capabilities.py +0 -0
  719. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/new_function_labels.py +0 -0
  720. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/property_extractor.py +0 -0
  721. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/property_grounding.py +0 -0
  722. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/reclassify.py +0 -0
  723. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/residual_candidates.py +0 -0
  724. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/scarce_function_labels.py +0 -0
  725. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/segment.py +0 -0
  726. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/semantic_judge.py +0 -0
  727. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/symbolic_validation.py +0 -0
  728. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/spans/tag_clause_extractor.py +0 -0
  729. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/subgraphs/__init__.py +0 -0
  730. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/subgraphs/async_ingestion.py +0 -0
  731. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/subgraphs/query_constraint_extraction.py +0 -0
  732. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/contracts/subgraphs/typed_clause_extraction.py +0 -0
  733. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/packs/reference_seam.py +0 -0
  734. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/py.typed +0 -0
  735. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/skills/__init__.py +0 -0
  736. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/skills/generation/__init__.py +0 -0
  737. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/skills/rlm/SKILL.md +0 -0
  738. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/skills/rlm/__init__.py +0 -0
  739. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/skills/rlm/agent.py +0 -0
  740. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/skills/span_relevance_judgment/SKILL.md +0 -0
  741. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/skills/vision_to_text/SKILL.md +0 -0
  742. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/skills/vision_to_text/__init__.py +0 -0
  743. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/spans/__init__.py +0 -0
  744. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/spans/page_map.py +0 -0
  745. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/store/__init__.py +0 -0
  746. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/store/chunk_text.py +0 -0
  747. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/store/seam.py +0 -0
  748. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/subgraphs/__init__.py +0 -0
  749. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/subgraphs/graph_extraction.py +0 -0
  750. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/subgraphs/observability.py +0 -0
  751. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/subgraphs/scaffold.py +0 -0
  752. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/subgraphs/semantic_chunking.py +0 -0
  753. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/util/__init__.py +0 -0
  754. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/util/concurrent.py +0 -0
  755. {rag_wright-0.7.0 → rag_wright-0.9.0}/src/rag_wright/util/spacy_model.py +0 -0
  756. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/__init__.py +0 -0
  757. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/__init__.py +0 -0
  758. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_answers_exports.py +0 -0
  759. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_bytes_ingest.py +0 -0
  760. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_capability_reexports.py +0 -0
  761. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_decision_swap_doc_example.py +0 -0
  762. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_discover.py +0 -0
  763. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_documents.py +0 -0
  764. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_e2e.py +0 -0
  765. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_invoke.py +0 -0
  766. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_kg.py +0 -0
  767. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_mcp.py +0 -0
  768. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_metering_tracing_exports.py +0 -0
  769. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_model_role_export.py +0 -0
  770. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_options.py +0 -0
  771. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_pack_store.py +0 -0
  772. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_usage.py +0 -0
  773. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_workspace.py +0 -0
  774. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/api/test_workspace_models.py +0 -0
  775. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/arch/domain_vocabulary_baseline.json +0 -0
  776. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/arch/test_api_docs_current.py +0 -0
  777. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/arch/test_doc_references.py +0 -0
  778. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/arch/test_engine_domain_vocabulary.py +0 -0
  779. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/arch/test_import_contracts.py +0 -0
  780. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/arch/test_packs_use_store_primitives.py +0 -0
  781. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/async_helpers.py +0 -0
  782. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/__init__.py +0 -0
  783. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/_fixtures/rlm_probe_skill/SKILL.md +0 -0
  784. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_answer_generator_async.py +0 -0
  785. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_assertion_extraction.py +0 -0
  786. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_authoring_contract.py +0 -0
  787. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_chunk_read.py +0 -0
  788. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_chunk_write.py +0 -0
  789. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_chunking_prompts_neutral.py +0 -0
  790. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_claim_extraction.py +0 -0
  791. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_clause_exception_linking.py +0 -0
  792. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_compliance_judgment.py +0 -0
  793. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_compliance_store.py +0 -0
  794. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_contract_kg_serve.py +0 -0
  795. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_contract_kg_store.py +0 -0
  796. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_contract_kg_store_reads.py +0 -0
  797. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_contract_taxonomy_and_spans.py +0 -0
  798. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_dg_adapter.py +0 -0
  799. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_dg_async.py +0 -0
  800. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_dg_extraction.py +0 -0
  801. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_dg_model_seam.py +0 -0
  802. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_dg_private.py +0 -0
  803. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_disambiguation.py +0 -0
  804. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_document_scope.py +0 -0
  805. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_embedding.py +0 -0
  806. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_embedding_profiles.py +0 -0
  807. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_entity_resolution.py +0 -0
  808. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_entity_rules_plumbing.py +0 -0
  809. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_fusion.py +0 -0
  810. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_graph_extraction.py +0 -0
  811. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_graph_query.py +0 -0
  812. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_graph_storage.py +0 -0
  813. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_highlight_serve.py +0 -0
  814. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_hybrid_search.py +0 -0
  815. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_jev_decision.py +0 -0
  816. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_manifest_validation.py +0 -0
  817. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_manifests.py +0 -0
  818. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_parsing.py +0 -0
  819. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_parties_extraction.py +0 -0
  820. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_property_boosted_retrieval.py +0 -0
  821. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_query_function_classifier.py +0 -0
  822. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_query_understanding.py +0 -0
  823. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_registry.py +0 -0
  824. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_remote_encoders.py +0 -0
  825. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_repair_partition.py +0 -0
  826. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_requirement_extraction.py +0 -0
  827. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_reranking.py +0 -0
  828. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_retrieval_core.py +0 -0
  829. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_rlm_chunking.py +0 -0
  830. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_rlm_chunking_async.py +0 -0
  831. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_rlm_method.py +0 -0
  832. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_rlm_synthesis.py +0 -0
  833. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_runtime_registry.py +0 -0
  834. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_scan_quality.py +0 -0
  835. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_span_relevance_judgment.py +0 -0
  836. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_structural_boundary_discoverer.py +0 -0
  837. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_structural_model_fallback.py +0 -0
  838. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_tag_boundary_discoverer.py +0 -0
  839. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_tiered_ocr.py +0 -0
  840. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/capabilities/test_vlm_ocr.py +0 -0
  841. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/compliance_fakes.py +0 -0
  842. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/conftest.py +0 -0
  843. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/__init__.py +0 -0
  844. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_canonical_source_doc_id.py +0 -0
  845. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_chunk_record.py +0 -0
  846. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_compliance.py +0 -0
  847. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_cuad_highlight_contracts.py +0 -0
  848. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_extraction.py +0 -0
  849. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_function.py +0 -0
  850. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_function_routing.py +0 -0
  851. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_identifiers.py +0 -0
  852. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_ingestion_hooks.py +0 -0
  853. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_jurisdiction.py +0 -0
  854. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_ontology.py +0 -0
  855. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_property.py +0 -0
  856. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_provenance.py +0 -0
  857. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/contracts/test_value_match.py +0 -0
  858. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/corpus/__init__.py +0 -0
  859. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/corpus/_ooxml_fixtures.py +0 -0
  860. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/corpus/test_canonicalize.py +0 -0
  861. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/corpus/test_cuad.py +0 -0
  862. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/corpus/test_cuad_ingestion.py +0 -0
  863. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/corpus/test_document_parser.py +0 -0
  864. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/corpus/test_edgar.py +0 -0
  865. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/corpus/test_embedded.py +0 -0
  866. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/corpus/test_gcs_ingestion.py +0 -0
  867. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/corpus/test_http.py +0 -0
  868. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/corpus/test_parse_wire2.py +0 -0
  869. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/corpus/test_selection.py +0 -0
  870. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/eval/test_contractnli_judge.py +0 -0
  871. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/eval/test_cuad_highlight_metrics.py +0 -0
  872. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/eval/test_kg_property_rerank.py +0 -0
  873. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/eval/test_nl_to_type_metrics.py +0 -0
  874. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/eval/test_relational_eval.py +0 -0
  875. {rag_wright-0.7.0/tests/foundation → rag_wright-0.9.0/tests/evals}/__init__.py +0 -0
  876. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/fixtures/ingestion/segmenter_gold.json +0 -0
  877. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/fixtures/ingestion/textile_spec_sheet.md +0 -0
  878. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/fixtures/ingestion/textile_test_report.md +0 -0
  879. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/fixtures/leg_a_silver/README.md +0 -0
  880. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/fixtures/leg_a_silver/evidence_snapshot.json +0 -0
  881. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/fixtures/table-bearing-contract.pdf +0 -0
  882. {rag_wright-0.7.0/tests/ingestion → rag_wright-0.9.0/tests/foundation}/__init__.py +0 -0
  883. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/foundation/test_arcadedb_hybrid.py +0 -0
  884. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/foundation/test_model_seam_structured.py +0 -0
  885. {rag_wright-0.7.0/tests/mcp → rag_wright-0.9.0/tests/ingestion}/__init__.py +0 -0
  886. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ingestion/test_builder.py +0 -0
  887. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ingestion/test_chunk_discoverer_hook.py +0 -0
  888. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ingestion/test_concurrency_ceiling.py +0 -0
  889. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ingestion/test_document_metadata.py +0 -0
  890. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ingestion/test_evaluate.py +0 -0
  891. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ingestion/test_evaluate_labels.py +0 -0
  892. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ingestion/test_layout_segmenter.py +0 -0
  893. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ingestion/test_spreadsheet_content.py +0 -0
  894. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ingestion/test_table_rows.py +0 -0
  895. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ingestion/test_tuning.py +0 -0
  896. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ingestion/test_unit_grouper.py +0 -0
  897. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ingestion/test_unit_representative.py +0 -0
  898. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/journey/incidents_domain.py +0 -0
  899. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/journey/incidents_pack.ttl +0 -0
  900. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/journey/test_incidents_journey.py +0 -0
  901. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/journey/test_pack_schema.py +0 -0
  902. {rag_wright-0.7.0/tests/models → rag_wright-0.9.0/tests/mcp}/__init__.py +0 -0
  903. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/mcp/test_compliance_server.py +0 -0
  904. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/mcp/test_intra_document_qa_server.py +0 -0
  905. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/mcp/test_no_model_supplied_tenant.py +0 -0
  906. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/mcp/test_relational_qa_server.py +0 -0
  907. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/mcp/test_typed_property_retrieval_server.py +0 -0
  908. {rag_wright-0.7.0/tests/ontology → rag_wright-0.9.0/tests/models}/__init__.py +0 -0
  909. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_async_infra.py +0 -0
  910. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_classifier_heads_load_clean.py +0 -0
  911. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_model_servers.py +0 -0
  912. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_models_dir.py +0 -0
  913. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_no_gemma_default.py +0 -0
  914. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_profile_routing.py +0 -0
  915. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_profile_seam.py +0 -0
  916. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_seam_async.py +0 -0
  917. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_seam_deadline_and_cap.py +0 -0
  918. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_seam_retry.py +0 -0
  919. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_seam_stream.py +0 -0
  920. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_serving_seam.py +0 -0
  921. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_serving_wiring.py +0 -0
  922. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_tag_structured.py +0 -0
  923. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_tag_structured_async.py +0 -0
  924. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_tracing.py +0 -0
  925. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/models/test_usage.py +0 -0
  926. {rag_wright-0.7.0/tests/skills → rag_wright-0.9.0/tests/ontology}/__init__.py +0 -0
  927. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ontology/test_clause_template.py +0 -0
  928. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ontology/test_compliance_ontology_authoritative.py +0 -0
  929. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ontology/test_derivation.py +0 -0
  930. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ontology/test_entity_taxonomy.py +0 -0
  931. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ontology/test_generated_template_meta_in_sync.py +0 -0
  932. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ontology/test_generated_vocab_in_sync.py +0 -0
  933. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ontology/test_template_captured_in_ttl.py +0 -0
  934. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/ontology/test_ttl_is_source_of_truth.py +0 -0
  935. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/reference/test_compliance_reference.py +0 -0
  936. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/reference/test_contract_seam.py +0 -0
  937. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/scripts/test_eval_chunking_ab.py +0 -0
  938. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/scripts/test_eval_classifier_ab.py +0 -0
  939. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/scripts/test_fetch_reference_models.py +0 -0
  940. {rag_wright-0.7.0/tests/store → rag_wright-0.9.0/tests/skills}/__init__.py +0 -0
  941. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/skills/test_ingestion_skill_example.py +0 -0
  942. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_boundary.py +0 -0
  943. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_classifier_property_extractor.py +0 -0
  944. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_clause_classifier_tags_0005.py +0 -0
  945. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_clause_function_classifier.py +0 -0
  946. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_clause_function_classifier_async.py +0 -0
  947. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_clause_kg_extractor.py +0 -0
  948. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_clause_kg_extractor_async.py +0 -0
  949. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_dim_classifier.py +0 -0
  950. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_dim_fleet_live.py +0 -0
  951. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_function_classifier.py +0 -0
  952. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_hybrid_classifier.py +0 -0
  953. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_hybrid_property_extractor.py +0 -0
  954. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_legalbert_classifier.py +0 -0
  955. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_model_capabilities.py +0 -0
  956. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_new_function_labels.py +0 -0
  957. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_page_map.py +0 -0
  958. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_property_extractor.py +0 -0
  959. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_property_grounding.py +0 -0
  960. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_reclassify.py +0 -0
  961. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_residual_decision.py +0 -0
  962. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_scarce_function_labels.py +0 -0
  963. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_segment.py +0 -0
  964. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_segmentation_vocab.py +0 -0
  965. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_semantic_judge.py +0 -0
  966. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_setfit_clause_adapter.py +0 -0
  967. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_setfit_probabilities.py +0 -0
  968. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_span_offsets.py +0 -0
  969. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_stage_labels_0005.py +0 -0
  970. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_symbolic_validation.py +0 -0
  971. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/spans/test_tag_clause_extractor.py +0 -0
  972. {rag_wright-0.7.0/tests/subgraphs → rag_wright-0.9.0/tests/store}/__init__.py +0 -0
  973. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_affiliation_backfill.py +0 -0
  974. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_arcadedb_clause_kg.py +0 -0
  975. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_arcadedb_contract.py +0 -0
  976. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_arcadedb_property.py +0 -0
  977. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_arcadedb_requirement_sources.py +0 -0
  978. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_arcadedb_schema.py +0 -0
  979. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_arcadedb_span.py +0 -0
  980. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_chunk_text.py +0 -0
  981. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_concurrent_writes.py +0 -0
  982. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_contract_kg_store_live.py +0 -0
  983. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_document_metadata_live.py +0 -0
  984. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_document_scope.py +0 -0
  985. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_engine_domain_neutral.py +0 -0
  986. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_entities_by_name.py +0 -0
  987. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_kg_edges.py +0 -0
  988. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_kg_mutations.py +0 -0
  989. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_kg_read.py +0 -0
  990. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_kg_write.py +0 -0
  991. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_neutral_schema.py +0 -0
  992. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/store/test_write_graph_idempotent.py +0 -0
  993. {rag_wright-0.7.0/tests/util → rag_wright-0.9.0/tests/subgraphs}/__init__.py +0 -0
  994. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_async_ingestion.py +0 -0
  995. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_chunk7_structure_carry.py +0 -0
  996. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_clause_results.py +0 -0
  997. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_compliance_check.py +0 -0
  998. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_compliance_ingestion.py +0 -0
  999. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_contract_ingestion_pipeline.py +0 -0
  1000. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_contract_ingestion_pipeline_async.py +0 -0
  1001. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_contract_ingestion_pipeline_graph_async.py +0 -0
  1002. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_graph_extraction.py +0 -0
  1003. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_ingest_knobs.py +0 -0
  1004. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_ingest_segment_classify.py +0 -0
  1005. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_intra_document_qa.py +0 -0
  1006. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_observability.py +0 -0
  1007. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_partial_entry_contract.py +0 -0
  1008. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_query_constraint_extraction.py +0 -0
  1009. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_relational_qa.py +0 -0
  1010. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_requirement_extraction.py +0 -0
  1011. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_scaffold.py +0 -0
  1012. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_semantic_chunking.py +0 -0
  1013. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_typed_clause_extraction.py +0 -0
  1014. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/subgraphs/test_typed_property_retrieval.py +0 -0
  1015. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/test_backfill_clause_span_id.py +0 -0
  1016. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/test_dg_model_ab.py +0 -0
  1017. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/test_populate_clause_kg.py +0 -0
  1018. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/test_populate_entity_graph.py +0 -0
  1019. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/util/test_concurrent.py +0 -0
  1020. {rag_wright-0.7.0 → rag_wright-0.9.0}/tests/util/test_spacy_model.py +0 -0
@@ -37,9 +37,13 @@ MCP) follows automatically for invokable kinds; 4b (a bespoke MCP server) is opt
37
37
  1. **Implementation** — the real code, in that kind's home (see per-kind below).
38
38
  2. **The invoke factory + `impl_ref`** (invokable kinds: subgraph/model) — write a co-located
39
39
  `async def ainvoke(resources, inputs)` (subgraph) / `def <name>(resources, inputs)` (model) in the capability's
40
- own module. A subgraph factory builds over the opaque `WorkspaceHandle` (`resources._store`,
41
- `resources._embedder`, `resources.model_id(role)`), never env; a model factory is store-independent and ignores
42
- `resources`. The manifest's `impl_ref="module:attr"` points to it. The invoker imports
40
+ own module. A subgraph factory builds over the opaque `WorkspaceHandle`, never env: its store access with
41
+ `pack_store(resources, YourStore)` (your pack's store extension over the workspace's store) and its models with
42
+ `resources.model_id(role)`; its query embedder with `workspace_embedder(resources)` (`rag_wright.pack_sdk`, built
43
+ from the workspace's embedding profile) and its options with `resources.config`; a model factory is
44
+ store-independent and ignores `resources`. A builder that takes the store as a keyword goes through `pack_store`
45
+ too: `pack_store(resources, lambda store: production_x(store=store, ...))`. The handle's underscored attributes
46
+ are engine-internal; the reference pack's factories show the public form. The manifest's `impl_ref="module:attr"` points to it. The invoker imports
43
47
  it LAZILY and calls it — there is **NO central adapter dict** (EP-CORE-2). A plain function/agent_skill/mcp_tool
44
48
  declares no `impl_ref`.
45
49
  3. **ARD manifest + register it** — a `CapabilityManifest(slug, kind, display_name, description,
@@ -57,8 +61,9 @@ MCP) follows automatically for invokable kinds; 4b (a bespoke MCP server) is opt
57
61
  A downstream product can register without touching the canonical set (`register_capability` does not check
58
62
  slugs), BUT `manifests.author()` rejects a non-canonical slug, so a product that publishes ARD JSON must call
59
63
  `register_canonical_slugs` for its slugs first.
60
- Publish to `~/.air/registry` with `uv run python scripts/publish_manifests.py`; that script publishes only the
61
- engine's reference pack (it calls `load_reference_pack()`), so a product publishes its own with `publish_all`.
64
+ Publish the ARD JSON (`urn:air`) of what is registered with `publish(slug, root=...)` or `publish_all(root=...)`
65
+ from `rag_wright.api` (the root defaults to `ARD_REGISTRY_ROOT`, else `~/.air/registry`); a slug must be canonical
66
+ (`register_canonical_slugs`, above). The engine's `scripts/publish_manifests.py` does this for its reference pack.
62
67
  Callable kinds get `ResponseBounds` (defaulted); `agent_skill` must NOT declare bounds (loaded, not called).
63
68
  4. **Invocable + MCP for free** — once registered with an `impl_ref`, the capability is callable as
64
69
  `ainvoke_subgraph(slug, inputs, resources=ws)` / `invoke_model(slug, inputs, resources=ws)` (or
@@ -79,7 +84,7 @@ MCP) follows automatically for invokable kinds; 4b (a bespoke MCP server) is opt
79
84
  - **Invoke:** the co-located `async def ainvoke(resources, inputs)` factory (impl_ref target) builds + awaits the graph.
80
85
  - Retry/dead-letter come from the graph scaffold, not the invoker. `CapabilityManifest` has no contract field (only
81
86
  the internal `CapabilityRegistry.register(contract=...)` takes one); where the typed I/O must be declared, set
82
- `capability_interface` on the manifest.
87
+ `capability_interface` on the manifest (`CapabilityInterface`, from `rag_wright.pack_sdk`).
83
88
 
84
89
  ### function — a plain, typed callable
85
90
  - **Home:** `capabilities/<slug>.py` (generic) or `packs/<pack>/capabilities/<slug>.py` (domain). A deterministic or model-backed callable with a Pydantic in/out contract.
@@ -103,7 +108,9 @@ MCP) follows automatically for invokable kinds; 4b (a bespoke MCP server) is opt
103
108
  - **Home:** `skills/<slug>/SKILL.md` (generic) or `packs/<pack>/skills/<slug>/SKILL.md` (domain, e.g.
104
109
  `packs/compliance/skills/compliance_judgment/SKILL.md`) + the agent runtime (e.g. `skills/rlm/`). It is LOADED (progressive
105
110
  disclosure), not called: no `ResponseBounds`. Declare `requires=(...)` for a closure over other skills and
106
- `skill_runtime` for its intrinsic runtime.
111
+ `skill_runtime` (`SkillRuntime`, from `rag_wright.pack_sdk`) for its intrinsic runtime.
112
+ - A product's agent (a Deep Agents harness) is not a capability kind yet: an `agent` kind is a later engine workstream
113
+ (PS-33, engine ADR-0139). Build agents in the product, on `agent_chat_model` for their model.
107
114
 
108
115
  ### mcp_tool — a capability exposed over MCP
109
116
  - A distinct ARD identity (`<slug>_mcp`) for the same underlying capability exposed as a cross-agent MCP tool.
@@ -129,7 +136,7 @@ add it to `_RESERVED_WITHOUT_MANIFEST` with a one-line reason. The engine's `tes
129
136
  pack, so these tests see its slugs.
130
137
 
131
138
  **The import boundary (engine repo).** `pyproject.toml` `[tool.importlinter]` has three forbidden contracts: every
132
- generic engine package (`source_modules`: `rag_wright.api`, `capabilities`, `contracts`, `corpus`, `ingestion`,
139
+ generic engine package (`source_modules`: `rag_wright.api`, `capabilities`, `contracts`, `corpus`, `evals`, `ingestion`,
133
140
  `models`, `ontology`, `pack_sdk`, `skills`, `spans`, `store`, `subgraphs`, `util`) must never import
134
141
  `rag_wright.packs`; pack code (`rag_wright.packs`) imports only `rag_wright.api` and `rag_wright.pack_sdk` (plus
135
142
  itself), never another engine package directly; and `rag_wright.packs.contracts` must never import
@@ -136,6 +136,11 @@ network-bound work inside it; the engine runs up to `IngestionTuning.extract_con
136
136
 
137
137
  - **Hidden sheets** are ingested by default; `IngestSource(include_hidden_sheets=False)` skips them (listed in
138
138
  `DocumentReport.skipped_hidden_sheets`).
139
+ - **Blank rows inside a table**: the parse cuts a sheet's table at every blank row; the engine glues a piece back
140
+ onto the table above when its first row is data (its number or date columns agree, or it is formatted like the
141
+ data rather than the header), so no record is read as a header. A text-only table with no formatting cannot be
142
+ decided from the file: it stays apart and `evaluate_ingestion` lists it in `warnings` (format the header row, or
143
+ remove the blank rows).
139
144
  - **Exact cell values**: `table_rows(parse_document(...))` returns every data row as a `TableRow` (`columns`,
140
145
  `values`, `cell(name)`), read from the parse's cell grid, whole even when chunking split the table. A per-row unit
141
146
  carries its row in `Unit.table_row`, so the extractor reads cells, not re-parsed text.
@@ -144,12 +149,32 @@ network-bound work inside it; the engine runs up to `IngestionTuning.extract_con
144
149
  to its parent, and an `AttachedTo` edge from the child to the table-row span it belongs to, with a confidence and
145
150
  the identifier evidence (`IngestionTuning.identifier` sets what counts as an identifier). The report lists them in
146
151
  `DocumentReport.children`, `links` and `unmapped_links`.
152
+ - **Record table or form, decided per table.** In `auto` mode a table is a database (one unit per row) when its
153
+ header has `RecordTableRule.min_header_cols`+ named columns, `distinct_ratio`+ of them distinct, and either a serial
154
+ first column in `serial_ratio`+ of the rows or `min_cols`+ columns; anything else stays whole (a form). A test log
155
+ or results sheet judged wrongly is fixed with `IngestionTuning(record_table=RecordTableRule(...))`, or per source
156
+ with `IngestSource(table_mode="record"|"block")`. Check the decision on your samples with
157
+ `evaluate_ingestion(..., table_labels=[{"pattern": <regex on the header row>, "label": "record"|"block"}])`
158
+ (first match wins): a block table split per row, or a wide record table not split, is a failure, and tables no
159
+ pattern matched are listed in `unlabelled_tables`.
160
+ - **How an embedded file finds its row.** An identifier is a token of 4+ characters containing a digit that appears
161
+ on at most `IdentifierRule.max_rows` table rows and in at most `max_files` embedded files (defaults 3 and 3; set
162
+ them with `IngestionTuning(identifier=IdentifierRule(...))`). A file whose identifiers match no row, or too many,
163
+ stays a child document with no `AttachedTo` edge and is listed in `unmapped_links`: for a workbook with dozens of
164
+ embedded lab reports, check `links` against what you expect before trusting the graph.
165
+ - **Nesting.** A file embedded in an embedded file is ingested; anything deeper is listed in
166
+ `DocumentReport.embedded_skipped`, not walked.
167
+ - **Stable ids.** `IngestSource(doc_id=...)` gives a document your own id (an upload's record id, say), so a re-ingest
168
+ of the same file lands on the same `Document`.
147
169
 
148
170
  ## 6. Verify (definition of done)
149
171
 
150
- 1. `evaluate_ingestion` passes on a representative sample of YOUR documents (not a hand-picked easy one). If your
151
- units carry labels, its `labels` report on your gold meets the bar you set, with the confusions understood.
152
- 2. A live ingest of that sample: no dead letters, `extraction_failures` explained, records cite spans
172
+ 1. `evaluate_ingestion` passes on a representative sample of YOUR documents (not a hand-picked easy one), with
173
+ `table_labels` covering every table type you have. If your units carry labels, its `labels` report on your gold
174
+ meets the bar you set, with the confusions understood. Inside a web backend use `aevaluate_ingestion` (with
175
+ `progress`) as a background job.
176
+ 2. A live ingest of that sample, in a disposable database (`with temporary_workspace(config, prefix="trial") as ws:`),
177
+ no dead letters, `extraction_failures` explained, records cite spans
153
178
  (`kg_read(ws, "<your type>", fields=["span_id"])`), and `span_positions(ws, doc_id)` gives the citation positions.
154
179
  3. A hermetic test of your extractor on fixed units (no model calls in the default suite; the engine's test network
155
180
  guard fails any unmarked test that reaches the network).
@@ -6,8 +6,10 @@ description: >-
6
6
  starting a new domain (right after capabilities are defined), when adding or changing a capability, or when A/B-ing
7
7
  alternatives (e.g. a trained classifier vs a System-1 decision model). Covers gold-set design + reliability,
8
8
  per-capability-KIND metrics (extraction / classification / retrieval / graph / generation / judgment), the
9
- gate-vs-diagnostic split, building the gold cheaply, an isolated executable harness, and optional Langfuse
10
- Datasets/Experiments/Scores automation. An eval is the executable acceptance criterion; training data IS an eval.
9
+ gate-vs-diagnostic split, building the gold cheaply, and running it with the engine's eval toolkit
10
+ (`load_gold_set` from an expert's own files, one `score_*` per kind, `arun_eval` with repeats and errors kept apart,
11
+ an `EvalReport` a backend can return, optional Langfuse datasets and runs). An eval is the executable acceptance
12
+ criterion; training data IS an eval.
11
13
  ---
12
14
 
13
15
  # Creating evals (eval-first / TDD)
@@ -19,6 +21,13 @@ can A/B alternatives and catch regressions forever. Corollary observed repeatedl
19
21
  data you build for a classifier/decision model IS an eval** (a labeled gold set + a metric) — so building the eval
20
22
  first also gives you the data design for free.
21
23
 
24
+ **The toolkit (on `rag_wright.api`).** `load_gold_set` turns an expert's CSV / XLSX / JSONL into a `GoldSet`;
25
+ one scorer per capability kind (section 2) turns predictions into a `ScorerResult` (the gate, its thresholds,
26
+ diagnostics that are never gated); `arun_eval` runs your capability over the gold set (concurrently, `[eval] i/N`
27
+ progress, repeats, a failed call kept as an error) and returns an `EvalReport` -- JSON-ready, every item's outputs
28
+ kept, so `rescore_eval` can score it again later without calling anything. Use it rather than hand-writing a
29
+ harness; section 6 is a complete example.
30
+
22
31
  Repository paths in this skill (`docs/`, `eval/`, `scripts/`, `tests/`, `src/`) are in the engine repository: read them there or on GitHub, at the tag matching your installed engine. The `eval/` and `scripts/` files named as patterns are the engine's own evals: read them as
23
32
  worked examples; your evals live in your repo.
24
33
 
@@ -50,12 +59,32 @@ worked examples; your evals live in your repo.
50
59
  - **Separate a tuning set from a held-out set.** Label the held-out set BEFORE any prompt runs on it, tune only on
51
60
  the tuning set, and report both numbers (ADR-0122 boundary residue prompt: 94.5% held-out vs 96.2% tuning). A
52
61
  number measured only on the set you tuned on is not a result.
62
+ - **Gold from your experts' own files.** Domain experts label in spreadsheets: `load_gold_set(path_or_upload,
63
+ GoldMapping(id=..., input=..., expected=..., group=...), name=..., version=...)` reads them as written -- the header
64
+ found under a title, blank rows skipped, values kept exactly, each item's place recorded -- and refuses anything
65
+ that would make the gold wrong (a missing column, a row without its id, a duplicate id) with where it is. Map
66
+ `group` to the source document so splits stay leakage-safe. A workbook with several sheets: name one with
67
+ `sheet=`. Say how the gold was made with `provenance=` (`hand`, `silver` or `generated`; or a per-row column through
68
+ `GoldMapping(provenance=...)`), so silver is never conflated with gold. A gold set is `local_only` by default:
69
+ client data never leaves the machine.
53
70
  - **Gold stays local when the corpus is restrictively licensed** (CUAD/ACORD-derived gold lives under the
54
71
  gitignored `data/eval/`); commit the builder and the scorer, never the data.
55
72
 
56
73
  ## 2. Pick the metric by capability KIND, and split GATE vs DIAGNOSTIC
57
74
  Always set ONE pass/fail **gate** (from the acceptance criterion) and report **diagnostics** alongside (never gate
58
- on a diagnostic).
75
+ on a diagnostic). Each kind has its scorer on `rag_wright.api`, checked against the engine evals named below:
76
+
77
+ | kind | scorer | gate |
78
+ |---|---|---|
79
+ | classification / typed decision | `score_classification` | the weakest class's recall@k (+ top-1 accuracy via `top1_floor`) |
80
+ | retrieval | `score_retrieval` | mean recall@k at a relevance grade; nDCG reported |
81
+ | extraction | `score_extraction` | recall and precision, apart |
82
+ | judgment / verdict | `score_judgment` | precision and recall of the actionable verdict |
83
+ | generation / QA | `score_generation` | citation recall, correct abstention, groundedness |
84
+ | graph / relational | `score_relational` | recall over the answer set |
85
+ | ingestion structure / unit labelling | `score_ingestion` | `evaluate_ingestion`'s checks (+ label accuracy) |
86
+ | candidate-then-choose | `score_candidate_choice` | candidate coverage, value-level recall and precision |
87
+
59
88
  - **Extraction** (section → records, clauses, requirements): recall / precision / F1 of extracted items vs gold,
60
89
  reported SEPARATELY (under- vs over-extraction are different failures). Watch over-extraction on non-operative
61
90
  input (definitions) and under-extraction on long input.
@@ -84,7 +113,7 @@ on a diagnostic).
84
113
  scores mean what they say), not one accuracy number. Pattern: `eval/semantic_judge_gold.py` (ING-9: decision
85
114
  model 95.3% vs LLM 90.1% on 192 blind hand-labelled cases).
86
115
  - **Candidate-then-choose pipelines** (a generator proposes, a model picks): measure the generator's **coverage**
87
- separately, because it caps recall (ING-9b residual values: candidate coverage 95%; value-level recall 0.83 /
116
+ separately, because it caps recall (ING-9b residual values: candidate coverage 0.93, 188/203 recomputed from the saved outputs; value-level recall 0.83 /
88
117
  precision 0.88 vs the LLM's 0.60 / 0.79. Pattern: `eval/residual_decision_gold.py`). **Count is not accuracy**:
89
118
  emitting more values is not a win without precision.
90
119
  - **Ingestion structure**: `evaluate_ingestion` (in `rag_wright.api`) is the packaged structural eval of the
@@ -111,42 +140,87 @@ on a diagnostic).
111
140
  - **Generate hard cases** (near-boundary positives/negatives) to stress the exact confusions — TRAIN-ONLY; the
112
141
  gold test stays real. (Full data playbook: the `setfit` skill Phase 1/4 + `classifier-opportunity-analysis`.)
113
142
 
114
- ## 4. Make it an executable, isolated harness
115
- - **Isolate the capability under test**: inject it (a seam / `extract_override` / an injected `retrieve`) so the
116
- eval measures ONE capability, not the whole pipeline. Invoke production code THROUGH the capability layer
117
- (`ainvoke_subgraph`/`ainvoke_model`), never a hand-built copy. Score the **shipped request** (the exact
118
- prompt/question builder production uses, e.g. `judge_request`), not a copy of it re-typed in the eval.
119
- - **Repeatability for non-deterministic models.** Run each case several times on identical input; report how many
120
- answers flip and how far the scores sit from the threshold. Flips cluster near the threshold and usually mean
121
- the QUESTION is ambiguous: fix the question, do not vote it away (Jev flipped 5/181 answers at scores 0.47-0.56;
122
- temperature/seed did not help, majority voting barely helped, rewriting the ambiguous question did. The ADR-0122
123
- boundary residue prompt went from 94-96% with flips to 460/461, zero flips across 3 calls). Pattern:
124
- `eval/boundary_residue_gold.py`.
143
+ ## 4. Run it: `arun_eval`
144
+ `arun_eval(gold, task, scorers, *, repeats, concurrency, progress)` is the harness. It runs `task` (your coroutine,
145
+ or a plain function, which runs off the event loop) on every item, `repeats` times, `concurrency` at a time, streams
146
+ `[eval] i/N` lines to `progress`, keeps a call that raises as an ERROR in that item's slot (never dropped, never an
147
+ answer), scores each repeat, and passes a scorer only if it passes on every repeat (its gate is the worst repeat;
148
+ `per_repeat_gate` lists each). `run_eval` is the synchronous form; inside a web backend, await `arun_eval` as a
149
+ background job. What is still yours:
150
+ - **Isolate the capability under test**: the task calls ONE capability, injected (a seam, such as the reference pack's
151
+ `extract_override` or an injected `retrieve`), so the eval measures it, not the whole pipeline. Invoke production code THROUGH the
152
+ capability layer (`ainvoke_subgraph`/`ainvoke_model`), never a hand-built copy. Score the **shipped request** (the
153
+ exact prompt/question builder production uses, e.g. the reference pack's `judge_request`), not a copy of it re-typed in the eval.
154
+ - **Repeatability for non-deterministic models.** Use `repeats` and read `report.flips`; flips cluster near the
155
+ threshold and usually mean the QUESTION is ambiguous: fix the question, do not vote it away (Jev flipped 5/181
156
+ answers at scores 0.47-0.56; temperature/seed did not help, majority voting barely helped, rewriting the ambiguous
157
+ question did. The ADR-0122 boundary residue prompt went from 94-96% with flips to 460/461, zero flips across 3
158
+ calls). Pattern: `eval/boundary_residue_gold.py`.
125
159
  - **Cache keys include the prompt and the method.** Any decision or extraction cache must key on the prompt text
126
160
  and the method (decision model vs LLM, and which model), so an eval never reuses outputs a different prompt or
127
161
  method produced (ADR-0122 ING-4d / ADR-0040 ING-9b: the residue decision cache and the clause cache).
128
- - **Score from a RESULT ARTIFACT (JSON), not stdout scraping** (scraping truncates and silently drops rows).
129
- - **Parallelize** model/LLM calls (async + semaphore) — same cost, far less wall-clock; order-preserving so it
130
- stays deterministic.
131
- - **Env-selected** so the SAME harness runs local (dev) or on Modal (full corpus + GPU).
132
- - **Pre-flight paid bulk** (>~50 paid calls): print the exact count + cost and wait (`warn-before-bulk` rule).
133
- - Stream `X/N` progress + actively monitor any run over ~30s (never launch-and-forget).
162
+ - **Keep the report.** `report.model_dump_json()` holds every item's outputs; save it next to the gold version.
163
+ `rescore_eval(report, gold, scorers)` re-scores it with new thresholds, a new scorer or a corrected gold, free. An
164
+ eval kept only as aggregate numbers can never be checked again.
165
+ - **Pre-flight paid bulk** (>~50 paid calls): print the exact count + cost and wait for approval before launching.
134
166
  - **Hermetic tests never touch the network**: `tests/conftest.py` fails a test that resolves a non-local host unless
135
- it carries a live marker (`model`, `store`, ...). Live evals run as `uv run python -u eval/<name>.py` (outside
136
- pytest) or carry a live marker.
137
-
138
- ## 5. Langfuse — optional eval automation (we already use it for tracing)
139
- Langfuse has a first-class eval stack we are NOT yet using (we use it only for spans/usage today): a **Dataset**
140
- (items = input + optional expected output) → a **Task** (your capability) run over the dataset as an **Experiment
141
- Run** → **Evaluators** (deterministic checks or LLM-as-judge) producing **Scores** (numeric/categorical/boolean),
142
- all linked to traces. Reach for it when you want **tracked, re-runnable, dashboarded** evals + regression tracking
143
- across capability versions; a local JSON harness is enough for a quick one-off gate. Keep the gold BUILDER + a
144
- committed snapshot in the repo (reproducibility); push the items to the Langfuse dataset so runs and scores land
145
- next to the traces you already collect. Ground the exact Dataset/Experiment API before wiring
146
- (https://langfuse.com/docs/evaluation/concepts, https://langfuse.com/docs/datasets/overview); confirm the installed
147
- SDK version's surface, not prose.
148
-
149
- ## 6. The TDD loop
167
+ it carries a live marker (`model`, `store`, ...). Live evals run as scripts (outside pytest) or carry a live
168
+ marker.
169
+
170
+ ## 5. Langfuse -- optional: datasets, runs and scores next to the traces
171
+ `arun_eval(..., langfuse=True)` (or `RAG_EVAL_BACKEND=langfuse`; the keys alone send nothing) runs the same eval on
172
+ Langfuse: the gold set becomes a dataset (items upserted; items no longer in the gold set archived; the version is
173
+ the server's latest timestamp, recorded as `report.dataset_version`), each repeat a dataset run (`report.run_urls`),
174
+ and each scorer's gates and pass/fail are pushed as run scores. The report is the same, scored locally from the same
175
+ outputs. With engine tracing on (`RAG_TRACE_LEVEL`), every model call the task makes nests under its item's trace,
176
+ on both backends. What was verified against Langfuse 4.15.1 (self-hosted), and what to know:
177
+ - **`local_only` is refused before anything is sent.** Only a self-hosted Langfuse should ever receive client data;
178
+ set `local_only=False` only for data that may leave the machine.
179
+ - **Scoring runs in your process**, not in Langfuse: its code evaluators are a 2-second, standard-library sandbox
180
+ with no network, so they cannot run your scorers.
181
+ - **The SDK's own `run_experiment` drops an item whose task raises, and blocks a running event loop**; `arun_eval`
182
+ handles both (an error is an error in its slot; the run is off the loop). Call `arun_eval`, not the SDK directly.
183
+ - **Reading observations back**: the v2 list endpoint is Cloud-only until Langfuse v4 ships in the open-source
184
+ release, and the v1 endpoint times out on a trace-only query: bound every read by time.
185
+ - Langfuse's managed LLM-as-a-judge and decision-model evaluators, and its UI prompt experiments, test a prompt in
186
+ Langfuse, not your pipeline: out of scope for this toolkit (a product may still use them).
187
+
188
+ ## 6. A complete example
189
+ An expert's labelled workbook, your capability run through the capability layer, two repeats, the report kept and
190
+ scored again later. `my_judge` stands for your capability's call (e.g. through `ainvoke_model`); the rest runs as
191
+ written.
192
+
193
+ ```python
194
+ import asyncio
195
+ import functools
196
+ from pathlib import Path
197
+
198
+ from rag_wright.api import (EvalReport, GoldMapping, arun_eval, load_gold_set, rescore_eval,
199
+ score_judgment)
200
+
201
+ GOLD_FILE = "gold/nli_expert_labels.xlsx" # the expert's own file
202
+ REPORT = "eval_runs/nli_judge.json"
203
+
204
+ mapping = GoldMapping(id="ID", input=["Premise", "Hypothesis"], expected="Label", group="Contract")
205
+ gold = load_gold_set(GOLD_FILE, mapping, name="nli-judge", version="2026-10-12")
206
+
207
+
208
+ async def judge(item):
209
+ return await my_judge(item.input["Premise"], item.input["Hypothesis"])
210
+
211
+
212
+ gate = functools.partial(score_judgment, actionable="contradiction", precision=0.8, recall=0.7)
213
+ report = asyncio.run(arun_eval(gold, judge, [gate], repeats=2, concurrency=8, progress=print))
214
+ Path(REPORT).parent.mkdir(parents=True, exist_ok=True)
215
+ Path(REPORT).write_text(report.model_dump_json(indent=1), encoding="utf-8")
216
+ print(report.passed, report.scores[0].gate, "errors", report.errors, "flips", report.flips)
217
+
218
+ stricter = functools.partial(score_judgment, actionable="contradiction", precision=0.9, recall=0.7)
219
+ saved = EvalReport.model_validate_json(Path(REPORT).read_text(encoding="utf-8"))
220
+ print("at 0.9 precision:", rescore_eval(saved, gold, [stricter]).passed)
221
+ ```
222
+
223
+ ## 7. The TDD loop
150
224
  1. Write the eval from the contract + a handful of real gold items → it fails (red) on the unbuilt/weak capability.
151
225
  2. Implement the minimum to pass the gate (green).
152
226
  3. A/B alternatives (rule / trained classifier / decision model / LLM) on the SAME gold; select on gate + diagnostics + cost + calibration.
@@ -158,7 +232,11 @@ SDK version's surface, not prose.
158
232
  - **Gating on a diagnostic** (e.g. nDCG) — report it, don't threshold it.
159
233
  - **No reliability check on a subjective gold** — you can't read a number off a gold whose own labels disagree.
160
234
  - **Eval not isolated** to the capability (measures the whole pipeline) — you can't attribute a regression.
161
- - **Scraping stdout** for metrics — write + read a JSON artifact.
235
+ - **Scraping stdout** for metrics — keep and read the `EvalReport` JSON.
236
+ - **A failed call scored as an answer** (a timeout read as "neutral", an error read as "abstained") — it is an error;
237
+ `arun_eval` keeps it apart (ADR-0133).
238
+ - **Only aggregates kept** — an eval whose per-item outputs were not saved can never be re-scored or checked; keep
239
+ the report.
162
240
  - **Faking a win by shrinking the sample / picking easy items** — real, representative, honest.
163
241
 
164
242
  ## Hand-off / where this sits
@@ -25,9 +25,10 @@ you can fine-tune. In RAG_Wright a decision model is wired as a `kind="model"` c
25
25
 
26
26
  **Swapping Jev for Laya is config, but not free.** `DECISION_PROFILES` has only Jev entries (`jev-1.13`, the
27
27
  default, and `jev-latest`). A Laya swap needs (1) a server that speaks the Decisions API (POST
28
- `{model, state, questions}`, return `{answers: {<id>: {type, noul|choice|score}}}`), and (2) a `DecisionModelProfile`
29
- entry in `DECISION_PROFILES` with its `endpoint`, `served_model_id` and `api_key_env` (an unknown id falls back to
30
- the OpenRouter endpoint). Then select it with `RAG_DECISION_MODEL=<profile id>`;
28
+ `{model, state, questions}`, return `{answers: {<id>: {type, noul|choice|score}}}`), and (2) its profile, registered
29
+ at startup from your product: `register_decision_profile(DecisionModelProfile(model_id="laya-onprem",
30
+ served_model_id=..., endpoint=..., api_key_env=...))`, both on `rag_wright.api` (an unregistered id falls back to the
31
+ OpenRouter endpoint). Then select it with `RAG_DECISION_MODEL=<profile id>` (or the `jev_decision` input `model`);
31
32
  `RAG_JEV_TIMEOUT_S` overrides the request timeout.
32
33
 
33
34
  **Batch the questions.** One call carries one `state` and many keyed questions, so ask everything about a unit in
@@ -68,7 +69,7 @@ server you swap in.
68
69
  ## Data — the JSONL schema + criteria (the differentiator)
69
70
  One JSONL line per case (`research/scripts/finetune_single_device.py` reads this exact shape):
70
71
  ```
71
- {"state": "<clause text>",
72
+ {"state": "<unit text>",
72
73
  "questions": {"<dim>": {"type":"choice","instructions":"<the question>","criteria":{"<value>":"<description>", ...}}},
73
74
  "gold": {"<dim>": {"probabilities": {"<value>": <p>, ...}, "label": "<value>"}}}
74
75
  ```
@@ -78,7 +79,7 @@ One JSONL line per case (`research/scripts/finetune_single_device.py` reads this
78
79
  - **`gold` is a DISTRIBUTION (soft targets), not a hard label** — RLCD trains on the teacher's probability per option.
79
80
  One-hot (`{gold:1.0, other:0.0}`) works and is the pragmatic start; true soft targets (teacher per-option probs)
80
81
  are the design-intended enhancement.
81
- - Reuse your existing **contract-disjoint, symmetric splits** so floors are directly comparable to SetFit. Silver
82
+ - Reuse your existing **document-disjoint, symmetric splits** so floors are directly comparable to SetFit. Silver
82
83
  goes in TRAIN only; val/test stay gold.
83
84
 
84
85
  ## Fine-tune — single T4, RLCD, calibration built in
@@ -116,11 +117,12 @@ One JSONL line per case (`research/scripts/finetune_single_device.py` reads this
116
117
  the model from the engine (never a hardcoded/stale id; bulk teacher labeling on Modal Qwen, not OpenRouter), load
117
118
  `.env` by EXPLICIT path from an out-of-repo script, SMOKE one item before the fan-out, and stream X/N to a log you
118
119
  actively monitor. Those exact mistakes cost runs on 2026-10-04.
119
- - **Modal harness = reuse the [[setfit]] hardened pattern:** `.uv_pip_install("laya")` + `.add_local_file` the
120
+ - **Modal harness = follow the [[setfit]] hardened pattern** (the pattern described there; that harness's code is
121
+ not shipped): `.uv_pip_install("laya")` + `.add_local_file` the
120
122
  finetune script; launcher BLOCKS on `.get()` per spawn (no spawn-and-return), stamps + verifies a `data_sha`,
121
123
  writes a manifest, streams X/N; snapshot keepers server-side to a `/checkpoints/<name>` path (a small copy fn) —
122
124
  the laya volume has no built-in snapshot, add one. Never lose a fine-tune.
123
- - **ACCOUNT CONTAINER CAP = 10 (fzaidi2014).** Spawning more than 10 fine-tunes at once does NOT run them all —
125
+ - **ACCOUNT CONTAINER CAP (10 on the engine authors' account; check your workspace's).** Spawning more than 10 fine-tunes at once does NOT run them all —
124
126
  Modal queues the rest and runs ~10 at a time (correct, but ~N/10 waves of wall-clock, and a "why only 10 running?"
125
127
  surprise). Size a `groupbake`/dimbatch fan-out to ≤10 in flight (chunk into waves + gather between), or state the
126
128
  wave count honestly. This is a DIFFERENT knob from the vLLM `max_containers=1` + `@modal.concurrent` batching in the
@@ -16,6 +16,11 @@ ADR-0110 and the other `docs/` paths are in the engine repository: read them the
16
16
  matching your installed engine.
17
17
  This skill is the operational checklist that ties them together.
18
18
 
19
+ **Which route.** A product deploys and reaches the server through the engine API, `adeploy_model_server` (the
20
+ section after the locked config). The raw `modal deploy` of the bundled script further down is the engine
21
+ developer's route, and what the API runs underneath. **When to stop it** is one rule, in "Cold start & cost": deploy
22
+ once, let it scale to zero between uses, never stop it between runs.
23
+
19
24
  ## The LOCKED production config (ADR-0110) — do not re-litigate
20
25
  **Config B: `Qwen/Qwen3.8-27B-FP8` weights + `--kv-cache-dtype fp8`, on 1× A100-80GB, TP=1, `--max-model-len 16384`, `--gpu-memory-utilization 0.95`.**
21
26
  - Config B (FP8 weights) is the **locked deploy** — 52.71× concurrency @16K (ADR-0110 rounds it to 53×), ~23% higher throughput, ~31 GB weights (30.9 GB on disk, 28.9 GiB in VRAM);
@@ -38,15 +43,21 @@ from rag_wright.api import EngineConfig, ModelServerSpec, adeploy_model_server,
38
43
  server = await adeploy_model_server(ModelServerSpec(name="acme-qwen", max_num_seqs=32)) # key from VLLM_API_KEY
39
44
  config = EngineConfig(store=..., models={"general": server.model_id}) # or any model= argument
40
45
  ...
41
- stop_model_server("acme-qwen") # stop billing
46
+ stop_model_server("acme-qwen") # only to retire it: stopping discards the snapshots (see "Cold start & cost")
42
47
  ```
43
48
 
44
- `amodel_server(spec)` reconnects to a server deployed earlier (a restart, another process) without redeploying.
49
+ `server.model_id` is `qwen3.8-27b-modal@<name>`: a copy of the `qwen3.8-27b-modal` profile pointed at this server
50
+ (reasoning on for structured calls and agent turns, off for free text). Use that id, never `VLLM_BASE_URL`. A
51
+ reasoning-off structured pick (bulk closed-vocab labeling) has no `@<name>` variant: point `VLLM_BASE_URL` at
52
+ `server.base_url` and use the `qwen3.8-27b-modal-nothink` profile.
53
+ `amodel_server(spec)` reconnects to a server deployed earlier (a restart, another process) without redeploying;
54
+ `await_model_server(server, timeout_s=...)` waits for readiness; `amodel_server_status(spec)` looks without waking it
55
+ (`deployed`, `running` (a container bills), `healthy`, `weights_cached`); `astop_model_server(name)` is the async stop.
45
56
  The API key comes from the variable `ModelServerSpec.api_key_env` names (default `VLLM_API_KEY`); there is no default
46
57
  key, so set a real one. Needs `rag-wright[modal]` and a Modal login. One app per server name: different names give
47
58
  different servers (and URLs), for example one per tenant.
48
59
 
49
- **The exact working deploy (this succeeded):**
60
+ **The engine developer's route: the raw deploy (this succeeded):**
50
61
  ```
51
62
  VLLM_API_KEY=<a long random string> MODAL_IMAGE_BUILDER_VERSION=2025.06 \
52
63
  APP_NAME=rw-qwen3-modal MODEL=Qwen/Qwen3.8-27B-FP8 KV_CACHE_DTYPE=fp8 \
@@ -58,12 +69,12 @@ VLLM_API_KEY=<a long random string> MODAL_IMAGE_BUILDER_VERSION=2025.06 \
58
69
  The script refuses to deploy without `VLLM_API_KEY`: Modal's web endpoint is public and unauthenticated, so vLLM's
59
70
  `--api-key` is the only gate on a billing A100, and there is no default key. Then wire the engine: `.env`
60
71
  `VLLM_BASE_URL=https://<workspace>--rw-qwen3-modal-serve.modal.run/v1` and the same `VLLM_API_KEY`; the profile
61
- `qwen3.8-27b-modal` routes there (the seam also refuses an unset key). **Stop billing when done:**
62
- `uv run --no-sync modal app stop rw-qwen3-modal --yes` (A100 is expensive).
72
+ `qwen3.8-27b-modal` routes there (the seam also refuses an unset key). When to stop it: "Cold start & cost" below.
63
73
 
64
74
  **The engine does NOT reach Modal by default.** Every role's default is `_PRODUCT_LLM = "qwen3.8-27b-modal-or"`,
65
- the same model routed through OpenRouter (a Modal cold start can still take minutes when Modal builds a snapshot). To send calls to the Modal server, set
66
- `RAG_MODEL_ALL=qwen3.8-27b-modal` (all roles), a per-role `RAG_MODEL_<ROLE>`, or `EngineConfig.models`. For bulk
75
+ the same model routed through OpenRouter (a Modal cold start can still take minutes when Modal builds a snapshot). To send calls to the Modal server, put
76
+ `server.model_id` in `EngineConfig.models` (the API route), or on the raw route set `RAG_MODEL_ALL=qwen3.8-27b-modal`
77
+ (all roles) or a per-role `RAG_MODEL_<ROLE>`. For bulk
67
78
  closed-vocab labeling, the reasoning-off profile `qwen3.8-27b-modal-nothink` exists (opt-in; see the reasoning
68
79
  caveat below). `VISION_OCR` now defaults to the product LLM too, but image inputs through the Modal vLLM server are
69
80
  UNVERIFIED (the serve script passes no multimodal flags): confirm an image call works before pointing
@@ -123,14 +134,22 @@ the OFFICIAL prebuilt vLLM image** rather than pip-building vLLM:
123
134
  a weight read of 12-154 s from the Volume (9P), then compile-cache load + CUDA-graph capture. Measured and NOT
124
135
  worth adopting (ADR-0109 addendum): `--load-format runai_streamer`, precompiled `.pyc`, `HF_HUB_OFFLINE=1` (it
125
136
  changes vLLM's compile-cache key every container, so each start recompiles). Poll `/health` for readiness.
126
- - **A100 is billed while up — `modal app stop <app> --yes` the moment you're done.** Verify with `modal app list`
127
- (state `stopped`, 0 tasks) + endpoint 404.
128
- - **Do NOT warm the GPU before the consumer is ready, and do NOT trust auto-scaledown to protect billing** (burned
129
- 2026-10-04: a smoke-warmed A100 sat idle ~20 min while unrelated work ran, because "scaledown_window will handle
130
- it" was assumed — it did not, fast enough). RULE: build the bulk/label/eval consumer FIRST (while the app is
131
- stopped/cold), THEN warm → smoke → run → **`modal app stop` immediately after**, in one continuous go. If you warm
132
- only to prove stand-up and the consumer is not next, STOP it right after the smoke. Treat the explicit stop as
133
- mandatory, not the scaledown as sufficient; verify stopped with `modal app list`.
137
+ - **When to stop it -- one rule (EV-6; it used to contradict the line above).** The A100 is billed only while a
138
+ container runs; the server scales to zero after 10 idle minutes (`scaledown_window=600`, no warm minimum) and then
139
+ costs nothing and KEEPS its snapshots, so the next request is back in ~13 s. `modal app stop` saves at most those
140
+ 10 minutes and makes the next deploy pay a snapshot-building boot (usually 4-9 min; 15 min seen once) (2026-10-12: a stop after a failed smoke
141
+ run, then a redeploy, cost a 911 s boot).
142
+ 1. **Deploy once per server name**; reuse the name (a new name builds new snapshots).
143
+ 2. **Build the consumer first** (the bulk / label / eval script, its smoke test, its progress logging) while no
144
+ container runs, then warm, smoke and run in one go. Do not warm a GPU before its consumer is ready (2026-10-04:
145
+ a smoke-warmed A100 sat idle ~20 min while unrelated work ran).
146
+ 3. **Between runs, and when you are done, let it scale to zero.** Never stop it between runs; a script's error
147
+ path must not stop it either when a fix-and-rerun is likely.
148
+ 4. **Check it reached zero**: `amodel_server_status(spec).running` is False (or `modal app list` shows the app
149
+ `deployed` with 0 tasks) about 10 minutes after the last call. If tasks remain past the window, find out why (that is the 2026-10-04 burn) and stop it.
150
+ 5. **Stop (`modal app stop <app> --yes`, or `stop_model_server`) only to retire a server**: you will not use it
151
+ for a long time and do not want its endpoint up, or you are replacing its deployment. Expect the next deploy to
152
+ rebuild the snapshots.
134
153
 
135
154
  ## The meta-lesson
136
155
  Config + recipe live in **ADR-0110 + the script + this skill**. Before any Qwen/Modal work: read them, don't
@@ -219,11 +219,14 @@ after the 21-classifier runs — each one cost real time and each is avoidable w
219
219
  order before you fan out any bulk job.
220
220
 
221
221
  1. **Resolve the model from the engine, never hardcode a model id.** A hardcoded id rots: `ibm-granite/granite-4.1-8b`
222
- now 404s on OpenRouter ("No endpoints found"). Use the engine resolver (`models.profiles.model_for(ModelRole.<ROLE>)`,
222
+ now 404s on OpenRouter ("No endpoints found"). Use the engine resolver (`rag_wright.pack_sdk.model_for(ModelRole.<ROLE>)`,
223
223
  or `ws.model_id(role)` on a workspace; the model-profile seam) so the id and backend come from config, and **confirm it with a one-call smoke before any
224
224
  bulk run**. Bulk teacher labeling runs on **self-hosted Qwen on Modal** (`qwen-vllm-modal` skill + ADR-0110), NOT
225
- OpenRouter (flat-GPU = the warn-before-bulk rule); reasoning ON for label fidelity; client concurrency ≤16; raise
226
- the structured timeout for reasoning-ON bulk; `modal app stop` when done.
225
+ OpenRouter (a flat GPU rate, not a per-call bill: before more than ~50 paid calls, print the exact count and cost
226
+ and wait for approval); reasoning ON for label fidelity; client concurrency below the server's `max_num_seqs`
227
+ (counting every concurrent run); raise the structured timeout for reasoning-ON bulk; between runs let the server
228
+ scale to zero, and stop it only to retire it (`qwen-vllm-modal`, "Cold start & cost": a stop discards its
229
+ snapshots).
227
230
  2. **Load `.env` by EXPLICIT path in any script run from outside the repo root** (a scratchpad / one-off script).
228
231
  `load_dotenv()` with no path searches the CALLING SCRIPT's directory, so a script in `/tmp/...` silently misses
229
232
  the project `.env` → `KeyError` or wrong creds. Pass the repo `.env` path (`load_dotenv("/abs/repo/.env")`) or
@@ -257,7 +260,7 @@ Concrete tool gotchas from a real run; following them saves real time.
257
260
  per-run progress log on the volume. A run whose app shows `stopped / 0 tasks` seconds after launch did NOT train —
258
261
  confirm via the platform task count and the registry, not by assuming.
259
262
  - **Mind the ACCOUNT CONTAINER CAP when sizing the fan-out.** A workspace has a max concurrent-container count (10 on
260
- the fzaidi2014 account). Spawning more than that does NOT run them all at once — the excess QUEUES and runs in waves
263
+ the engine authors' account; check your own workspace's limit). Spawning more than that does NOT run them all at once — the excess QUEUES and runs in waves
261
264
  (correct + no double-spend, but ~N/cap× the wall-clock, and only `cap` show as running). Size the wave to ≤ the cap
262
265
  (chunk spawns + gather between waves) or report the wave count honestly. Distinct from any in-container concurrency.
263
266
  - **When multiple entrypoints exist, name the one to run** (`script.py::entrypoint`) and use the FULL script path;