rag-wright 0.15.0__tar.gz → 0.16.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1104) hide show
  1. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/building-an-ingestion-capability/SKILL.md +1 -1
  2. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/specifying-a-product-on-the-engine/SKILL.md +1 -1
  3. {rag_wright-0.15.0/src/rag_wright/.agents → rag_wright-0.16.1/.claude}/skills/using-the-rag-wright-engine/SKILL.md +2 -2
  4. rag_wright-0.16.1/.release-please-manifest.json +3 -0
  5. {rag_wright-0.15.0 → rag_wright-0.16.1}/CHANGELOG.md +22 -0
  6. {rag_wright-0.15.0 → rag_wright-0.16.1}/CLAUDE.md +5 -1
  7. {rag_wright-0.15.0 → rag_wright-0.16.1}/PKG-INFO +2 -1
  8. rag_wright-0.16.1/docs/adr/0140-one-model-family-on-metal.md +57 -0
  9. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/README.md +2 -1
  10. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/api/README.md +9 -5
  11. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/api/pack_sdk.md +8 -4
  12. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/configuration.md +11 -1
  13. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/domain-adaptation/kg-construction.md +3 -1
  14. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/plan.md +6 -0
  15. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/workspaces.md +8 -1
  16. {rag_wright-0.15.0 → rag_wright-0.16.1}/pyproject.toml +2 -1
  17. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/building-an-ingestion-capability/SKILL.md +1 -1
  18. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/specifying-a-product-on-the-engine/SKILL.md +1 -1
  19. {rag_wright-0.15.0/.claude → rag_wright-0.16.1/src/rag_wright/.agents}/skills/using-the-rag-wright-engine/SKILL.md +2 -2
  20. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/__init__.py +2 -2
  21. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/config.py +4 -0
  22. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/kg.py +5 -3
  23. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/workspace.py +3 -1
  24. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/embedding.py +17 -24
  25. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/parsing.py +20 -3
  26. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/reranking.py +24 -16
  27. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/contracts/ingestion.py +4 -2
  28. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/ingestion/builder.py +6 -2
  29. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/pack_sdk/__init__.py +2 -0
  30. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/clause_function_classifier.py +3 -1
  31. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/dim_classifier.py +8 -15
  32. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/subgraphs/contract_ingestion_pipeline.py +13 -8
  33. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/store/arcadedb.py +120 -26
  34. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/store/seam.py +20 -3
  35. rag_wright-0.16.1/src/rag_wright/util/devices.py +71 -0
  36. {rag_wright-0.15.0 → rag_wright-0.16.1}/tasks.md +4 -2
  37. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_reranking.py +6 -3
  38. rag_wright-0.16.1/tests/ingestion/test_write_count.py +39 -0
  39. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_concurrent_writes.py +76 -0
  40. rag_wright-0.16.1/tests/store/test_kg_contains.py +98 -0
  41. rag_wright-0.16.1/tests/store/test_pooled_client.py +104 -0
  42. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_store_create_flag.py +1 -0
  43. rag_wright-0.16.1/tests/subgraphs/test_contract_write_retry.py +97 -0
  44. rag_wright-0.16.1/tests/util/test_devices.py +143 -0
  45. {rag_wright-0.15.0 → rag_wright-0.16.1}/uv.lock +3 -1
  46. rag_wright-0.15.0/.release-please-manifest.json +0 -3
  47. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/settings.json +0 -0
  48. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/authoring-a-capability/SKILL.md +0 -0
  49. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/building-a-product-backend/SKILL.md +0 -0
  50. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/building-a-product-frontend/SKILL.md +0 -0
  51. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/building-a-product-frontend/scaffold/ShellLayout.test.tsx +0 -0
  52. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/building-a-product-frontend/scaffold/ShellLayout.tsx +0 -0
  53. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/building-a-product-frontend/scaffold/surfaces.tsx +0 -0
  54. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/building-an-agent-harness/SKILL.md +0 -0
  55. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/classifier-opportunity-analysis/SKILL.md +0 -0
  56. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/creating-evals/SKILL.md +0 -0
  57. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/laya/SKILL.md +0 -0
  58. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/qwen-vllm-modal/SKILL.md +0 -0
  59. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -0
  60. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/qwen-vllm-modal/scripts/rw_gate.py +0 -0
  61. {rag_wright-0.15.0 → rag_wright-0.16.1}/.claude/skills/setfit/SKILL.md +0 -0
  62. {rag_wright-0.15.0 → rag_wright-0.16.1}/.env.example +0 -0
  63. {rag_wright-0.15.0 → rag_wright-0.16.1}/.github/workflows/publish.yml +0 -0
  64. {rag_wright-0.15.0 → rag_wright-0.16.1}/.github/workflows/release-please.yml +0 -0
  65. {rag_wright-0.15.0 → rag_wright-0.16.1}/.gitignore +0 -0
  66. {rag_wright-0.15.0 → rag_wright-0.16.1}/LICENSE +0 -0
  67. {rag_wright-0.15.0 → rag_wright-0.16.1}/README.md +0 -0
  68. {rag_wright-0.15.0 → rag_wright-0.16.1}/SPEC.md +0 -0
  69. {rag_wright-0.15.0 → rag_wright-0.16.1}/conftest.py +0 -0
  70. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/ARCHITECTURE_OVERVIEW.md +0 -0
  71. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/ArcadeDB_Local.md +0 -0
  72. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/OBSERVABILITY.md +0 -0
  73. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0001-stack-and-library-choices.md +0 -0
  74. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0002-validation-corpus-cuad-edgar.md +0 -0
  75. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0003-ard-registration-and-capability-kinds.md +0 -0
  76. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0004-entity-disambiguation.md +0 -0
  77. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0005-relational-golden-set.md +0 -0
  78. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0006-model-profile.md +0 -0
  79. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0007-arcadedb-store-schema.md +0 -0
  80. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0008-unified-framework-index-docs-grounding.md +0 -0
  81. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0009-rlm-chunking-retained-as-configurable-capability.md +0 -0
  82. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0010-transformers-pinned-below-5-for-flagembedding-reranker.md +0 -0
  83. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0011-cuad-not-a-retrieval-benchmark-acord-for-queries.md +0 -0
  84. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0012-entity-mention-confidence-no-proximity-edges.md +0 -0
  85. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0013-entity-resolution-matching-strategy.md +0 -0
  86. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0014-split-generation-and-vision-to-text.md +0 -0
  87. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0015-rlm-dynamic-subagents-and-granted-subagents.md +0 -0
  88. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0016-rlm-defined-by-required-capabilities-enforced-as-tests.md +0 -0
  89. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0017-dynamic-dispatch-trigger-as-typed-flag.md +0 -0
  90. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0018-rlm-method-is-the-orchestrator-system-prompt.md +0 -0
  91. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0019-recursion-is-optional-for-chunking-required-for-synthesis.md +0 -0
  92. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0020-serialize-interpreter-sessions-per-process-ki1.md +0 -0
  93. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0021-capability-interface-governed-typed-io.md +0 -0
  94. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0022-fr-k-embedding-free-okf-navigation-experimental.md +0 -0
  95. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0023-cheap-model-for-okf-enrichment.md +0 -0
  96. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0024-reader-parallelism-lives-in-python-not-the-interpreter.md +0 -0
  97. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0025-retrieval-pivot-function-classify-property-graph-rerank.md +0 -0
  98. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0026-property-schema-and-extended-function-taxonomy.md +0 -0
  99. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0027-openrouter-provider-routing-by-throughput.md +0 -0
  100. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0028-deterministic-grounding-judge-and-flash-pro-cascade.md +0 -0
  101. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0029-retrieval-pipeline-domain-portability-and-adaptation.md +0 -0
  102. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0030-model-training-standard-modal-reusable-checkpointed.md +0 -0
  103. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0031-single-call-chunking-for-structured-contracts.md +0 -0
  104. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0032-nl-to-type-two-step-reason-emit-on-gemma.md +0 -0
  105. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0033-unified-contract-kg-three-legs-one-graph.md +0 -0
  106. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0034-granite-json-schema-structured-output-profile.md +0 -0
  107. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0035-graph-extraction-rebacked-with-gp1b-retire-hybrid.md +0 -0
  108. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0036-party-clause-link-party-to-edge.md +0 -0
  109. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0037-clause-template-is-authoritative-code-not-generated.md +0 -0
  110. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0038-full-cuad-kg-on-gcp-gpu-vm-and-gcs-backup.md +0 -0
  111. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0039-self-hosted-open-model-stack-on-modal-a100.md +0 -0
  112. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0040-neuro-symbolic-extraction-fidelity-ontology-shacl-validation.md +0 -0
  113. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0041-capability-kind-rubric-and-agent-skill-runtime-tiers.md +0 -0
  114. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0042-clause-level-span-id-provenance-and-content-hash-backfill.md +0 -0
  115. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0043-retire-cross-corpus-retrieval-standardize-on-leg-b.md +0 -0
  116. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0044-is-exception-to-derived-carveout-relationship.md +0 -0
  117. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0045-client-side-tag-parse-structured-output.md +0 -0
  118. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0046-acord-unified-into-one-production-kg.md +0 -0
  119. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0047-retire-precomputed-clause-function-gate.md +0 -0
  120. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0048-ingest-llm-classifier-nondestructive-reclassify.md +0 -0
  121. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0049-generic-customer-lens-for-ingestion.md +0 -0
  122. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0050-async-langgraph-ingestion.md +0 -0
  123. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0051-schema-bootstrap-and-feedback-driven-ontology-evolution.md +0 -0
  124. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0052-engine-product-split-graphwright-parked.md +0 -0
  125. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0053-answer-prose-output-hygiene.md +0 -0
  126. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0054-remove-auto-tag-from-generator-evidence.md +0 -0
  127. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0055-confidence-out-of-band.md +0 -0
  128. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0056-bound-structured-retry-wall-clock.md +0 -0
  129. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0057-async-engine-architecture.md +0 -0
  130. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0058-structure-first-chunking.md +0 -0
  131. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0059-recall-decoupled-from-classification-and-visible-partial-loss.md +0 -0
  132. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0060-scope-compliance-check-to-named-policy-sources.md +0 -0
  133. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0061-subject-document-compliance-per-section.md +0 -0
  134. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0062-tiered-ocr-scan-quality-vlm-escalation.md +0 -0
  135. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0063-per-sentence-compliance-subject-facts.md +0 -0
  136. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0064-typed-properties-out-of-band-on-evidence.md +0 -0
  137. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0065-deontic-applicability-gates-query-side.md +0 -0
  138. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0066-ontology-ttl-single-source-of-truth.md +0 -0
  139. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0067-domain-pack-retargeting.md +0 -0
  140. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0068-recall-first-actor-gate-ontology-role-disjointness.md +0 -0
  141. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0069-reading-order-chunking-tables-figures-retrievable.md +0 -0
  142. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0070-text-layer-first-parsing-no-false-vlm-escalation.md +0 -0
  143. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0071-defragmentation-reconstruct-paragraphs-from-line-items.md +0 -0
  144. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0072-extract-guard-furniture-and-deterministic-failure.md +0 -0
  145. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0073-born-digital-threshold-sparse-pages-no-vlm-escalation.md +0 -0
  146. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0074-retry-transient-extraction-failures.md +0 -0
  147. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0075-per-page-vlm-escalation.md +0 -0
  148. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0076-thread-safe-shared-embedder-reranker.md +0 -0
  149. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0077-concurrent-function-classification-across-chunks.md +0 -0
  150. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0078-dedicated-extraction-executor.md +0 -0
  151. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0079-product-default-granite-4.2-openrouter-routing.md +0 -0
  152. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0080-nested-tag-parse-and-degrade.md +0 -0
  153. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0081-function-independent-tagparse-clause-extraction.md +0 -0
  154. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0082-symbolic-gate-function-independent.md +0 -0
  155. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0083-executor-hop-trace-context-capture.md +0 -0
  156. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0084-gleaning-off-on-the-query-leg.md +0 -0
  157. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0085-query-constraint-extraction-tagparse.md +0 -0
  158. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0086-streaming-cost-capture.md +0 -0
  159. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0087-retrieval-relevance-score-on-rankedspan.md +0 -0
  160. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0088-per-span-relevance-verdict.md +0 -0
  161. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0089-structured-output-generation-tracing.md +0 -0
  162. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0090-affiliate-of-extraction.md +0 -0
  163. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0091-retire-partyto-edge.md +0 -0
  164. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0092-idempotent-write-graph.md +0 -0
  165. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0093-entities-by-name-seam.md +0 -0
  166. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0094-workspace-document-scope.md +0 -0
  167. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0095-span-page-provenance.md +0 -0
  168. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0096-carveout-keyword-normalization.md +0 -0
  169. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0097-caller-configurable-ingest-extraction-models.md +0 -0
  170. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0098-invoke-time-document-scope.md +0 -0
  171. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0099-mcp-tools-never-take-a-model-supplied-tenant.md +0 -0
  172. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0100-profile-based-model-routing.md +0 -0
  173. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0101-untagged-spans-reach-extraction-aspect-gate-removed.md +0 -0
  174. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0102-open-descriptive-list-dims-retain-verbatim.md +0 -0
  175. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0103-a-clause-is-a-provision-not-a-span.md +0 -0
  176. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0104-dense-floor-protection-in-leg-b.md +0 -0
  177. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0105-in-band-model-usage-accounting.md +0 -0
  178. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0106-document-signals-off-the-citation.md +0 -0
  179. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0107-requirement-page-provenance.md +0 -0
  180. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0108-qwen3-27b-single-a100-serving-profile.md +0 -0
  181. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0109-vllm-cold-start-reduction.md +0 -0
  182. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0110-fp8-kv-cache-16k-single-a100.md +0 -0
  183. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0111-pin-qwen3-27b-deepinfra-bf16.md +0 -0
  184. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0112-relax-deepagents-pin-to-floor.md +0 -0
  185. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0113-llm-span-instrumentation-for-latency-attribution.md +0 -0
  186. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0114-setfit-default-clause-function-classifier.md +0 -0
  187. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0115-classifier-only-step3a-property-extraction.md +0 -0
  188. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0116-soft-function-scoping-classifier-lane.md +0 -0
  189. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0117-engine-api-layer-and-capability-runtime.md +0 -0
  190. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0118-engine-core-api-vs-ard-adapter-free-impl-ref-client.md +0 -0
  191. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0119-jev-typed-decision-model-for-compliance-closed-set-fields.md +0 -0
  192. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0120-rlm-sub-agent-identity-dynamic-dispatch-trigger.md +0 -0
  193. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0121-spacy-optional-extra-model-runtime-download.md +0 -0
  194. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0122-provision-boundary-deterministic-plus-decision-model-residue.md +0 -0
  195. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0123-batched-releases-release-please-and-consumer-dependabot.md +0 -0
  196. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0124-generic-ingestion-builder-and-hooks.md +0 -0
  197. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0125-qwen-openrouter-unpinned.md +0 -0
  198. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0126-unit-representative-hook-and-the-reference-vote.md +0 -0
  199. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0127-retire-the-okf-code.md +0 -0
  200. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0128-two-public-tiers-api-and-pack-sdk.md +0 -0
  201. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0129-laya-temperatures-and-the-sklearn-floor.md +0 -0
  202. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0130-deploy-the-self-hosted-model-server-from-the-engine.md +0 -0
  203. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0131-model-server-hardening-after-rulewright-review.md +0 -0
  204. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0132-model-server-cold-start-from-a-gpu-snapshot.md +0 -0
  205. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0133-model-call-deadline-follows-the-timeout-and-a-thinking-cap.md +0 -0
  206. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0134-skills-for-product-developers-are-linked-per-project-never-globally.md +0 -0
  207. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0135-the-seam-gives-each-event-loop-its-own-async-http-client.md +0 -0
  208. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0136-spreadsheet-tables-are-glued-back-across-blank-rows.md +0 -0
  209. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0137-generated-answers-state-their-support-and-none-is-an-abstention.md +0 -0
  210. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0138-the-engine-reaches-pdfium-through-one-locked-door.md +0 -0
  211. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/adr/0139-the-agent-harness-substrate-is-engine-scope.md +0 -0
  212. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/api/harness.md +0 -0
  213. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/architecture/foundations-and-adding-a-domain.md +0 -0
  214. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/architecture.md +0 -0
  215. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/README.md +0 -0
  216. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/design/deontic-applicability-routing.md +0 -0
  217. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/design/ingestion-neuro-symbolic-gaps.md +0 -0
  218. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/design/semantic-subject-segmentation.md +0 -0
  219. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/design/unify-subject-preprocessing.md +0 -0
  220. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0037-closed-vocab-drops-verbatim-values-to-other.md +0 -0
  221. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0038-a-clause-node-is-now-created-per-sentence-so-98-percent-of-spans-become-clauses.md +0 -0
  222. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0039-the-provision-detector-reads-text-but-docling-puts-the-section-number-in-marker.md +0 -0
  223. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0040-covered-subject-is-asked-of-every-provision-so-verbatim-retention-fills-it-with-noise.md +0 -0
  224. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0041-VERIFICATION-dense-floor.md +0 -0
  225. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0041-leg-b-discards-the-best-dense-matches-on-some-queries.md +0 -0
  226. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0042-usage-is-captured-per-call-but-never-returned-so-cost-needs-a-langfuse-round-trip.md +0 -0
  227. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0043-a-requirement-carries-no-page-provenance-so-a-finding-cannot-point-into-its-policy.md +0 -0
  228. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0044-document-signals-scaffolding-is-shown-to-the-user-as-a-quote-from-their-document.md +0 -0
  229. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0045-a-fixed-money-cap-records-no-cap-quantum-so-the-amount-is-only-prose.md +0 -0
  230. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0046-appending-a-natural-follow-up-to-a-question-drops-the-clause-type.md +0 -0
  231. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0047-an-exact-deepagents-pin-transitively-pins-every-consumer.md +0 -0
  232. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/engine-issues/0048-the-pinned-endpoints-latency-tail-makes-agent-runs-undebuggable-from-either-side.md +0 -0
  233. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-07-20_graphwright_capability_interface_reply.md +0 -0
  234. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-07-20b_graphwright_interface_confirmation.md +0 -0
  235. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-07-20c_graphwright_ingestion_interfaces.md +0 -0
  236. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-08-30_subject_compliance_final_rulewright.md +0 -0
  237. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-01_issue-0013-recall-first-actor-gate_rulewright.md +0 -0
  238. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-01_ontology-source-of-truth_rulewright.md +0 -0
  239. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-03_issue-0014-table-retrievability_rulewright.md +0 -0
  240. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-04_bulk-ingestion-wall_rulewright.md +0 -0
  241. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-04_issue-0016-thread-safe-embedder_rulewright.md +0 -0
  242. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-05_observability-langfuse_rulewright.md +0 -0
  243. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-05_tagparse-ingestion-and-granite-4.2_rulewright.md +0 -0
  244. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-09_affiliate-of-extraction_rulewright.md +0 -0
  245. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-09_issue-0028-partyto-retired_rulewright.md +0 -0
  246. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-09_issue-0029-idempotent-write-graph_rulewright.md +0 -0
  247. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-09_issue-0030-entities-by-name_rulewright.md +0 -0
  248. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-09_observability-and-retrieval-floor_rulewright.md +0 -0
  249. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-09_relevance-verdict_rulewright.md +0 -0
  250. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-09_rename-run-ad-compliance-check_rulewright.md +0 -0
  251. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-09_structured-output-cost-tracing_rulewright.md +0 -0
  252. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-10_ingest-models-caller-configurable_rulewright.md +0 -0
  253. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-10_issue-0031-followup-failclosed-and-nodrift_rulewright.md +0 -0
  254. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-10_issue-0031-followup-validate-ingested-set_rulewright.md +0 -0
  255. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-10_issue-0031-workspace-document-scope_rulewright.md +0 -0
  256. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-10_issue-0032-span-page-provenance_rulewright.md +0 -0
  257. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-10_issue-0033-carveout-normalization_rulewright.md +0 -0
  258. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-10_issue-0034-invoke-time-document-scope_rulewright.md +0 -0
  259. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-11_issue-0035-followup-derived-guard_rulewright.md +0 -0
  260. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-11_issue-0035-mcp-no-model-tenant_rulewright.md +0 -0
  261. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-11_profile-based-model-routing_rulewright.md +0 -0
  262. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-11_qwen-default-modal-or_rulewright.md +0 -0
  263. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-11_qwen-everywhere-config_rulewright.md +0 -0
  264. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-12_clause-granularity_0036-0039_rulewright.md +0 -0
  265. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-12_closed-vocab_0037-0040_rulewright.md +0 -0
  266. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-12_dense-floor-protection_0041_rulewright.md +0 -0
  267. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-13_in-band-usage_0042_rulewright.md +0 -0
  268. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-14_document-signals-off-citation_0044_rulewright.md +0 -0
  269. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-14_requirement-page-provenance_0043_rulewright.md +0 -0
  270. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-16_qwen3-27b-single-a100-serving-profile_rulewright.md +0 -0
  271. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-18_fp8-accuracy-eval-configB_rulewright.md +0 -0
  272. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-18_fp8-kv-16k-single-a100_rulewright.md +0 -0
  273. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-20_deepagents-pin-relaxed_0047_rulewright.md +0 -0
  274. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-20_llm-span-instrumentation_0048_rulewright.md +0 -0
  275. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-21_0048-part2-modal-answers_from_rulewright.md +0 -0
  276. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/handoffs/2026-09-21_0048-part2-modal-scoping-questions_rulewright.md +0 -0
  277. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/misc/.gitkeep +0 -0
  278. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/plans/Corpus_Acquisition.md +0 -0
  279. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/plans/async-migration.md +0 -0
  280. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/plans/demo_plan.md +0 -0
  281. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/plans/gp1b_docling_graph_plan.md +0 -0
  282. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/plans/unified_contract_kg_ontology_bridge.md +0 -0
  283. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/plans/unified_contract_kg_plan.md +0 -0
  284. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/results/2026-07-24-t58-property-graph-population.md +0 -0
  285. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/results/2026-07-25-t58b-full-pipeline-rerank.md +0 -0
  286. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/archive/results/2026-07-25-t58b-topk-ordering-levers.md +0 -0
  287. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/concepts.md +0 -0
  288. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/contract_pipeline_explainer.md +0 -0
  289. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/corpus_ingest_recipe.md +0 -0
  290. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/domain-adaptation/README.md +0 -0
  291. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/domain-adaptation/_engine-gaps.md +0 -0
  292. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/domain-adaptation/authoring-capabilities.md +0 -0
  293. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/domain-adaptation/classification-and-decision-models.md +0 -0
  294. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/domain-adaptation/entity-resolution.md +0 -0
  295. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/domain-adaptation/evals-from-expert-files.md +0 -0
  296. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/domain-adaptation/ontology-authoring.md +0 -0
  297. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/classifier_model_ab.md +0 -0
  298. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/compliance_demo.md +0 -0
  299. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/compliance_gate_cc7.md +0 -0
  300. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/compliance_rung2_cc7.md +0 -0
  301. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/cuad_highlighting_cu-d1.md +0 -0
  302. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/dg_model_ab.md +0 -0
  303. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/function_gate_recall.md +0 -0
  304. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/generation_robustness_b_vs_c.md +0 -0
  305. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/nl_to_type_cu-d2.md +0 -0
  306. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/ocr_benchmark.md +0 -0
  307. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/prod1_readiness.md +0 -0
  308. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/prod2_readiness.md +0 -0
  309. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/query_side_model_ab.md +0 -0
  310. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/silver_granite_vs_gemma4.md +0 -0
  311. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/silver_provider_routing.md +0 -0
  312. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/eval/silver_selfhosted_gemma4_26b.md +0 -0
  313. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/evals.md +0 -0
  314. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/harness.md +0 -0
  315. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/installation.md +0 -0
  316. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/playbook.md +0 -0
  317. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/product/capability_profiles.md +0 -0
  318. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/product/contracts_product_roadmap.md +0 -0
  319. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/product/engine-api-migration-handoff.md +0 -0
  320. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/product/engine_async_api.md +0 -0
  321. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/product/new-domain-build-sequence.md +0 -0
  322. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/product/seam-adaptation-guide.md +0 -0
  323. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/proposals/compliance-ingest-classifier-decomposition.md +0 -0
  324. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/proposals/de-domaining-and-capability-runtime.md +0 -0
  325. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/proposals/new-domain-developer-journey.md +0 -0
  326. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/proposals/ontology-induction.md +0 -0
  327. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/quickstart.md +0 -0
  328. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/reference-pack.md +0 -0
  329. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/releasing.md +0 -0
  330. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/engine-platform/SPEC.md +0 -0
  331. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/engine-platform/TASKS.md +0 -0
  332. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/engine-prep/plan.md +0 -0
  333. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/evals/plan.md +0 -0
  334. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/ingestion-hooks/ing5-doc-audit.md +0 -0
  335. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/ingestion-hooks/ing8-breaking-changes.md +0 -0
  336. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/ingestion-hooks/plan.md +0 -0
  337. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/ingestion-hooks/rulewright-migration-0.2.0.md +0 -0
  338. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/langgraph-ingestion/plan.md +0 -0
  339. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-arcadedb-separation.md +0 -0
  340. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-migration-0.10.0.md +0 -0
  341. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-migration-0.11.0.md +0 -0
  342. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-migration-0.12.0.md +0 -0
  343. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-migration-0.13.0.md +0 -0
  344. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-migration-0.14.0.md +0 -0
  345. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-migration-0.3.0.md +0 -0
  346. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-migration-0.4.0.md +0 -0
  347. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-migration-0.5.0.md +0 -0
  348. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-migration-0.6.0.md +0 -0
  349. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-migration-0.7.0.md +0 -0
  350. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-migration-0.8.0.md +0 -0
  351. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-migration-0.9.0.md +0 -0
  352. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/specs/public-surface/rulewright-reply-2026-10-10-laya-and-sklearn.md +0 -0
  353. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/templates/product-starter/CLAUDE.md.template +0 -0
  354. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/templates/product-starter/README.md +0 -0
  355. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/templates/product-starter/dependabot.yml +0 -0
  356. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/templates/product-starter/playbook.md.template +0 -0
  357. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/upstream/laya-temperature-range-mismatch.md +0 -0
  358. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/vendor/arcadedb/arcadedb-buckets-schema.md +0 -0
  359. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/vendor/arcadedb/arcadedb-docs-extraction.json +0 -0
  360. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/vendor/arcadedb/arcadedb-vector-embeddings.md +0 -0
  361. {rag_wright-0.15.0 → rag_wright-0.16.1}/docs/vendor/arcadedb/arcadedb-vector-search-tutorial.md +0 -0
  362. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/__init__.py +0 -0
  363. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/acord.py +0 -0
  364. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/acord_retrieval.py +0 -0
  365. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/boundary_residue_gold.py +0 -0
  366. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/build_golden.py +0 -0
  367. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/compliance_demo/policy/community_conduct_policy.md +0 -0
  368. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/compliance_demo/subjects/post_borderline.txt +0 -0
  369. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/compliance_demo/subjects/post_compliant.txt +0 -0
  370. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/compliance_demo/subjects/post_violation.txt +0 -0
  371. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/condensed_pipeline.py +0 -0
  372. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/contract_parity_live.py +0 -0
  373. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/contractnli_judge.py +0 -0
  374. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/cuad_highlight.py +0 -0
  375. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/embedded_eval.py +0 -0
  376. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/full_pipeline_rerank.py +0 -0
  377. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/function_ceiling.py +0 -0
  378. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/function_property_rerank.py +0 -0
  379. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/function_rerank.py +0 -0
  380. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/gate1_chunker_ab.py +0 -0
  381. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/gate2_hybrid_rerank.py +0 -0
  382. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/golden/relational/set.json +0 -0
  383. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/golden.py +0 -0
  384. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/ground_discriminator_rerank.py +0 -0
  385. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/harness.py +0 -0
  386. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/ingestion_live_smoke.py +0 -0
  387. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/kg_primary.py +0 -0
  388. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/kg_property_rerank.py +0 -0
  389. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/listwise_rerank.py +0 -0
  390. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/multihop.py +0 -0
  391. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/nl_to_type.py +0 -0
  392. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/relational_eval.py +0 -0
  393. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/residual_decision_gold.py +0 -0
  394. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/segmenter_eval.py +0 -0
  395. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/semantic_judge_gold.py +0 -0
  396. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/test_acord.py +0 -0
  397. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/test_acord_retrieval.py +0 -0
  398. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/test_harness.py +0 -0
  399. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/test_multihop_set.py +0 -0
  400. {rag_wright-0.15.0 → rag_wright-0.16.1}/eval/unit_grouper_eval.py +0 -0
  401. {rag_wright-0.15.0 → rag_wright-0.16.1}/examples/model_server.py +0 -0
  402. {rag_wright-0.15.0 → rag_wright-0.16.1}/examples/quickstart.py +0 -0
  403. {rag_wright-0.15.0 → rag_wright-0.16.1}/plan.md +0 -0
  404. {rag_wright-0.15.0 → rag_wright-0.16.1}/release-please-config.json +0 -0
  405. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ab_model_overlap.py +0 -0
  406. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/acord_unify.py +0 -0
  407. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/acquire_acord.py +0 -0
  408. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/acquire_cuad.py +0 -0
  409. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/acquire_ecfr.py +0 -0
  410. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/acquire_edgar.py +0 -0
  411. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/acquire_ftc_255.py +0 -0
  412. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/acquire_prod1_corpus.py +0 -0
  413. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/audit_reclass_flips.py +0 -0
  414. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/author_leg_a_silver_key.py +0 -0
  415. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/backfill_affiliations.py +0 -0
  416. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/backfill_clause_span_id.py +0 -0
  417. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/backfill_edge_source_doc_id.py +0 -0
  418. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/backup_kg_to_gcs.sh +0 -0
  419. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/bootstrap_template_capture.py +0 -0
  420. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/bootstrap_typed_edges.py +0 -0
  421. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/build_api_docs.py +0 -0
  422. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/build_api_docs.sh +0 -0
  423. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/build_cuad_clause_cache.py +0 -0
  424. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/build_function_routing_map.py +0 -0
  425. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/build_harness_doc.py +0 -0
  426. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_assemble_v2.py +0 -0
  427. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_assemble_v3.py +0 -0
  428. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_generate_hard_negatives.py +0 -0
  429. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_generate_hard_positives.py +0 -0
  430. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_generate_training.py +0 -0
  431. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_hybrid.py +0 -0
  432. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_hybrid2.py +0 -0
  433. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_jev_actor.py +0 -0
  434. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_jev_claimtypes.py +0 -0
  435. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_jev_operative.py +0 -0
  436. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_label_spans.py +0 -0
  437. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_laya_prep.py +0 -0
  438. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_laya_train.py +0 -0
  439. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_prep_operative.py +0 -0
  440. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_relabel_rubric.py +0 -0
  441. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_relabel_rubric2.py +0 -0
  442. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/cic1_train_operative.py +0 -0
  443. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/compare_extraction_models.py +0 -0
  444. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/compliance_actor_gate_smoke.py +0 -0
  445. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/compliance_engine_smoke.py +0 -0
  446. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/compliance_policy_demo.py +0 -0
  447. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/curate_taxonomy_gaps.py +0 -0
  448. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/dg_model_ab.py +0 -0
  449. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/diagnose_acord_knn_expansion.py +0 -0
  450. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/diagnose_acord_knn_rerank.py +0 -0
  451. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/diagnose_acord_leg_pool.py +0 -0
  452. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/diagnose_acord_legs.py +0 -0
  453. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/diagnose_acord_pool.py +0 -0
  454. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/diagnose_acord_relstructure.py +0 -0
  455. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/diagnose_acord_retrieval.py +0 -0
  456. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/distill/eval_all.py +0 -0
  457. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/distill/eval_ce.py +0 -0
  458. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/distill/eval_listwise_b.py +0 -0
  459. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/distill/export_ce_dataset.py +0 -0
  460. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/distill/extract_features.py +0 -0
  461. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/distill/listwise_variants.py +0 -0
  462. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/distill/relational_features.py +0 -0
  463. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/distill/train_ce.py +0 -0
  464. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/distill/train_modal.py +0 -0
  465. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/enrich_edgar_candidates.py +0 -0
  466. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/eval_chunking_ab.py +0 -0
  467. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/eval_classifier_guided_vs_tagparse.py +0 -0
  468. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/eval_compliance_gold.py +0 -0
  469. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/extract_arcadedb_docs.py +0 -0
  470. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/fetch_reference_models.py +0 -0
  471. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/generate_contract_python.py +0 -0
  472. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/git_post_commit_graphify.sh +0 -0
  473. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/granite_chunker_assess.py +0 -0
  474. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/graph_status.sh +0 -0
  475. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ingest_acord.py +0 -0
  476. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ingest_compliance_async_prod2.py +0 -0
  477. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ingest_compliance_document_prod2.py +0 -0
  478. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ingest_compliance_prod2.py +0 -0
  479. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ingest_cuad.py +0 -0
  480. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ingest_cuad_full.py +0 -0
  481. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ingest_ftc_compliance.py +0 -0
  482. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ingest_prod1.py +0 -0
  483. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ingest_prod1_async.py +0 -0
  484. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ingest_smoke.py +0 -0
  485. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/install_git_hooks.sh +0 -0
  486. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/label_new_functions.py +0 -0
  487. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/legb_function_gate_recall.py +0 -0
  488. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/make_compliance_fixtures.py +0 -0
  489. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/make_compliance_gold.py +0 -0
  490. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/mcp_compliance_agent_demo.py +0 -0
  491. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/mcp_intra_document_qa_smoke.py +0 -0
  492. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/mcp_query_legs_agent_demo.py +0 -0
  493. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/measure_generation_robustness.py +0 -0
  494. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/measure_harness_genericity.py +0 -0
  495. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/measure_silver.py +0 -0
  496. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/merge_docs_into_framework.py +0 -0
  497. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/migrate_entity_cik_to_canonical_id.py +0 -0
  498. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/migrate_silver_evidence_autotag.py +0 -0
  499. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/migrate_silver_evidence_remove_autotag.py +0 -0
  500. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/migrate_span_fields.py +0 -0
  501. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/mine_scarce_functions.py +0 -0
  502. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_arcadedb.py +0 -0
  503. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_backfill.py +0 -0
  504. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_exception_linking.py +0 -0
  505. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_gemma4_vllm.py +0 -0
  506. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_gemma4_vllm_snapshot.py +0 -0
  507. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_granite_server.py +0 -0
  508. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_granite_throughput.py +0 -0
  509. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_granite_vllm_server.py +0 -0
  510. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_query_app.py +0 -0
  511. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_qwen3_27b_bench.py +0 -0
  512. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_qwen3_27b_snapshot.py +0 -0
  513. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_qwen3_vllm_server.py +0 -0
  514. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/modal_stack_a100.py +0 -0
  515. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ocr_benchmark.py +0 -0
  516. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ocr_preprocess.py +0 -0
  517. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/ontology_dimension_check.py +0 -0
  518. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/phase_a_leg_validate.py +0 -0
  519. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/populate_clause_kg.py +0 -0
  520. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/populate_entity_graph.py +0 -0
  521. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/populate_entity_graph_extracted.py +0 -0
  522. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/populate_property_store.py +0 -0
  523. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/prep_relational_verification.py +0 -0
  524. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/publish_manifests.py +0 -0
  525. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/reclassify_kg.py +0 -0
  526. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/refresh_framework_graph.sh +0 -0
  527. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/revert_reclass_flips.py +0 -0
  528. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/run_acord_retrieval.py +0 -0
  529. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/run_clause_exception_linking.py +0 -0
  530. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/semantic_judge_live_validate.py +0 -0
  531. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/semantic_judge_probe.py +0 -0
  532. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/snapshot_leg_a_eval.py +0 -0
  533. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/stack_correctness_validate.py +0 -0
  534. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/table_retrieval_smoke.py +0 -0
  535. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/train_function_classifier.py +0 -0
  536. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/train_legalbert_function.py +0 -0
  537. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/train_legalbert_modal.py +0 -0
  538. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/typed_rerank_validate.py +0 -0
  539. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/verify_wheel_install.sh +0 -0
  540. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/vllm_extraction_ab.py +0 -0
  541. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/vllm_kg_query_validate.py +0 -0
  542. {rag_wright-0.15.0 → rag_wright-0.16.1}/scripts/vllm_raw_diagnostic.py +0 -0
  543. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/authoring-a-capability/SKILL.md +0 -0
  544. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/building-a-product-backend/SKILL.md +0 -0
  545. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/building-a-product-frontend/SKILL.md +0 -0
  546. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/building-a-product-frontend/scaffold/ShellLayout.test.tsx +0 -0
  547. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/building-a-product-frontend/scaffold/ShellLayout.tsx +0 -0
  548. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/building-a-product-frontend/scaffold/surfaces.tsx +0 -0
  549. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/building-an-agent-harness/SKILL.md +0 -0
  550. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/classifier-opportunity-analysis/SKILL.md +0 -0
  551. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/creating-evals/SKILL.md +0 -0
  552. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/laya/SKILL.md +0 -0
  553. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/qwen-vllm-modal/SKILL.md +0 -0
  554. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -0
  555. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/rw_gate.py +0 -0
  556. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/.agents/skills/setfit/SKILL.md +0 -0
  557. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/__init__.py +0 -0
  558. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/agents.py +0 -0
  559. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/answers.py +0 -0
  560. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/discover.py +0 -0
  561. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/documents.py +0 -0
  562. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/ids.py +0 -0
  563. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/invoke.py +0 -0
  564. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/mcp.py +0 -0
  565. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/tracing.py +0 -0
  566. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/api/usage.py +0 -0
  567. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/__init__.py +0 -0
  568. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/answer_generator.py +0 -0
  569. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/ard.py +0 -0
  570. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/chunk_read.py +0 -0
  571. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/chunk_write.py +0 -0
  572. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/disambiguation.py +0 -0
  573. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/document_parse.py +0 -0
  574. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/document_scope.py +0 -0
  575. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/embedding_profiles.py +0 -0
  576. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/entity_resolution.py +0 -0
  577. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/fusion.py +0 -0
  578. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/graph_query.py +0 -0
  579. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/graph_storage.py +0 -0
  580. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/hybrid_search.py +0 -0
  581. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/invoke.py +0 -0
  582. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/jev_decision.py +0 -0
  583. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/manifests.py +0 -0
  584. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/parse_audit.py +0 -0
  585. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/registry.py +0 -0
  586. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/remote_encoders.py +0 -0
  587. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/retrieval_core.py +0 -0
  588. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/rlm_chunking.py +0 -0
  589. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/rlm_synthesis.py +0 -0
  590. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/scan_quality.py +0 -0
  591. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/sheet_tables.py +0 -0
  592. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/span_relevance_judgment.py +0 -0
  593. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/span_search.py +0 -0
  594. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/vision_to_text.py +0 -0
  595. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/capabilities/vlm_ocr.py +0 -0
  596. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/contracts/__init__.py +0 -0
  597. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/contracts/chunk.py +0 -0
  598. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/contracts/evals.py +0 -0
  599. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/contracts/extraction.py +0 -0
  600. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/contracts/graph.py +0 -0
  601. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/contracts/identifiers.py +0 -0
  602. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/contracts/provenance.py +0 -0
  603. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/contracts/span.py +0 -0
  604. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/corpus/__init__.py +0 -0
  605. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/corpus/canonicalize.py +0 -0
  606. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/corpus/document_parser.py +0 -0
  607. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/corpus/embedded.py +0 -0
  608. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/corpus/http.py +0 -0
  609. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/evals/__init__.py +0 -0
  610. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/evals/gold.py +0 -0
  611. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/evals/langfuse_backend.py +0 -0
  612. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/evals/runner.py +0 -0
  613. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/evals/scorers.py +0 -0
  614. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/__init__.py +0 -0
  615. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/accounting.py +0 -0
  616. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/agent.py +0 -0
  617. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/batch.py +0 -0
  618. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/clarify.py +0 -0
  619. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/confirm.py +0 -0
  620. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/decisions.py +0 -0
  621. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/definition.py +0 -0
  622. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/dispatch.py +0 -0
  623. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/errors.py +0 -0
  624. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/events.py +0 -0
  625. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/filesystem.py +0 -0
  626. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/grading.py +0 -0
  627. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/interpreter.py +0 -0
  628. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/memory.py +0 -0
  629. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/models.py +0 -0
  630. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/rules.py +0 -0
  631. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/runs.py +0 -0
  632. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/scope.py +0 -0
  633. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/seen.py +0 -0
  634. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/skills.py +0 -0
  635. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/thinking.py +0 -0
  636. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/tiers.py +0 -0
  637. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/tracing.py +0 -0
  638. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/withhold.py +0 -0
  639. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/harness/workers.py +0 -0
  640. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/ingestion/__init__.py +0 -0
  641. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/ingestion/evaluate.py +0 -0
  642. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/ingestion/group.py +0 -0
  643. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/ingestion/layout.py +0 -0
  644. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/ingestion/segment.py +0 -0
  645. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/ingestion/tables.py +0 -0
  646. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/models/__init__.py +0 -0
  647. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/models/model_servers.py +0 -0
  648. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/models/profiles.py +0 -0
  649. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/models/seam.py +0 -0
  650. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/models/tag_structured.py +0 -0
  651. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/models/tracing.py +0 -0
  652. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/models/usage.py +0 -0
  653. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/models/weights.py +0 -0
  654. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/ontology/__init__.py +0 -0
  655. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/ontology/pack_schema.py +0 -0
  656. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/ontology/registry.py +0 -0
  657. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/__init__.py +0 -0
  658. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/__init__.py +0 -0
  659. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/capabilities/__init__.py +0 -0
  660. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/capabilities/assertion_extraction.py +0 -0
  661. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/capabilities/claim_extraction.py +0 -0
  662. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/capabilities/compliance_judgment.py +0 -0
  663. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/capabilities/compliance_store.py +0 -0
  664. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/capabilities/requirement_extraction.py +0 -0
  665. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/invokers.py +0 -0
  666. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/mcp/__init__.py +0 -0
  667. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/mcp/compliance_server.py +0 -0
  668. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/ontology/__init__.py +0 -0
  669. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/ontology/compliance_bridge.ttl +0 -0
  670. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/ontology/loader.py +0 -0
  671. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/ontology/packs/ftc_16cfr255.ttl +0 -0
  672. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/pack.py +0 -0
  673. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/schemas/__init__.py +0 -0
  674. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/schemas/compliance.py +0 -0
  675. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/skills/__init__.py +0 -0
  676. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/skills/claim_extraction/SKILL.md +0 -0
  677. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/skills/claim_extraction/__init__.py +0 -0
  678. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/skills/claim_extraction/template.py +0 -0
  679. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/skills/compliance_judgment/SKILL.md +0 -0
  680. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/skills/generic_compliance_judgment/SKILL.md +0 -0
  681. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/skills/requirement_extraction/SKILL.md +0 -0
  682. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/skills/requirement_extraction/__init__.py +0 -0
  683. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/skills/requirement_extraction/template.py +0 -0
  684. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/subgraphs/__init__.py +0 -0
  685. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/subgraphs/compliance_check.py +0 -0
  686. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/subgraphs/compliance_ingestion.py +0 -0
  687. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/compliance/subgraphs/requirement_extraction.py +0 -0
  688. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/__init__.py +0 -0
  689. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/capabilities/__init__.py +0 -0
  690. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/capabilities/clause_exception_linking.py +0 -0
  691. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/capabilities/contract_kg_serve.py +0 -0
  692. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/capabilities/contract_kg_store.py +0 -0
  693. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/capabilities/dg_extraction.py +0 -0
  694. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/capabilities/graph_extraction.py +0 -0
  695. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/capabilities/highlight_serve.py +0 -0
  696. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/capabilities/property_boosted_retrieval.py +0 -0
  697. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/capabilities/query_function_classifier.py +0 -0
  698. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/capabilities/query_understanding.py +0 -0
  699. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/corpus/__init__.py +0 -0
  700. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/corpus/cuad.py +0 -0
  701. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/corpus/cuad_ingestion.py +0 -0
  702. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/corpus/edgar.py +0 -0
  703. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/corpus/gcs_ingestion.py +0 -0
  704. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/corpus/selection.py +0 -0
  705. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/mcp/__init__.py +0 -0
  706. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/mcp/intra_document_qa_server.py +0 -0
  707. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/mcp/relational_qa_server.py +0 -0
  708. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/mcp/session_store.py +0 -0
  709. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/mcp/typed_property_retrieval_server.py +0 -0
  710. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/ontology/__init__.py +0 -0
  711. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/ontology/_generated_template_meta.py +0 -0
  712. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/ontology/_generated_vocab.py +0 -0
  713. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/ontology/clause_template.py +0 -0
  714. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/ontology/codegen.py +0 -0
  715. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/ontology/contract_bridge.ttl +0 -0
  716. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/ontology/contract_taxonomy.py +0 -0
  717. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/ontology/derive.py +0 -0
  718. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/ontology/loader.py +0 -0
  719. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/ontology/template_introspect.py +0 -0
  720. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/options.py +0 -0
  721. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/pack.py +0 -0
  722. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/schemas/__init__.py +0 -0
  723. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/schemas/contract_meta.py +0 -0
  724. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/schemas/function.py +0 -0
  725. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/schemas/function_routing.py +0 -0
  726. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/schemas/highlight.py +0 -0
  727. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/schemas/jurisdiction.py +0 -0
  728. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/schemas/ontology.py +0 -0
  729. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/schemas/property.py +0 -0
  730. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/schemas/query_intent.py +0 -0
  731. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/schemas/value_match.py +0 -0
  732. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/skills/__init__.py +0 -0
  733. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/skills/corpus_ingest/SKILL.md +0 -0
  734. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/SKILL.md +0 -0
  735. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/__init__.py +0 -0
  736. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/skills/guidance/__init__.py +0 -0
  737. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/skills/guidance/chunking.md +0 -0
  738. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/skills/guidance/generation.md +0 -0
  739. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/skills/guidance/relevance.md +0 -0
  740. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/__init__.py +0 -0
  741. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/boundary.py +0 -0
  742. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/clause_kg_extractor.py +0 -0
  743. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/cuad_labels.py +0 -0
  744. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/dim_fleet.json +0 -0
  745. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/function_classifier.py +0 -0
  746. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/function_families.py +0 -0
  747. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/hybrid_classifier.py +0 -0
  748. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/legalbert_classifier.py +0 -0
  749. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/model_capabilities.py +0 -0
  750. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/new_function_labels.py +0 -0
  751. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/property_extractor.py +0 -0
  752. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/property_grounding.py +0 -0
  753. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/reclassify.py +0 -0
  754. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/residual_candidates.py +0 -0
  755. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/scarce_function_labels.py +0 -0
  756. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/segment.py +0 -0
  757. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/semantic_judge.py +0 -0
  758. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/symbolic_validation.py +0 -0
  759. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/spans/tag_clause_extractor.py +0 -0
  760. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/subgraphs/__init__.py +0 -0
  761. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/subgraphs/async_ingestion.py +0 -0
  762. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/subgraphs/intra_document_qa.py +0 -0
  763. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/subgraphs/query_constraint_extraction.py +0 -0
  764. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/subgraphs/relational_qa.py +0 -0
  765. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/subgraphs/typed_clause_extraction.py +0 -0
  766. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/contracts/subgraphs/typed_property_retrieval.py +0 -0
  767. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/packs/reference_seam.py +0 -0
  768. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/py.typed +0 -0
  769. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/skills/__init__.py +0 -0
  770. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/skills/generation/SKILL.md +0 -0
  771. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/skills/generation/__init__.py +0 -0
  772. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/skills/rlm/SKILL.md +0 -0
  773. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/skills/rlm/__init__.py +0 -0
  774. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/skills/rlm/agent.py +0 -0
  775. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/skills/span_relevance_judgment/SKILL.md +0 -0
  776. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/skills/vision_to_text/SKILL.md +0 -0
  777. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/skills/vision_to_text/__init__.py +0 -0
  778. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/spans/__init__.py +0 -0
  779. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/spans/page_map.py +0 -0
  780. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/store/__init__.py +0 -0
  781. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/store/chunk_text.py +0 -0
  782. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/subgraphs/__init__.py +0 -0
  783. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/subgraphs/graph_extraction.py +0 -0
  784. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/subgraphs/observability.py +0 -0
  785. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/subgraphs/scaffold.py +0 -0
  786. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/subgraphs/semantic_chunking.py +0 -0
  787. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/util/__init__.py +0 -0
  788. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/util/concurrent.py +0 -0
  789. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/util/pdfium.py +0 -0
  790. {rag_wright-0.15.0 → rag_wright-0.16.1}/src/rag_wright/util/spacy_model.py +0 -0
  791. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/__init__.py +0 -0
  792. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/__init__.py +0 -0
  793. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_agent_chat_model.py +0 -0
  794. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_agent_chat_model_live.py +0 -0
  795. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_answers_exports.py +0 -0
  796. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_api_embedder_ps39.py +0 -0
  797. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_bytes_ingest.py +0 -0
  798. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_capability_reexports.py +0 -0
  799. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_decision_swap_doc_example.py +0 -0
  800. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_discover.py +0 -0
  801. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_documents.py +0 -0
  802. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_drop_workspace.py +0 -0
  803. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_drop_workspace_live.py +0 -0
  804. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_e2e.py +0 -0
  805. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_invoke.py +0 -0
  806. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_kg.py +0 -0
  807. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_mcp.py +0 -0
  808. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_metering_tracing_exports.py +0 -0
  809. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_migrate_span_fields.py +0 -0
  810. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_model_role_export.py +0 -0
  811. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_open_workspace_reconfig.py +0 -0
  812. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_options.py +0 -0
  813. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_pack_sdk.py +0 -0
  814. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_pack_store.py +0 -0
  815. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_pdf_page_count.py +0 -0
  816. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_public_gaps_ps38.py +0 -0
  817. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_tracing_helpers_ps32.py +0 -0
  818. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_usage.py +0 -0
  819. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_workspace.py +0 -0
  820. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/api/test_workspace_models.py +0 -0
  821. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/arch/domain_vocabulary_baseline.json +0 -0
  822. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/arch/test_api_docs_current.py +0 -0
  823. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/arch/test_doc_references.py +0 -0
  824. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/arch/test_engine_domain_vocabulary.py +0 -0
  825. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/arch/test_import_contracts.py +0 -0
  826. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/arch/test_lock_version.py +0 -0
  827. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/arch/test_packs_use_store_primitives.py +0 -0
  828. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/arch/test_pdfium_door.py +0 -0
  829. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/arch/test_shipped_skills.py +0 -0
  830. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/async_helpers.py +0 -0
  831. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/__init__.py +0 -0
  832. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/_fixtures/rlm_probe_skill/SKILL.md +0 -0
  833. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_answer_generator.py +0 -0
  834. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_answer_generator_async.py +0 -0
  835. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_assertion_extraction.py +0 -0
  836. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_authoring_contract.py +0 -0
  837. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_chunk_read.py +0 -0
  838. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_chunk_write.py +0 -0
  839. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_chunking_prompts_neutral.py +0 -0
  840. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_claim_extraction.py +0 -0
  841. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_clause_exception_linking.py +0 -0
  842. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_compliance_judgment.py +0 -0
  843. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_compliance_store.py +0 -0
  844. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_contract_kg_serve.py +0 -0
  845. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_contract_kg_store.py +0 -0
  846. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_contract_kg_store_reads.py +0 -0
  847. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_contract_taxonomy_and_spans.py +0 -0
  848. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_dg_adapter.py +0 -0
  849. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_dg_async.py +0 -0
  850. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_dg_extraction.py +0 -0
  851. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_dg_model_seam.py +0 -0
  852. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_dg_private.py +0 -0
  853. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_disambiguation.py +0 -0
  854. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_document_scope.py +0 -0
  855. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_embedding.py +0 -0
  856. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_embedding_profiles.py +0 -0
  857. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_entity_resolution.py +0 -0
  858. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_entity_rules_plumbing.py +0 -0
  859. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_fusion.py +0 -0
  860. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_graph_extraction.py +0 -0
  861. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_graph_query.py +0 -0
  862. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_graph_storage.py +0 -0
  863. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_highlight_serve.py +0 -0
  864. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_hybrid_search.py +0 -0
  865. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_jev_decision.py +0 -0
  866. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_manifest_validation.py +0 -0
  867. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_manifests.py +0 -0
  868. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_parse_audit.py +0 -0
  869. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_parsing.py +0 -0
  870. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_parties_extraction.py +0 -0
  871. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_property_boosted_retrieval.py +0 -0
  872. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_query_function_classifier.py +0 -0
  873. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_query_understanding.py +0 -0
  874. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_registry.py +0 -0
  875. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_remote_encoders.py +0 -0
  876. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_repair_partition.py +0 -0
  877. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_requirement_extraction.py +0 -0
  878. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_retrieval_core.py +0 -0
  879. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_rlm_chunking.py +0 -0
  880. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_rlm_chunking_async.py +0 -0
  881. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_rlm_method.py +0 -0
  882. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_rlm_synthesis.py +0 -0
  883. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_runtime_registry.py +0 -0
  884. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_scan_quality.py +0 -0
  885. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_span_relevance_judgment.py +0 -0
  886. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_span_search.py +0 -0
  887. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_structural_boundary_discoverer.py +0 -0
  888. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_structural_model_fallback.py +0 -0
  889. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_tag_boundary_discoverer.py +0 -0
  890. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_tiered_ocr.py +0 -0
  891. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/capabilities/test_vlm_ocr.py +0 -0
  892. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/compliance_fakes.py +0 -0
  893. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/conftest.py +0 -0
  894. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/__init__.py +0 -0
  895. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_canonical_source_doc_id.py +0 -0
  896. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_chunk_record.py +0 -0
  897. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_compliance.py +0 -0
  898. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_cuad_highlight_contracts.py +0 -0
  899. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_extraction.py +0 -0
  900. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_function.py +0 -0
  901. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_function_routing.py +0 -0
  902. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_identifiers.py +0 -0
  903. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_ingestion_hooks.py +0 -0
  904. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_jurisdiction.py +0 -0
  905. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_ontology.py +0 -0
  906. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_property.py +0 -0
  907. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_provenance.py +0 -0
  908. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/contracts/test_value_match.py +0 -0
  909. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/corpus/__init__.py +0 -0
  910. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/corpus/_ooxml_fixtures.py +0 -0
  911. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/corpus/test_canonicalize.py +0 -0
  912. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/corpus/test_cuad.py +0 -0
  913. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/corpus/test_cuad_ingestion.py +0 -0
  914. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/corpus/test_document_parser.py +0 -0
  915. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/corpus/test_edgar.py +0 -0
  916. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/corpus/test_embedded.py +0 -0
  917. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/corpus/test_gcs_ingestion.py +0 -0
  918. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/corpus/test_http.py +0 -0
  919. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/corpus/test_parse_wire2.py +0 -0
  920. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/corpus/test_selection.py +0 -0
  921. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/eval/test_contractnli_judge.py +0 -0
  922. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/eval/test_cuad_highlight_metrics.py +0 -0
  923. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/eval/test_kg_property_rerank.py +0 -0
  924. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/eval/test_nl_to_type_metrics.py +0 -0
  925. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/eval/test_relational_eval.py +0 -0
  926. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/evals/__init__.py +0 -0
  927. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/evals/test_gold_contracts.py +0 -0
  928. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/evals/test_gold_import.py +0 -0
  929. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/evals/test_langfuse_backend.py +0 -0
  930. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/evals/test_runner.py +0 -0
  931. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/evals/test_scorer_parity.py +0 -0
  932. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/evals/test_scorers_a.py +0 -0
  933. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/evals/test_scorers_b.py +0 -0
  934. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/evals/test_scorers_c.py +0 -0
  935. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/evals/test_scorers_d.py +0 -0
  936. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/fixtures/ingestion/parity.json +0 -0
  937. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/fixtures/ingestion/parity_blank.pdf +0 -0
  938. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/fixtures/ingestion/parity_cover_with_attachment.pdf +0 -0
  939. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/fixtures/ingestion/parity_db_with_a_broken_report.xlsx +0 -0
  940. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/fixtures/ingestion/parity_db_with_reports.xlsx +0 -0
  941. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/fixtures/ingestion/parity_grid.xlsx +0 -0
  942. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/fixtures/ingestion/segmenter_gold.json +0 -0
  943. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/fixtures/ingestion/textile_spec_sheet.md +0 -0
  944. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/fixtures/ingestion/textile_test_report.md +0 -0
  945. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/fixtures/leg_a_silver/README.md +0 -0
  946. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/fixtures/leg_a_silver/evidence_snapshot.json +0 -0
  947. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/fixtures/table-bearing-contract.pdf +0 -0
  948. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/foundation/__init__.py +0 -0
  949. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/foundation/test_arcadedb_hybrid.py +0 -0
  950. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/foundation/test_model_seam_structured.py +0 -0
  951. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/harness/__init__.py +0 -0
  952. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/harness/test_greenfield_conformance.py +0 -0
  953. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/harness/test_harness_accounting.py +0 -0
  954. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/harness/test_harness_engine_wiring.py +0 -0
  955. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/harness/test_harness_genericity.py +0 -0
  956. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/harness/test_harness_live.py +0 -0
  957. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/harness/test_harness_recorder.py +0 -0
  958. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/harness/test_harness_thinking.py +0 -0
  959. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/__init__.py +0 -0
  960. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_aevaluate.py +0 -0
  961. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_builder.py +0 -0
  962. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_chunk_discoverer_hook.py +0 -0
  963. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_concurrency_ceiling.py +0 -0
  964. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_document_metadata.py +0 -0
  965. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_evaluate.py +0 -0
  966. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_evaluate_labels.py +0 -0
  967. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_graph_live.py +0 -0
  968. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_graph_parity.py +0 -0
  969. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_layout_segmenter.py +0 -0
  970. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_sheet_continuations.py +0 -0
  971. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_spreadsheet_content.py +0 -0
  972. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_table_rows.py +0 -0
  973. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_tuning.py +0 -0
  974. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_unit_grouper.py +0 -0
  975. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ingestion/test_unit_representative.py +0 -0
  976. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/journey/incidents_domain.py +0 -0
  977. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/journey/incidents_pack.ttl +0 -0
  978. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/journey/test_incidents_journey.py +0 -0
  979. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/journey/test_pack_schema.py +0 -0
  980. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/mcp/__init__.py +0 -0
  981. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/mcp/test_compliance_server.py +0 -0
  982. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/mcp/test_intra_document_qa_server.py +0 -0
  983. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/mcp/test_no_model_supplied_tenant.py +0 -0
  984. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/mcp/test_relational_qa_server.py +0 -0
  985. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/mcp/test_typed_property_retrieval_server.py +0 -0
  986. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/__init__.py +0 -0
  987. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_async_infra.py +0 -0
  988. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_classifier_heads_load_clean.py +0 -0
  989. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_model_servers.py +0 -0
  990. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_models_dir.py +0 -0
  991. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_no_gemma_default.py +0 -0
  992. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_profile_routing.py +0 -0
  993. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_profile_seam.py +0 -0
  994. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_seam_async.py +0 -0
  995. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_seam_deadline_and_cap.py +0 -0
  996. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_seam_event_loops.py +0 -0
  997. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_seam_retry.py +0 -0
  998. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_seam_stream.py +0 -0
  999. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_serving_seam.py +0 -0
  1000. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_serving_wiring.py +0 -0
  1001. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_tag_structured.py +0 -0
  1002. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_tag_structured_async.py +0 -0
  1003. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_tracing.py +0 -0
  1004. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/models/test_usage.py +0 -0
  1005. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ontology/__init__.py +0 -0
  1006. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ontology/test_clause_template.py +0 -0
  1007. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ontology/test_compliance_ontology_authoritative.py +0 -0
  1008. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ontology/test_derivation.py +0 -0
  1009. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ontology/test_entity_taxonomy.py +0 -0
  1010. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ontology/test_generated_template_meta_in_sync.py +0 -0
  1011. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ontology/test_generated_vocab_in_sync.py +0 -0
  1012. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ontology/test_template_captured_in_ttl.py +0 -0
  1013. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/ontology/test_ttl_is_source_of_truth.py +0 -0
  1014. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/reference/test_compliance_reference.py +0 -0
  1015. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/reference/test_contract_seam.py +0 -0
  1016. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/scripts/test_eval_chunking_ab.py +0 -0
  1017. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/scripts/test_eval_classifier_ab.py +0 -0
  1018. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/scripts/test_fetch_reference_models.py +0 -0
  1019. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/scripts/test_generation_robustness_errors.py +0 -0
  1020. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/skills/__init__.py +0 -0
  1021. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/skills/test_creating_evals_skill_example.py +0 -0
  1022. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/skills/test_ingestion_skill_example.py +0 -0
  1023. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_boundary.py +0 -0
  1024. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_classifier_property_extractor.py +0 -0
  1025. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_clause_classifier_tags_0005.py +0 -0
  1026. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_clause_function_classifier.py +0 -0
  1027. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_clause_function_classifier_async.py +0 -0
  1028. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_clause_kg_extractor.py +0 -0
  1029. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_clause_kg_extractor_async.py +0 -0
  1030. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_dim_classifier.py +0 -0
  1031. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_dim_fleet_live.py +0 -0
  1032. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_function_classifier.py +0 -0
  1033. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_hybrid_classifier.py +0 -0
  1034. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_hybrid_property_extractor.py +0 -0
  1035. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_legalbert_classifier.py +0 -0
  1036. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_model_capabilities.py +0 -0
  1037. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_new_function_labels.py +0 -0
  1038. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_page_map.py +0 -0
  1039. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_property_extractor.py +0 -0
  1040. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_property_grounding.py +0 -0
  1041. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_reclassify.py +0 -0
  1042. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_residual_decision.py +0 -0
  1043. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_scarce_function_labels.py +0 -0
  1044. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_segment.py +0 -0
  1045. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_segmentation_vocab.py +0 -0
  1046. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_semantic_judge.py +0 -0
  1047. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_setfit_clause_adapter.py +0 -0
  1048. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_setfit_probabilities.py +0 -0
  1049. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_span_offsets.py +0 -0
  1050. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_stage_labels_0005.py +0 -0
  1051. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_symbolic_validation.py +0 -0
  1052. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/spans/test_tag_clause_extractor.py +0 -0
  1053. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/__init__.py +0 -0
  1054. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_affiliation_backfill.py +0 -0
  1055. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_arcadedb_clause_kg.py +0 -0
  1056. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_arcadedb_contract.py +0 -0
  1057. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_arcadedb_property.py +0 -0
  1058. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_arcadedb_requirement_sources.py +0 -0
  1059. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_arcadedb_schema.py +0 -0
  1060. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_arcadedb_span.py +0 -0
  1061. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_chunk_text.py +0 -0
  1062. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_contract_kg_store_live.py +0 -0
  1063. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_document_metadata_live.py +0 -0
  1064. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_document_scope.py +0 -0
  1065. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_engine_domain_neutral.py +0 -0
  1066. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_entities_by_name.py +0 -0
  1067. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_kg_edges.py +0 -0
  1068. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_kg_identifiers.py +0 -0
  1069. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_kg_mutations.py +0 -0
  1070. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_kg_range.py +0 -0
  1071. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_kg_read.py +0 -0
  1072. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_kg_write.py +0 -0
  1073. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_neutral_schema.py +0 -0
  1074. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_pack_schema_properties.py +0 -0
  1075. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/store/test_write_graph_idempotent.py +0 -0
  1076. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/__init__.py +0 -0
  1077. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_async_ingestion.py +0 -0
  1078. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_chunk7_structure_carry.py +0 -0
  1079. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_clause_results.py +0 -0
  1080. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_compliance_check.py +0 -0
  1081. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_compliance_ingestion.py +0 -0
  1082. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_contract_ingestion_pipeline.py +0 -0
  1083. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_contract_ingestion_pipeline_async.py +0 -0
  1084. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_contract_ingestion_pipeline_graph_async.py +0 -0
  1085. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_graph_extraction.py +0 -0
  1086. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_ingest_knobs.py +0 -0
  1087. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_ingest_segment_classify.py +0 -0
  1088. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_intra_document_qa.py +0 -0
  1089. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_observability.py +0 -0
  1090. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_partial_entry_contract.py +0 -0
  1091. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_query_constraint_extraction.py +0 -0
  1092. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_relational_qa.py +0 -0
  1093. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_requirement_extraction.py +0 -0
  1094. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_scaffold.py +0 -0
  1095. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_semantic_chunking.py +0 -0
  1096. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_typed_clause_extraction.py +0 -0
  1097. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/subgraphs/test_typed_property_retrieval.py +0 -0
  1098. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/test_backfill_clause_span_id.py +0 -0
  1099. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/test_dg_model_ab.py +0 -0
  1100. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/test_populate_clause_kg.py +0 -0
  1101. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/test_populate_entity_graph.py +0 -0
  1102. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/util/__init__.py +0 -0
  1103. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/util/test_concurrent.py +0 -0
  1104. {rag_wright-0.15.0 → rag_wright-0.16.1}/tests/util/test_spacy_model.py +0 -0
