rag-wright 0.12.0__tar.gz → 0.13.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 (1078) hide show
  1. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/building-an-ingestion-capability/SKILL.md +4 -0
  2. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/specifying-a-product-on-the-engine/SKILL.md +1 -1
  3. {rag_wright-0.12.0/src/rag_wright/.agents → rag_wright-0.13.0/.claude}/skills/using-the-rag-wright-engine/SKILL.md +5 -2
  4. rag_wright-0.13.0/.release-please-manifest.json +3 -0
  5. {rag_wright-0.12.0 → rag_wright-0.13.0}/CHANGELOG.md +15 -0
  6. {rag_wright-0.12.0 → rag_wright-0.13.0}/CLAUDE.md +1 -1
  7. {rag_wright-0.12.0 → rag_wright-0.13.0}/PKG-INFO +1 -1
  8. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/ArcadeDB_Local.md +1 -1
  9. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0062-tiered-ocr-scan-quality-vlm-escalation.md +11 -0
  10. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/api/README.md +35 -3
  11. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/configuration.md +5 -0
  12. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/domain-adaptation/README.md +1 -1
  13. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/domain-adaptation/_engine-gaps.md +5 -1
  14. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/domain-adaptation/authoring-capabilities.md +4 -3
  15. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/installation.md +11 -4
  16. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/plan.md +5 -1
  17. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/rulewright-migration-0.12.0.md +2 -2
  18. {rag_wright-0.12.0 → rag_wright-0.13.0}/pyproject.toml +1 -1
  19. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/migrate_span_fields.py +5 -6
  20. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/building-an-ingestion-capability/SKILL.md +4 -0
  21. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/specifying-a-product-on-the-engine/SKILL.md +1 -1
  22. {rag_wright-0.12.0/.claude → rag_wright-0.13.0/src/rag_wright/.agents}/skills/using-the-rag-wright-engine/SKILL.md +5 -2
  23. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/__init__.py +9 -5
  24. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/kg.py +34 -4
  25. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/workspace.py +22 -1
  26. rag_wright-0.13.0/src/rag_wright/capabilities/parse_audit.py +88 -0
  27. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/parsing.py +11 -6
  28. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/scan_quality.py +21 -7
  29. rag_wright-0.13.0/src/rag_wright/capabilities/span_search.py +102 -0
  30. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/store/arcadedb.py +12 -18
  31. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/store/seam.py +35 -3
  32. rag_wright-0.13.0/tests/api/test_migrate_span_fields.py +67 -0
  33. rag_wright-0.13.0/tests/capabilities/test_parse_audit.py +149 -0
  34. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_scan_quality.py +32 -0
  35. rag_wright-0.13.0/tests/capabilities/test_span_search.py +129 -0
  36. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_tiered_ocr.py +73 -0
  37. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_arcadedb_span.py +16 -0
  38. rag_wright-0.13.0/tests/store/test_kg_range.py +64 -0
  39. {rag_wright-0.12.0 → rag_wright-0.13.0}/uv.lock +1 -1
  40. rag_wright-0.12.0/.release-please-manifest.json +0 -3
  41. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/settings.json +0 -0
  42. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/authoring-a-capability/SKILL.md +0 -0
  43. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/building-a-product-backend/SKILL.md +0 -0
  44. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/building-a-product-frontend/SKILL.md +0 -0
  45. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/building-an-agent-harness/SKILL.md +0 -0
  46. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/classifier-opportunity-analysis/SKILL.md +0 -0
  47. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/creating-evals/SKILL.md +0 -0
  48. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/laya/SKILL.md +0 -0
  49. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/qwen-vllm-modal/SKILL.md +0 -0
  50. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -0
  51. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/qwen-vllm-modal/scripts/rw_gate.py +0 -0
  52. {rag_wright-0.12.0 → rag_wright-0.13.0}/.claude/skills/setfit/SKILL.md +0 -0
  53. {rag_wright-0.12.0 → rag_wright-0.13.0}/.env.example +0 -0
  54. {rag_wright-0.12.0 → rag_wright-0.13.0}/.github/workflows/publish.yml +0 -0
  55. {rag_wright-0.12.0 → rag_wright-0.13.0}/.github/workflows/release-please.yml +0 -0
  56. {rag_wright-0.12.0 → rag_wright-0.13.0}/.gitignore +0 -0
  57. {rag_wright-0.12.0 → rag_wright-0.13.0}/LICENSE +0 -0
  58. {rag_wright-0.12.0 → rag_wright-0.13.0}/README.md +0 -0
  59. {rag_wright-0.12.0 → rag_wright-0.13.0}/SPEC.md +0 -0
  60. {rag_wright-0.12.0 → rag_wright-0.13.0}/conftest.py +0 -0
  61. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/ARCHITECTURE_OVERVIEW.md +0 -0
  62. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/OBSERVABILITY.md +0 -0
  63. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0001-stack-and-library-choices.md +0 -0
  64. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0002-validation-corpus-cuad-edgar.md +0 -0
  65. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0003-ard-registration-and-capability-kinds.md +0 -0
  66. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0004-entity-disambiguation.md +0 -0
  67. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0005-relational-golden-set.md +0 -0
  68. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0006-model-profile.md +0 -0
  69. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0007-arcadedb-store-schema.md +0 -0
  70. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0008-unified-framework-index-docs-grounding.md +0 -0
  71. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0009-rlm-chunking-retained-as-configurable-capability.md +0 -0
  72. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0010-transformers-pinned-below-5-for-flagembedding-reranker.md +0 -0
  73. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0011-cuad-not-a-retrieval-benchmark-acord-for-queries.md +0 -0
  74. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0012-entity-mention-confidence-no-proximity-edges.md +0 -0
  75. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0013-entity-resolution-matching-strategy.md +0 -0
  76. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0014-split-generation-and-vision-to-text.md +0 -0
  77. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0015-rlm-dynamic-subagents-and-granted-subagents.md +0 -0
  78. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0016-rlm-defined-by-required-capabilities-enforced-as-tests.md +0 -0
  79. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0017-dynamic-dispatch-trigger-as-typed-flag.md +0 -0
  80. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0018-rlm-method-is-the-orchestrator-system-prompt.md +0 -0
  81. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0019-recursion-is-optional-for-chunking-required-for-synthesis.md +0 -0
  82. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0020-serialize-interpreter-sessions-per-process-ki1.md +0 -0
  83. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0021-capability-interface-governed-typed-io.md +0 -0
  84. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0022-fr-k-embedding-free-okf-navigation-experimental.md +0 -0
  85. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0023-cheap-model-for-okf-enrichment.md +0 -0
  86. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0024-reader-parallelism-lives-in-python-not-the-interpreter.md +0 -0
  87. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0025-retrieval-pivot-function-classify-property-graph-rerank.md +0 -0
  88. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0026-property-schema-and-extended-function-taxonomy.md +0 -0
  89. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0027-openrouter-provider-routing-by-throughput.md +0 -0
  90. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0028-deterministic-grounding-judge-and-flash-pro-cascade.md +0 -0
  91. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0029-retrieval-pipeline-domain-portability-and-adaptation.md +0 -0
  92. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0030-model-training-standard-modal-reusable-checkpointed.md +0 -0
  93. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0031-single-call-chunking-for-structured-contracts.md +0 -0
  94. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0032-nl-to-type-two-step-reason-emit-on-gemma.md +0 -0
  95. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0033-unified-contract-kg-three-legs-one-graph.md +0 -0
  96. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0034-granite-json-schema-structured-output-profile.md +0 -0
  97. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0035-graph-extraction-rebacked-with-gp1b-retire-hybrid.md +0 -0
  98. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0036-party-clause-link-party-to-edge.md +0 -0
  99. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0037-clause-template-is-authoritative-code-not-generated.md +0 -0
  100. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0038-full-cuad-kg-on-gcp-gpu-vm-and-gcs-backup.md +0 -0
  101. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0039-self-hosted-open-model-stack-on-modal-a100.md +0 -0
  102. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0040-neuro-symbolic-extraction-fidelity-ontology-shacl-validation.md +0 -0
  103. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0041-capability-kind-rubric-and-agent-skill-runtime-tiers.md +0 -0
  104. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0042-clause-level-span-id-provenance-and-content-hash-backfill.md +0 -0
  105. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0043-retire-cross-corpus-retrieval-standardize-on-leg-b.md +0 -0
  106. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0044-is-exception-to-derived-carveout-relationship.md +0 -0
  107. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0045-client-side-tag-parse-structured-output.md +0 -0
  108. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0046-acord-unified-into-one-production-kg.md +0 -0
  109. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0047-retire-precomputed-clause-function-gate.md +0 -0
  110. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0048-ingest-llm-classifier-nondestructive-reclassify.md +0 -0
  111. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0049-generic-customer-lens-for-ingestion.md +0 -0
  112. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0050-async-langgraph-ingestion.md +0 -0
  113. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0051-schema-bootstrap-and-feedback-driven-ontology-evolution.md +0 -0
  114. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0052-engine-product-split-graphwright-parked.md +0 -0
  115. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0053-answer-prose-output-hygiene.md +0 -0
  116. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0054-remove-auto-tag-from-generator-evidence.md +0 -0
  117. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0055-confidence-out-of-band.md +0 -0
  118. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0056-bound-structured-retry-wall-clock.md +0 -0
  119. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0057-async-engine-architecture.md +0 -0
  120. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0058-structure-first-chunking.md +0 -0
  121. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0059-recall-decoupled-from-classification-and-visible-partial-loss.md +0 -0
  122. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0060-scope-compliance-check-to-named-policy-sources.md +0 -0
  123. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0061-subject-document-compliance-per-section.md +0 -0
  124. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0063-per-sentence-compliance-subject-facts.md +0 -0
  125. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0064-typed-properties-out-of-band-on-evidence.md +0 -0
  126. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0065-deontic-applicability-gates-query-side.md +0 -0
  127. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0066-ontology-ttl-single-source-of-truth.md +0 -0
  128. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0067-domain-pack-retargeting.md +0 -0
  129. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0068-recall-first-actor-gate-ontology-role-disjointness.md +0 -0
  130. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0069-reading-order-chunking-tables-figures-retrievable.md +0 -0
  131. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0070-text-layer-first-parsing-no-false-vlm-escalation.md +0 -0
  132. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0071-defragmentation-reconstruct-paragraphs-from-line-items.md +0 -0
  133. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0072-extract-guard-furniture-and-deterministic-failure.md +0 -0
  134. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0073-born-digital-threshold-sparse-pages-no-vlm-escalation.md +0 -0
  135. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0074-retry-transient-extraction-failures.md +0 -0
  136. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0075-per-page-vlm-escalation.md +0 -0
  137. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0076-thread-safe-shared-embedder-reranker.md +0 -0
  138. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0077-concurrent-function-classification-across-chunks.md +0 -0
  139. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0078-dedicated-extraction-executor.md +0 -0
  140. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0079-product-default-granite-4.2-openrouter-routing.md +0 -0
  141. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0080-nested-tag-parse-and-degrade.md +0 -0
  142. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0081-function-independent-tagparse-clause-extraction.md +0 -0
  143. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0082-symbolic-gate-function-independent.md +0 -0
  144. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0083-executor-hop-trace-context-capture.md +0 -0
  145. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0084-gleaning-off-on-the-query-leg.md +0 -0
  146. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0085-query-constraint-extraction-tagparse.md +0 -0
  147. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0086-streaming-cost-capture.md +0 -0
  148. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0087-retrieval-relevance-score-on-rankedspan.md +0 -0
  149. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0088-per-span-relevance-verdict.md +0 -0
  150. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0089-structured-output-generation-tracing.md +0 -0
  151. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0090-affiliate-of-extraction.md +0 -0
  152. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0091-retire-partyto-edge.md +0 -0
  153. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0092-idempotent-write-graph.md +0 -0
  154. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0093-entities-by-name-seam.md +0 -0
  155. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0094-workspace-document-scope.md +0 -0
  156. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0095-span-page-provenance.md +0 -0
  157. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0096-carveout-keyword-normalization.md +0 -0
  158. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0097-caller-configurable-ingest-extraction-models.md +0 -0
  159. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0098-invoke-time-document-scope.md +0 -0
  160. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0099-mcp-tools-never-take-a-model-supplied-tenant.md +0 -0
  161. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0100-profile-based-model-routing.md +0 -0
  162. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0101-untagged-spans-reach-extraction-aspect-gate-removed.md +0 -0
  163. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0102-open-descriptive-list-dims-retain-verbatim.md +0 -0
  164. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0103-a-clause-is-a-provision-not-a-span.md +0 -0
  165. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0104-dense-floor-protection-in-leg-b.md +0 -0
  166. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0105-in-band-model-usage-accounting.md +0 -0
  167. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0106-document-signals-off-the-citation.md +0 -0
  168. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0107-requirement-page-provenance.md +0 -0
  169. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0108-qwen3-27b-single-a100-serving-profile.md +0 -0
  170. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0109-vllm-cold-start-reduction.md +0 -0
  171. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0110-fp8-kv-cache-16k-single-a100.md +0 -0
  172. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0111-pin-qwen3-27b-deepinfra-bf16.md +0 -0
  173. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0112-relax-deepagents-pin-to-floor.md +0 -0
  174. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0113-llm-span-instrumentation-for-latency-attribution.md +0 -0
  175. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0114-setfit-default-clause-function-classifier.md +0 -0
  176. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0115-classifier-only-step3a-property-extraction.md +0 -0
  177. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0116-soft-function-scoping-classifier-lane.md +0 -0
  178. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0117-engine-api-layer-and-capability-runtime.md +0 -0
  179. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0118-engine-core-api-vs-ard-adapter-free-impl-ref-client.md +0 -0
  180. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0119-jev-typed-decision-model-for-compliance-closed-set-fields.md +0 -0
  181. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0120-rlm-sub-agent-identity-dynamic-dispatch-trigger.md +0 -0
  182. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0121-spacy-optional-extra-model-runtime-download.md +0 -0
  183. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0122-provision-boundary-deterministic-plus-decision-model-residue.md +0 -0
  184. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0123-batched-releases-release-please-and-consumer-dependabot.md +0 -0
  185. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0124-generic-ingestion-builder-and-hooks.md +0 -0
  186. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0125-qwen-openrouter-unpinned.md +0 -0
  187. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0126-unit-representative-hook-and-the-reference-vote.md +0 -0
  188. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0127-retire-the-okf-code.md +0 -0
  189. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0128-two-public-tiers-api-and-pack-sdk.md +0 -0
  190. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0129-laya-temperatures-and-the-sklearn-floor.md +0 -0
  191. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0130-deploy-the-self-hosted-model-server-from-the-engine.md +0 -0
  192. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0131-model-server-hardening-after-rulewright-review.md +0 -0
  193. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0132-model-server-cold-start-from-a-gpu-snapshot.md +0 -0
  194. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0133-model-call-deadline-follows-the-timeout-and-a-thinking-cap.md +0 -0
  195. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0134-skills-for-product-developers-are-linked-per-project-never-globally.md +0 -0
  196. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0135-the-seam-gives-each-event-loop-its-own-async-http-client.md +0 -0
  197. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0136-spreadsheet-tables-are-glued-back-across-blank-rows.md +0 -0
  198. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0137-generated-answers-state-their-support-and-none-is-an-abstention.md +0 -0
  199. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0138-the-engine-reaches-pdfium-through-one-locked-door.md +0 -0
  200. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/0139-the-agent-harness-substrate-is-engine-scope.md +0 -0
  201. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/adr/README.md +0 -0
  202. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/api/harness.md +0 -0
  203. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/api/pack_sdk.md +0 -0
  204. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/architecture/foundations-and-adding-a-domain.md +0 -0
  205. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/architecture.md +0 -0
  206. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/README.md +0 -0
  207. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/design/deontic-applicability-routing.md +0 -0
  208. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/design/ingestion-neuro-symbolic-gaps.md +0 -0
  209. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/design/semantic-subject-segmentation.md +0 -0
  210. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/design/unify-subject-preprocessing.md +0 -0
  211. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0037-closed-vocab-drops-verbatim-values-to-other.md +0 -0
  212. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0038-a-clause-node-is-now-created-per-sentence-so-98-percent-of-spans-become-clauses.md +0 -0
  213. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0039-the-provision-detector-reads-text-but-docling-puts-the-section-number-in-marker.md +0 -0
  214. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0040-covered-subject-is-asked-of-every-provision-so-verbatim-retention-fills-it-with-noise.md +0 -0
  215. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0041-VERIFICATION-dense-floor.md +0 -0
  216. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0041-leg-b-discards-the-best-dense-matches-on-some-queries.md +0 -0
  217. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0042-usage-is-captured-per-call-but-never-returned-so-cost-needs-a-langfuse-round-trip.md +0 -0
  218. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0043-a-requirement-carries-no-page-provenance-so-a-finding-cannot-point-into-its-policy.md +0 -0
  219. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0044-document-signals-scaffolding-is-shown-to-the-user-as-a-quote-from-their-document.md +0 -0
  220. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0045-a-fixed-money-cap-records-no-cap-quantum-so-the-amount-is-only-prose.md +0 -0
  221. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0046-appending-a-natural-follow-up-to-a-question-drops-the-clause-type.md +0 -0
  222. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0047-an-exact-deepagents-pin-transitively-pins-every-consumer.md +0 -0
  223. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/engine-issues/0048-the-pinned-endpoints-latency-tail-makes-agent-runs-undebuggable-from-either-side.md +0 -0
  224. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-07-20_graphwright_capability_interface_reply.md +0 -0
  225. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-07-20b_graphwright_interface_confirmation.md +0 -0
  226. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-07-20c_graphwright_ingestion_interfaces.md +0 -0
  227. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-08-30_subject_compliance_final_rulewright.md +0 -0
  228. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-01_issue-0013-recall-first-actor-gate_rulewright.md +0 -0
  229. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-01_ontology-source-of-truth_rulewright.md +0 -0
  230. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-03_issue-0014-table-retrievability_rulewright.md +0 -0
  231. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-04_bulk-ingestion-wall_rulewright.md +0 -0
  232. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-04_issue-0016-thread-safe-embedder_rulewright.md +0 -0
  233. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-05_observability-langfuse_rulewright.md +0 -0
  234. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-05_tagparse-ingestion-and-granite-4.2_rulewright.md +0 -0
  235. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-09_affiliate-of-extraction_rulewright.md +0 -0
  236. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-09_issue-0028-partyto-retired_rulewright.md +0 -0
  237. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-09_issue-0029-idempotent-write-graph_rulewright.md +0 -0
  238. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-09_issue-0030-entities-by-name_rulewright.md +0 -0
  239. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-09_observability-and-retrieval-floor_rulewright.md +0 -0
  240. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-09_relevance-verdict_rulewright.md +0 -0
  241. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-09_rename-run-ad-compliance-check_rulewright.md +0 -0
  242. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-09_structured-output-cost-tracing_rulewright.md +0 -0
  243. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-10_ingest-models-caller-configurable_rulewright.md +0 -0
  244. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-failclosed-and-nodrift_rulewright.md +0 -0
  245. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-validate-ingested-set_rulewright.md +0 -0
  246. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-10_issue-0031-workspace-document-scope_rulewright.md +0 -0
  247. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-10_issue-0032-span-page-provenance_rulewright.md +0 -0
  248. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-10_issue-0033-carveout-normalization_rulewright.md +0 -0
  249. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-10_issue-0034-invoke-time-document-scope_rulewright.md +0 -0
  250. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-11_issue-0035-followup-derived-guard_rulewright.md +0 -0
  251. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-11_issue-0035-mcp-no-model-tenant_rulewright.md +0 -0
  252. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-11_profile-based-model-routing_rulewright.md +0 -0
  253. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-11_qwen-default-modal-or_rulewright.md +0 -0
  254. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-11_qwen-everywhere-config_rulewright.md +0 -0
  255. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-12_clause-granularity_0036-0039_rulewright.md +0 -0
  256. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-12_closed-vocab_0037-0040_rulewright.md +0 -0
  257. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-12_dense-floor-protection_0041_rulewright.md +0 -0
  258. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-13_in-band-usage_0042_rulewright.md +0 -0
  259. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-14_document-signals-off-citation_0044_rulewright.md +0 -0
  260. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-14_requirement-page-provenance_0043_rulewright.md +0 -0
  261. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-16_qwen3-27b-single-a100-serving-profile_rulewright.md +0 -0
  262. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-18_fp8-accuracy-eval-configB_rulewright.md +0 -0
  263. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-18_fp8-kv-16k-single-a100_rulewright.md +0 -0
  264. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-20_deepagents-pin-relaxed_0047_rulewright.md +0 -0
  265. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-20_llm-span-instrumentation_0048_rulewright.md +0 -0
  266. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-answers_from_rulewright.md +0 -0
  267. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-scoping-questions_rulewright.md +0 -0
  268. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/misc/.gitkeep +0 -0
  269. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/plans/Corpus_Acquisition.md +0 -0
  270. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/plans/async-migration.md +0 -0
  271. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/plans/demo_plan.md +0 -0
  272. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/plans/gp1b_docling_graph_plan.md +0 -0
  273. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/plans/unified_contract_kg_ontology_bridge.md +0 -0
  274. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/plans/unified_contract_kg_plan.md +0 -0
  275. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/results/2026-07-24-t58-property-graph-population.md +0 -0
  276. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/results/2026-07-25-t58b-full-pipeline-rerank.md +0 -0
  277. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/archive/results/2026-07-25-t58b-topk-ordering-levers.md +0 -0
  278. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/concepts.md +0 -0
  279. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/contract_pipeline_explainer.md +0 -0
  280. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/corpus_ingest_recipe.md +0 -0
  281. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/domain-adaptation/classification-and-decision-models.md +0 -0
  282. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/domain-adaptation/entity-resolution.md +0 -0
  283. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/domain-adaptation/evals-from-expert-files.md +0 -0
  284. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/domain-adaptation/kg-construction.md +0 -0
  285. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/domain-adaptation/ontology-authoring.md +0 -0
  286. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/classifier_model_ab.md +0 -0
  287. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/compliance_demo.md +0 -0
  288. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/compliance_gate_cc7.md +0 -0
  289. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/compliance_rung2_cc7.md +0 -0
  290. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/cuad_highlighting_cu-d1.md +0 -0
  291. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/dg_model_ab.md +0 -0
  292. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/function_gate_recall.md +0 -0
  293. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/generation_robustness_b_vs_c.md +0 -0
  294. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/nl_to_type_cu-d2.md +0 -0
  295. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/ocr_benchmark.md +0 -0
  296. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/prod1_readiness.md +0 -0
  297. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/prod2_readiness.md +0 -0
  298. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/query_side_model_ab.md +0 -0
  299. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/silver_granite_vs_gemma4.md +0 -0
  300. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/silver_provider_routing.md +0 -0
  301. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/eval/silver_selfhosted_gemma4_26b.md +0 -0
  302. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/evals.md +0 -0
  303. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/harness.md +0 -0
  304. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/playbook.md +0 -0
  305. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/product/capability_profiles.md +0 -0
  306. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/product/contracts_product_roadmap.md +0 -0
  307. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/product/engine-api-migration-handoff.md +0 -0
  308. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/product/engine_async_api.md +0 -0
  309. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/product/new-domain-build-sequence.md +0 -0
  310. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/product/seam-adaptation-guide.md +0 -0
  311. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/proposals/compliance-ingest-classifier-decomposition.md +0 -0
  312. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/proposals/de-domaining-and-capability-runtime.md +0 -0
  313. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/proposals/new-domain-developer-journey.md +0 -0
  314. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/proposals/ontology-induction.md +0 -0
  315. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/quickstart.md +0 -0
  316. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/reference-pack.md +0 -0
  317. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/releasing.md +0 -0
  318. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/engine-platform/SPEC.md +0 -0
  319. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/engine-platform/TASKS.md +0 -0
  320. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/engine-prep/plan.md +0 -0
  321. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/evals/plan.md +0 -0
  322. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/ingestion-hooks/ing5-doc-audit.md +0 -0
  323. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/ingestion-hooks/ing8-breaking-changes.md +0 -0
  324. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/ingestion-hooks/plan.md +0 -0
  325. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/ingestion-hooks/rulewright-migration-0.2.0.md +0 -0
  326. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/rulewright-arcadedb-separation.md +0 -0
  327. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/rulewright-migration-0.10.0.md +0 -0
  328. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/rulewright-migration-0.11.0.md +0 -0
  329. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/rulewright-migration-0.3.0.md +0 -0
  330. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/rulewright-migration-0.4.0.md +0 -0
  331. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/rulewright-migration-0.5.0.md +0 -0
  332. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/rulewright-migration-0.6.0.md +0 -0
  333. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/rulewright-migration-0.7.0.md +0 -0
  334. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/rulewright-migration-0.8.0.md +0 -0
  335. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/rulewright-migration-0.9.0.md +0 -0
  336. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/specs/public-surface/rulewright-reply-2026-10-10-laya-and-sklearn.md +0 -0
  337. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/templates/product-starter/CLAUDE.md.template +0 -0
  338. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/templates/product-starter/README.md +0 -0
  339. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/templates/product-starter/dependabot.yml +0 -0
  340. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/templates/product-starter/playbook.md.template +0 -0
  341. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/upstream/laya-temperature-range-mismatch.md +0 -0
  342. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/vendor/arcadedb/arcadedb-buckets-schema.md +0 -0
  343. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/vendor/arcadedb/arcadedb-docs-extraction.json +0 -0
  344. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/vendor/arcadedb/arcadedb-vector-embeddings.md +0 -0
  345. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/vendor/arcadedb/arcadedb-vector-search-tutorial.md +0 -0
  346. {rag_wright-0.12.0 → rag_wright-0.13.0}/docs/workspaces.md +0 -0
  347. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/__init__.py +0 -0
  348. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/acord.py +0 -0
  349. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/acord_retrieval.py +0 -0
  350. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/boundary_residue_gold.py +0 -0
  351. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/build_golden.py +0 -0
  352. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/compliance_demo/policy/community_conduct_policy.md +0 -0
  353. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/compliance_demo/subjects/post_borderline.txt +0 -0
  354. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/compliance_demo/subjects/post_compliant.txt +0 -0
  355. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/compliance_demo/subjects/post_violation.txt +0 -0
  356. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/condensed_pipeline.py +0 -0
  357. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/contract_parity_live.py +0 -0
  358. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/contractnli_judge.py +0 -0
  359. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/cuad_highlight.py +0 -0
  360. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/embedded_eval.py +0 -0
  361. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/full_pipeline_rerank.py +0 -0
  362. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/function_ceiling.py +0 -0
  363. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/function_property_rerank.py +0 -0
  364. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/function_rerank.py +0 -0
  365. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/gate1_chunker_ab.py +0 -0
  366. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/gate2_hybrid_rerank.py +0 -0
  367. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/golden/relational/set.json +0 -0
  368. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/golden.py +0 -0
  369. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/ground_discriminator_rerank.py +0 -0
  370. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/harness.py +0 -0
  371. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/ingestion_live_smoke.py +0 -0
  372. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/kg_primary.py +0 -0
  373. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/kg_property_rerank.py +0 -0
  374. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/listwise_rerank.py +0 -0
  375. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/multihop.py +0 -0
  376. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/nl_to_type.py +0 -0
  377. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/relational_eval.py +0 -0
  378. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/residual_decision_gold.py +0 -0
  379. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/segmenter_eval.py +0 -0
  380. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/semantic_judge_gold.py +0 -0
  381. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/test_acord.py +0 -0
  382. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/test_acord_retrieval.py +0 -0
  383. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/test_harness.py +0 -0
  384. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/test_multihop_set.py +0 -0
  385. {rag_wright-0.12.0 → rag_wright-0.13.0}/eval/unit_grouper_eval.py +0 -0
  386. {rag_wright-0.12.0 → rag_wright-0.13.0}/examples/model_server.py +0 -0
  387. {rag_wright-0.12.0 → rag_wright-0.13.0}/examples/quickstart.py +0 -0
  388. {rag_wright-0.12.0 → rag_wright-0.13.0}/plan.md +0 -0
  389. {rag_wright-0.12.0 → rag_wright-0.13.0}/release-please-config.json +0 -0
  390. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ab_model_overlap.py +0 -0
  391. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/acord_unify.py +0 -0
  392. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/acquire_acord.py +0 -0
  393. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/acquire_cuad.py +0 -0
  394. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/acquire_ecfr.py +0 -0
  395. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/acquire_edgar.py +0 -0
  396. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/acquire_ftc_255.py +0 -0
  397. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/acquire_prod1_corpus.py +0 -0
  398. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/audit_reclass_flips.py +0 -0
  399. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/author_leg_a_silver_key.py +0 -0
  400. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/backfill_affiliations.py +0 -0
  401. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/backfill_clause_span_id.py +0 -0
  402. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/backfill_edge_source_doc_id.py +0 -0
  403. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/backup_kg_to_gcs.sh +0 -0
  404. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/bootstrap_template_capture.py +0 -0
  405. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/bootstrap_typed_edges.py +0 -0
  406. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/build_api_docs.py +0 -0
  407. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/build_api_docs.sh +0 -0
  408. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/build_cuad_clause_cache.py +0 -0
  409. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/build_function_routing_map.py +0 -0
  410. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/build_harness_doc.py +0 -0
  411. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_assemble_v2.py +0 -0
  412. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_assemble_v3.py +0 -0
  413. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_generate_hard_negatives.py +0 -0
  414. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_generate_hard_positives.py +0 -0
  415. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_generate_training.py +0 -0
  416. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_hybrid.py +0 -0
  417. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_hybrid2.py +0 -0
  418. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_jev_actor.py +0 -0
  419. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_jev_claimtypes.py +0 -0
  420. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_jev_operative.py +0 -0
  421. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_label_spans.py +0 -0
  422. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_laya_prep.py +0 -0
  423. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_laya_train.py +0 -0
  424. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_prep_operative.py +0 -0
  425. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_relabel_rubric.py +0 -0
  426. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_relabel_rubric2.py +0 -0
  427. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/cic1_train_operative.py +0 -0
  428. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/compare_extraction_models.py +0 -0
  429. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/compliance_actor_gate_smoke.py +0 -0
  430. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/compliance_engine_smoke.py +0 -0
  431. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/compliance_policy_demo.py +0 -0
  432. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/curate_taxonomy_gaps.py +0 -0
  433. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/dg_model_ab.py +0 -0
  434. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/diagnose_acord_knn_expansion.py +0 -0
  435. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/diagnose_acord_knn_rerank.py +0 -0
  436. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/diagnose_acord_leg_pool.py +0 -0
  437. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/diagnose_acord_legs.py +0 -0
  438. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/diagnose_acord_pool.py +0 -0
  439. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/diagnose_acord_relstructure.py +0 -0
  440. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/diagnose_acord_retrieval.py +0 -0
  441. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/distill/eval_all.py +0 -0
  442. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/distill/eval_ce.py +0 -0
  443. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/distill/eval_listwise_b.py +0 -0
  444. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/distill/export_ce_dataset.py +0 -0
  445. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/distill/extract_features.py +0 -0
  446. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/distill/listwise_variants.py +0 -0
  447. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/distill/relational_features.py +0 -0
  448. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/distill/train_ce.py +0 -0
  449. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/distill/train_modal.py +0 -0
  450. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/enrich_edgar_candidates.py +0 -0
  451. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/eval_chunking_ab.py +0 -0
  452. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/eval_classifier_guided_vs_tagparse.py +0 -0
  453. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/eval_compliance_gold.py +0 -0
  454. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/extract_arcadedb_docs.py +0 -0
  455. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/fetch_reference_models.py +0 -0
  456. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/generate_contract_python.py +0 -0
  457. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/git_post_commit_graphify.sh +0 -0
  458. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/granite_chunker_assess.py +0 -0
  459. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/graph_status.sh +0 -0
  460. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ingest_acord.py +0 -0
  461. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ingest_compliance_async_prod2.py +0 -0
  462. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ingest_compliance_document_prod2.py +0 -0
  463. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ingest_compliance_prod2.py +0 -0
  464. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ingest_cuad.py +0 -0
  465. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ingest_cuad_full.py +0 -0
  466. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ingest_ftc_compliance.py +0 -0
  467. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ingest_prod1.py +0 -0
  468. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ingest_prod1_async.py +0 -0
  469. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ingest_smoke.py +0 -0
  470. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/install_git_hooks.sh +0 -0
  471. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/label_new_functions.py +0 -0
  472. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/legb_function_gate_recall.py +0 -0
  473. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/make_compliance_fixtures.py +0 -0
  474. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/make_compliance_gold.py +0 -0
  475. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/mcp_compliance_agent_demo.py +0 -0
  476. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/mcp_intra_document_qa_smoke.py +0 -0
  477. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/mcp_query_legs_agent_demo.py +0 -0
  478. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/measure_generation_robustness.py +0 -0
  479. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/measure_harness_genericity.py +0 -0
  480. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/measure_silver.py +0 -0
  481. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/merge_docs_into_framework.py +0 -0
  482. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/migrate_entity_cik_to_canonical_id.py +0 -0
  483. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/migrate_silver_evidence_autotag.py +0 -0
  484. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/migrate_silver_evidence_remove_autotag.py +0 -0
  485. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/mine_scarce_functions.py +0 -0
  486. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_arcadedb.py +0 -0
  487. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_backfill.py +0 -0
  488. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_exception_linking.py +0 -0
  489. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_gemma4_vllm.py +0 -0
  490. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_gemma4_vllm_snapshot.py +0 -0
  491. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_granite_server.py +0 -0
  492. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_granite_throughput.py +0 -0
  493. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_granite_vllm_server.py +0 -0
  494. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_query_app.py +0 -0
  495. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_qwen3_27b_bench.py +0 -0
  496. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_qwen3_27b_snapshot.py +0 -0
  497. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_qwen3_vllm_server.py +0 -0
  498. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/modal_stack_a100.py +0 -0
  499. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ocr_benchmark.py +0 -0
  500. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ocr_preprocess.py +0 -0
  501. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/ontology_dimension_check.py +0 -0
  502. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/phase_a_leg_validate.py +0 -0
  503. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/populate_clause_kg.py +0 -0
  504. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/populate_entity_graph.py +0 -0
  505. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/populate_entity_graph_extracted.py +0 -0
  506. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/populate_property_store.py +0 -0
  507. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/prep_relational_verification.py +0 -0
  508. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/publish_manifests.py +0 -0
  509. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/reclassify_kg.py +0 -0
  510. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/refresh_framework_graph.sh +0 -0
  511. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/revert_reclass_flips.py +0 -0
  512. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/run_acord_retrieval.py +0 -0
  513. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/run_clause_exception_linking.py +0 -0
  514. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/semantic_judge_live_validate.py +0 -0
  515. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/semantic_judge_probe.py +0 -0
  516. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/snapshot_leg_a_eval.py +0 -0
  517. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/stack_correctness_validate.py +0 -0
  518. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/table_retrieval_smoke.py +0 -0
  519. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/train_function_classifier.py +0 -0
  520. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/train_legalbert_function.py +0 -0
  521. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/train_legalbert_modal.py +0 -0
  522. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/typed_rerank_validate.py +0 -0
  523. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/verify_wheel_install.sh +0 -0
  524. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/vllm_extraction_ab.py +0 -0
  525. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/vllm_kg_query_validate.py +0 -0
  526. {rag_wright-0.12.0 → rag_wright-0.13.0}/scripts/vllm_raw_diagnostic.py +0 -0
  527. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/authoring-a-capability/SKILL.md +0 -0
  528. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/building-a-product-backend/SKILL.md +0 -0
  529. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/building-a-product-frontend/SKILL.md +0 -0
  530. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/building-an-agent-harness/SKILL.md +0 -0
  531. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/classifier-opportunity-analysis/SKILL.md +0 -0
  532. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/creating-evals/SKILL.md +0 -0
  533. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/laya/SKILL.md +0 -0
  534. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/SKILL.md +0 -0
  535. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -0
  536. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/rw_gate.py +0 -0
  537. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/.agents/skills/setfit/SKILL.md +0 -0
  538. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/__init__.py +0 -0
  539. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/agents.py +0 -0
  540. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/answers.py +0 -0
  541. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/config.py +0 -0
  542. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/discover.py +0 -0
  543. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/documents.py +0 -0
  544. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/ids.py +0 -0
  545. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/invoke.py +0 -0
  546. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/mcp.py +0 -0
  547. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/tracing.py +0 -0
  548. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/api/usage.py +0 -0
  549. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/__init__.py +0 -0
  550. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/answer_generator.py +0 -0
  551. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/ard.py +0 -0
  552. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/chunk_read.py +0 -0
  553. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/chunk_write.py +0 -0
  554. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/disambiguation.py +0 -0
  555. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/document_parse.py +0 -0
  556. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/document_scope.py +0 -0
  557. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/embedding.py +0 -0
  558. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/embedding_profiles.py +0 -0
  559. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/entity_resolution.py +0 -0
  560. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/fusion.py +0 -0
  561. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/graph_query.py +0 -0
  562. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/graph_storage.py +0 -0
  563. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/hybrid_search.py +0 -0
  564. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/invoke.py +0 -0
  565. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/jev_decision.py +0 -0
  566. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/manifests.py +0 -0
  567. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/registry.py +0 -0
  568. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/remote_encoders.py +0 -0
  569. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/reranking.py +0 -0
  570. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/retrieval_core.py +0 -0
  571. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/rlm_chunking.py +0 -0
  572. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/rlm_synthesis.py +0 -0
  573. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/sheet_tables.py +0 -0
  574. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/span_relevance_judgment.py +0 -0
  575. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/vision_to_text.py +0 -0
  576. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/capabilities/vlm_ocr.py +0 -0
  577. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/contracts/__init__.py +0 -0
  578. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/contracts/chunk.py +0 -0
  579. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/contracts/evals.py +0 -0
  580. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/contracts/extraction.py +0 -0
  581. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/contracts/graph.py +0 -0
  582. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/contracts/identifiers.py +0 -0
  583. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/contracts/ingestion.py +0 -0
  584. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/contracts/provenance.py +0 -0
  585. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/contracts/span.py +0 -0
  586. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/corpus/__init__.py +0 -0
  587. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/corpus/canonicalize.py +0 -0
  588. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/corpus/document_parser.py +0 -0
  589. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/corpus/embedded.py +0 -0
  590. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/corpus/http.py +0 -0
  591. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/evals/__init__.py +0 -0
  592. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/evals/gold.py +0 -0
  593. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/evals/langfuse_backend.py +0 -0
  594. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/evals/runner.py +0 -0
  595. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/evals/scorers.py +0 -0
  596. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/__init__.py +0 -0
  597. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/accounting.py +0 -0
  598. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/agent.py +0 -0
  599. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/batch.py +0 -0
  600. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/clarify.py +0 -0
  601. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/confirm.py +0 -0
  602. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/decisions.py +0 -0
  603. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/definition.py +0 -0
  604. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/dispatch.py +0 -0
  605. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/errors.py +0 -0
  606. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/events.py +0 -0
  607. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/filesystem.py +0 -0
  608. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/grading.py +0 -0
  609. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/interpreter.py +0 -0
  610. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/memory.py +0 -0
  611. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/models.py +0 -0
  612. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/rules.py +0 -0
  613. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/runs.py +0 -0
  614. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/scope.py +0 -0
  615. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/seen.py +0 -0
  616. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/skills.py +0 -0
  617. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/thinking.py +0 -0
  618. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/tiers.py +0 -0
  619. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/tracing.py +0 -0
  620. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/withhold.py +0 -0
  621. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/harness/workers.py +0 -0
  622. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/ingestion/__init__.py +0 -0
  623. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/ingestion/builder.py +0 -0
  624. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/ingestion/evaluate.py +0 -0
  625. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/ingestion/group.py +0 -0
  626. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/ingestion/layout.py +0 -0
  627. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/ingestion/segment.py +0 -0
  628. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/ingestion/tables.py +0 -0
  629. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/models/__init__.py +0 -0
  630. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/models/model_servers.py +0 -0
  631. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/models/profiles.py +0 -0
  632. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/models/seam.py +0 -0
  633. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/models/tag_structured.py +0 -0
  634. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/models/tracing.py +0 -0
  635. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/models/usage.py +0 -0
  636. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/models/weights.py +0 -0
  637. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/ontology/__init__.py +0 -0
  638. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/ontology/pack_schema.py +0 -0
  639. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/ontology/registry.py +0 -0
  640. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/pack_sdk/__init__.py +0 -0
  641. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/__init__.py +0 -0
  642. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/__init__.py +0 -0
  643. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/capabilities/__init__.py +0 -0
  644. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/capabilities/assertion_extraction.py +0 -0
  645. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/capabilities/claim_extraction.py +0 -0
  646. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/capabilities/compliance_judgment.py +0 -0
  647. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/capabilities/compliance_store.py +0 -0
  648. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/capabilities/requirement_extraction.py +0 -0
  649. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/invokers.py +0 -0
  650. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/mcp/__init__.py +0 -0
  651. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/mcp/compliance_server.py +0 -0
  652. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/ontology/__init__.py +0 -0
  653. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/ontology/compliance_bridge.ttl +0 -0
  654. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/ontology/loader.py +0 -0
  655. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/ontology/packs/ftc_16cfr255.ttl +0 -0
  656. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/pack.py +0 -0
  657. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/schemas/__init__.py +0 -0
  658. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/schemas/compliance.py +0 -0
  659. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/skills/__init__.py +0 -0
  660. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/skills/claim_extraction/SKILL.md +0 -0
  661. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/skills/claim_extraction/__init__.py +0 -0
  662. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/skills/claim_extraction/template.py +0 -0
  663. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/skills/compliance_judgment/SKILL.md +0 -0
  664. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/skills/generic_compliance_judgment/SKILL.md +0 -0
  665. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/SKILL.md +0 -0
  666. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/__init__.py +0 -0
  667. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/template.py +0 -0
  668. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/subgraphs/__init__.py +0 -0
  669. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/subgraphs/compliance_check.py +0 -0
  670. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/subgraphs/compliance_ingestion.py +0 -0
  671. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/compliance/subgraphs/requirement_extraction.py +0 -0
  672. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/__init__.py +0 -0
  673. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/capabilities/__init__.py +0 -0
  674. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/capabilities/clause_exception_linking.py +0 -0
  675. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_serve.py +0 -0
  676. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_store.py +0 -0
  677. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/capabilities/dg_extraction.py +0 -0
  678. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/capabilities/graph_extraction.py +0 -0
  679. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/capabilities/highlight_serve.py +0 -0
  680. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/capabilities/property_boosted_retrieval.py +0 -0
  681. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/capabilities/query_function_classifier.py +0 -0
  682. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/capabilities/query_understanding.py +0 -0
  683. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/corpus/__init__.py +0 -0
  684. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/corpus/cuad.py +0 -0
  685. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/corpus/cuad_ingestion.py +0 -0
  686. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/corpus/edgar.py +0 -0
  687. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/corpus/gcs_ingestion.py +0 -0
  688. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/corpus/selection.py +0 -0
  689. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/mcp/__init__.py +0 -0
  690. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/mcp/intra_document_qa_server.py +0 -0
  691. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/mcp/relational_qa_server.py +0 -0
  692. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/mcp/session_store.py +0 -0
  693. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/mcp/typed_property_retrieval_server.py +0 -0
  694. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/ontology/__init__.py +0 -0
  695. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/ontology/_generated_template_meta.py +0 -0
  696. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/ontology/_generated_vocab.py +0 -0
  697. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/ontology/clause_template.py +0 -0
  698. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/ontology/codegen.py +0 -0
  699. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/ontology/contract_bridge.ttl +0 -0
  700. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/ontology/contract_taxonomy.py +0 -0
  701. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/ontology/derive.py +0 -0
  702. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/ontology/loader.py +0 -0
  703. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/ontology/template_introspect.py +0 -0
  704. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/options.py +0 -0
  705. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/pack.py +0 -0
  706. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/schemas/__init__.py +0 -0
  707. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/schemas/contract_meta.py +0 -0
  708. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/schemas/function.py +0 -0
  709. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/schemas/function_routing.py +0 -0
  710. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/schemas/highlight.py +0 -0
  711. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/schemas/jurisdiction.py +0 -0
  712. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/schemas/ontology.py +0 -0
  713. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/schemas/property.py +0 -0
  714. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/schemas/query_intent.py +0 -0
  715. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/schemas/value_match.py +0 -0
  716. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/skills/__init__.py +0 -0
  717. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/skills/corpus_ingest/SKILL.md +0 -0
  718. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/SKILL.md +0 -0
  719. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/__init__.py +0 -0
  720. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/skills/guidance/__init__.py +0 -0
  721. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/skills/guidance/chunking.md +0 -0
  722. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/skills/guidance/generation.md +0 -0
  723. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/skills/guidance/relevance.md +0 -0
  724. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/__init__.py +0 -0
  725. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/boundary.py +0 -0
  726. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/clause_function_classifier.py +0 -0
  727. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/clause_kg_extractor.py +0 -0
  728. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/cuad_labels.py +0 -0
  729. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/dim_classifier.py +0 -0
  730. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/dim_fleet.json +0 -0
  731. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/function_classifier.py +0 -0
  732. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/function_families.py +0 -0
  733. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/hybrid_classifier.py +0 -0
  734. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/legalbert_classifier.py +0 -0
  735. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/model_capabilities.py +0 -0
  736. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/new_function_labels.py +0 -0
  737. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/property_extractor.py +0 -0
  738. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/property_grounding.py +0 -0
  739. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/reclassify.py +0 -0
  740. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/residual_candidates.py +0 -0
  741. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/scarce_function_labels.py +0 -0
  742. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/segment.py +0 -0
  743. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/semantic_judge.py +0 -0
  744. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/symbolic_validation.py +0 -0
  745. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/spans/tag_clause_extractor.py +0 -0
  746. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/subgraphs/__init__.py +0 -0
  747. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/subgraphs/async_ingestion.py +0 -0
  748. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/subgraphs/contract_ingestion_pipeline.py +0 -0
  749. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/subgraphs/intra_document_qa.py +0 -0
  750. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/subgraphs/query_constraint_extraction.py +0 -0
  751. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/subgraphs/relational_qa.py +0 -0
  752. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/subgraphs/typed_clause_extraction.py +0 -0
  753. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/contracts/subgraphs/typed_property_retrieval.py +0 -0
  754. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/packs/reference_seam.py +0 -0
  755. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/py.typed +0 -0
  756. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/skills/__init__.py +0 -0
  757. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/skills/generation/SKILL.md +0 -0
  758. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/skills/generation/__init__.py +0 -0
  759. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/skills/rlm/SKILL.md +0 -0
  760. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/skills/rlm/__init__.py +0 -0
  761. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/skills/rlm/agent.py +0 -0
  762. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/skills/span_relevance_judgment/SKILL.md +0 -0
  763. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/skills/vision_to_text/SKILL.md +0 -0
  764. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/skills/vision_to_text/__init__.py +0 -0
  765. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/spans/__init__.py +0 -0
  766. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/spans/page_map.py +0 -0
  767. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/store/__init__.py +0 -0
  768. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/store/chunk_text.py +0 -0
  769. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/subgraphs/__init__.py +0 -0
  770. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/subgraphs/graph_extraction.py +0 -0
  771. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/subgraphs/observability.py +0 -0
  772. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/subgraphs/scaffold.py +0 -0
  773. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/subgraphs/semantic_chunking.py +0 -0
  774. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/util/__init__.py +0 -0
  775. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/util/concurrent.py +0 -0
  776. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/util/pdfium.py +0 -0
  777. {rag_wright-0.12.0 → rag_wright-0.13.0}/src/rag_wright/util/spacy_model.py +0 -0
  778. {rag_wright-0.12.0 → rag_wright-0.13.0}/tasks.md +0 -0
  779. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/__init__.py +0 -0
  780. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/__init__.py +0 -0
  781. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_agent_chat_model.py +0 -0
  782. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_agent_chat_model_live.py +0 -0
  783. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_answers_exports.py +0 -0
  784. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_api_embedder_ps39.py +0 -0
  785. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_bytes_ingest.py +0 -0
  786. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_capability_reexports.py +0 -0
  787. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_decision_swap_doc_example.py +0 -0
  788. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_discover.py +0 -0
  789. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_documents.py +0 -0
  790. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_drop_workspace.py +0 -0
  791. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_drop_workspace_live.py +0 -0
  792. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_e2e.py +0 -0
  793. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_invoke.py +0 -0
  794. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_kg.py +0 -0
  795. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_mcp.py +0 -0
  796. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_metering_tracing_exports.py +0 -0
  797. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_model_role_export.py +0 -0
  798. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_open_workspace_reconfig.py +0 -0
  799. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_options.py +0 -0
  800. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_pack_sdk.py +0 -0
  801. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_pack_store.py +0 -0
  802. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_pdf_page_count.py +0 -0
  803. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_public_gaps_ps38.py +0 -0
  804. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_tracing_helpers_ps32.py +0 -0
  805. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_usage.py +0 -0
  806. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_workspace.py +0 -0
  807. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/api/test_workspace_models.py +0 -0
  808. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/arch/domain_vocabulary_baseline.json +0 -0
  809. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/arch/test_api_docs_current.py +0 -0
  810. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/arch/test_doc_references.py +0 -0
  811. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/arch/test_engine_domain_vocabulary.py +0 -0
  812. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/arch/test_import_contracts.py +0 -0
  813. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/arch/test_lock_version.py +0 -0
  814. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/arch/test_packs_use_store_primitives.py +0 -0
  815. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/arch/test_pdfium_door.py +0 -0
  816. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/arch/test_shipped_skills.py +0 -0
  817. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/async_helpers.py +0 -0
  818. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/__init__.py +0 -0
  819. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/_fixtures/rlm_probe_skill/SKILL.md +0 -0
  820. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_answer_generator.py +0 -0
  821. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_answer_generator_async.py +0 -0
  822. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_assertion_extraction.py +0 -0
  823. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_authoring_contract.py +0 -0
  824. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_chunk_read.py +0 -0
  825. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_chunk_write.py +0 -0
  826. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_chunking_prompts_neutral.py +0 -0
  827. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_claim_extraction.py +0 -0
  828. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_clause_exception_linking.py +0 -0
  829. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_compliance_judgment.py +0 -0
  830. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_compliance_store.py +0 -0
  831. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_contract_kg_serve.py +0 -0
  832. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_contract_kg_store.py +0 -0
  833. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_contract_kg_store_reads.py +0 -0
  834. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_contract_taxonomy_and_spans.py +0 -0
  835. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_dg_adapter.py +0 -0
  836. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_dg_async.py +0 -0
  837. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_dg_extraction.py +0 -0
  838. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_dg_model_seam.py +0 -0
  839. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_dg_private.py +0 -0
  840. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_disambiguation.py +0 -0
  841. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_document_scope.py +0 -0
  842. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_embedding.py +0 -0
  843. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_embedding_profiles.py +0 -0
  844. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_entity_resolution.py +0 -0
  845. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_entity_rules_plumbing.py +0 -0
  846. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_fusion.py +0 -0
  847. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_graph_extraction.py +0 -0
  848. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_graph_query.py +0 -0
  849. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_graph_storage.py +0 -0
  850. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_highlight_serve.py +0 -0
  851. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_hybrid_search.py +0 -0
  852. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_jev_decision.py +0 -0
  853. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_manifest_validation.py +0 -0
  854. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_manifests.py +0 -0
  855. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_parsing.py +0 -0
  856. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_parties_extraction.py +0 -0
  857. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_property_boosted_retrieval.py +0 -0
  858. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_query_function_classifier.py +0 -0
  859. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_query_understanding.py +0 -0
  860. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_registry.py +0 -0
  861. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_remote_encoders.py +0 -0
  862. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_repair_partition.py +0 -0
  863. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_requirement_extraction.py +0 -0
  864. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_reranking.py +0 -0
  865. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_retrieval_core.py +0 -0
  866. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_rlm_chunking.py +0 -0
  867. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_rlm_chunking_async.py +0 -0
  868. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_rlm_method.py +0 -0
  869. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_rlm_synthesis.py +0 -0
  870. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_runtime_registry.py +0 -0
  871. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_span_relevance_judgment.py +0 -0
  872. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_structural_boundary_discoverer.py +0 -0
  873. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_structural_model_fallback.py +0 -0
  874. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_tag_boundary_discoverer.py +0 -0
  875. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/capabilities/test_vlm_ocr.py +0 -0
  876. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/compliance_fakes.py +0 -0
  877. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/conftest.py +0 -0
  878. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/__init__.py +0 -0
  879. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_canonical_source_doc_id.py +0 -0
  880. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_chunk_record.py +0 -0
  881. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_compliance.py +0 -0
  882. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_cuad_highlight_contracts.py +0 -0
  883. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_extraction.py +0 -0
  884. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_function.py +0 -0
  885. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_function_routing.py +0 -0
  886. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_identifiers.py +0 -0
  887. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_ingestion_hooks.py +0 -0
  888. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_jurisdiction.py +0 -0
  889. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_ontology.py +0 -0
  890. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_property.py +0 -0
  891. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_provenance.py +0 -0
  892. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/contracts/test_value_match.py +0 -0
  893. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/corpus/__init__.py +0 -0
  894. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/corpus/_ooxml_fixtures.py +0 -0
  895. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/corpus/test_canonicalize.py +0 -0
  896. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/corpus/test_cuad.py +0 -0
  897. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/corpus/test_cuad_ingestion.py +0 -0
  898. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/corpus/test_document_parser.py +0 -0
  899. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/corpus/test_edgar.py +0 -0
  900. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/corpus/test_embedded.py +0 -0
  901. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/corpus/test_gcs_ingestion.py +0 -0
  902. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/corpus/test_http.py +0 -0
  903. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/corpus/test_parse_wire2.py +0 -0
  904. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/corpus/test_selection.py +0 -0
  905. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/eval/test_contractnli_judge.py +0 -0
  906. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/eval/test_cuad_highlight_metrics.py +0 -0
  907. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/eval/test_kg_property_rerank.py +0 -0
  908. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/eval/test_nl_to_type_metrics.py +0 -0
  909. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/eval/test_relational_eval.py +0 -0
  910. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/evals/__init__.py +0 -0
  911. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/evals/test_gold_contracts.py +0 -0
  912. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/evals/test_gold_import.py +0 -0
  913. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/evals/test_langfuse_backend.py +0 -0
  914. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/evals/test_runner.py +0 -0
  915. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/evals/test_scorer_parity.py +0 -0
  916. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/evals/test_scorers_a.py +0 -0
  917. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/evals/test_scorers_b.py +0 -0
  918. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/evals/test_scorers_c.py +0 -0
  919. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/evals/test_scorers_d.py +0 -0
  920. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/fixtures/ingestion/segmenter_gold.json +0 -0
  921. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/fixtures/ingestion/textile_spec_sheet.md +0 -0
  922. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/fixtures/ingestion/textile_test_report.md +0 -0
  923. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/fixtures/leg_a_silver/README.md +0 -0
  924. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/fixtures/leg_a_silver/evidence_snapshot.json +0 -0
  925. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/fixtures/table-bearing-contract.pdf +0 -0
  926. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/foundation/__init__.py +0 -0
  927. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/foundation/test_arcadedb_hybrid.py +0 -0
  928. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/foundation/test_model_seam_structured.py +0 -0
  929. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/harness/__init__.py +0 -0
  930. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/harness/test_greenfield_conformance.py +0 -0
  931. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/harness/test_harness_accounting.py +0 -0
  932. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/harness/test_harness_engine_wiring.py +0 -0
  933. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/harness/test_harness_genericity.py +0 -0
  934. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/harness/test_harness_live.py +0 -0
  935. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/harness/test_harness_recorder.py +0 -0
  936. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/harness/test_harness_thinking.py +0 -0
  937. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/__init__.py +0 -0
  938. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_aevaluate.py +0 -0
  939. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_builder.py +0 -0
  940. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_chunk_discoverer_hook.py +0 -0
  941. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_concurrency_ceiling.py +0 -0
  942. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_document_metadata.py +0 -0
  943. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_evaluate.py +0 -0
  944. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_evaluate_labels.py +0 -0
  945. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_layout_segmenter.py +0 -0
  946. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_sheet_continuations.py +0 -0
  947. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_spreadsheet_content.py +0 -0
  948. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_table_rows.py +0 -0
  949. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_tuning.py +0 -0
  950. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_unit_grouper.py +0 -0
  951. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ingestion/test_unit_representative.py +0 -0
  952. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/journey/incidents_domain.py +0 -0
  953. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/journey/incidents_pack.ttl +0 -0
  954. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/journey/test_incidents_journey.py +0 -0
  955. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/journey/test_pack_schema.py +0 -0
  956. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/mcp/__init__.py +0 -0
  957. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/mcp/test_compliance_server.py +0 -0
  958. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/mcp/test_intra_document_qa_server.py +0 -0
  959. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/mcp/test_no_model_supplied_tenant.py +0 -0
  960. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/mcp/test_relational_qa_server.py +0 -0
  961. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/mcp/test_typed_property_retrieval_server.py +0 -0
  962. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/__init__.py +0 -0
  963. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_async_infra.py +0 -0
  964. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_classifier_heads_load_clean.py +0 -0
  965. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_model_servers.py +0 -0
  966. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_models_dir.py +0 -0
  967. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_no_gemma_default.py +0 -0
  968. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_profile_routing.py +0 -0
  969. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_profile_seam.py +0 -0
  970. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_seam_async.py +0 -0
  971. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_seam_deadline_and_cap.py +0 -0
  972. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_seam_event_loops.py +0 -0
  973. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_seam_retry.py +0 -0
  974. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_seam_stream.py +0 -0
  975. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_serving_seam.py +0 -0
  976. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_serving_wiring.py +0 -0
  977. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_tag_structured.py +0 -0
  978. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_tag_structured_async.py +0 -0
  979. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_tracing.py +0 -0
  980. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/models/test_usage.py +0 -0
  981. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ontology/__init__.py +0 -0
  982. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ontology/test_clause_template.py +0 -0
  983. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ontology/test_compliance_ontology_authoritative.py +0 -0
  984. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ontology/test_derivation.py +0 -0
  985. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ontology/test_entity_taxonomy.py +0 -0
  986. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ontology/test_generated_template_meta_in_sync.py +0 -0
  987. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ontology/test_generated_vocab_in_sync.py +0 -0
  988. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ontology/test_template_captured_in_ttl.py +0 -0
  989. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/ontology/test_ttl_is_source_of_truth.py +0 -0
  990. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/reference/test_compliance_reference.py +0 -0
  991. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/reference/test_contract_seam.py +0 -0
  992. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/scripts/test_eval_chunking_ab.py +0 -0
  993. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/scripts/test_eval_classifier_ab.py +0 -0
  994. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/scripts/test_fetch_reference_models.py +0 -0
  995. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/scripts/test_generation_robustness_errors.py +0 -0
  996. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/skills/__init__.py +0 -0
  997. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/skills/test_creating_evals_skill_example.py +0 -0
  998. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/skills/test_ingestion_skill_example.py +0 -0
  999. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_boundary.py +0 -0
  1000. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_classifier_property_extractor.py +0 -0
  1001. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_clause_classifier_tags_0005.py +0 -0
  1002. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_clause_function_classifier.py +0 -0
  1003. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_clause_function_classifier_async.py +0 -0
  1004. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_clause_kg_extractor.py +0 -0
  1005. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_clause_kg_extractor_async.py +0 -0
  1006. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_dim_classifier.py +0 -0
  1007. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_dim_fleet_live.py +0 -0
  1008. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_function_classifier.py +0 -0
  1009. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_hybrid_classifier.py +0 -0
  1010. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_hybrid_property_extractor.py +0 -0
  1011. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_legalbert_classifier.py +0 -0
  1012. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_model_capabilities.py +0 -0
  1013. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_new_function_labels.py +0 -0
  1014. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_page_map.py +0 -0
  1015. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_property_extractor.py +0 -0
  1016. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_property_grounding.py +0 -0
  1017. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_reclassify.py +0 -0
  1018. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_residual_decision.py +0 -0
  1019. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_scarce_function_labels.py +0 -0
  1020. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_segment.py +0 -0
  1021. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_segmentation_vocab.py +0 -0
  1022. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_semantic_judge.py +0 -0
  1023. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_setfit_clause_adapter.py +0 -0
  1024. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_setfit_probabilities.py +0 -0
  1025. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_span_offsets.py +0 -0
  1026. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_stage_labels_0005.py +0 -0
  1027. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_symbolic_validation.py +0 -0
  1028. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/spans/test_tag_clause_extractor.py +0 -0
  1029. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/__init__.py +0 -0
  1030. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_affiliation_backfill.py +0 -0
  1031. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_arcadedb_clause_kg.py +0 -0
  1032. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_arcadedb_contract.py +0 -0
  1033. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_arcadedb_property.py +0 -0
  1034. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_arcadedb_requirement_sources.py +0 -0
  1035. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_arcadedb_schema.py +0 -0
  1036. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_chunk_text.py +0 -0
  1037. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_concurrent_writes.py +0 -0
  1038. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_contract_kg_store_live.py +0 -0
  1039. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_document_metadata_live.py +0 -0
  1040. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_document_scope.py +0 -0
  1041. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_engine_domain_neutral.py +0 -0
  1042. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_entities_by_name.py +0 -0
  1043. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_kg_edges.py +0 -0
  1044. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_kg_mutations.py +0 -0
  1045. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_kg_read.py +0 -0
  1046. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_kg_write.py +0 -0
  1047. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_neutral_schema.py +0 -0
  1048. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_store_create_flag.py +0 -0
  1049. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/store/test_write_graph_idempotent.py +0 -0
  1050. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/__init__.py +0 -0
  1051. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_async_ingestion.py +0 -0
  1052. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_chunk7_structure_carry.py +0 -0
  1053. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_clause_results.py +0 -0
  1054. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_compliance_check.py +0 -0
  1055. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_compliance_ingestion.py +0 -0
  1056. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_contract_ingestion_pipeline.py +0 -0
  1057. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_contract_ingestion_pipeline_async.py +0 -0
  1058. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_contract_ingestion_pipeline_graph_async.py +0 -0
  1059. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_graph_extraction.py +0 -0
  1060. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_ingest_knobs.py +0 -0
  1061. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_ingest_segment_classify.py +0 -0
  1062. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_intra_document_qa.py +0 -0
  1063. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_observability.py +0 -0
  1064. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_partial_entry_contract.py +0 -0
  1065. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_query_constraint_extraction.py +0 -0
  1066. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_relational_qa.py +0 -0
  1067. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_requirement_extraction.py +0 -0
  1068. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_scaffold.py +0 -0
  1069. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_semantic_chunking.py +0 -0
  1070. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_typed_clause_extraction.py +0 -0
  1071. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/subgraphs/test_typed_property_retrieval.py +0 -0
  1072. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/test_backfill_clause_span_id.py +0 -0
  1073. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/test_dg_model_ab.py +0 -0
  1074. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/test_populate_clause_kg.py +0 -0
  1075. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/test_populate_entity_graph.py +0 -0
  1076. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/util/__init__.py +0 -0
  1077. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/util/test_concurrent.py +0 -0
  1078. {rag_wright-0.12.0 → rag_wright-0.13.0}/tests/util/test_spacy_model.py +0 -0