@@ -28,7 +28,7 @@ Repository paths in this skill (`docs/`, `eval/`, `scripts/`, `tests/`, `src/`)
28
28
  | group spans into units | engine default, domain may override | a heading starts a unit, a table stays whole (a record table is one unit per row), page furniture dropped, units capped | `unit_grouper=`, `boundary_decider=` |
29
29
  | choose each unit's representative span (its `anchor` + leading tag) | **domain decision**, optional | the grouper's choice: the first member, often a heading | `unit_representative=` |
30
30
  | extract records from a unit | **domain (required)** | (none) | the `extractor` argument |
31
- | write records | engine default | `kg_write` | `writer=` |
31
+ | write records | engine default | `kg_write` | `writer=` (returns the number of records now in the graph, or `None`) |
32
32
  | per-document follow-up (e.g. an entity graph) | domain, optional | none | `document_hook=` |
33
33
  | `Document` node, embedded children (`EmbeddedIn` / `AttachedTo`), progress, dead-lettering | engine | always on | (none) |
34
34
 
@@ -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`, `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 |
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`, `Contains`, 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 |
@@ -28,8 +28,8 @@ open-core and domain-neutral; your product brings the domain. Hard rules:
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
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;
31
+ are equality, a list for membership, `NOT_NULL`, a `Range(gt=, ge=, lt=, le=)` or a `Contains(text, case_sensitive=False)` (a literal
32
+ substring; an empty field never matches) on any number of fields, evaluated in the store;
33
33
  `entities_by_name`, `span_positions`), hybrid span search (`span_search` / `aspan_search`: cited spans from
34
34
  the dense and sparse index, fused in the store), `pack_store(ws, cls)` (build your pack's store extension over the
35
35
  workspace's store; the store itself stays private), metering and tracing (`measure_usage`, `record_usage`,
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.16.1"
3
+ }
@@ -4,6 +4,28 @@ 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.16.1](https://github.com/fzaidi-dai/RAG_Wright/compare/0.16.0...0.16.1) (2026-11-01)
8
+
9
+
10
+ ### Bug Fixes
11
+
12
+ * **PS-57:** a retried write no longer loses a document's clauses; the conflict budget is configurable ([5d209d7](https://github.com/fzaidi-dai/RAG_Wright/commit/5d209d7eb1ab4bad93cd7026e81e79d9b6852fe5))
13
+ * **PS-58:** a record writer reports the count that landed ([a7c384c](https://github.com/fzaidi-dai/RAG_Wright/commit/a7c384cfab59832f9714bac9996f91a29340ed71))
14
+ * **PS-59:** the store's client keeps keep-alive connections, one session per thread ([f644ba3](https://github.com/fzaidi-dai/RAG_Wright/commit/f644ba3f3f37f12102037405b9a58567098358b3))
15
+
16
+ ## [0.16.0](https://github.com/fzaidi-dai/RAG_Wright/compare/0.15.0...0.16.0) (2026-10-28)
17
+
18
+
19
+ ### Features
20
+
21
+ * **PS-54:** a Contains where value matches a substring of a text field in the store ([e00b9e2](https://github.com/fzaidi-dai/RAG_Wright/commit/e00b9e271f7185cf5c15a0312d2e76c7c1eb68c6))
22
+
23
+
24
+ ### Bug Fixes
25
+
26
+ * **PS-55:** only the BGE models run on Metal, one call at a time per process ([1cb1c90](https://github.com/fzaidi-dai/RAG_Wright/commit/1cb1c90ccc1d5e93421806c26862ab97d503bb72))
27
+ * **PS-56:** the BGE reranker scores again on transformers 5 ([d06ec1b](https://github.com/fzaidi-dai/RAG_Wright/commit/d06ec1b97ad4ae457a232ba9f1bb5e89b033513b))
28
+
7
29
  ## [0.15.0](https://github.com/fzaidi-dai/RAG_Wright/compare/0.14.1...0.15.0) (2026-10-28)
8
30
 
9
31
 
@@ -55,7 +55,11 @@ The failure mode to avoid, which has happened before: a command fails with "modu
55
55
 
56
56
  ## Start of every session
57
57
 
58
- > **CURRENT STATE (2026-10-28): `rag-wright` 0.14.1 is RELEASED** (PR #17; TexWright's two requests: PS-49 a retried
58
+ > **CURRENT STATE (2026-10-29): `rag-wright` 0.16.0 is RELEASED** (PR #19; TexWright's requests: PS-54 a `Contains`
59
+ > substring `where` value, PS-55 only the BGE models on Metal under one process lock (ADR-0140); PS-56 the BGE reranker
60
+ > scores again on transformers 5). Before it, **`rag-wright` 0.15.0 is RELEASED** (PR #18; PS-51 the frontend skill draws the shell and
61
+ > ships its scaffold, RuleWright's request; PS-52 one workspace embedder under concurrent first use and PS-53 KG calls refuse
62
+ > a name that is not an identifier, TexWright's requests). Before it, **`rag-wright` 0.14.1 is RELEASED** (PR #17; TexWright's two requests: PS-49 a retried
59
63
  > ArcadeDB write conflict no longer prints as an error, PS-50 `ensure_pack_schema` declares a property a pack gains on an
60
64
  > existing type). Before it, **(2026-10-17): the LangGraph ingestion workstream is RELEASED as `rag-wright` 0.14.0** (PR #16; LGI-1..5,
61
65
  > `docs/specs/langgraph-ingestion/plan.md`, ADR-0124 amended): `build_ingestion` is a LangGraph graph
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: rag-wright
3
- Version: 0.15.0
3
+ Version: 0.16.1
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
@@ -42,6 +42,7 @@ Requires-Dist: pydantic>=2.0
42
42
  Requires-Dist: pypdfium2>=5.11
43
43
  Requires-Dist: pyshacl>=0.40.1
44
44
  Requires-Dist: python-dotenv>=1.2
45
+ Requires-Dist: requests>=2.34.2
45
46
  Requires-Dist: scikit-learn>=1.9.1
46
47
  Requires-Dist: sentence-transformers>=6.1.0
47
48
  Requires-Dist: transformers<5.9,>=5.4
@@ -0,0 +1,57 @@
1
+ # ADR-0140: One model family on Metal, under one process lock
2
+
3
+ **Status:** accepted · **Date:** 2026-10-29 · **Related:** PS-55, TexWright's request
4
+ `2026-10-25-two-model-families-in-one-process-abort-on-metal.md`, RuleWright T-7.25 / T-7.46 (`_avoid_mps`), ADR-0076
5
+ (issue 0016, the per-instance embedder lock), ADR-0138 (pdfium)
6
+
7
+ ## Context
8
+
9
+ PyTorch's Apple Metal (`mps`) backend is not safe for concurrent use. Two threads running models on it abort the
10
+ process inside Metal (`failed assertion _status < MTLCommandBufferStatusCommitted ... setCurrentCommandEncoder:`) or
11
+ segfault it. Either way it is a native `abort()`, so nothing in Python can catch it.
12
+
13
+ The engine reached Metal from three model families, each choosing its own device automatically:
14
+
15
+ - the BGE-M3 embedder (`_resolve_device`);
16
+ - the BGE reranker (FlagEmbedding's choice);
17
+ - Docling's layout, table and RapidOCR-torch models (`AcceleratorOptions(device="auto")`).
18
+
19
+ It also runs them on different threads: an ingest embeds one document while it parses another, and a server embeds
20
+ a query while an upload parses. Issue 0016's per-instance locks do not help across instances or families.
21
+
22
+ Reproduced with the BGE-M3 embedder in one thread and Docling in another, each run in a child process:
23
+
24
+ - On torch 2.14.1 (TexWright's environment), 6 of 6 runs died within seconds: 5 SIGABRT with TexWright's
25
+ assertion, 1 SIGSEGV. Three of the runs OCR'd a screen image and three parsed PDFs.
26
+ - On torch 2.12.1 the same shapes survived every run, so the failure depends on the torch version, and the newer
27
+ version makes it certain.
28
+ - RuleWright measured it independently on their contract ingest: 4 crashes in about 8 runs on Metal, 0 in 6 on CPU.
29
+ They fixed it in their own seam (`_avoid_mps`), and the engine never adopted the fix.
30
+
31
+ `docs/workspaces.md` claimed that concurrent calls in one process are safe without qualification.
32
+
33
+ ## Decision
34
+
35
+ - **`rag_wright.util.devices`** owns the engine's device policy. Unless told otherwise, it uses CUDA when present.
36
+ On Metal it allows only the BGE family (the embedder and the reranker, the hot path, about 2x faster there).
37
+ Everything else goes to CPU.
38
+ - **Docling** runs on CPU where its `auto` would pick Metal. The engine passes the device explicitly, because
39
+ Docling's default options are built once at import. Docling's output is identical on CPU and Metal (measured on
40
+ the engine's fixtures).
41
+ - **The reference pack's classifiers** (SetFit, Laya) follow the same policy. Packs get it through
42
+ `pack_sdk.torch_device`, which never picks Metal unless asked.
43
+ - **On Metal, every BGE call holds `METAL_LOCK`**, one re-entrant lock per process. Two embedders, or an embedder
44
+ and the reranker, never run on Metal at once. Off Metal each instance keeps its own lock (issue 0016), so a CUDA
45
+ host loses no concurrency.
46
+ - **Explicit choices always win**, `mps` included: `EMBED_DEVICE` (the whole BGE family), `DOCLING_DEVICE`,
47
+ `RAG_SETFIT_DEVICE`, and any `device=` argument. This keeps the crash reproducible, and it means an operator who
48
+ puts a second family on Metal gives up the guarantee.
49
+
50
+ ## Consequences
51
+
52
+ - A product needs no process-per-pipeline workaround. A server may stage an upload's ingest beside query traffic.
53
+ RuleWright can delete `_avoid_mps`, and TexWright can delete its spawned-process seed and the skipped browser test.
54
+ - On Apple Silicon, Docling parses and the pack classifiers run on CPU (slower than Metal), and BGE calls from
55
+ different instances queue behind one another. A CUDA or CPU-only host is unchanged.
56
+ - The rule holds only while engine code chooses the devices. A product's own torch model should take its device from
57
+ `pack_sdk.torch_device`, or it must stay off Metal.
@@ -195,4 +195,5 @@ framing that still appears in older ADRs and the root `SPEC.md`/`plan.md`.
195
195
  0136 A spreadsheet table cut at its blank rows is glued back together after the parse ·
196
196
  0137 A generated answer states the evidence's support every time, and "none" is an abstention ·
197
197
  0138 PDF parses run one at a time, and the engine reaches pdfium through one locked door ·
198
- 0139 The agent harness substrate is engine scope
198
+ 0139 The agent harness substrate is engine scope ·
199
+ 0140 One model family on Metal, under one process lock
@@ -8,7 +8,7 @@
8
8
 
9
9
  The product's view of the engine: the store connection, chosen models (`models`: `ModelRole` value -> model alias), the embedding profile, the `options` catalog (generic `ingest` knobs + each pack's options under `packs`), and `pack`: the path to the domain pack `.ttl` whose KG types `open_workspace` creates (None = only the neutral engine types: Chunk, Entity, Relationship, Mentions, Span, Document, EmbeddedIn, AttachedTo). Defaults just work; override only to trade quality/cost/latency. Implementation details (ArcadeDB, BGE) never cross this boundary.
10
10
 
11
- ### `StoreConfig(host: 'str', port: 'str', user: 'str', password: 'str', backend: 'str' = 'arcadedb', protocol: 'str' = 'http') -> None`
11
+ ### `StoreConfig(host: 'str', port: 'str', user: 'str', password: 'str', backend: 'str' = 'arcadedb', protocol: 'str' = 'http', conflict_attempts: 'Optional[int]' = None, conflict_backoff_cap_s: 'Optional[float]' = None) -> None`
12
12
 
13
13
  How to reach the KG/retrieval store. `backend` selects the implementation (only `arcadedb` today; a new backend -- e.g. Neo4j -- is added here, invisibly to the product).
14
14
 
@@ -88,6 +88,10 @@ A `where` value meaning a comparison, evaluated in the store (ER-1): `gt` (>), `
88
88
 
89
89
  `[(operator, bound), ...]`, lower bound first.
90
90
 
91
+ ### `Contains(text: 'str', case_sensitive: 'bool' = False) -> None`
92
+
93
+ A `where` value meaning "this string field contains `text`", evaluated in the store (PS-54). The match is literal (`%`, `_` and `?` are ordinary characters), case-insensitive unless `case_sensitive=True`, and a field with no value never matches. It composes with equality, membership, `NOT_NULL` and `Range` on every KG call that takes `where`: `where={"composition": Contains("UHMWPE"), "gsm": Range(ge=250, le=320)}`.
94
+
91
95
  ### `BlankPageText(*, source: str, pages: dict[int, str], cache_files: list[str]) -> None`
92
96
 
93
97
  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.
@@ -300,9 +304,9 @@ PS-R3: which member span represents a unit -- a DOMAIN decision. The engine appl
300
304
 
301
305
  One unit -> the domain's typed records (required; the domain-specific step).
302
306
 
303
- ### `RecordWriter: (source_doc_id: 'str', extractions: 'Sequence[UnitExtraction]') -> 'Awaitable[None]'`
307
+ ### `RecordWriter: (source_doc_id: 'str', extractions: 'Sequence[UnitExtraction]') -> 'Awaitable[Optional[int]]'`
304
308
 