@@ -154,6 +154,10 @@ category.
154
154
 
155
155
  ## 5. Spreadsheets, tables and embedded files
156
156
 
157
+ - **Blank PDF pages** are read as empty, never sent to the vision model (engine 0.13.0). On a parse cache built
158
+ by an earlier engine with `VISION_OCR` configured, run `find_blank_pages_with_text(cache_dir, sources)` once:
159
+ delete each finding's `cache_files` and re-ingest that document (its blank pages may hold invented text).
160
+
157
161
  - **Hidden sheets** are ingested by default; `IngestSource(include_hidden_sheets=False)` skips them (listed in
158
162
  `DocumentReport.skipped_hidden_sheets`).
159
163
  - **Blank rows inside a table**: the parse cuts a sheet's table at every blank row; the engine glues a piece back
@@ -58,7 +58,7 @@ Every product item lands in one or more of these. The route column is where the
58
58
  | **Domain knowledge**: vocabulary, schema, constraints, synonyms, decision criteria | "controlled vocabularies", "the ontology", "mandatory fields", "valid ranges" | `EngineConfig(pack=...)` (the store creates the declared types on `open_workspace`); your capabilities read value sets and SHACL shapes with `rdflib` / `pyshacl` | `authoring-a-capability` | ontology authoring |