305
- Optional: persist a document's extractions. The engine default writes them with `kg_write`.
309
+ Optional: persist a document's extractions. The engine default writes them with `kg_write`. Return the number of records now in the graph (written, or found already written); `None` lets the engine count the record nodes it handed over (RuleWright, 2026-10-31: only the writer knows what landed).
306
310
 
307
311
  ### `BoundaryDiscoverer: (**kwargs)`
308
312
 
@@ -424,7 +428,7 @@ Rank the live ARD catalog by semantic match to `query`; return the top `k` (opti
424
428
 
425
429
  ### `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]'`
426
430
 
427
- 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. Every name is checked, never interpolated unchecked (the module docstring): a request-chosen field is safe, but an unknown one matches nothing.
431
+ 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), a `Range` (comparisons, on any number of fields: `{"weight": Range(ge=180, le=220), "tensile": Range(gt=400)}`) or a `Contains` (a literal substring, case-insensitive unless `case_sensitive=True`; an empty field never matches: `{"composition": Contains("UHMWPE")}`); 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. Every name is checked, never interpolated unchecked (the module docstring): a request-chosen field is safe, but an unknown one matches nothing.
428
432
 
429
433
  ### `kg_write(ws: 'WorkspaceHandle', nodes: 'list', edges: 'Any' = ()) -> 'None'`
430
434
 
@@ -436,7 +440,7 @@ Generic edge TRAVERSAL over the workspace (see `Store.kg_edges`): node-start out
436
440
 
437
441
  ### `kg_count(ws: 'WorkspaceHandle', type_name: 'str', *, where: 'Optional[dict]' = None, key_range: 'Optional[tuple]' = None) -> 'int'`
438
442
 
439
- 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.
443
+ The number of vertices or edges of `type_name` matching `where` / `key_range` (see `Store.kg_count`); `where` as in `kg_read`, `Range` and `Contains` values included.
440
444
 
441
445
  ### `kg_delete(ws: 'WorkspaceHandle', type_name: 'str', *, where: 'Optional[dict]' = None, key_range: 'Optional[tuple]' = None) -> 'int'`
442
446
 
@@ -116,11 +116,11 @@ Write the document's nodes/edges (one transaction), unless an unchanged run alre
116
116
 
117
117
  The graph query capability's output: candidate answers as evidence for fusion (FR-C.5, FR-Q.3).
118
118
 
119
- ### `BGEReranker(model_name: 'str' = 'BAAI/bge-reranker-v2-m3', *, use_fp16: 'bool' = False, model: 'object | None' = None) -> 'None'`
119
+ ### `BGEReranker(model_name: 'str' = 'BAAI/bge-reranker-v2-m3', *, use_fp16: 'bool' = False, device: 'str | None' = None, model: 'object | None' = None) -> 'None'`
120
120
 