59
59
  | **Ingestion**: documents, spreadsheets, images, embedded files into the graph | "parse the forms", "load the lab reports", "idempotent re-runs" | `build_ingestion` (your extractor + optional hooks) → `aingest`; `IngestSource`, `IngestionTuning`, `table_rows` / `TableRow`, `evaluate_ingestion`, `check_extraction`; `KgNode` / `KgEdge` | `building-an-ingestion-capability` | KG construction |
60
60
  | **Entity and registry resolution** | "resolve against the yarn register", "queue unresolved mentions" | your `document_hook`; the entity-resolution building blocks on `rag_wright.pack_sdk` | `building-an-ingestion-capability` | entity resolution |
61
- | **A typed query or retrieval** | "find similar cases", "filter the table", "the dossier" | a query capability of your pack composing the primitives (`kg_read`, `kg_edges`, `NOT_NULL`, hybrid search from `rag_wright.pack_sdk`), registered with `CapabilityManifest` + `register_capability` / `load_pack`, invoked with `ainvoke_subgraph` | `authoring-a-capability` | authoring capabilities |
61
+ | **A typed query or retrieval** | "find similar cases", "filter the table", "the dossier" | a query capability of your pack composing the primitives (`kg_read`, `kg_edges`, `NOT_NULL`, `Range`, hybrid span search with `span_search` from `rag_wright.api`), registered with `CapabilityManifest` + `register_capability` / `load_pack`, invoked with `ainvoke_subgraph` | `authoring-a-capability` | authoring capabilities |
62
62
  | **A cited answer, or a refusal** | "every answer cites its source", "say when it is not in the records" | `agenerate_answer` over `EvidenceItem`s (an answer states its support; "none" abstains), `ajudge_spans` | `authoring-a-capability` | concepts (answers) |
63
63
  | **A typed decision or classification** | "classify the structure", "which of these is it" | `classifier-opportunity-analysis` first; then rules, a trained classifier, or the decision model (`jev_decision` from `engine_capabilities()`, criteria in the pack) | `classifier-opportunity-analysis` → `setfit` / `laya` | classification and decision models |
64
64
  | **A deterministic workflow behind a button** (mode **D**) | "upload, confirm, save", "export CSV" | a product **operation** (one function per user operation) calling your capabilities; the route calls the operation | `building-a-product-backend` | domain-adaptation step 8 |
@@ -27,8 +27,11 @@ open-core and domain-neutral; your product brings the domain. Hard rules:
27
27
  `EngineConfig`/`StoreConfig` (`StoreConfig.from_env()` reads `ARCADEDB_*`)/`open_workspace`
28
28
  (`temporary_workspace`/`drop_workspace` for disposable and removed databases), the invokers
29
29
  (`ainvoke_subgraph`/`invoke_model`/`ainvoke_model`), discovery (`capability_index`/`discover`), the KG accessors
30
- (`kg_read` with `key_range`, `kg_write`, `kg_edges` with `NOT_NULL`, `kg_count`/`kg_delete`/`kg_update`,
31
- `entities_by_name`, `span_positions`), `pack_store(ws, cls)` (build your pack's store extension over the
30
+ (`kg_read`, `kg_write`, `kg_edges`, `kg_count`/`kg_delete`/`kg_update`, all filtering by `where` values that
31
+ are equality, a list for membership, `NOT_NULL` or a `Range(gt=, ge=, lt=, le=)` on any number of fields,
32
+ evaluated in the store;
33
+ `entities_by_name`, `span_positions`), hybrid span search (`span_search` / `aspan_search`: cited spans from
34
+ the dense and sparse index, fused in the store), `pack_store(ws, cls)` (build your pack's store extension over the
32
35
  workspace's store; the store itself stays private), metering and tracing (`measure_usage`, `record_usage`,
33
36
  `traced_run`/`traced_step`, and for code emitting its own generations `tracing_on`/`trace_level`/
34
37
  `start_generation`/`finish_generation`/`flush_tracing`), the query embedder (`ws.embedder` where you hold a
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.13.0"
3
+ }
@@ -4,6 +4,21 @@ All notable changes to RAG_Wright are documented here. The format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project aims to follow
5
5
  [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [0.13.0](https://github.com/fzaidi-dai/RAG_Wright/compare/0.12.0...0.13.0) (2026-10-15)
8
+
9
+
10
+ ### Features
11
+
12
+ * **PS-35:** migrate a pre-0.2.0 database's Span fields through rag_wright.api ([856f956](https://github.com/fzaidi-dai/RAG_Wright/commit/856f956f674c731d170878d44ec3fef980a10ba9))
13
+ * **PS-44:** range filters on any number of KG fields, evaluated in the store (TexWright ER-1) ([cc62c49](https://github.com/fzaidi-dai/RAG_Wright/commit/cc62c49000161567869d46127bb158db16106c28))
14
+ * **PS-45:** a public hybrid span search on rag_wright.api (engine gap G24) ([4aa802f](https://github.com/fzaidi-dai/RAG_Wright/commit/4aa802fdc6cf12a3c732aa7a41e4de6240dd05da))
15
+ * **PS-47:** find cached parses holding text a VLM invented for a blank page ([ff92d81](https://github.com/fzaidi-dai/RAG_Wright/commit/ff92d81956590002418ef50f41dee54e0b0b6ef8))
16
+
17
+
18
+ ### Bug Fixes
19
+
20
+ * **PS-46:** a page with no ink is blank, never escalated to the VLM (TexWright 2026-10-15) ([fc633a8](https://github.com/fzaidi-dai/RAG_Wright/commit/fc633a84aa52a89de5b79d90b50d80f7d622d792))
21
+
7
22
  ## [0.12.0](https://github.com/fzaidi-dai/RAG_Wright/compare/0.11.0...0.12.0) (2026-10-15)
8
23
 
9
24
 
@@ -57,7 +57,7 @@ The failure mode to avoid, which has happened before: a command fails with "modu
57
57
 
58
58
  > **CURRENT STATE (2026-10-15): `rag-wright` 0.11.0 is RELEASED** (PR #13: PS-40 the product-building skills ship,
59
59
  > PS-41 the skills audit, PS-42 by-slug registration; RuleWright's guide `docs/specs/public-surface/rulewright-migration-0.11.0.md`).
60
- > **PS-43 done, unreleased (next: 0.12.0)**: `worker_spec(definition=)`, `docs/harness.md` (tables generated by
60
+ > **PS-43 RELEASED as 0.12.0 (2026-10-15, PR #14)**: `worker_spec(definition=)`, `docs/harness.md` (tables generated by
61
61
  > `scripts/build_harness_doc.py`), the harness source cleared of RuleWright's vocabulary with a guard; guide
62
62
  > `rulewright-migration-0.12.0.md`. Before it,
63
63
  > **(2026-10-14): PS-32 done: the agent harness is the engine's third public tier `rag_wright.harness`**
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: rag-wright
3
- Version: 0.12.0
3
+ Version: 0.13.0
4
4
  Summary: A domain-retargetable, open-core engine for hybrid retrieval + knowledge-graph RAG: parsing, chunking, embedding, hybrid search, reranking, graph extraction, entity resolution, ontology-driven knowledge, and a capability runtime.
5
5
  Project-URL: Homepage, https://github.com/fzaidi-dai/RAG_Wright
6
6
  Project-URL: Repository, https://github.com/fzaidi-dai/RAG_Wright
@@ -60,7 +60,7 @@ typed edges, and `ComplianceStore` creates `Requirement`, so they appear the fir
60
60
 
61
61
  A database created before the `Span` field rename (`contract_id`, `function`, `functions` became `document_id`,
62
62
  `primary_tag`, `tags`) is refused by `ensure_schema` with a `RuntimeError`; migrate it once with
63
- `uv run python -u scripts/migrate_span_fields.py <database>`.
63
+ `migrate_span_fields(config, corpus=...)` from `rag_wright.api` ([installation](installation.md)).
64
64
 
65
65
  ## Stop / reset
66
66
 
@@ -84,3 +84,14 @@ now, a self-hosted vLLM-Gemma-4 later for data sovereignty (only `base_url` chan
84
84
  as the escalation provider for data sovereignty; (3) routing the vision call **through the async model seam**
85
85
  for true thread cancellation (today `to_thread` unblocks the caller at the deadline but the docling thread
86
86
  runs on); (4) classical preprocessing stays available as a cheap first pass but is not the heavy-scan fix.
87
+
88
+ ## Amendment (2026-10-15, PS-46): a blank page is not degraded
89
+
90
+ A page with no ink read as both "blurry" (a white page has Laplacian variance 0) and "faint" (no pixel below 128),
91
+ so it was escalated, and a VLM asked to transcribe an empty page invents one (TexWright: meeting minutes in another
92
+ language, kept in the parse). The gate now measures `ink_frac` (pixels below 200, faint grey included) and returns
93
+ `ScanQuality.BLANK` for a page with no OCR text and `ink_frac` at most 1e-4: never escalated, never flagged
94
+ needs-rescan, listed in `TieredOCRReport.blank_pages`. Measured margin: blank 0; the heavy faint scan 0.077-0.082
95
+ (its `dark_frac` is 0.0025, which is why `dark_frac` alone cannot separate it); the sparsest real fixture page
96
+ 0.019. The post-escalation check stays a flag rather than dropping the VLM text: it is an English word-rate test,
97
+ and a correct transcription of a page with few common words (a number-heavy table) fails it.
@@ -68,6 +68,10 @@ Members: `STRUCTURED_REASONING` (`'structured_reasoning'`), `STRUCTURED_REASONIN
68
68
 
69
69
  One ranked capability match from `discover` — enough for an agent to pick and invoke it by `slug`.
70
70
 
71
+ ### `SpanHit(*, span_id: str, text: str, document_id: str, doc_start: Optional[int] = None, doc_end: Optional[int] = None, pages: list[int] = [], bbox: Optional[tuple[float, float, float, float]] = None, primary_tag: str = '', rank: int, found_by: tuple[str, ...]) -> None`
72
+
73
+ One cited span from `span_search`, best first. `found_by` says which legs found it: `"hybrid"` (the fused dense + sparse search) and/or `"dense"` (the dense floor). `bbox` is `(l, t, r, b)` or None.
74
+
71
75
  ### `KgNode(type: 'str', key_field: 'str', props: 'dict[str, object]') -> None`
72
76
 
73
77
  A typed KG node to upsert (DD-1b, ADR-0117): `type` is the vertex type, `key_field` the identity field to upsert on, `props` the fields (including `key_field`) as DOMAIN-NATIVE values. The store encodes each prop by its pack-declared storage type -- the caller never serializes to the store's wire format.
@@ -76,6 +80,18 @@ A typed KG node to upsert (DD-1b, ADR-0117): `type` is the vertex type, `key_fie
76
80
 
77
81
  A typed KG edge to create between two nodes identified by (type, key_field, key). `props` are native values (edge properties are type-driven: edges declare no storage schema).
78
82
 
83
+ ### `Range(gt: 'Optional[object]' = None, ge: 'Optional[object]' = None, lt: 'Optional[object]' = None, le: 'Optional[object]' = None) -> None`
84
+
85
+ A `where` value meaning a comparison, evaluated in the store (ER-1): `gt` (>), `ge` (>=), `lt` (<), `le` (<=), at most one lower and one upper bound, at least one bound. Bounds are scalars (numbers compare as numbers, strings lexically). Any number of fields may carry one, beside equality, membership and `NOT_NULL`, on every KG call that takes `where`: `where={"weight": Range(ge=180, le=220), "tensile": Range(gt=400)}`.
86
+
87
+ #### `Range.terms(self) -> 'list[tuple[str, object]]'`
88
+
89
+ `[(operator, bound), ...]`, lower bound first.
90
+
91
+ ### `BlankPageText(*, source: str, pages: dict[int, str], cache_files: list[str]) -> None`
92
+
93
+ One cached parse with text on blank pages. `source` is the PDF's path (or the name given with its bytes), `pages` maps each blank page to the text the cached parse holds there, and `cache_files` are the cached parse(s) and their OCR sidecar: delete them, then re-ingest the document so it is parsed again.
94
+
79
95
  ### `EvidenceItem(*, chunk_id: str, text: str, confidence: Optional[str] = None, properties: Optional[list[dict]] = None) -> None`
80
96
 
81
97
  One piece of grounding evidence: a chunk's text, its `chunk_id` (the citation), and — for a graph-derived fact — its confidence tag (surfaced to the generator, FR-S.4).
@@ -296,7 +312,7 @@ The semantic boundary-discovery seam: decide chunk boundaries as a partition of
296
312
 
297
313
  ### `open_workspace(config: 'EngineConfig', *, corpus: 'str', reset: 'bool' = False, create: 'bool' = True) -> 'WorkspaceHandle'`
298
314
 
299
- Resolve (and cache) the workspace for `corpus` (the backend database name) from `config`. Ensures the schema: the neutral engine types, plus `config.pack`'s declared types when set. Raises `RuntimeError` on a database whose `Span` type still has the pre-ING-8d field names (migrate it with `scripts/migrate_span_fields.py`). Returns an opaque `WorkspaceHandle`. `reset=True` drops + recreates the database (test/clean-slate) and bypasses the cache. A missing database is created (logged): that is how a new corpus is provisioned. `create=False` raises `LookupError` instead (PS-27) -- use it wherever the corpus must already exist, so a wrong name fails loudly rather than opening an empty graph.
315
+ Resolve (and cache) the workspace for `corpus` (the backend database name) from `config`. Ensures the schema: the neutral engine types, plus `config.pack`'s declared types when set. Raises `RuntimeError` on a database whose `Span` type still has the pre-ING-8d field names (migrate it with `migrate_span_fields`). Returns an opaque `WorkspaceHandle`. `reset=True` drops + recreates the database (test/clean-slate) and bypasses the cache. A missing database is created (logged): that is how a new corpus is provisioned. `create=False` raises `LookupError` instead (PS-27) -- use it wherever the corpus must already exist, so a wrong name fails loudly rather than opening an empty graph.
300
316
 
301
317
  One handle per store and corpus is cached for the process. An equal `config` returns it; a different one (new models, options, credentials or pack) returns a new handle that replaces it from then on, so a configuration change takes effect without a restart (PS-16). The new handle reuses the store when the store settings and the pack are unchanged, and the query embedder when the embedding profile is unchanged; a call still holding the old handle finishes on the old config.
302
318
 
@@ -304,6 +320,10 @@ One handle per store and corpus is cached for the process. An equal `config` ret
304
320
 
305
321
  Drop the database `corpus` (PS-37): everything in it, the retrieval index and the knowledge graph, is deleted and cannot be recovered. Returns True if it existed, False if there was nothing to drop. A cached handle for it is closed and forgotten, so a later `open_workspace` starts fresh. A missing or blank `corpus` raises `ValueError`: the name is always explicit, never a default database.
306
322
 
323
+ ### `migrate_span_fields(config: 'EngineConfig', *, corpus: 'str', batch: 'int' = 5000, progress: 'Optional[Callable[[int, int], None]]' = None) -> 'int'`
324
+
325
+ Migrate the database `corpus` from the pre-0.2.0 `Span` field names (`contract_id`, `function`, `functions`) to the generic ones (`document_id`, `primary_tag`, `tags`), the database `open_workspace` refuses until this has run (PS-35). Values are copied in batches of `batch` and the old properties dropped; `progress(done, total)` is called after each batch. Idempotent: returns the number of records moved, 0 when already migrated. The database must exist (`LookupError` otherwise; it is never created), and a missing or blank `corpus` raises `ValueError`. Afterwards the schema is checked, so a database this returns for opens with `open_workspace`.
326
+
307
327
  ### `temporary_workspace(config: 'EngineConfig', *, prefix: 'str' = 'tmp') -> 'Iterator[WorkspaceHandle]'`
308
328
 
309
329
  A workspace on a fresh database, `<prefix>_<12 hex>`, dropped when the block exits, whether it succeeds or raises (PS-37). For a probe or a measurement whose database must not outlive it: `with temporary_workspace(config, prefix="probe") as ws: ...`.
@@ -386,7 +406,7 @@ Rank the live ARD catalog by semantic match to `query`; return the top `k` (opti
386
406
 
387
407
  ### `kg_read(ws: 'WorkspaceHandle', node_type: 'str', *, where: 'Optional[dict]' = None, fields: 'Optional[list]' = None, distinct: 'Optional[str]' = None, order_by: 'Optional[str]' = None, limit: 'Optional[int]' = None, key_range: 'Optional[tuple]' = None) -> 'list[dict]'`
388
408
 
389
- Read typed nodes of `node_type` from the workspace (see `Store.kg_read`). Equality/`IN` filters, a `key_range=(field, lo, hi)` range, projection, distinct, order, limit; an empty list `where` value is scope-to-nothing -> `[]`.
409
+ Read typed nodes of `node_type` from the workspace (see `Store.kg_read`). Each `where` value is a scalar (equality), a list (membership; an empty list is scope-to-nothing -> `[]`), `NOT_NULL` (presence) or a `Range` (comparisons, on any number of fields: `{"weight": Range(ge=180, le=220), "tensile": Range(gt=400)}`); all filters are AND-ed and evaluated in the store. `key_range=(field, lo, hi)` is the half-open shorthand (`lo <= field < hi`). Then projection, distinct, order and limit.
390
410
 
391
411
  ### `kg_write(ws: 'WorkspaceHandle', nodes: 'list', edges: 'Any' = ()) -> 'None'`
392
412
 
@@ -398,7 +418,7 @@ Generic edge TRAVERSAL over the workspace (see `Store.kg_edges`): node-start out
398
418
 
399
419
  ### `kg_count(ws: 'WorkspaceHandle', type_name: 'str', *, where: 'Optional[dict]' = None, key_range: 'Optional[tuple]' = None) -> 'int'`
400
420
 
401
- The number of vertices or edges of `type_name` matching `where` / `key_range` (see `Store.kg_count`).
421
+ The number of vertices or edges of `type_name` matching `where` / `key_range` (see `Store.kg_count`); `where` as in `kg_read`, `Range` values included.
402
422
 
403
423
  ### `kg_delete(ws: 'WorkspaceHandle', type_name: 'str', *, where: 'Optional[dict]' = None, key_range: 'Optional[tuple]' = None) -> 'int'`
404
424
 
@@ -416,6 +436,14 @@ Resolve an entity NAME to every entity node it matches: `[{entity_id, name, enti
416
436
 
417
437
  Every span of `document` with its position provenance, ordered by document position. Each row: `span_id`, `parent_chunk_id`, `span_index`, `text`, `primary_tag` (the span tagger's primary tag, "" if untagged), `document_id`, `doc_start` / `doc_end` (document-absolute offsets), `pages`, and `bbox` DECODED to a `(l, t, r, b)` tuple or None. The engine MECHANISM behind a product's citation/highlight types -- the product wraps these rows into its own presentation type (e.g. `SpanLocation`).
418
438
 
439
+ ### `span_search(ws: 'WorkspaceHandle', query: 'str', *, k: 'int' = 10, documents: 'Optional[list]' = None, tag: 'Optional[str]' = None, dense_floor: 'int' = 3) -> 'list'`
440
+
441
+ Hybrid search over the workspace's span index (every ingested span, embedded dense and sparse): the two legs fused by Reciprocal Rank Fusion in the store, with the top `dense_floor` pure-dense spans guaranteed a place, so a strong semantic match a common-token query would push out of the fused pool is kept (0 turns it off). Returns up to `k` `SpanHit`s, best first, each citation-ready: `span_id`, `text`, `document_id`, `doc_start` / `doc_end`, `pages`, `bbox`, `primary_tag`, `rank`, and `found_by` (`"hybrid"` and/or `"dense"`). `documents` scopes it to those source documents in the store (`None` = all, `[]` = nothing); `tag` keeps one primary tag. No reranking: compose `BGEReranker` over the hits if you want one. Raises `RuntimeError` when the workspace has no embedder.
442
+
443
+ ### `aspan_search(ws: 'WorkspaceHandle', query: 'str', *, k: 'int' = 10, documents: 'Optional[list]' = None, tag: 'Optional[str]' = None, dense_floor: 'int' = 3) -> 'list'`
444
+
445
+ `span_search` off the event loop (the query embedding and the store calls block), for an async caller.
446
+
419
447
  ### `document_of(entity_id: 'str') -> 'str'`
420
448
 
421
449
  The source-document id embedded in a chunk/span/unit id (`<source_doc_id>:<idx>:<hash>` -> the first, delimiter-safe segment). Empty in -> empty out.
@@ -448,6 +476,10 @@ The number of pages in a PDF (a path or the PDF's bytes), read under the engine'
448
476
 
449
477
  The async, deadline-bounded twin of `parse_document_bytes` (ADR-0057): runs the docling parse off the event loop.
450
478
 
479
+ ### `find_blank_pages_with_text(cache_dir: 'Any', sources: 'Iterable[Source]' = (), *, progress: 'Optional[Callable[[int, int], None]]' = None) -> 'list[BlankPageText]'`
480
+
481
+ Audit the parse cache under `cache_dir` (the one given to `parse_document`, or to `aingest`, which keeps its parses in `parsed/`; searched recursively) for text on blank pages. `sources` are the documents' PDFs, as paths or `(name, bytes)`; files embedded in a parsed package are stored in the cache and audited without being passed. A source that is not a PDF, or has no cached parse, is skipped. `progress(done, total)` is called after each PDF. Raises `FileNotFoundError` when `cache_dir` does not exist.
482
+
451
483
  ### `agenerate_answer(query: 'str', evidence: 'list[EvidenceItem]', *, ws: 'Any', guidance: 'Optional[str]' = None) -> 'GeneratedAnswer'`
452
484
 
453
485
  A grounded, cited answer to `query` over `evidence`, or an abstention. Empty evidence abstains without a model call; a citation not in the evidence is dropped, and an answer left with no valid citation becomes an abstention (no claim without a citation). `answer_kind` says whether the evidence fully supported the answer (`answered`), only partly (`partial`) or not at all (`abstained`). `guidance` adds your domain's wording to the domain-neutral method.
@@ -109,6 +109,11 @@ and how to manage workspaces.
109
109
  deployment serves a single model; OCR resolves its endpoint and flags through the same profile as every other
110
110
  call. Override one role with `RAG_MODEL_<ROLE>` (e.g. `RAG_MODEL_VISION_OCR`, `RAG_MODEL_GENERAL`), or every
111
111
  role at once with `RAG_MODEL_ALL`; the role-specific variable wins.
112
+ - **Blank PDF pages** are never sent to `VISION_OCR` (0.13.0, PS-46): a page with no ink has nothing to read, and a
113
+ vision model asked to transcribe one invents a page. A parse cached by an earlier engine with `VISION_OCR`
114
+ configured may still hold such text: `find_blank_pages_with_text(cache_dir, sources)` lists every page that is
115
+ blank in the source PDF but has text in its cached parse (files embedded in a parsed package are found in the
116
+ cache without being passed). Delete each finding's `cache_files`, then re-ingest the document.
112
117
  - **Structured output** is client-side tag-parse (ADR-0045); any provider flags live in the profile.
113
118
  - **A self-hosted Qwen server**: see [A self-hosted model server](#a-self-hosted-model-server-qwen-on-modal) below.
114
119
  - **Decision models** (e.g. Jev) are reached through a `DecisionModelProfile` (default `jev-1.13`;
@@ -42,7 +42,7 @@ ADR-0117/0118 engine API + capability runtime). Read [Concepts](../concepts.md)
42
42
  (segmenter, span tagger, unit grouper, boundary decider, writer, a per-document hook)
43
43
  → [KG construction](kg-construction.md) and the `building-an-ingestion-capability` skill. Your query graphs, domain functions, and skills **compose the engine's
44
44
  generic primitives from the public tiers** (graph reads and query, embedding, typed ranking, reranking,
45
- answers, parsing, chunking; hybrid search and fusion are not public yet, gap G24) and register only your OWN domain graphs/models/skills via `register_capability(manifest)` with an
45
+ answers, parsing, chunking, and hybrid span search with `span_search`) and register only your OWN domain graphs/models/skills via `register_capability(manifest)` with an
46
46
  `impl_ref`, invocable (and MCP-exposable) with zero engine edits. Package them as a pack module that exposes
47
47
  `register()` and load it with `load_pack("<your module>")`.
48
48
  → [Authoring capabilities](authoring-capabilities.md).
@@ -190,7 +190,7 @@ they are the real "does a new customer benefit?" items. The genuine engine ones
190
190
  - **Table rows:** `table_rows(source_document)` returns every parsed table's rows as exact cells (`TableRow`), and a
191
191
  one-row unit carries its row as `Unit.table_row` (ING-7).
192
192
 
193
- ### G24: No public hybrid search or fusion primitive
193
+ ### G24: No public hybrid search or fusion primitive (closed)
194
194
  - **Where:** the engine's own retrieval legs run hybrid (dense + sparse) span search and rank fusion internally, and
195
195
  the authoring guide used to say a capability composes them "by direct import"; neither is on `rag_wright.api` or
196
196
  `rag_wright.pack_sdk`.
@@ -199,6 +199,10 @@ they are the real "does a new customer benefit?" items. The genuine engine ones
199
199
  what it embeds itself, beside a structured leg (`kg_read`, `typed_constraint_match_rank`).
200
200
  - **Proposed:** a public hybrid span search over a workspace (query text, filters, k) returning cited spans, with the
201
201
  fusion and reranking it already applies; on `rag_wright.pack_sdk` for pack capabilities.
202
+ - **Closed by PS-45:** `span_search(ws, query, *, k, documents, tag, dense_floor)` and `aspan_search` on
203
+ `rag_wright.api` (which pack code may also import): the store-side RRF fusion of the dense and sparse span
204
+ legs plus the dense floor (ADR-0104), returning citation-ready `SpanHit`s. Reranking stays the caller's
205
+ (`BGEReranker`), as it was in the engine's own leg.
202
206
  - Surfaced: the TexWright specification (2026-10-14).
203
207
 
204
208
  ## Prerequisites a domain provides (not engine gaps)
@@ -114,9 +114,10 @@ slug. Write good `representative_queries` (2–5, phrased like real tasks) — t
114
114
  Your capabilities **compose the engine's generic primitives from the public tiers** (`rag_wright.api` and
115
115
  `rag_wright.pack_sdk`: the knowledge-graph reads `kg_read` / `kg_edges`, graph query, embedding (`ws.embedder`,
116
116
  `cosine`), typed ranking (`typed_constraint_match_rank`), reranking (`BGEReranker`), answers (`agenerate_answer`,
117
- `ajudge_spans`), parsing and chunking); you register only your OWN domain graphs/models/skills. Don't wrap or
118
- re-register an engine primitive. Hybrid (dense + sparse) span search and rank fusion are not public yet (engine gap
119
- G24): check a primitive is on a tier before designing around it.
117
+ `ajudge_spans`), hybrid span search (`span_search` / `aspan_search`: the dense and sparse legs fused in the store,
118
+ with a dense floor, returning cited spans), parsing and chunking); you register only your OWN domain
119
+ graphs/models/skills. Don't wrap or re-register an engine primitive, and check a primitive is on a tier before
120
+ designing around it.
120
121
 
121
122
  ## Definition of done
122
123
 
@@ -131,13 +131,20 @@ To serve open models yourself instead, set `RAG_SERVING=vllm` with `VLLM_BASE_UR
131
131
 
132
132
  `open_workspace` (through `ensure_schema`) refuses a database whose `Span` type still has the old field names
133
133
  (`contract_id`, `function`, `functions`; renamed to `document_id`, `primary_tag`, `tags`) and raises a `RuntimeError`
134
- naming the fix. Migrate each such database once, in place (it connects with the `ARCADEDB_*` settings in `.env`; it
135
- is idempotent and streams `X/N` progress):
134
+ naming the fix. Migrate each such database once, in place, with `migrate_span_fields` from `rag_wright.api`. It is
135
+ idempotent (it returns the number of spans moved, 0 when already migrated), never creates a database, and reports
136
+ progress after each batch:
136
137
 
137
- ```sh
138
- uv run python -u scripts/migrate_span_fields.py <database>
138
+ ```python
139
+ from rag_wright.api import EngineConfig, StoreConfig, migrate_span_fields
140
+
141
+ config = EngineConfig(store=StoreConfig.from_env())
142
+ moved = migrate_span_fields(config, corpus="my_corpus",
143
+ progress=lambda done, total: print(f"[migrate] {done}/{total}"))
139
144
  ```
140
145
 
146
+ From an engine checkout, `uv run python -u scripts/migrate_span_fields.py <database>` does the same.
147
+
141
148
  Every other breaking change since 0.1.0, with the exact change a consumer makes, is in
142
149
  [`specs/ingestion-hooks/ing8-breaking-changes.md`](specs/ingestion-hooks/ing8-breaking-changes.md).
143
150
 
@@ -107,7 +107,7 @@ in two at the PS-6 gate so the store rewrite is its own visible task. One task,
107
107
  | PS-32 | (waits on RuleWright) Adopt the agent harness substrate as `rag_wright.harness`, a third public tier (ADR-0139). RuleWright separates the substrate from its product parts in its own repo and hands over a package that imports nothing from the product; the engine takes it in as it stands, with import contracts (the harness reaches engine code only through `rag_wright.api`; no engine module imports the harness), the domain-vocabulary guard, no Postgres extra (the product passes its checkpointer in; ADR-0139 correction), RuleWright's third guard (deployment, vendor, tenancy shape; its handover version, which also matches field declarations) in the engine suite, RuleWright's greenfield conformance test (a second product on the seams; strict expected failures that may only shrink), the run context as the product's own type against a `scope` protocol (ADR-0139 addendum), and the three measurements repeated here, `rag_wright.harness.__all__` declared (RuleWright pins it), `tracing_on()` and a flush on `rag_wright.api` (the harness may import only `api`), and the handover shapes agreed 2026-10-13 (RuleWright's `2026-10-13-what-to-build-for-rag_wright-harness.md`): the query encoder is `api.query_embedder()` built once per process; run resources are an opaque product value passed to the product's worker factories (`RunResources` and `run_resources.py` stay in the product, which declares its tool names); the harness defines its own deadline exceptions and `error_middleware` takes `retry_on` and `message_for` from the product; tracing through `api.traced_run`/`traced_step`; the agent model through `api.agent_chat_model` with the model id passed in, the `building-an-agent-harness` skill moved into the shipped skills, docs, and a RuleWright migration guide. No new protocols for future products | the harness's own tests pass in the engine; import contracts and the vocabulary guard; a plain install imports without the extra; live: a chat run with an interrupt and a resume | done 2026-10-14 ( `rag_wright.harness` 26 modules with `__all__` (42 names); `AgentDefinition`/`AgentPrompts`/`ToolSurface` made the tier's; `agent_chat_model(trace=False)` and `tracing_on`/`trace_level`/`start_generation`/`finish_generation`/`flush_tracing` on `api`; two import contracts; the vocabulary guard clean; conformance 7/7, genericity guard, 39 harness tests; live interrupt-and-resume on `qwen3.8-27b-modal-or` (2 calls, $0.00038); `langchain`/`langchain-core` declared; `GenerationRecorder` fixed: only a retry of the same turn abandons an attempt, a failed call closes as an error) |
108
108
  | PS-33 | (later; its own workstream when agreed) Agentic capabilities: an `agent` capability kind (amends ADR-0041) for a harness compiled to a LangGraph graph and registered under a capability name; typed contracts at the boundary (inputs to messages and context, `response_format` back to the contract, the graceful-degrade rule); interrupts across the capability boundary (a suspended result with a resume handle, declared in the manifest); deadlines, budgets and dispatch limits passed down nested agents; a worked example on public data with an eval | to be planned | todo (later) |
109
109
  | PS-34 | RuleWright's 25 databases leave the engine's ArcadeDB (they sit in the engine checkout's `data/arcadedb`, served by the engine's container, which RuleWright's `scripts/arcadedb.sh` also manages by name). The product owns its store and its data, the knowledge graph included; the docs were corrected 2026-10-12 (`installation.md`, `ArcadeDB_Local.md`). RuleWright moves them to its own container, port and data directory per `rulewright-arcadedb-separation.md`; the engine then deletes its copies (user's go-ahead), decides `some-db`, and restores its container's own settings | RuleWright: every moved database opens with `create=False`, its live store tests pass; engine: `data/arcadedb` holds engine databases only | done 2026-10-13 (the engine dropped `rulewright_dev`, `rulewright_compliance` and `some-db` with `drop_workspace`; six engine databases remain) |
110
- | PS-35 | (small) The pre-0.2.0 `Span` field migration is reachable only through `scripts/migrate_span_fields.py`, which is not in the wheel, and `ArcadeDBStore.migrate_span_fields` is internal; `installation.md` tells a product to run the script. Put the migration on `rag_wright.api` (or state that it needs an engine checkout) | a hermetic test of the public call; `installation.md` names it | todo |
110
+ | PS-35 | (small) The pre-0.2.0 `Span` field migration is reachable only through `scripts/migrate_span_fields.py`, which is not in the wheel, and `ArcadeDBStore.migrate_span_fields` is internal; `installation.md` tells a product to run the script. Put the migration on `rag_wright.api` (or state that it needs an engine checkout) | a hermetic test of the public call; `installation.md` names it | done 2026-10-15: `migrate_span_fields(config, *, corpus, batch, progress)` on `rag_wright.api` (opens the store without the schema check, never creates the database, checks the schema after); the refusal messages and docs name it; the script wraps it |
111
111
  | PS-36 | An agent's chat model from a model profile on `rag_wright.api` (ADR-0139 correction): the seam's builder is internal today (`models/seam.py:build_model`), so RuleWright's harness built its own and named a model and a vendor in code. Public, profile-driven, with tracing and `usage_scope` metering; precedes RuleWright's `models.py` stage of the separation | hermetic tests (profile resolution, metering, tracing); live: one agent call through a profile | done 2026-10-13 (`agent_chat_model`; profile slot `agent_extra_body`; live: a deep agent on `qwen3.8-27b-modal-or`, 2 calls metered with real cost) |
112
112
  | PS-37 | The public surface can drop a database it created (RuleWright request 2026-10-13: a create-only lifecycle leaks, and its only workarounds reach past the engine to the store). `drop_workspace(config, *, corpus) -> bool` (explicit name only, never a default database; closes and forgets the cached handle) and `temporary_workspace(config, *, prefix=)` (a fresh `<prefix>_<12 hex>` corpus dropped on exit, also on error); `ArcadeDBStore.drop_database` underneath | hermetic tests; live: create, write, drop on exit, `create=False` refuses after | done (2026-10-13): `tests/api/test_drop_workspace.py` (9) + `test_drop_workspace_live.py` (live, nothing left behind); `docs/workspaces.md` "Removing a workspace"; API reference regenerated; full suite 2169 passed. Housekeeping: `some-db` (empty, from before PS-27) dropped; the engine's container recreated on its own settings (6 GB heap, no cap) after RuleWright's script had set 3 GiB/2 GB on it; two stopped containers removed |
113
113
  | PS-38 | Close the public-surface gaps a new product (TexWright) hits, from the 2026-10-13 product-starter review (`_engine-gaps.md`): (a) ARD publication on `rag_wright.api` (`publish`/`publish_all` with a target root, G14); (b) `CapabilityInterface` and `SkillRuntime` on `rag_wright.pack_sdk`, so a product can fill those manifest fields (G23); (c) a public way to register a `DecisionModelProfile` (and a model profile), so a Laya or on-premises decision model is config, not an engine edit (G12); (d) a public accessor for the workspace's configured embedder, and the reference pack moved onto it and onto `pack_store` (no `resources._store`/`_embedder`) (G22); (e) `StoreConfig.from_env()` no longer defaults `ARCADEDB_PORT` to 2480, so an unset variable cannot reach another instance (it raises naming the variable); the skills and docs that name these gaps updated | hermetic tests per item; the import contracts and doc-reference guard green; RuleWright's suite checked for (e) before it lands (it sets `ARCADEDB_PORT`); a live publish of a product manifest to a temporary root | done 2026-10-13 (publish/publish_all and the profile registrations on `api`; CapabilityInterface, SkillRuntime, workspace_embedder on `pack_sdk`; `WorkspaceHandle.config`; reference pack off private attributes; `ARCADEDB_PORT` required; 6 live reference tests green) |
@@ -116,3 +116,7 @@ in two at the PS-6 gate so the store rewrite is its own visible task. One task,
116
116
  | PS-41 | Audit the engine-authored product-developer skills and the domain-adaptation guide for omissions a greenfield product hits (TexWright as the test case), and fix them: the specifying skill (capability catalog + definition-of-done requirement, models, the operations registry and parity, the agent's guardrails, settled data semantics, confirming a primitive is public, a live reconciliation); the consumer skill (three tiers, the harness first, specify first, client data, the surface snapshot over all tiers); capability authoring (product homes and slug prefixes, the eval in the definition of done, the harness for agents); ingestion (images and scans, a model-backed extractor as a closure, interpretations as records, per-sheet roles, multi-row records, re-ingest under G8, registering the pipeline, field-level accuracy); evals (gold from provided data, field-level ingestion accuracy, judged gold, agent behavior classes); the backend skill (the operations registry, parity, read-only agent tools); the guide (step 0 specify, the bridge pack for an existing ontology, G24: no public hybrid search, the false 'compose hybrid search by import' claim removed, a `uv pip` fixed) | the doc-reference, shipped-skills and ingestion-example guards green | done 2026-10-14 |
117
117
  | PS-42 | Register only the engine capabilities a product uses, by slug (TexWright T-0.2 finding): the product-starter templates, the consumer skill and the domain-adaptation docs showed a blanket `for m in engine_capabilities(): register_capability(m)`, which puts unused capabilities into `discover()`'s ranking pool; now by slug, failing loudly when a used slug is no longer offered | the doc-reference and shipped-skills guards green | done 2026-10-14 |
118
118
  | PS-43 | The harness tier's design reference and its quiet defaults (RuleWright's 2026-10-15 note): `docs/harness.md` taken in from RuleWright's draft, its tables generated from the live tier by `scripts/build_harness_doc.py`; `worker_spec(definition=)` fills the seven policy parameters (and the signposts) a worker otherwise left inert from the product's `AgentDefinition`, explicit arguments winning; the harness source's docstrings and comments cleared of the originating product's vocabulary, task, requirement and ADR ids, with a guard; two `AgentPrompts` fields described; the agent-harness skill's 'Four declared facts' corrected to fifteen | the product-text guard, the `definition=` conformance tests and the harness-design drift test green | done 2026-10-15 |
119
+ | PS-44 | TexWright ER-1: range filters on any number of fields, evaluated in the store. `Range(gt=, ge=, lt=, le=)` on `rag_wright.api` is a `where` value beside equality, membership and `NOT_NULL`, on every KG call that takes `where` (`kg_read`, `kg_count`, `kg_delete`, `kg_update`, `kg_edges`); `kg_read` now shares the filter grammar (so `NOT_NULL` works there too); `key_range` stays as the half-open shorthand | hermetic SQL-contract tests and a live test of two numeric ranges together | done 2026-10-15 |
120
+ | PS-45 | Engine gap G24: a public hybrid span search. `span_search(ws, query, *, k, documents, tag, dense_floor)` and `aspan_search` on `rag_wright.api`, over the span index ingestion fills: the store-side RRF fusion of the dense and sparse legs plus the dense floor (ADR-0104), returning citation-ready `SpanHit`s (text, document, offsets, pages, box, `found_by`); no reranking (the caller composes `BGEReranker`). G24 closed; the guide, the authoring page and the specifying and consumer skills name it | hermetic tests of the composition and the public call; a live test on real ArcadeDB and BGE-M3 (found by meaning, scoped, cited) | done 2026-10-15 |
121
+ | PS-46 | TexWright's 2026-10-15 report: a blank page escalated to the VLM came back as an invented document the parse kept. The scan-quality gate gains `ScanQuality.BLANK` (no OCR text and no ink: `ink_frac`, pixels < 200, at most 1e-4; the heavy faint scan measures ~0.08) and `TieredOCRParser` never escalates or flags a blank page, reporting it in `TieredOCRReport.blank_pages`. The post-check stays a flag, not a filter (a verbatim transcription of a page with few common English words fails it). ADR-0062 amended | hermetic gate and tiered tests (a real 2-page PDF: the VLM gets page 1 only); a live docling parse reports the blank page; the heavy fixture still escalates all 10 pages | done 2026-10-15 |
122
+ | PS-47 | The audit for PS-46: a parse cached before the fix keeps a blank page's invented text (the cache is keyed on content). `find_blank_pages_with_text(cache_dir, sources=(), *, progress)` and `BlankPageText` on `rag_wright.api` list every page blank in the source PDF (no ink, no text layer) with text in its cached parse, and the cache files to delete before re-ingesting. Searches the cache recursively (`aingest` keeps parses in `parsed/`); embedded files are audited from the cache's own copies; top-level sources are passed as paths or `(name, bytes)` | hermetic tests; a live `build_ingestion` of a workbook embedding a blank-tail PDF: clean, then a planted page found with nothing passed, then clean after delete and re-ingest | done 2026-10-15 |
@@ -1,7 +1,7 @@
1
1
  # RuleWright: moving to rag-wright 0.12
2
2
 
3
- What 0.12.0 changes for RuleWright (PS-43, from your note of 2026-10-15; unreleased until its release PR is
4
- merged). Do the 0.11 guide first. Nothing here is edited from the engine repo, and nothing breaks an existing
3
+ What 0.12.0 changes for RuleWright (PS-43, from your note of 2026-10-15; released 2026-10-15: PyPI and GitHub
4
+ release `0.12.0`). Do the 0.11 guide first. Nothing here is edited from the engine repo, and nothing breaks an existing
5
5
  call: every item is new or optional.
6
6
 
7
7
  ## 1. Build workers with `worker_spec(..., definition=...)` (PS-43)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "rag-wright"
3
- version = "0.12.0"
3
+ version = "0.13.0"
4
4
  description = "A domain-retargetable, open-core engine for hybrid retrieval + knowledge-graph RAG: parsing, chunking, embedding, hybrid search, reranking, graph extraction, entity resolution, ontology-driven knowledge, and a capability runtime."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12,<3.13"
@@ -3,6 +3,7 @@
3
3
  `contract_id` -> `document_id`, `function` -> `primary_tag`, `functions` -> `tags` (values copied, old fields removed,
4
4
  old properties dropped). The legacy `parent_okf_path` locator is left in place. Idempotent: re-running on a migrated
5
5
  database moves nothing. After ING-8d, `ArcadeDBStore.ensure_schema` refuses an unmigrated database.
6
+ A thin command over the public call `rag_wright.api.migrate_span_fields` (PS-35), which a product uses.
6
7
 
7
8
  Usage: uv run python -u scripts/migrate_span_fields.py <database> [--batch 5000]
8
9
  """
@@ -13,7 +14,7 @@ import time
13
14
 
14
15
  from dotenv import load_dotenv
15
16
 
16
- from rag_wright.store.arcadedb import ArcadeDBStore
17
+ from rag_wright.api import EngineConfig, StoreConfig, migrate_span_fields
17
18
 
18
19
 
19
20
  def main() -> None:
@@ -22,16 +23,14 @@ def main() -> None:
22
23
  ap.add_argument("--batch", type=int, default=5000)
23
24
  args = ap.parse_args()
24
25
  load_dotenv(".env")
25
- store = ArcadeDBStore.from_env(database=args.database)
26
+ config = EngineConfig(store=StoreConfig.from_env())
26
27
  t0 = time.time()
27
28
  print(f"[migrate] {args.database}: Span field rename (batch {args.batch})", flush=True)
28
- moved = store.migrate_span_fields(
29
- batch=args.batch,
29
+ moved = migrate_span_fields(
30
+ config, corpus=args.database, batch=args.batch,
30
31
  progress=lambda done, total: print(f"[migrate] {done}/{total} spans, {time.time() - t0:.0f}s", flush=True))
31
- store.ensure_schema() # the post-condition: the migrated database is accepted
32
32
  print(f"[migrate] done: {moved} spans moved in {time.time() - t0:.0f}s"
33
33
  + (" (already migrated)" if moved == 0 else ""), flush=True)
34
- store.close()
35
34
 
36
35
 
37
36
  if __name__ == "__main__":
@@ -154,6 +154,10 @@ category.
154
154
 
155
155
  ## 5. Spreadsheets, tables and embedded files
156
156
 
157
+ - **Blank PDF pages** are read as empty, never sent to the vision model (engine 0.13.0). On a parse cache built
158
+ by an earlier engine with `VISION_OCR` configured, run `find_blank_pages_with_text(cache_dir, sources)` once:
159
+ delete each finding's `cache_files` and re-ingest that document (its blank pages may hold invented text).
160
+
157
161
  - **Hidden sheets** are ingested by default; `IngestSource(include_hidden_sheets=False)` skips them (listed in
158
162
  `DocumentReport.skipped_hidden_sheets`).
159
163
  - **Blank rows inside a table**: the parse cuts a sheet's table at every blank row; the engine glues a piece back
@@ -58,7 +58,7 @@ Every product item lands in one or more of these. The route column is where the
58
58
  | **Domain knowledge**: vocabulary, schema, constraints, synonyms, decision criteria | "controlled vocabularies", "the ontology", "mandatory fields", "valid ranges" | `EngineConfig(pack=...)` (the store creates the declared types on `open_workspace`); your capabilities read value sets and SHACL shapes with `rdflib` / `pyshacl` | `authoring-a-capability` | ontology authoring |
59
59
  | **Ingestion**: documents, spreadsheets, images, embedded files into the graph | "parse the forms", "load the lab reports", "idempotent re-runs" | `build_ingestion` (your extractor + optional hooks) → `aingest`; `IngestSource`, `IngestionTuning`, `table_rows` / `TableRow`, `evaluate_ingestion`, `check_extraction`; `KgNode` / `KgEdge` | `building-an-ingestion-capability` | KG construction |
60
60
  | **Entity and registry resolution** | "resolve against the yarn register", "queue unresolved mentions" | your `document_hook`; the entity-resolution building blocks on `rag_wright.pack_sdk` | `building-an-ingestion-capability` | entity resolution |
61
- | **A typed query or retrieval** | "find similar cases", "filter the table", "the dossier" | a query capability of your pack composing the primitives (`kg_read`, `kg_edges`, `NOT_NULL`, hybrid search from `rag_wright.pack_sdk`), registered with `CapabilityManifest` + `register_capability` / `load_pack`, invoked with `ainvoke_subgraph` | `authoring-a-capability` | authoring capabilities |
61
+ | **A typed query or retrieval** | "find similar cases", "filter the table", "the dossier" | a query capability of your pack composing the primitives (`kg_read`, `kg_edges`, `NOT_NULL`, `Range`, hybrid span search with `span_search` from `rag_wright.api`), registered with `CapabilityManifest` + `register_capability` / `load_pack`, invoked with `ainvoke_subgraph` | `authoring-a-capability` | authoring capabilities |
62
62
  | **A cited answer, or a refusal** | "every answer cites its source", "say when it is not in the records" | `agenerate_answer` over `EvidenceItem`s (an answer states its support; "none" abstains), `ajudge_spans` | `authoring-a-capability` | concepts (answers) |
63
63
  | **A typed decision or classification** | "classify the structure", "which of these is it" | `classifier-opportunity-analysis` first; then rules, a trained classifier, or the decision model (`jev_decision` from `engine_capabilities()`, criteria in the pack) | `classifier-opportunity-analysis` → `setfit` / `laya` | classification and decision models |
64
64
  | **A deterministic workflow behind a button** (mode **D**) | "upload, confirm, save", "export CSV" | a product **operation** (one function per user operation) calling your capabilities; the route calls the operation | `building-a-product-backend` | domain-adaptation step 8 |
@@ -27,8 +27,11 @@ open-core and domain-neutral; your product brings the domain. Hard rules:
27
27
  `EngineConfig`/`StoreConfig` (`StoreConfig.from_env()` reads `ARCADEDB_*`)/`open_workspace`
28
28
  (`temporary_workspace`/`drop_workspace` for disposable and removed databases), the invokers
29
29
  (`ainvoke_subgraph`/`invoke_model`/`ainvoke_model`), discovery (`capability_index`/`discover`), the KG accessors
30
- (`kg_read` with `key_range`, `kg_write`, `kg_edges` with `NOT_NULL`, `kg_count`/`kg_delete`/`kg_update`,
31
- `entities_by_name`, `span_positions`), `pack_store(ws, cls)` (build your pack's store extension over the
30
+ (`kg_read`, `kg_write`, `kg_edges`, `kg_count`/`kg_delete`/`kg_update`, all filtering by `where` values that
31
+ are equality, a list for membership, `NOT_NULL` or a `Range(gt=, ge=, lt=, le=)` on any number of fields,
32
+ evaluated in the store;
33
+ `entities_by_name`, `span_positions`), hybrid span search (`span_search` / `aspan_search`: cited spans from
34
+ the dense and sparse index, fused in the store), `pack_store(ws, cls)` (build your pack's store extension over the
32
35
  workspace's store; the store itself stays private), metering and tracing (`measure_usage`, `record_usage`,
33
36
  `traced_run`/`traced_step`, and for code emitting its own generations `tracing_on`/`trace_level`/
34
37
  `start_generation`/`finish_generation`/`flush_tracing`), the query embedder (`ws.embedder` where you hold a
@@ -26,6 +26,7 @@ from rag_wright.api.answers import (AnswerKind, Condition, EvidenceItem, Generat
26
26
  RelevanceVerdict, agenerate_answer, ajudge_spans)
27
27
  from rag_wright.api.documents import (aparse_document, aparse_document_bytes, parse_document,
28
28
  parse_document_bytes, source_document, pdf_page_count)
29
+ from rag_wright.capabilities.parse_audit import BlankPageText, find_blank_pages_with_text
29
30
  from rag_wright.api.ids import decode_bbox, document_of
30
31
  from rag_wright.api.discover import Discovered, discover
31
32
  from rag_wright.contracts.ingestion import (
@@ -70,10 +71,11 @@ from rag_wright.evals import (GoldImportError, GoldMapping, aload_gold_set, arun
70
71
  score_candidate_choice, score_classification, score_extraction, score_generation,
71
72
  score_ingestion, score_judgment, score_relational, score_retrieval)
72
73
  from rag_wright.ingestion.tables import table_rows
73
- from rag_wright.store.seam import NOT_NULL, KgEdge, KgNode
74
+ from rag_wright.store.seam import NOT_NULL, KgEdge, KgNode, Range
74
75
  from rag_wright.api.invoke import ainvoke_model, ainvoke_subgraph, capability_index, invoke_model
75
- from rag_wright.api.kg import (entities_by_name, kg_count, kg_delete, kg_edges, kg_read, kg_update, kg_write,
76
- span_positions)
76
+ from rag_wright.api.kg import (aspan_search, entities_by_name, kg_count, kg_delete, kg_edges, kg_read, kg_update,
77
+ kg_write, span_positions, span_search)
78
+ from rag_wright.capabilities.span_search import SpanHit
77
79
  from rag_wright.api.tracing import (finish_generation, flush_tracing, start_generation, trace_level, traced_run,
78
80
  traced_step, tracing_on)
79
81
  from rag_wright.api.usage import ModelUsage, UsageTotals, measure_usage, record_usage
@@ -82,6 +84,7 @@ from rag_wright.models.profiles import (DecisionModelProfile, ModelProfile, Mode
82
84
  from rag_wright.api.workspace import (
83
85
  WorkspaceHandle,
84
86
  drop_workspace,
87
+ migrate_span_fields,
85
88
  open_workspace,
86
89
  pack_store,
87
90
  temporary_workspace,
@@ -101,7 +104,7 @@ from rag_wright.models.model_servers import (
101
104
  )
102
105
 
103
106
  __all__ = [
104
- "EngineConfig", "StoreConfig", "EngineOptions", "IngestOptions", "WorkspaceHandle", "open_workspace", "drop_workspace", "temporary_workspace", "pack_store", "use_workspace_models",
107
+ "EngineConfig", "StoreConfig", "EngineOptions", "IngestOptions", "WorkspaceHandle", "open_workspace", "drop_workspace", "migrate_span_fields", "temporary_workspace", "pack_store", "use_workspace_models",
105
108
  # PS-19: deploy the self-hosted model server and use it like any model
106
109
  "ModelServerSpec", "ModelServer", "adeploy_model_server", "amodel_server", "await_model_server", "stop_model_server",
107
110
  "ModelServerNotDeployed", "ModelServerStatus", "amodel_server_status", "astop_model_server",
@@ -111,9 +114,10 @@ __all__ = [
111
114
  "query_embedder", # PS-39: the process-wide query embedder, for a seam that holds no workspace
112
115
  "ModelRole", # PS-1 (G17): WorkspaceHandle.model_id(role) and EngineConfig.models need it
113
116
  "ainvoke_subgraph", "invoke_model", "ainvoke_model", "capability_index", "discover", "Discovered",
114
- "kg_read", "kg_write", "kg_edges", "kg_count", "kg_delete", "kg_update", "entities_by_name", "span_positions", "KgNode", "KgEdge", "NOT_NULL",
117
+ "kg_read", "kg_write", "kg_edges", "kg_count", "kg_delete", "kg_update", "entities_by_name", "span_positions", "span_search", "aspan_search", "SpanHit", "KgNode", "KgEdge", "NOT_NULL", "Range",
115
118
  "document_of", "decode_bbox",
116
119
  "source_document", "parse_document", "aparse_document", "parse_document_bytes", "pdf_page_count", "aparse_document_bytes",
120
+ "find_blank_pages_with_text", "BlankPageText", # PS-47: cached parses holding text a VLM invented for a blank page
117
121
  "agenerate_answer", "ajudge_spans", "EvidenceItem", "GeneratedAnswer", "AnswerKind",
118
122
  "RelevanceVerdict", "Relevance", "Condition",
119
123
  "measure_usage", "record_usage", "UsageTotals", "ModelUsage", "traced_run", "traced_step",
@@ -19,16 +19,19 @@ _SPAN_POSITION_FIELDS = [
19
19
  def kg_read(ws: WorkspaceHandle, node_type: str, *, where: Optional[dict] = None, fields: Optional[list] = None,
20
20
  distinct: Optional[str] = None, order_by: Optional[str] = None, limit: Optional[int] = None,
21
21
  key_range: Optional[tuple] = None) -> list[dict]:
22
- """Read typed nodes of `node_type` from the workspace (see `Store.kg_read`). Equality/`IN` filters, a
23
- `key_range=(field, lo, hi)` range, projection, distinct, order, limit; an empty list `where` value is
24
- scope-to-nothing -> `[]`."""
22
+ """Read typed nodes of `node_type` from the workspace (see `Store.kg_read`). Each `where` value is a scalar
23
+ (equality), a list (membership; an empty list is scope-to-nothing -> `[]`), `NOT_NULL` (presence) or a `Range`
24
+ (comparisons, on any number of fields: `{"weight": Range(ge=180, le=220), "tensile": Range(gt=400)}`); all
25
+ filters are AND-ed and evaluated in the store. `key_range=(field, lo, hi)` is the half-open shorthand
26
+ (`lo <= field < hi`). Then projection, distinct, order and limit."""
25
27
  return ws._store.kg_read(node_type, where=where, fields=fields, distinct=distinct, order_by=order_by, limit=limit,
26
28
  key_range=key_range)
27
29
 
28
30
 
29
31
  def kg_count(ws: WorkspaceHandle, type_name: str, *, where: Optional[dict] = None,
30
32
  key_range: Optional[tuple] = None) -> int:
31
- """The number of vertices or edges of `type_name` matching `where` / `key_range` (see `Store.kg_count`)."""
33
+ """The number of vertices or edges of `type_name` matching `where` / `key_range` (see `Store.kg_count`); `where`
34
+ as in `kg_read`, `Range` values included."""
32
35
  return ws._store.kg_count(type_name, where=where, key_range=key_range)
33
36
 
34
37
 
@@ -85,3 +88,30 @@ def span_positions(ws: WorkspaceHandle, document: str) -> list[dict]:
85
88
  rows = ws._store.kg_read(SPAN_TYPE, fields=_SPAN_POSITION_FIELDS, where={"document_id": document},
86
89
  order_by="doc_start")
87
90
  return [{**r, "bbox": decode_bbox(r.get("bbox"))} for r in rows]
91
+
92
+
93
+ def span_search(ws: WorkspaceHandle, query: str, *, k: int = 10, documents: Optional[list] = None,
94
+ tag: Optional[str] = None, dense_floor: int = 3) -> list:
95
+ """Hybrid search over the workspace's span index (every ingested span, embedded dense and sparse): the two legs
96
+ fused by Reciprocal Rank Fusion in the store, with the top `dense_floor` pure-dense spans guaranteed a place, so
97
+ a strong semantic match a common-token query would push out of the fused pool is kept (0 turns it off). Returns
98
+ up to `k` `SpanHit`s, best first, each citation-ready: `span_id`, `text`, `document_id`, `doc_start` /
99
+ `doc_end`, `pages`, `bbox`, `primary_tag`, `rank`, and `found_by` (`"hybrid"` and/or `"dense"`). `documents`
100
+ scopes it to those source documents in the store (`None` = all, `[]` = nothing); `tag` keeps one primary tag.
101
+ No reranking: compose `BGEReranker` over the hits if you want one. Raises `RuntimeError` when the workspace
102
+ has no embedder."""
103
+ from rag_wright.capabilities.span_search import span_search as _search
104
+
105
+ if ws.embedder is None:
106
+ raise RuntimeError("span_search needs the workspace's embedder; this workspace was opened without one")
107
+ return _search(query, store=ws._store, embedder=ws.embedder, k=k, documents=documents, tag=tag,
108
+ dense_floor=dense_floor)
109
+
110
+
111
+ async def aspan_search(ws: WorkspaceHandle, query: str, *, k: int = 10, documents: Optional[list] = None,
112
+ tag: Optional[str] = None, dense_floor: int = 3) -> list:
113
+ """`span_search` off the event loop (the query embedding and the store calls block), for an async caller."""
114
+ import asyncio
115
+
116
+ return await asyncio.to_thread(span_search, ws, query, k=k, documents=documents, tag=tag,
117
+ dense_floor=dense_floor)
@@ -83,7 +83,7 @@ def use_workspace_models(ws: Any) -> Iterator[None]:
83
83
  def open_workspace(config: EngineConfig, *, corpus: str, reset: bool = False, create: bool = True) -> WorkspaceHandle:
84
84
  """Resolve (and cache) the workspace for `corpus` (the backend database name) from `config`. Ensures the schema:
85
85
  the neutral engine types, plus `config.pack`'s declared types when set. Raises `RuntimeError` on a database whose
86
- `Span` type still has the pre-ING-8d field names (migrate it with `scripts/migrate_span_fields.py`). Returns an
86
+ `Span` type still has the pre-ING-8d field names (migrate it with `migrate_span_fields`). Returns an
87
87
  opaque `WorkspaceHandle`. `reset=True` drops + recreates the database (test/clean-slate) and bypasses the cache.
88
88
  A missing database is created (logged): that is how a new corpus is provisioned. `create=False` raises
89
89
  `LookupError` instead (PS-27) -- use it wherever the corpus must already exist, so a wrong name fails loudly
@@ -140,6 +140,27 @@ def drop_workspace(config: EngineConfig, *, corpus: str) -> bool:
140
140
  return existed
141
141
 
142
142
 
143
+ def migrate_span_fields(config: EngineConfig, *, corpus: str, batch: int = 5000,
144
+ progress: Optional[Callable[[int, int], None]] = None) -> int:
145
+ """Migrate the database `corpus` from the pre-0.2.0 `Span` field names (`contract_id`, `function`, `functions`)
146
+ to the generic ones (`document_id`, `primary_tag`, `tags`), the database `open_workspace` refuses until this
147
+ has run (PS-35). Values are copied in batches of `batch` and the old properties dropped; `progress(done, total)`
148
+ is called after each batch. Idempotent: returns the number of records moved, 0 when already migrated. The
149
+ database must exist (`LookupError` otherwise; it is never created), and a missing or blank `corpus` raises
150
+ `ValueError`. Afterwards the schema is checked, so a database this returns for opens with `open_workspace`."""
151
+ if not corpus or not corpus.strip():
152
+ raise ValueError("migrate_span_fields needs the corpus to migrate; it never falls back to a default database")
153
+ store = _build_store(config, corpus, reset=False, create=False)
154
+ try:
155
+ moved = store.migrate_span_fields(batch=batch, progress=progress)
156
+ store.ensure_schema()
157
+ finally:
158
+ store.close()
159
+ if moved:
160
+ logger.info("migrated %d spans in database %r to the generic field names", moved, corpus)
161
+ return moved
162
+
163
+
143
164
  @contextmanager
144
165
  def temporary_workspace(config: EngineConfig, *, prefix: str = "tmp") -> Iterator[WorkspaceHandle]:
145
166
  """A workspace on a fresh database, `<prefix>_<12 hex>`, dropped when the block exits, whether it succeeds or