121
- The real reranker: `FlagEmbedding.FlagAutoReranker` (model loaded lazily).
121
+ The real reranker: a `sentence_transformers.CrossEncoder` over `bge-reranker-v2-m3` (PS-56), scoring raw logits (no activation), 512 tokens per pair as before.
122
122
 
123
- THREAD-SAFE (engine issue 0016): FlagEmbedding mutates the model in place on every call (the same in-place `.to()`/`.eval()` conversions that segfault the shared BGE-M3 embedder under thread concurrency), so a shared reranker is guarded by an instance lock too -- defense-in-depth for any concurrent `score` caller.
123
+ THREAD-SAFE (engine issue 0016): a shared reranker is guarded by an instance lock -- defense-in-depth for any concurrent `score` caller (its FlagEmbedding predecessor mutated the model in place on every call). It is in the BGE family: its device follows the embedder's (`EMBED_DEVICE`), and on Metal its lock is the process-wide one the embedders hold (PS-55), so a rerank never runs on Metal beside an embed.
124
124
 
125
125
  #### `BGEReranker.score(self, query: 'str', passages: 'list[str]') -> 'list[float]'`
126
126
 
@@ -182,7 +182,7 @@ Group into units (checked), attach table rows, extract each unit concurrently (p
182
182
 
183
183
  #### `IngestionStages.write(self, sd: 'Any', extractions: 'list') -> 'int'`
184
184
 
185
- Persist the records (the domain's writer, else `kg_write`). Returns the number of record nodes.
185
+ Persist the records (the domain's writer, else `kg_write`). Returns the number that landed: the writer's own count when it returns one; else the record nodes handed over, which the default `kg_write` lands in one transaction (it raises rather than land part of them).
186
186
 
187
187
  #### `IngestionStages.write_document_node(self, doc_id: 'str', *, parent_id: 'Optional[str]', filename: 'str', media_type: 'str', sha256: 'str', metadata: 'Optional[dict]' = None) -> 'None'`
188
188
 
@@ -358,6 +358,10 @@ True when at least one usage scope is active — the seam checks this to decide
358
358
 
359
359
  The models root (see the module docstring for the resolution order).
360
360
 
361
+ ### `torch_device(explicit: 'Optional[str]' = None, *, env: 'Optional[str]' = None, metal: 'bool' = False) -> 'str'`
362
+
363
+ The device for one engine model: `explicit`, else the `env` variable, else CUDA when present, else Metal only for the family allowed on it (`metal=True`, the BGE family), else CPU.
364
+
361
365
  ### `business_span(name: 'str', **attributes: 'Any') -> 'Iterator[Any]'`
362
366
 
363
367
  A domain/business span on the AMBIENT tracer (never a new provider). No-op when OTel is absent.
@@ -45,6 +45,14 @@ configuration change takes effect without a restart ([`workspaces.md`](workspace
45
45
  | `password` | `str` | — | password |
46
46
  | `backend` | `str` | `"arcadedb"` | store implementation (only `arcadedb` today) |
47
47
  | `protocol` | `str` | `"http"` | `http` locally; `https` for a remote/Modal store |
48
+ | `conflict_attempts` | `int \| None` | `None` | attempts per write when ArcadeDB reports a write conflict (`None`: `ARCADEDB_CONFLICT_ATTEMPTS`, else 20) |
49
+ | `conflict_backoff_cap_s` | `float \| None` | `None` | the longest wait between those attempts, in seconds (`None`: `ARCADEDB_CONFLICT_BACKOFF_CAP_S`, else 2) |
50
+
51
+ Concurrent writers that touch the same page get a write conflict; the store retries the write (the failed
52
+ transaction is rolled back whole) with a doubling wait from 10 ms up to the cap. Two writers creating the same new
53
+ node by `kg_write` get a duplicate key instead, which is retried the same way. A write that is still conflicting
54
+ after the last attempt raises, about 25 s after the first one with the defaults. Raise the budget when more than
55
+ eight documents write into one graph at once.
48
56
 
49
57
  `StoreConfig.from_env()` builds one from `ARCADEDB_HOST` (default `localhost`), `ARCADEDB_PORT` (required: no
50
58
  default, so an unset variable cannot reach another instance on the machine),
@@ -284,6 +292,7 @@ Prefer config; use env for secrets and for non-API callers. The common ones the
284
292
  | variable | purpose |
285
293
  |---|---|
286
294
  | `ARCADEDB_HOST` / `ARCADEDB_PORT` / `ARCADEDB_USER` / `ARCADEDB_PASSWORD` / `ARCADEDB_DATABASE` / `ARCADEDB_PROTOCOL` | store connection: `StoreConfig.from_env()` reads them (and the scripts do); `open_workspace` itself reads only the `StoreConfig` it is given |
295
+ | `ARCADEDB_CONFLICT_ATTEMPTS` / `ARCADEDB_CONFLICT_BACKOFF_CAP_S` | the write-conflict retry budget when `StoreConfig.conflict_attempts` / `conflict_backoff_cap_s` are unset |
287
296
  | `OPENROUTER_API_KEY` / `OPENROUTER_BASE_URL` / `OPENROUTER_PROVIDER` / `OPENROUTER_ALLOW_FALLBACKS` | OpenRouter access + provider routing (`OPENROUTER_SORT` / `OPENROUTER_PROVIDER_ORDER`: the contracts pack's docling-graph extraction only) |
288
297
  | `RAG_SERVING` / `VLLM_BASE_URL` / `VLLM_API_KEY` / `STACK_URL` | serving backend (openrouter \| vllm) + self-hosted endpoint |
289
298
  | `RAG_MODEL_<ROLE>` (e.g. `RAG_MODEL_GENERAL`, `RAG_MODEL_VISION_OCR`) / `RAG_MODEL_ALL` / `RAG_GRAPH_EXTRACT_MODEL` / `RAG_DECISION_MODEL` | model overrides (one role / all roles / graph extraction / decision-model profile) |
@@ -294,7 +303,8 @@ Prefer config; use env for secrets and for non-API callers. The common ones the
294
303
  | `RAG_MODEL_DEADLINE_S` | total wall-clock limit for one model call across its retries (default: follows `RAG_STRUCTURED_TIMEOUT_S`, never under 180 s) |
295
304
  | `RAG_SPACY_MODEL` | the spaCy model name for the optional NER extra |
296
305
  | `RAG_MODELS_DIR` | the models root every trained classifier loads its weights from (default: the engine checkout's `data/models` when it exists, else `./data/models`); fill it with `scripts/fetch_reference_models.py` for the reference pack |
297
- | `EMBED_DEVICE` / `RAG_SETFIT_DEVICE` / `RAG_SETFIT_CLAUSE_DIR` / `RAG_SETFIT_THRESHOLD` / `RAG_SETFIT_TOPK` | embedder / classifier device + fleet knobs (`RAG_SETFIT_CLAUSE_DIR` overrides `<models root>/setfit_clause`) |
306
+ | `EMBED_DEVICE` / `DOCLING_DEVICE` / `RAG_SETFIT_DEVICE` | where the local models run. Unset: CUDA when present; on Apple Silicon the BGE embedder and reranker (`EMBED_DEVICE`) run on Metal under one process lock and Docling and the classifiers on CPU, because Metal is not safe for concurrent use (PS-55, `docs/workspaces.md`). An explicit value, `mps` included, always wins |
307
+ | `RAG_SETFIT_CLAUSE_DIR` / `RAG_SETFIT_THRESHOLD` / `RAG_SETFIT_TOPK` | classifier fleet knobs (`RAG_SETFIT_CLAUSE_DIR` overrides `<models root>/setfit_clause`) |
298
308
  | `LANGFUSE_PUBLIC_KEY` / `LANGFUSE_SECRET_KEY` / `LANGFUSE_HOST` / `RAG_TRACE_LEVEL` | observability (Langfuse tracing; see [`OBSERVABILITY.md`](OBSERVABILITY.md)) |
299
309
  | `RAG_EVAL_BACKEND` | `local` (default) or `langfuse`: where `arun_eval` runs when its `langfuse` argument is not given. `langfuse` needs the Langfuse keys and a gold set with `local_only=False`; a `local_only` gold set is refused before anything is sent |
300
310
 
@@ -59,7 +59,9 @@ parse → chunk → segment (+ optional tag) → index (embed each span → the
59
59
  A unit holding exactly one data row of a parsed table carries that row as `Unit.table_row` (exact cells).
60
60
  - **extract**: your `extractor` turns each unit into **typed records** (`UnitExtraction`: `KgNode`s and `KgEdge`s
61
61
  in your pack's schema). This is the domain-specific step.
62
- - **write**: persist the records (your `writer`, else `kg_write`), then a generic `Document` node per document.
62
+ - **write**: persist the records (your `writer`, else `kg_write`), then a generic `Document` node per document. Your
63
+ `writer` returns the number of records now in the graph (the report's `records`), or `None` to let the engine count
64
+ the record nodes it handed over.
63
65
  - **entity graph + resolve**: not run by default. Run your entity extraction and resolution in a `document_hook`
64
66
  (see [entity resolution](entity-resolution.md)).
65
67
 
@@ -125,4 +125,10 @@ in two at the PS-6 gate so the store rewrite is its own visible task. One task,
125
125
  | PS-51 | RuleWright's request (`docs/engine-requests/2026-10-28-the-frontend-skill-never-says-what-the-shell-looks-like.md`, their repo; TexWright shipped a top bar, no rail, no detail region, no current-surface state): `building-a-product-frontend` gains Decision 2, the shell's regions (`rail | main detail` over a reserved run row, entailed by the six things; a horizontal bar cannot grow; four columns do not fit at 1440px), the registry's real fields (`nav: { label, end }`, no `icon`), `aria-current` and more than colour with its test, the shell before the surfaces in the build order, two checklist items, and a shipped scaffold (`scaffold/surfaces.tsx`, `ShellLayout.tsx`, `ShellLayout.test.tsx`) | scaffold: strict `tsc`, 7/7 jsdom tests, the `end` and `aria-current` guards proved by planting; a production build measured in Chromium at 1440x900 (rail 256px, detail beside main, 44px links); `test_shipped_skills.py` checks the scaffold is named and ships in wheel + sdist | done 2026-10-28 |
126
126
  | PS-52 | TexWright's request (`docs/engine-requests/2026-10-24-workspace-embedder-is-not-thread-safe.md`, their repo): `WorkspaceHandle._embedder` was an unguarded check-then-set, so threads arriving at first use each built a model (`arun_eval(concurrency=4)`: four loads, then a SIGSEGV; each `BGEM3Embedder` locks only itself). A per-handle lock with a double check builds one; `ws.embedder`, `workspace_embedder` and `span_search` say the embedder may be called from several threads | a hermetic 8-thread first-use test (8 builds before, 1 after); live BGE-M3, 4 threads x 3 runs: 4 models in 12-18s before, 1 model in ~6s after; API reference regenerated | done 2026-10-28 |
127
127
  | PS-53 | TexWright's request (`docs/engine-requests/2026-10-21-identifiers-in-kg-queries-are-interpolated-unescaped.md`, their repo): KG calls escaped VALUES but interpolated NAMES raw (`where={"1=1 OR id": NOT_NULL}` returned every row). Every name a KG call puts into SQL is now checked first (types; `where` / `key_range` / `set` / `fields` / `distinct` fields; `order_by` terms; `kg_edges` select aliases and expressions; `KgNode` / `KgEdge` properties, key fields and types): an identifier, `@rid`/`@type`/`@in`/`@out` where read, `field [ASC|DESC]`, or a field on `c.`/`e.`/`v.`/`inV().`/`outV().`; else `ValueError`, nothing sent. Unknown fields still match nothing (undeclared properties are supported, the engine's own types carry them); the API docstrings say so | 29 hermetic cases (28 fail before); TexWright's payloads refused live; full hermetic (2327) and live store (67) suites green | done 2026-10-28 |
128
+ | PS-54 | TexWright's request (`docs/engine-requests/2026-10-19-substring-match-in-the-kg-filter-grammar.md`, their repo): the KG filter grammar had no substring predicate ("composition contains UHMWPE" over free text). `Contains(text, case_sensitive=False)`, a `where` value beside `Range` on every KG call that takes `where`: a literal `indexOf` test (not `LIKE`, whose `%`, `_` and `?` are wildcards, measured live), case folded on both sides in the store, a field with no value never matches, empty text refused | 8 hermetic tests (red before) + a live test (case both ways, literal wildcards, quotes and backslashes, accents, missing values, with `Range`, `kg_count`, a `kg_edges` traversal filtered at all three points); full hermetic (2353) and live store (42) suites green | done 2026-10-29 |
129
+ | PS-55 | TexWright's request (`docs/engine-requests/2026-10-25-two-model-families-in-one-process-abort-on-metal.md`, their repo): Metal is not safe for concurrent use and the engine put three families on it automatically (BGE-M3, the BGE reranker, Docling's layout/table/RapidOCR models), then ran them on different threads (an ingest embeds while it parses; a server embeds a query while an upload parses), so a process aborted in Metal. RuleWright had measured and pinned it in their own seam (T-7.25/T-7.46), never adopted here. `rag_wright.util.devices` (ADR-0140): only the BGE family on Metal, every call there under one process lock (`METAL_LOCK`); Docling and the pack classifiers on CPU where Metal would be picked (`pack_sdk.torch_device`); explicit device variables win; CUDA/CPU hosts unchanged; `docs/workspaces.md` corrected | red, torch 2.14.1 (TexWright's env, this engine tree): embedder + Docling in two threads, 6/6 child runs died in seconds (5 SIGABRT with their assertion, 1 SIGSEGV; OCR and PDF); torch 2.12.1 never failed. Green, same interpreter: 9/9 runs survived 150s each (OCR, PDF, two embedders). Full hermetic (2361) and live embed/parse/store (60) suites green. 8 hermetic tests (4 behaviour tests red before); Docling output identical CPU vs Metal | done 2026-10-29 |
130
+ | PS-56 | Found during PS-55: `BGEReranker` failed on every call (`XLMRobertaTokenizer has no attribute prepare_for_model`): FlagEmbedding's `FlagAutoReranker.compute_score` calls a tokenizer method transformers 5 removed, so the reference pack's `intra_document_qa` rerank (and RuleWright's copy) and any product composing `BGEReranker` over `span_search` hits were broken. The reranker is now a `sentence_transformers.CrossEncoder` (already a dependency) over the same `bge-reranker-v2-m3`, raw logits, 512 tokens per pair; same `BGEReranker` API, device and lock (PS-55) | red: the live reranker test failed on the tokenizer error. Green: it passes, plus a one-pair and a >512-token case; CrossEncoder's logits equal the model card's plain-transformers recipe (max abs diff 0.0, truncated passage included); embedder + reranker on Metal under the shared lock, torch 2.14.1: 3/3 runs survived 150s, 590 reranks and 586 embeds, none failing (before: the rerank thread died on its first call); full hermetic (2361) green | done 2026-10-29 |
131
+ | PS-57 | RuleWright's request (`docs/engine-requests/2026-10-31-a-write-conflict-loses-a-documents-clauses-and-your-pack-carries-the-defect.md`, their repo): at 4 concurrent documents, 2 of 15 reported `ingested` with zero clauses. The contracts pack's `write` node popped the pending extractions (filled by `extract_clauses`) before the store write landed, so the node's retry wrote nothing and reported success; it now reads them and releases them after the write. The conflict budget is reachable: `StoreConfig.conflict_attempts` / `conflict_backoff_cap_s`, else `ARCADEDB_CONFLICT_ATTEMPTS` / `ARCADEDB_CONFLICT_BACKOFF_CAP_S`; default raised 10 attempts / 0.5 s cap to 20 / 2 s. Found by the live probe: two writers creating the same new node get a duplicate key, never retried; `kg_write` and `write_graph` (UPSERT-only) now retry it | pack retry test through the real per-document graph (0/3 clauses landed before, 3/3 after); six store tests; live probe (clause-shaped transactions over shared value nodes, pooled sessions): old budget lost 38/2,400 at 4 and 8 writers, new lost 0/2,400 at the same wall-clock; live store suite 42 passed | done 2026-11-01 |
132
+ | PS-58 | RuleWright's request (`docs/engine-requests/2026-10-31-ingestionstages-write-returns-a-count-derived-from-its-own-input.md`, their repo): `IngestionStages.write` returned the record nodes it was handed, and `RecordWriter` (declared `-> None`) could not say what landed. A writer now returns the number of records in the graph (`Optional[int]`; `None` keeps the engine's count); the default `kg_write` branch keeps the handed-over count, true because that write is one transaction (lands whole or raises). The contracts pack's writer returns the clauses in the graph and its `write` node reports that as `clauses` | three hermetic tests + the PS-57 retry test's count (red before, green after); live `build_ingestion` on two fixtures: default and a writer landing every other record, `records` equals the graph in all four documents | done 2026-11-01 |
133
+ | PS-59 | Found during PS-57: the ArcadeDB client opens a new connection for every request (`requests.post`, no session); at 8 concurrent writers against Docker on macOS about two thirds of writes failed with `RemoteDisconnected`, and with a keep-alive session per thread the same run lost none. Give the store's client a pooled session | live probe at 8 writers: zero connection drops | done 2026-11-01: the store's client (`_PooledClient`) keeps one keep-alive `requests.Session` per thread and `ArcadeDBStore.close()` releases them; live, the same probe lost 374 of 800 transactions to `RemoteDisconnected` unpooled and 0 of 800 at 8 writers and 0 of 1,600 at 16 pooled |
128
134
  | PS-48 | Port the agent harness's substrate behaviour tests from RuleWright onto the engine's fabric fixture (ADR-0139 handover): of RuleWright's 553 harness-touching tests, 314 test the substrate (port), 213 RuleWright's composition (stay), 25 live (1 substrate: OpenRouter cost accounting). Seven gated sub-tasks: **a** shared `tests/harness/fabric.py` + scripting/slow/hanging/failing fake models + `InMemorySaver` helpers, then events, skills, clarify (~23); **b** models and errors (~42); **c** runs, confirm, continuation (~32); **d** decisions and rules (~51); **e** grading (~32); **f** seen and memory (~41); **g** workers, batch, dispatch, tiers, agent wiring, filesystem, interpreter, withhold + the live accounting test (~93, may split). Ambiguous tests split, not moved whole; a ported test failing on engine code is a substrate defect fixed in that sub-task; deadline globals via monkeypatch; no new dependencies. Follow-up (owner RuleWright): retire its substrate duplicates once ported | each sub-task's ported tests green on the fabric fixture | todo (proposed; awaiting go-ahead) |
@@ -31,11 +31,18 @@ crosses corpora: every read and write goes through the handle's store.
31
31
  | per process | the serving backend and endpoints, provider routing, call timeouts | `RAG_SERVING`, `VLLM_BASE_URL`, `OPENROUTER_*`, `RAG_*_TIMEOUT_S` |
32
32
  | per process | the decision model's profile (one call can name another in the `jev_decision` input `model`) | `RAG_DECISION_MODEL` |
33
33
  | per process | trained classifier weights and their knobs | `RAG_MODELS_DIR`, `RAG_SETFIT_*` |
34
+ | per process | where the local models run (Metal, CUDA or CPU) | `EMBED_DEVICE`, `DOCLING_DEVICE`, `RAG_SETFIT_DEVICE` |
34
35
  | per process | one cached handle per corpus, replaced when the corpus is opened with a different config | see "Changing a workspace's configuration" |
35
36
  | per process | the reference pack's graph-extraction model and its standalone MCP servers (they read the environment when they start) | `RAG_GRAPH_EXTRACT_MODEL`; one server process per deployment |
36
37
 
37
38
  Concurrent calls for different workspaces in one process are safe: each call resolves its own workspace's models,
38
- and metering and trace scopes belong to the call that opened them.
39
+ and metering and trace scopes belong to the call that opened them. That includes Apple Silicon, where it takes one
40
+ rule (PS-55): PyTorch's Metal backend is not safe for concurrent use (two threads running models on it abort the
41
+ process inside Metal, which no caller can catch), so the engine keeps only its BGE models (the embedder and the
42
+ reranker) on Metal, every call to them under one process-wide lock, and runs Docling and the classifiers on CPU. A
43
+ query embedding in a server and an upload's parse in the same process therefore never meet on Metal. Setting
44
+ `DOCLING_DEVICE=mps` or `RAG_SETFIT_DEVICE=mps` puts a second family back on Metal and gives this up; a pack's own
45
+ torch model takes its device from `pack_sdk.torch_device`, which never picks Metal unless asked.
39
46
 
40
47
  ## Managing workspaces
41
48
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "rag-wright"
3
- version = "0.15.0"
3
+ version = "0.16.1"
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"
@@ -51,6 +51,7 @@ dependencies = [
51
51
  "pypdfium2>=5.11",
52
52
  "pyshacl>=0.40.1",
53
53
  "python-dotenv>=1.2",
54
+ "requests>=2.34.2",
54
55
  "scikit-learn>=1.9.1",
55
56
  "sentence-transformers>=6.1.0",
56
57
  "transformers>=5.4,<5.9",
@@ -28,7 +28,7 @@ Repository paths in this skill (`docs/`, `eval/`, `scripts/`, `tests/`, `src/`)
28
28
  | group spans into units | engine default, domain may override | a heading starts a unit, a table stays whole (a record table is one unit per row), page furniture dropped, units capped | `unit_grouper=`, `boundary_decider=` |
29
29
  | choose each unit's representative span (its `anchor` + leading tag) | **domain decision**, optional | the grouper's choice: the first member, often a heading | `unit_representative=` |
30
30
  | extract records from a unit | **domain (required)** | (none) | the `extractor` argument |
31
- | write records | engine default | `kg_write` | `writer=` |
31
+ | write records | engine default | `kg_write` | `writer=` (returns the number of records now in the graph, or `None`) |
32
32
  | per-document follow-up (e.g. an entity graph) | domain, optional | none | `document_hook=` |
33
33
  | `Document` node, embedded children (`EmbeddedIn` / `AttachedTo`), progress, dead-lettering | engine | always on | (none) |
34
34
 
@@ -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`, `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 |
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`, `Contains`, 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 |
@@ -28,8 +28,8 @@ open-core and domain-neutral; your product brings the domain. Hard rules:
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
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;
31
+ are equality, a list for membership, `NOT_NULL`, a `Range(gt=, ge=, lt=, le=)` or a `Contains(text, case_sensitive=False)` (a literal
32
+ substring; an empty field never matches) on any number of fields, evaluated in the store;
33
33
  `entities_by_name`, `span_positions`), hybrid span search (`span_search` / `aspan_search`: cited spans from
34
34
  the dense and sparse index, fused in the store), `pack_store(ws, cls)` (build your pack's store extension over the
35
35
  workspace's store; the store itself stays private), metering and tracing (`measure_usage`, `record_usage`,
@@ -71,7 +71,7 @@ from rag_wright.evals import (GoldImportError, GoldMapping, aload_gold_set, arun
71
71
  score_candidate_choice, score_classification, score_extraction, score_generation,
72
72
  score_ingestion, score_judgment, score_relational, score_retrieval)
73
73
  from rag_wright.ingestion.tables import table_rows
74
- from rag_wright.store.seam import NOT_NULL, KgEdge, KgNode, Range
74
+ from rag_wright.store.seam import NOT_NULL, Contains, KgEdge, KgNode, Range
75
75
  from rag_wright.api.invoke import ainvoke_model, ainvoke_subgraph, capability_index, invoke_model
76
76
  from rag_wright.api.kg import (aspan_search, entities_by_name, kg_count, kg_delete, kg_edges, kg_read, kg_update,
77
77
  kg_write, span_positions, span_search)
@@ -114,7 +114,7 @@ __all__ = [
114
114
  "query_embedder", # PS-39: the process-wide query embedder, for a seam that holds no workspace
115
115
  "ModelRole", # PS-1 (G17): WorkspaceHandle.model_id(role) and EngineConfig.models need it
116
116
  "ainvoke_subgraph", "invoke_model", "ainvoke_model", "capability_index", "discover", "Discovered",
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",
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", "Contains",
118
118
  "document_of", "decode_bbox",
119
119
  "source_document", "parse_document", "aparse_document", "parse_document_bytes", "pdf_page_count", "aparse_document_bytes",
120
120
  "find_blank_pages_with_text", "BlankPageText", # PS-47: cached parses holding text a VLM invented for a blank page
@@ -23,6 +23,10 @@ class StoreConfig:
23
23
  password: str
24
24
  backend: str = "arcadedb"
25
25
  protocol: str = "http"
26
+ # RuleWright (2026-10-31): the write-conflict retry budget. None: `ARCADEDB_CONFLICT_ATTEMPTS` /
27
+ # `ARCADEDB_CONFLICT_BACKOFF_CAP_S`, else 20 attempts with each wait capped at 2 s (about 25 s in all).
28
+ conflict_attempts: Optional[int] = None
29
+ conflict_backoff_cap_s: Optional[float] = None
26
30
 
27
31
  @classmethod
28
32
  def from_env(cls) -> "StoreConfig":
@@ -30,8 +30,10 @@ def kg_read(ws: WorkspaceHandle, node_type: str, *, where: Optional[dict] = None
30
30
  distinct: Optional[str] = None, order_by: Optional[str] = None, limit: Optional[int] = None,
31
31
  key_range: Optional[tuple] = None) -> list[dict]:
32
32
  """Read typed nodes of `node_type` from the workspace (see `Store.kg_read`). Each `where` value is a scalar
33
- (equality), a list (membership; an empty list is scope-to-nothing -> `[]`), `NOT_NULL` (presence) or a `Range`
34
- (comparisons, on any number of fields: `{"weight": Range(ge=180, le=220), "tensile": Range(gt=400)}`); all
33
+ (equality), a list (membership; an empty list is scope-to-nothing -> `[]`), `NOT_NULL` (presence), a `Range`
34
+ (comparisons, on any number of fields: `{"weight": Range(ge=180, le=220), "tensile": Range(gt=400)}`) or a
35
+ `Contains` (a literal substring, case-insensitive unless `case_sensitive=True`; an empty field never matches:
36
+ `{"composition": Contains("UHMWPE")}`); all
35
37
  filters are AND-ed and evaluated in the store. `key_range=(field, lo, hi)` is the half-open shorthand
36
38
  (`lo <= field < hi`). Then projection, distinct, order and limit. Every name is checked, never interpolated
37
39
  unchecked (the module docstring): a request-chosen field is safe, but an unknown one matches nothing."""
@@ -42,7 +44,7 @@ def kg_read(ws: WorkspaceHandle, node_type: str, *, where: Optional[dict] = None
42
44
  def kg_count(ws: WorkspaceHandle, type_name: str, *, where: Optional[dict] = None,
43
45
  key_range: Optional[tuple] = None) -> int:
44
46
  """The number of vertices or edges of `type_name` matching `where` / `key_range` (see `Store.kg_count`); `where`
45
- as in `kg_read`, `Range` values included."""
47
+ as in `kg_read`, `Range` and `Contains` values included."""
46
48
  return ws._store.kg_count(type_name, where=where, key_range=key_range)
47
49
 
48
50
 
@@ -131,7 +131,9 @@ def _build_store(config: EngineConfig, corpus: str, *, reset: bool, create: bool
131
131
  from rag_wright.store.arcadedb import ArcadeDBStore
132
132
 
133
133
  return ArcadeDBStore.from_config(sc.host, sc.port, sc.user, sc.password, database=corpus,
134
- protocol=sc.protocol, reset=reset, pack_ttl=config.pack, create=create)
134
+ protocol=sc.protocol, reset=reset, pack_ttl=config.pack, create=create,
135
+ conflict_attempts=sc.conflict_attempts,
136
+ conflict_backoff_cap_s=sc.conflict_backoff_cap_s)
135
137
 
136
138
 
137
139
  def drop_workspace(config: EngineConfig, *, corpus: str) -> bool:
@@ -17,7 +17,6 @@ from __future__ import annotations
17
17
 
18
18
  import asyncio
19
19
  import math
20
- import threading
21
20
  from typing import Protocol, runtime_checkable
22
21
 
23
22
  from pydantic import BaseModel, field_validator
@@ -63,49 +62,43 @@ class ChunkEmbedding(BaseModel):
63
62
 
64
63
 
65
64
  def _resolve_device(device: str | None) -> str:
66
- """The device to run BGE-M3 on: explicit arg, else `EMBED_DEVICE`, else auto (Metal `mps` when available,
67
- else `cpu`). Auto-MPS offloads embedding from the CPU (freeing it for LegalBERT + extraction during ingest)
68
- and is ~2x faster; the vectors are bit-for-bit equivalent to CPU (verified cosine 1.0), so it is a pure
69
- speed choice, not a semantic one."""
70
- import os
71
-
72
- chosen = device or os.environ.get("EMBED_DEVICE")
73
- if chosen:
74
- return chosen
75
- try:
76
- import torch
77
-
78
- if torch.backends.mps.is_available():
79
- return "mps"
80
- if torch.cuda.is_available(): # a GPU box (e.g. the bulk-ingestion VM) -> use the GPU
81
- return "cuda"
82
- except Exception: # noqa: BLE001 - torch/device probing must never break model construction
83
- pass
84
- return "cpu"
65
+ """The device to run the BGE family (this embedder and `BGEReranker`) on: explicit arg, else `EMBED_DEVICE`,
66
+ else CUDA, else Metal `mps`, else `cpu`. Metal offloads embedding from the CPU and is ~2x faster; the vectors
67
+ are bit-for-bit equivalent to CPU (verified cosine 1.0), so it is a pure speed choice. The BGE family is the
68
+ ONE family the engine puts on Metal, and every call to it there holds the process-wide Metal lock (PS-55,
69
+ `rag_wright.util.devices`)."""
70
+ from rag_wright.util.devices import torch_device
71
+
72
+ return torch_device(device, env="EMBED_DEVICE", metal=True)
85
73
 
86
74
 
87
75
  class BGEM3Embedder:
88
76
  """The real embedder: BGE-M3 via `FlagEmbedding.BGEM3FlagModel` (model loaded lazily).
89
77
 
90
- THREAD-SAFE (engine issue 0016): FlagEmbedding mutates the model IN PLACE on every `encode`
78
+ THREAD-SAFE (engine issue 0016, PS-55): FlagEmbedding mutates the model IN PLACE on every `encode`
91
79
  (`self.model.float()` / `.to(device)` / `.eval()`), and those C++ conversions release the GIL, so two threads
92
80
  driving one shared model swap the same parameter-tensor storage under each other and SEGFAULT the interpreter
93
81
  (not a catchable exception). The engine SHARES one `Embedder` across concurrent-document ingestion
94
82
  (`run_job(max_concurrency=...)` -> per-document `encode_batch`) and across `embed_chunks`' per-chunk thread
95
83
  fan-out. So every model call is serialized by an instance lock. The lock guards ONLY `self._model.encode`
96
84
  (the numpy results are per-call, thread-local); the serialized section is the CPU/GPU encode, which is a small
97
- slice of ingest time -- the concurrency worth overlapping is the network-bound extraction, not the encode."""
85
+ slice of ingest time -- the concurrency worth overlapping is the network-bound extraction, not the encode.
86
+ On Metal the lock is the process-wide `METAL_LOCK` instead (PS-55): Metal is not safe for concurrent use, and a
87
+ process can hold several embedders (the query embedder, each workspace's) plus the reranker."""
98
88
 
99
89
  def __init__(self, model_name: str = "BAAI/bge-m3", *, use_fp16: bool = False,
100
90
  device: str | None = None, batch_size: int = 64, model: object | None = None) -> None:
101
91
  self._batch_size = batch_size # cross-item independent, so batching never changes a vector, only speed
102
- self._lock = threading.Lock() # issue 0016: serialize the in-place-mutating BGE-M3 encode across threads
92
+ from rag_wright.util.devices import model_lock
93
+
94
+ resolved = _resolve_device(device)
95
+ self._lock = model_lock(resolved) # issue 0016 per instance; on Metal one lock per process (PS-55)
103
96
  if model is not None: # injected (hermetic tests) -- avoids loading the real model
104
97
  self._model = model
105
98
  else:
106
99
  from FlagEmbedding import BGEM3FlagModel
107
100
 
108
- self._model = BGEM3FlagModel(model_name, use_fp16=use_fp16, devices=_resolve_device(device))
101
+ self._model = BGEM3FlagModel(model_name, use_fp16=use_fp16, devices=resolved)
109
102
 
110
103
  def encode_dense(self, text: str) -> list[float]:
111
104
  with self._lock: # issue 0016
@@ -70,12 +70,29 @@ def _thread_converter():
70
70
  keep their own)."""
71
71
  converter = getattr(_THREAD, "converter", None)
72
72
  if converter is None:
73
- from docling.document_converter import DocumentConverter
74
-
75
- converter = _THREAD.converter = DocumentConverter()
73
+ converter = _THREAD.converter = _new_converter()
76
74
  return converter
77
75
 
78
76
 
77
+ def _new_converter():
78
+ """Docling's converter with the engine's device for its layout, table and OCR models (PS-55): `cpu` where
79
+ Docling's `auto` would pick Metal, which is not safe for concurrent use and is kept for the BGE family;
80
+ `DOCLING_DEVICE` when set; else Docling's own choice. Passed explicitly because Docling's default options are
81
+ built once, at import. The output is identical on CPU and Metal (measured on the engine's fixtures)."""
82
+ from docling.datamodel.accelerator_options import AcceleratorOptions
83
+ from docling.datamodel.base_models import InputFormat
84
+ from docling.datamodel.pipeline_options import PdfPipelineOptions
85
+ from docling.document_converter import DocumentConverter, ImageFormatOption, PdfFormatOption
86
+
87
+ from rag_wright.util.devices import docling_device
88
+
89
+ def options() -> PdfPipelineOptions:
90
+ return PdfPipelineOptions(accelerator_options=AcceleratorOptions(device=docling_device()))
91
+
92
+ return DocumentConverter(format_options={InputFormat.PDF: PdfFormatOption(pipeline_options=options()),
93
+ InputFormat.IMAGE: ImageFormatOption(pipeline_options=options())})
94
+
95
+
79
96
  class DoclingParser:
80
97
  """The real parser: Docling's `DocumentConverter` (the calling thread's, reused across documents). Built
81
98
  lazily so importing the capability (and the hermetic tests) does not load Docling's models."""