rag-wright 0.6.0__tar.gz → 0.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rag_wright-0.6.0/src/rag_wright/.agents → rag_wright-0.8.0/.claude}/skills/building-an-ingestion-capability/SKILL.md +5 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/.claude/skills/creating-evals/SKILL.md +112 -36
- {rag_wright-0.6.0 → rag_wright-0.8.0}/.claude/skills/qwen-vllm-modal/SKILL.md +46 -20
- rag_wright-0.8.0/.claude/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +164 -0
- rag_wright-0.8.0/.claude/skills/qwen-vllm-modal/scripts/rw_gate.py +58 -0
- {rag_wright-0.6.0/src/rag_wright/.agents → rag_wright-0.8.0/.claude}/skills/using-the-rag-wright-engine/SKILL.md +20 -2
- rag_wright-0.8.0/.release-please-manifest.json +3 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/CHANGELOG.md +32 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/CLAUDE.md +12 -2
- {rag_wright-0.6.0 → rag_wright-0.8.0}/PKG-INFO +4 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/README.md +2 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0109-vllm-cold-start-reduction.md +39 -0
- rag_wright-0.8.0/docs/adr/0132-model-server-cold-start-from-a-gpu-snapshot.md +45 -0
- rag_wright-0.8.0/docs/adr/0133-model-call-deadline-follows-the-timeout-and-a-thinking-cap.md +40 -0
- rag_wright-0.8.0/docs/adr/0134-skills-for-product-developers-are-linked-per-project-never-globally.md +39 -0
- rag_wright-0.8.0/docs/adr/0135-the-seam-gives-each-event-loop-its-own-async-http-client.md +29 -0
- rag_wright-0.8.0/docs/adr/0136-spreadsheet-tables-are-glued-back-across-blank-rows.md +38 -0
- rag_wright-0.8.0/docs/adr/0137-generated-answers-state-their-support-and-none-is-an-abstention.md +34 -0
- rag_wright-0.8.0/docs/adr/0138-the-engine-reaches-pdfium-through-one-locked-door.md +39 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/README.md +10 -3
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/api/README.md +115 -9
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/api/pack_sdk.md +7 -3
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/configuration.md +28 -10
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/domain-adaptation/README.md +3 -2
- rag_wright-0.8.0/docs/domain-adaptation/evals-from-expert-files.md +46 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/domain-adaptation/kg-construction.md +34 -1
- rag_wright-0.8.0/docs/evals.md +51 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/installation.md +2 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/playbook.md +6 -6
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/releasing.md +1 -1
- rag_wright-0.8.0/docs/specs/evals/plan.md +118 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/public-surface/plan.md +10 -1
- rag_wright-0.8.0/docs/specs/public-surface/rulewright-migration-0.7.0.md +46 -0
- rag_wright-0.8.0/docs/specs/public-surface/rulewright-migration-0.8.0.md +62 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/templates/product-starter/CLAUDE.md.template +3 -2
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/templates/product-starter/README.md +1 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/templates/product-starter/playbook.md.template +5 -2
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/workspaces.md +5 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/condensed_pipeline.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/contract_parity_live.py +2 -2
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/contractnli_judge.py +17 -11
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/cuad_highlight.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/full_pipeline_rerank.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/function_ceiling.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/function_property_rerank.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/function_rerank.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/ground_discriminator_rerank.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/kg_primary.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/kg_property_rerank.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/listwise_rerank.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/relational_eval.py +14 -2
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/residual_decision_gold.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/examples/model_server.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/pyproject.toml +4 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/release-please-config.json +4 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/measure_generation_robustness.py +24 -13
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/refresh_framework_graph.sh +1 -1
- {rag_wright-0.6.0/.claude → rag_wright-0.8.0/src/rag_wright/.agents}/skills/building-an-ingestion-capability/SKILL.md +5 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/.agents/skills/creating-evals/SKILL.md +112 -36
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/SKILL.md +46 -20
- rag_wright-0.8.0/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +164 -0
- rag_wright-0.8.0/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/rw_gate.py +58 -0
- {rag_wright-0.6.0/.claude → rag_wright-0.8.0/src/rag_wright/.agents}/skills/using-the-rag-wright-engine/SKILL.md +20 -2
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/api/__init__.py +13 -4
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/api/documents.py +14 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/api/workspace.py +7 -4
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/answer_generator.py +25 -10
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/document_parse.py +17 -7
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/parsing.py +18 -15
- rag_wright-0.8.0/src/rag_wright/capabilities/sheet_tables.py +174 -0
- rag_wright-0.8.0/src/rag_wright/contracts/evals.py +140 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/corpus/document_parser.py +7 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/corpus/embedded.py +24 -30
- rag_wright-0.8.0/src/rag_wright/evals/__init__.py +11 -0
- rag_wright-0.8.0/src/rag_wright/evals/gold.py +219 -0
- rag_wright-0.8.0/src/rag_wright/evals/langfuse_backend.py +109 -0
- rag_wright-0.8.0/src/rag_wright/evals/runner.py +139 -0
- rag_wright-0.8.0/src/rag_wright/evals/scorers.py +477 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/ingestion/__init__.py +2 -2
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/ingestion/evaluate.py +104 -30
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/models/model_servers.py +13 -7
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/models/profiles.py +11 -3
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/models/seam.py +115 -13
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/models/tracing.py +19 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/mcp/compliance_server.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/mcp/intra_document_qa_server.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/mcp/relational_qa_server.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/mcp/typed_property_retrieval_server.py +1 -1
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/skills/generation/SKILL.md +7 -6
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/store/arcadedb.py +19 -6
- rag_wright-0.8.0/src/rag_wright/util/pdfium.py +58 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tasks.md +15 -4
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_open_workspace_reconfig.py +1 -1
- rag_wright-0.8.0/tests/api/test_pdf_page_count.py +42 -0
- rag_wright-0.8.0/tests/arch/test_lock_version.py +30 -0
- rag_wright-0.8.0/tests/arch/test_pdfium_door.py +80 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/arch/test_shipped_skills.py +21 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_answer_generator.py +39 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/eval/test_contractnli_judge.py +11 -0
- rag_wright-0.8.0/tests/evals/test_gold_contracts.py +87 -0
- rag_wright-0.8.0/tests/evals/test_gold_import.py +146 -0
- rag_wright-0.8.0/tests/evals/test_langfuse_backend.py +165 -0
- rag_wright-0.8.0/tests/evals/test_runner.py +124 -0
- rag_wright-0.8.0/tests/evals/test_scorer_parity.py +311 -0
- rag_wright-0.8.0/tests/evals/test_scorers_a.py +116 -0
- rag_wright-0.8.0/tests/evals/test_scorers_b.py +82 -0
- rag_wright-0.8.0/tests/evals/test_scorers_c.py +101 -0
- rag_wright-0.8.0/tests/evals/test_scorers_d.py +96 -0
- rag_wright-0.8.0/tests/ingestion/test_aevaluate.py +105 -0
- rag_wright-0.8.0/tests/ingestion/test_sheet_continuations.py +143 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_model_servers.py +74 -3
- rag_wright-0.8.0/tests/models/test_seam_deadline_and_cap.py +131 -0
- rag_wright-0.8.0/tests/models/test_seam_event_loops.py +84 -0
- rag_wright-0.8.0/tests/scripts/test_generation_robustness_errors.py +17 -0
- rag_wright-0.8.0/tests/skills/test_creating_evals_skill_example.py +57 -0
- rag_wright-0.8.0/tests/store/test_store_create_flag.py +121 -0
- rag_wright-0.8.0/tests/util/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/uv.lock +3 -1
- rag_wright-0.6.0/.claude/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -98
- rag_wright-0.6.0/.release-please-manifest.json +0 -3
- rag_wright-0.6.0/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -98
- {rag_wright-0.6.0 → rag_wright-0.8.0}/.claude/settings.json +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/.claude/skills/authoring-a-capability/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/.claude/skills/classifier-opportunity-analysis/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/.claude/skills/laya/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/.claude/skills/setfit/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/.env.example +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/.github/workflows/publish.yml +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/.github/workflows/release-please.yml +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/.gitignore +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/LICENSE +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/SPEC.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/conftest.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/ARCHITECTURE_OVERVIEW.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/ArcadeDB_Local.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/OBSERVABILITY.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0001-stack-and-library-choices.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0002-validation-corpus-cuad-edgar.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0003-ard-registration-and-capability-kinds.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0004-entity-disambiguation.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0005-relational-golden-set.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0006-model-profile.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0007-arcadedb-store-schema.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0008-unified-framework-index-docs-grounding.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0009-rlm-chunking-retained-as-configurable-capability.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0010-transformers-pinned-below-5-for-flagembedding-reranker.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0011-cuad-not-a-retrieval-benchmark-acord-for-queries.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0012-entity-mention-confidence-no-proximity-edges.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0013-entity-resolution-matching-strategy.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0014-split-generation-and-vision-to-text.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0015-rlm-dynamic-subagents-and-granted-subagents.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0016-rlm-defined-by-required-capabilities-enforced-as-tests.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0017-dynamic-dispatch-trigger-as-typed-flag.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0018-rlm-method-is-the-orchestrator-system-prompt.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0019-recursion-is-optional-for-chunking-required-for-synthesis.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0020-serialize-interpreter-sessions-per-process-ki1.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0021-capability-interface-governed-typed-io.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0022-fr-k-embedding-free-okf-navigation-experimental.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0023-cheap-model-for-okf-enrichment.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0024-reader-parallelism-lives-in-python-not-the-interpreter.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0025-retrieval-pivot-function-classify-property-graph-rerank.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0026-property-schema-and-extended-function-taxonomy.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0027-openrouter-provider-routing-by-throughput.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0028-deterministic-grounding-judge-and-flash-pro-cascade.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0029-retrieval-pipeline-domain-portability-and-adaptation.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0030-model-training-standard-modal-reusable-checkpointed.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0031-single-call-chunking-for-structured-contracts.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0032-nl-to-type-two-step-reason-emit-on-gemma.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0033-unified-contract-kg-three-legs-one-graph.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0034-granite-json-schema-structured-output-profile.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0035-graph-extraction-rebacked-with-gp1b-retire-hybrid.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0036-party-clause-link-party-to-edge.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0037-clause-template-is-authoritative-code-not-generated.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0038-full-cuad-kg-on-gcp-gpu-vm-and-gcs-backup.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0039-self-hosted-open-model-stack-on-modal-a100.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0040-neuro-symbolic-extraction-fidelity-ontology-shacl-validation.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0041-capability-kind-rubric-and-agent-skill-runtime-tiers.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0042-clause-level-span-id-provenance-and-content-hash-backfill.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0043-retire-cross-corpus-retrieval-standardize-on-leg-b.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0044-is-exception-to-derived-carveout-relationship.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0045-client-side-tag-parse-structured-output.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0046-acord-unified-into-one-production-kg.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0047-retire-precomputed-clause-function-gate.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0048-ingest-llm-classifier-nondestructive-reclassify.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0049-generic-customer-lens-for-ingestion.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0050-async-langgraph-ingestion.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0051-schema-bootstrap-and-feedback-driven-ontology-evolution.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0052-engine-product-split-graphwright-parked.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0053-answer-prose-output-hygiene.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0054-remove-auto-tag-from-generator-evidence.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0055-confidence-out-of-band.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0056-bound-structured-retry-wall-clock.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0057-async-engine-architecture.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0058-structure-first-chunking.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0059-recall-decoupled-from-classification-and-visible-partial-loss.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0060-scope-compliance-check-to-named-policy-sources.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0061-subject-document-compliance-per-section.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0062-tiered-ocr-scan-quality-vlm-escalation.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0063-per-sentence-compliance-subject-facts.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0064-typed-properties-out-of-band-on-evidence.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0065-deontic-applicability-gates-query-side.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0066-ontology-ttl-single-source-of-truth.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0067-domain-pack-retargeting.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0068-recall-first-actor-gate-ontology-role-disjointness.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0069-reading-order-chunking-tables-figures-retrievable.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0070-text-layer-first-parsing-no-false-vlm-escalation.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0071-defragmentation-reconstruct-paragraphs-from-line-items.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0072-extract-guard-furniture-and-deterministic-failure.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0073-born-digital-threshold-sparse-pages-no-vlm-escalation.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0074-retry-transient-extraction-failures.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0075-per-page-vlm-escalation.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0076-thread-safe-shared-embedder-reranker.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0077-concurrent-function-classification-across-chunks.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0078-dedicated-extraction-executor.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0079-product-default-granite-4.2-openrouter-routing.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0080-nested-tag-parse-and-degrade.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0081-function-independent-tagparse-clause-extraction.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0082-symbolic-gate-function-independent.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0083-executor-hop-trace-context-capture.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0084-gleaning-off-on-the-query-leg.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0085-query-constraint-extraction-tagparse.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0086-streaming-cost-capture.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0087-retrieval-relevance-score-on-rankedspan.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0088-per-span-relevance-verdict.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0089-structured-output-generation-tracing.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0090-affiliate-of-extraction.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0091-retire-partyto-edge.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0092-idempotent-write-graph.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0093-entities-by-name-seam.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0094-workspace-document-scope.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0095-span-page-provenance.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0096-carveout-keyword-normalization.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0097-caller-configurable-ingest-extraction-models.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0098-invoke-time-document-scope.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0099-mcp-tools-never-take-a-model-supplied-tenant.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0100-profile-based-model-routing.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0101-untagged-spans-reach-extraction-aspect-gate-removed.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0102-open-descriptive-list-dims-retain-verbatim.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0103-a-clause-is-a-provision-not-a-span.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0104-dense-floor-protection-in-leg-b.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0105-in-band-model-usage-accounting.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0106-document-signals-off-the-citation.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0107-requirement-page-provenance.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0108-qwen3-27b-single-a100-serving-profile.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0110-fp8-kv-cache-16k-single-a100.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0111-pin-qwen3-27b-deepinfra-bf16.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0112-relax-deepagents-pin-to-floor.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0113-llm-span-instrumentation-for-latency-attribution.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0114-setfit-default-clause-function-classifier.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0115-classifier-only-step3a-property-extraction.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0116-soft-function-scoping-classifier-lane.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0117-engine-api-layer-and-capability-runtime.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0118-engine-core-api-vs-ard-adapter-free-impl-ref-client.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0119-jev-typed-decision-model-for-compliance-closed-set-fields.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0120-rlm-sub-agent-identity-dynamic-dispatch-trigger.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0121-spacy-optional-extra-model-runtime-download.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0122-provision-boundary-deterministic-plus-decision-model-residue.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0123-batched-releases-release-please-and-consumer-dependabot.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0124-generic-ingestion-builder-and-hooks.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0125-qwen-openrouter-unpinned.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0126-unit-representative-hook-and-the-reference-vote.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0127-retire-the-okf-code.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0128-two-public-tiers-api-and-pack-sdk.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0129-laya-temperatures-and-the-sklearn-floor.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0130-deploy-the-self-hosted-model-server-from-the-engine.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/adr/0131-model-server-hardening-after-rulewright-review.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/architecture/foundations-and-adding-a-domain.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/architecture.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/README.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/design/deontic-applicability-routing.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/design/ingestion-neuro-symbolic-gaps.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/design/semantic-subject-segmentation.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/design/unify-subject-preprocessing.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0037-closed-vocab-drops-verbatim-values-to-other.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0038-a-clause-node-is-now-created-per-sentence-so-98-percent-of-spans-become-clauses.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0039-the-provision-detector-reads-text-but-docling-puts-the-section-number-in-marker.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0040-covered-subject-is-asked-of-every-provision-so-verbatim-retention-fills-it-with-noise.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0041-VERIFICATION-dense-floor.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0041-leg-b-discards-the-best-dense-matches-on-some-queries.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0042-usage-is-captured-per-call-but-never-returned-so-cost-needs-a-langfuse-round-trip.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0043-a-requirement-carries-no-page-provenance-so-a-finding-cannot-point-into-its-policy.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0044-document-signals-scaffolding-is-shown-to-the-user-as-a-quote-from-their-document.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0045-a-fixed-money-cap-records-no-cap-quantum-so-the-amount-is-only-prose.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0046-appending-a-natural-follow-up-to-a-question-drops-the-clause-type.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0047-an-exact-deepagents-pin-transitively-pins-every-consumer.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/engine-issues/0048-the-pinned-endpoints-latency-tail-makes-agent-runs-undebuggable-from-either-side.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-07-20_graphwright_capability_interface_reply.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-07-20b_graphwright_interface_confirmation.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-07-20c_graphwright_ingestion_interfaces.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-08-30_subject_compliance_final_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-01_issue-0013-recall-first-actor-gate_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-01_ontology-source-of-truth_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-03_issue-0014-table-retrievability_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-04_bulk-ingestion-wall_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-04_issue-0016-thread-safe-embedder_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-05_observability-langfuse_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-05_tagparse-ingestion-and-granite-4.2_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-09_affiliate-of-extraction_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-09_issue-0028-partyto-retired_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-09_issue-0029-idempotent-write-graph_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-09_issue-0030-entities-by-name_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-09_observability-and-retrieval-floor_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-09_relevance-verdict_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-09_rename-run-ad-compliance-check_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-09_structured-output-cost-tracing_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-10_ingest-models-caller-configurable_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-failclosed-and-nodrift_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-validate-ingested-set_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-10_issue-0031-workspace-document-scope_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-10_issue-0032-span-page-provenance_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-10_issue-0033-carveout-normalization_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-10_issue-0034-invoke-time-document-scope_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-11_issue-0035-followup-derived-guard_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-11_issue-0035-mcp-no-model-tenant_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-11_profile-based-model-routing_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-11_qwen-default-modal-or_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-11_qwen-everywhere-config_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-12_clause-granularity_0036-0039_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-12_closed-vocab_0037-0040_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-12_dense-floor-protection_0041_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-13_in-band-usage_0042_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-14_document-signals-off-citation_0044_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-14_requirement-page-provenance_0043_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-16_qwen3-27b-single-a100-serving-profile_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-18_fp8-accuracy-eval-configB_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-18_fp8-kv-16k-single-a100_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-20_deepagents-pin-relaxed_0047_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-20_llm-span-instrumentation_0048_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-answers_from_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-scoping-questions_rulewright.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/misc/.gitkeep +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/plans/Corpus_Acquisition.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/plans/async-migration.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/plans/demo_plan.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/plans/gp1b_docling_graph_plan.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/plans/unified_contract_kg_ontology_bridge.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/plans/unified_contract_kg_plan.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/results/2026-07-24-t58-property-graph-population.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/results/2026-07-25-t58b-full-pipeline-rerank.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/archive/results/2026-07-25-t58b-topk-ordering-levers.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/concepts.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/contract_pipeline_explainer.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/corpus_ingest_recipe.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/domain-adaptation/_engine-gaps.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/domain-adaptation/authoring-capabilities.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/domain-adaptation/classification-and-decision-models.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/domain-adaptation/entity-resolution.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/domain-adaptation/ontology-authoring.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/classifier_model_ab.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/compliance_demo.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/compliance_gate_cc7.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/compliance_rung2_cc7.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/cuad_highlighting_cu-d1.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/dg_model_ab.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/function_gate_recall.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/generation_robustness_b_vs_c.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/nl_to_type_cu-d2.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/ocr_benchmark.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/prod1_readiness.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/prod2_readiness.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/query_side_model_ab.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/silver_granite_vs_gemma4.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/silver_provider_routing.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/eval/silver_selfhosted_gemma4_26b.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/product/capability_profiles.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/product/contracts_product_roadmap.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/product/engine-api-migration-handoff.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/product/engine_async_api.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/product/new-domain-build-sequence.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/product/seam-adaptation-guide.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/proposals/compliance-ingest-classifier-decomposition.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/proposals/de-domaining-and-capability-runtime.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/proposals/new-domain-developer-journey.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/proposals/ontology-induction.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/quickstart.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/reference-pack.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/engine-platform/SPEC.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/engine-platform/TASKS.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/engine-prep/plan.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/ingestion-hooks/ing5-doc-audit.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/ingestion-hooks/ing8-breaking-changes.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/ingestion-hooks/plan.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/ingestion-hooks/rulewright-migration-0.2.0.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/public-surface/rulewright-migration-0.3.0.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/public-surface/rulewright-migration-0.4.0.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/public-surface/rulewright-migration-0.5.0.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/public-surface/rulewright-migration-0.6.0.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/specs/public-surface/rulewright-reply-2026-10-10-laya-and-sklearn.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/templates/product-starter/dependabot.yml +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/upstream/laya-temperature-range-mismatch.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/vendor/arcadedb/arcadedb-buckets-schema.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/vendor/arcadedb/arcadedb-docs-extraction.json +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/vendor/arcadedb/arcadedb-vector-embeddings.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/docs/vendor/arcadedb/arcadedb-vector-search-tutorial.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/acord.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/acord_retrieval.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/boundary_residue_gold.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/build_golden.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/compliance_demo/policy/community_conduct_policy.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/compliance_demo/subjects/post_borderline.txt +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/compliance_demo/subjects/post_compliant.txt +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/compliance_demo/subjects/post_violation.txt +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/embedded_eval.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/gate1_chunker_ab.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/gate2_hybrid_rerank.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/golden/relational/set.json +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/golden.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/harness.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/ingestion_live_smoke.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/multihop.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/nl_to_type.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/segmenter_eval.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/semantic_judge_gold.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/test_acord.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/test_acord_retrieval.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/test_harness.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/test_multihop_set.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/eval/unit_grouper_eval.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/examples/quickstart.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/plan.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ab_model_overlap.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/acord_unify.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/acquire_acord.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/acquire_cuad.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/acquire_ecfr.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/acquire_edgar.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/acquire_ftc_255.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/acquire_prod1_corpus.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/audit_reclass_flips.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/author_leg_a_silver_key.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/backfill_affiliations.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/backfill_clause_span_id.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/backfill_edge_source_doc_id.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/backup_kg_to_gcs.sh +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/bootstrap_template_capture.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/bootstrap_typed_edges.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/build_api_docs.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/build_api_docs.sh +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/build_cuad_clause_cache.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/build_function_routing_map.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_assemble_v2.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_assemble_v3.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_generate_hard_negatives.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_generate_hard_positives.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_generate_training.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_hybrid.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_hybrid2.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_jev_actor.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_jev_claimtypes.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_jev_operative.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_label_spans.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_laya_prep.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_laya_train.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_prep_operative.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_relabel_rubric.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_relabel_rubric2.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/cic1_train_operative.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/compare_extraction_models.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/compliance_actor_gate_smoke.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/compliance_engine_smoke.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/compliance_policy_demo.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/curate_taxonomy_gaps.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/dg_model_ab.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/diagnose_acord_knn_expansion.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/diagnose_acord_knn_rerank.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/diagnose_acord_leg_pool.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/diagnose_acord_legs.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/diagnose_acord_pool.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/diagnose_acord_relstructure.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/diagnose_acord_retrieval.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/distill/eval_all.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/distill/eval_ce.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/distill/eval_listwise_b.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/distill/export_ce_dataset.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/distill/extract_features.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/distill/listwise_variants.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/distill/relational_features.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/distill/train_ce.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/distill/train_modal.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/enrich_edgar_candidates.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/eval_chunking_ab.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/eval_classifier_guided_vs_tagparse.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/eval_compliance_gold.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/extract_arcadedb_docs.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/fetch_reference_models.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/generate_contract_python.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/git_post_commit_graphify.sh +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/granite_chunker_assess.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/graph_status.sh +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ingest_acord.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ingest_compliance_async_prod2.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ingest_compliance_document_prod2.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ingest_compliance_prod2.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ingest_cuad.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ingest_cuad_full.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ingest_ftc_compliance.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ingest_prod1.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ingest_prod1_async.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ingest_smoke.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/install_git_hooks.sh +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/label_new_functions.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/legb_function_gate_recall.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/make_compliance_fixtures.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/make_compliance_gold.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/mcp_compliance_agent_demo.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/mcp_intra_document_qa_smoke.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/mcp_query_legs_agent_demo.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/measure_silver.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/merge_docs_into_framework.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/migrate_entity_cik_to_canonical_id.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/migrate_silver_evidence_autotag.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/migrate_silver_evidence_remove_autotag.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/migrate_span_fields.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/mine_scarce_functions.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_arcadedb.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_backfill.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_exception_linking.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_gemma4_vllm.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_gemma4_vllm_snapshot.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_granite_server.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_granite_throughput.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_granite_vllm_server.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_query_app.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_qwen3_27b_bench.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_qwen3_27b_snapshot.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_qwen3_vllm_server.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/modal_stack_a100.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ocr_benchmark.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ocr_preprocess.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/ontology_dimension_check.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/phase_a_leg_validate.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/populate_clause_kg.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/populate_entity_graph.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/populate_entity_graph_extracted.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/populate_property_store.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/prep_relational_verification.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/publish_manifests.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/reclassify_kg.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/revert_reclass_flips.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/run_acord_retrieval.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/run_clause_exception_linking.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/semantic_judge_live_validate.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/semantic_judge_probe.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/snapshot_leg_a_eval.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/stack_correctness_validate.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/table_retrieval_smoke.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/train_function_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/train_legalbert_function.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/train_legalbert_modal.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/typed_rerank_validate.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/verify_wheel_install.sh +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/vllm_extraction_ab.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/vllm_kg_query_validate.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/scripts/vllm_raw_diagnostic.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/.agents/skills/authoring-a-capability/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/.agents/skills/classifier-opportunity-analysis/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/.agents/skills/laya/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/.agents/skills/setfit/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/api/answers.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/api/config.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/api/discover.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/api/ids.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/api/invoke.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/api/kg.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/api/mcp.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/api/tracing.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/api/usage.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/ard.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/chunk_read.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/chunk_write.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/disambiguation.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/document_scope.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/embedding.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/embedding_profiles.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/entity_resolution.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/fusion.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/graph_query.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/graph_storage.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/hybrid_search.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/invoke.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/jev_decision.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/manifests.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/registry.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/remote_encoders.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/reranking.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/retrieval_core.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/rlm_chunking.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/rlm_synthesis.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/scan_quality.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/span_relevance_judgment.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/vision_to_text.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/capabilities/vlm_ocr.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/contracts/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/contracts/chunk.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/contracts/extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/contracts/graph.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/contracts/identifiers.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/contracts/ingestion.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/contracts/provenance.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/contracts/span.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/corpus/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/corpus/canonicalize.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/corpus/http.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/ingestion/builder.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/ingestion/group.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/ingestion/layout.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/ingestion/segment.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/ingestion/tables.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/models/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/models/tag_structured.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/models/usage.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/models/weights.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/ontology/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/ontology/pack_schema.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/ontology/registry.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/pack_sdk/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/capabilities/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/capabilities/assertion_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/capabilities/claim_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/capabilities/compliance_judgment.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/capabilities/compliance_store.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/capabilities/requirement_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/invokers.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/mcp/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/ontology/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/ontology/compliance_bridge.ttl +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/ontology/loader.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/ontology/packs/ftc_16cfr255.ttl +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/pack.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/schemas/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/schemas/compliance.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/skills/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/skills/claim_extraction/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/skills/claim_extraction/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/skills/claim_extraction/template.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/skills/compliance_judgment/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/skills/generic_compliance_judgment/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/template.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/subgraphs/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/subgraphs/compliance_check.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/subgraphs/compliance_ingestion.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/compliance/subgraphs/requirement_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/capabilities/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/capabilities/clause_exception_linking.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_serve.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_store.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/capabilities/dg_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/capabilities/graph_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/capabilities/highlight_serve.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/capabilities/property_boosted_retrieval.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/capabilities/query_function_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/capabilities/query_understanding.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/corpus/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/corpus/cuad.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/corpus/cuad_ingestion.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/corpus/edgar.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/corpus/gcs_ingestion.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/corpus/selection.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/mcp/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/mcp/session_store.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/ontology/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/ontology/_generated_template_meta.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/ontology/_generated_vocab.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/ontology/clause_template.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/ontology/codegen.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/ontology/contract_bridge.ttl +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/ontology/contract_taxonomy.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/ontology/derive.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/ontology/loader.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/ontology/template_introspect.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/options.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/pack.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/schemas/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/schemas/contract_meta.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/schemas/function.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/schemas/function_routing.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/schemas/highlight.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/schemas/jurisdiction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/schemas/ontology.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/schemas/property.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/schemas/query_intent.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/schemas/value_match.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/skills/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/skills/corpus_ingest/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/skills/guidance/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/skills/guidance/chunking.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/skills/guidance/generation.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/skills/guidance/relevance.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/boundary.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/clause_function_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/clause_kg_extractor.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/cuad_labels.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/dim_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/dim_fleet.json +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/function_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/function_families.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/hybrid_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/legalbert_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/model_capabilities.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/new_function_labels.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/property_extractor.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/property_grounding.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/reclassify.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/residual_candidates.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/scarce_function_labels.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/segment.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/semantic_judge.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/symbolic_validation.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/spans/tag_clause_extractor.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/subgraphs/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/subgraphs/async_ingestion.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/subgraphs/contract_ingestion_pipeline.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/subgraphs/intra_document_qa.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/subgraphs/query_constraint_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/subgraphs/relational_qa.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/subgraphs/typed_clause_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/contracts/subgraphs/typed_property_retrieval.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/packs/reference_seam.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/py.typed +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/skills/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/skills/generation/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/skills/rlm/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/skills/rlm/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/skills/rlm/agent.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/skills/span_relevance_judgment/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/skills/vision_to_text/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/skills/vision_to_text/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/spans/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/spans/page_map.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/store/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/store/chunk_text.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/store/seam.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/subgraphs/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/subgraphs/graph_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/subgraphs/observability.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/subgraphs/scaffold.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/subgraphs/semantic_chunking.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/util/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/util/concurrent.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/src/rag_wright/util/spacy_model.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_answers_exports.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_bytes_ingest.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_capability_reexports.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_decision_swap_doc_example.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_discover.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_documents.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_e2e.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_invoke.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_kg.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_mcp.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_metering_tracing_exports.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_model_role_export.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_options.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_pack_sdk.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_pack_store.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_usage.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_workspace.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/api/test_workspace_models.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/arch/domain_vocabulary_baseline.json +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/arch/test_api_docs_current.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/arch/test_doc_references.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/arch/test_engine_domain_vocabulary.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/arch/test_import_contracts.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/arch/test_packs_use_store_primitives.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/async_helpers.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/_fixtures/rlm_probe_skill/SKILL.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_answer_generator_async.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_assertion_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_authoring_contract.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_chunk_read.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_chunk_write.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_chunking_prompts_neutral.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_claim_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_clause_exception_linking.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_compliance_judgment.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_compliance_store.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_contract_kg_serve.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_contract_kg_store.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_contract_kg_store_reads.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_contract_taxonomy_and_spans.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_dg_adapter.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_dg_async.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_dg_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_dg_model_seam.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_dg_private.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_disambiguation.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_document_scope.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_embedding.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_embedding_profiles.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_entity_resolution.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_entity_rules_plumbing.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_fusion.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_graph_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_graph_query.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_graph_storage.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_highlight_serve.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_hybrid_search.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_jev_decision.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_manifest_validation.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_manifests.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_parsing.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_parties_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_property_boosted_retrieval.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_query_function_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_query_understanding.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_registry.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_remote_encoders.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_repair_partition.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_requirement_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_reranking.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_retrieval_core.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_rlm_chunking.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_rlm_chunking_async.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_rlm_method.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_rlm_synthesis.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_runtime_registry.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_scan_quality.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_span_relevance_judgment.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_structural_boundary_discoverer.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_structural_model_fallback.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_tag_boundary_discoverer.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_tiered_ocr.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/capabilities/test_vlm_ocr.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/compliance_fakes.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/conftest.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_canonical_source_doc_id.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_chunk_record.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_compliance.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_cuad_highlight_contracts.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_function.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_function_routing.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_identifiers.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_ingestion_hooks.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_jurisdiction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_ontology.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_property.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_provenance.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/contracts/test_value_match.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/corpus/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/corpus/_ooxml_fixtures.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/corpus/test_canonicalize.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/corpus/test_cuad.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/corpus/test_cuad_ingestion.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/corpus/test_document_parser.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/corpus/test_edgar.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/corpus/test_embedded.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/corpus/test_gcs_ingestion.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/corpus/test_http.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/corpus/test_parse_wire2.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/corpus/test_selection.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/eval/test_cuad_highlight_metrics.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/eval/test_kg_property_rerank.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/eval/test_nl_to_type_metrics.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/eval/test_relational_eval.py +0 -0
- {rag_wright-0.6.0/tests/foundation → rag_wright-0.8.0/tests/evals}/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/fixtures/ingestion/segmenter_gold.json +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/fixtures/ingestion/textile_spec_sheet.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/fixtures/ingestion/textile_test_report.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/fixtures/leg_a_silver/README.md +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/fixtures/leg_a_silver/evidence_snapshot.json +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/fixtures/table-bearing-contract.pdf +0 -0
- {rag_wright-0.6.0/tests/ingestion → rag_wright-0.8.0/tests/foundation}/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/foundation/test_arcadedb_hybrid.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/foundation/test_model_seam_structured.py +0 -0
- {rag_wright-0.6.0/tests/mcp → rag_wright-0.8.0/tests/ingestion}/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ingestion/test_builder.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ingestion/test_chunk_discoverer_hook.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ingestion/test_concurrency_ceiling.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ingestion/test_document_metadata.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ingestion/test_evaluate.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ingestion/test_evaluate_labels.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ingestion/test_layout_segmenter.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ingestion/test_spreadsheet_content.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ingestion/test_table_rows.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ingestion/test_tuning.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ingestion/test_unit_grouper.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ingestion/test_unit_representative.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/journey/incidents_domain.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/journey/incidents_pack.ttl +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/journey/test_incidents_journey.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/journey/test_pack_schema.py +0 -0
- {rag_wright-0.6.0/tests/models → rag_wright-0.8.0/tests/mcp}/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/mcp/test_compliance_server.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/mcp/test_intra_document_qa_server.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/mcp/test_no_model_supplied_tenant.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/mcp/test_relational_qa_server.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/mcp/test_typed_property_retrieval_server.py +0 -0
- {rag_wright-0.6.0/tests/ontology → rag_wright-0.8.0/tests/models}/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_async_infra.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_classifier_heads_load_clean.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_models_dir.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_no_gemma_default.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_profile_routing.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_profile_seam.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_seam_async.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_seam_retry.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_seam_stream.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_serving_seam.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_serving_wiring.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_tag_structured.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_tag_structured_async.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_tracing.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/models/test_usage.py +0 -0
- {rag_wright-0.6.0/tests/skills → rag_wright-0.8.0/tests/ontology}/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ontology/test_clause_template.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ontology/test_compliance_ontology_authoritative.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ontology/test_derivation.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ontology/test_entity_taxonomy.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ontology/test_generated_template_meta_in_sync.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ontology/test_generated_vocab_in_sync.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ontology/test_template_captured_in_ttl.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/ontology/test_ttl_is_source_of_truth.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/reference/test_compliance_reference.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/reference/test_contract_seam.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/scripts/test_eval_chunking_ab.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/scripts/test_eval_classifier_ab.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/scripts/test_fetch_reference_models.py +0 -0
- {rag_wright-0.6.0/tests/store → rag_wright-0.8.0/tests/skills}/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/skills/test_ingestion_skill_example.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_boundary.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_classifier_property_extractor.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_clause_classifier_tags_0005.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_clause_function_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_clause_function_classifier_async.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_clause_kg_extractor.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_clause_kg_extractor_async.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_dim_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_dim_fleet_live.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_function_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_hybrid_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_hybrid_property_extractor.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_legalbert_classifier.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_model_capabilities.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_new_function_labels.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_page_map.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_property_extractor.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_property_grounding.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_reclassify.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_residual_decision.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_scarce_function_labels.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_segment.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_segmentation_vocab.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_semantic_judge.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_setfit_clause_adapter.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_setfit_probabilities.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_span_offsets.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_stage_labels_0005.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_symbolic_validation.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/spans/test_tag_clause_extractor.py +0 -0
- {rag_wright-0.6.0/tests/subgraphs → rag_wright-0.8.0/tests/store}/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_affiliation_backfill.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_arcadedb_clause_kg.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_arcadedb_contract.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_arcadedb_property.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_arcadedb_requirement_sources.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_arcadedb_schema.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_arcadedb_span.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_chunk_text.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_concurrent_writes.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_contract_kg_store_live.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_document_metadata_live.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_document_scope.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_engine_domain_neutral.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_entities_by_name.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_kg_edges.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_kg_mutations.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_kg_read.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_kg_write.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_neutral_schema.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/store/test_write_graph_idempotent.py +0 -0
- {rag_wright-0.6.0/tests/util → rag_wright-0.8.0/tests/subgraphs}/__init__.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_async_ingestion.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_chunk7_structure_carry.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_clause_results.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_compliance_check.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_compliance_ingestion.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_contract_ingestion_pipeline.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_contract_ingestion_pipeline_async.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_contract_ingestion_pipeline_graph_async.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_graph_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_ingest_knobs.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_ingest_segment_classify.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_intra_document_qa.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_observability.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_partial_entry_contract.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_query_constraint_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_relational_qa.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_requirement_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_scaffold.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_semantic_chunking.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_typed_clause_extraction.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/subgraphs/test_typed_property_retrieval.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/test_backfill_clause_span_id.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/test_dg_model_ab.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/test_populate_clause_kg.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/test_populate_entity_graph.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/util/test_concurrent.py +0 -0
- {rag_wright-0.6.0 → rag_wright-0.8.0}/tests/util/test_spacy_model.py +0 -0
|
@@ -136,6 +136,11 @@ network-bound work inside it; the engine runs up to `IngestionTuning.extract_con
|
|
|
136
136
|
|
|
137
137
|
- **Hidden sheets** are ingested by default; `IngestSource(include_hidden_sheets=False)` skips them (listed in
|
|
138
138
|
`DocumentReport.skipped_hidden_sheets`).
|
|
139
|
+
- **Blank rows inside a table**: the parse cuts a sheet's table at every blank row; the engine glues a piece back
|
|
140
|
+
onto the table above when its first row is data (its number or date columns agree, or it is formatted like the
|
|
141
|
+
data rather than the header), so no record is read as a header. A text-only table with no formatting cannot be
|
|
142
|
+
decided from the file: it stays apart and `evaluate_ingestion` lists it in `warnings` (format the header row, or
|
|
143
|
+
remove the blank rows).
|
|
139
144
|
- **Exact cell values**: `table_rows(parse_document(...))` returns every data row as a `TableRow` (`columns`,
|
|
140
145
|
`values`, `cell(name)`), read from the parse's cell grid, whole even when chunking split the table. A per-row unit
|
|
141
146
|
carries its row in `Unit.table_row`, so the extractor reads cells, not re-parsed text.
|
|
@@ -6,8 +6,10 @@ description: >-
|
|
|
6
6
|
starting a new domain (right after capabilities are defined), when adding or changing a capability, or when A/B-ing
|
|
7
7
|
alternatives (e.g. a trained classifier vs a System-1 decision model). Covers gold-set design + reliability,
|
|
8
8
|
per-capability-KIND metrics (extraction / classification / retrieval / graph / generation / judgment), the
|
|
9
|
-
gate-vs-diagnostic split, building the gold cheaply,
|
|
10
|
-
|
|
9
|
+
gate-vs-diagnostic split, building the gold cheaply, and running it with the engine's eval toolkit
|
|
10
|
+
(`load_gold_set` from an expert's own files, one `score_*` per kind, `arun_eval` with repeats and errors kept apart,
|
|
11
|
+
an `EvalReport` a backend can return, optional Langfuse datasets and runs). An eval is the executable acceptance
|
|
12
|
+
criterion; training data IS an eval.
|
|
11
13
|
---
|
|
12
14
|
|
|
13
15
|
# Creating evals (eval-first / TDD)
|
|
@@ -19,6 +21,13 @@ can A/B alternatives and catch regressions forever. Corollary observed repeatedl
|
|
|
19
21
|
data you build for a classifier/decision model IS an eval** (a labeled gold set + a metric) — so building the eval
|
|
20
22
|
first also gives you the data design for free.
|
|
21
23
|
|
|
24
|
+
**The toolkit (on `rag_wright.api`).** `load_gold_set` turns an expert's CSV / XLSX / JSONL into a `GoldSet`;
|
|
25
|
+
one scorer per capability kind (section 2) turns predictions into a `ScorerResult` (the gate, its thresholds,
|
|
26
|
+
diagnostics that are never gated); `arun_eval` runs your capability over the gold set (concurrently, `[eval] i/N`
|
|
27
|
+
progress, repeats, a failed call kept as an error) and returns an `EvalReport` -- JSON-ready, every item's outputs
|
|
28
|
+
kept, so `rescore_eval` can score it again later without calling anything. Use it rather than hand-writing a
|
|
29
|
+
harness; section 6 is a complete example.
|
|
30
|
+
|
|
22
31
|
Repository paths in this skill (`docs/`, `eval/`, `scripts/`, `tests/`, `src/`) are in the engine repository: read them there or on GitHub, at the tag matching your installed engine. The `eval/` and `scripts/` files named as patterns are the engine's own evals: read them as
|
|
23
32
|
worked examples; your evals live in your repo.
|
|
24
33
|
|
|
@@ -50,12 +59,30 @@ worked examples; your evals live in your repo.
|
|
|
50
59
|
- **Separate a tuning set from a held-out set.** Label the held-out set BEFORE any prompt runs on it, tune only on
|
|
51
60
|
the tuning set, and report both numbers (ADR-0122 boundary residue prompt: 94.5% held-out vs 96.2% tuning). A
|
|
52
61
|
number measured only on the set you tuned on is not a result.
|
|
62
|
+
- **Gold from your experts' own files.** Domain experts label in spreadsheets: `load_gold_set(path_or_upload,
|
|
63
|
+
GoldMapping(id=..., input=..., expected=..., group=...), name=..., version=...)` reads them as written -- the header
|
|
64
|
+
found under a title, blank rows skipped, values kept exactly, each item's place recorded -- and refuses anything
|
|
65
|
+
that would make the gold wrong (a missing column, a row without its id, a duplicate id) with where it is. Map
|
|
66
|
+
`group` to the source document so splits stay leakage-safe. A gold set is `local_only` by default: client data
|
|
67
|
+
never leaves the machine.
|
|
53
68
|
- **Gold stays local when the corpus is restrictively licensed** (CUAD/ACORD-derived gold lives under the
|
|
54
69
|
gitignored `data/eval/`); commit the builder and the scorer, never the data.
|
|
55
70
|
|
|
56
71
|
## 2. Pick the metric by capability KIND, and split GATE vs DIAGNOSTIC
|
|
57
72
|
Always set ONE pass/fail **gate** (from the acceptance criterion) and report **diagnostics** alongside (never gate
|
|
58
|
-
on a diagnostic).
|
|
73
|
+
on a diagnostic). Each kind has its scorer on `rag_wright.api`, checked against the engine evals named below:
|
|
74
|
+
|
|
75
|
+
| kind | scorer | gate |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| classification / typed decision | `score_classification` | the weakest class's recall@k (+ top-1 accuracy via `top1_floor`) |
|
|
78
|
+
| retrieval | `score_retrieval` | mean recall@k at a relevance grade; nDCG reported |
|
|
79
|
+
| extraction | `score_extraction` | recall and precision, apart |
|
|
80
|
+
| judgment / verdict | `score_judgment` | precision and recall of the actionable verdict |
|
|
81
|
+
| generation / QA | `score_generation` | citation recall, correct abstention, groundedness |
|
|
82
|
+
| graph / relational | `score_relational` | recall over the answer set |
|
|
83
|
+
| ingestion structure / unit labelling | `score_ingestion` | `evaluate_ingestion`'s checks (+ label accuracy) |
|
|
84
|
+
| candidate-then-choose | `score_candidate_choice` | candidate coverage, value-level recall and precision |
|
|
85
|
+
|
|
59
86
|
- **Extraction** (section → records, clauses, requirements): recall / precision / F1 of extracted items vs gold,
|
|
60
87
|
reported SEPARATELY (under- vs over-extraction are different failures). Watch over-extraction on non-operative
|
|
61
88
|
input (definitions) and under-extraction on long input.
|
|
@@ -84,7 +111,7 @@ on a diagnostic).
|
|
|
84
111
|
scores mean what they say), not one accuracy number. Pattern: `eval/semantic_judge_gold.py` (ING-9: decision
|
|
85
112
|
model 95.3% vs LLM 90.1% on 192 blind hand-labelled cases).
|
|
86
113
|
- **Candidate-then-choose pipelines** (a generator proposes, a model picks): measure the generator's **coverage**
|
|
87
|
-
separately, because it caps recall (ING-9b residual values: candidate coverage
|
|
114
|
+
separately, because it caps recall (ING-9b residual values: candidate coverage 0.93, 188/203 recomputed from the saved outputs; value-level recall 0.83 /
|
|
88
115
|
precision 0.88 vs the LLM's 0.60 / 0.79. Pattern: `eval/residual_decision_gold.py`). **Count is not accuracy**:
|
|
89
116
|
emitting more values is not a win without precision.
|
|
90
117
|
- **Ingestion structure**: `evaluate_ingestion` (in `rag_wright.api`) is the packaged structural eval of the
|
|
@@ -111,42 +138,87 @@ on a diagnostic).
|
|
|
111
138
|
- **Generate hard cases** (near-boundary positives/negatives) to stress the exact confusions — TRAIN-ONLY; the
|
|
112
139
|
gold test stays real. (Full data playbook: the `setfit` skill Phase 1/4 + `classifier-opportunity-analysis`.)
|
|
113
140
|
|
|
114
|
-
## 4.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
`eval
|
|
141
|
+
## 4. Run it: `arun_eval`
|
|
142
|
+
`arun_eval(gold, task, scorers, *, repeats, concurrency, progress)` is the harness. It runs `task` (your coroutine,
|
|
143
|
+
or a plain function, which runs off the event loop) on every item, `repeats` times, `concurrency` at a time, streams
|
|
144
|
+
`[eval] i/N` lines to `progress`, keeps a call that raises as an ERROR in that item's slot (never dropped, never an
|
|
145
|
+
answer), scores each repeat, and passes a scorer only if it passes on every repeat (its gate is the worst repeat;
|
|
146
|
+
`per_repeat_gate` lists each). `run_eval` is the synchronous form; inside a web backend, await `arun_eval` as a
|
|
147
|
+
background job. What is still yours:
|
|
148
|
+
- **Isolate the capability under test**: the task calls ONE capability, injected (a seam / `extract_override` / an
|
|
149
|
+
injected `retrieve`), so the eval measures it, not the whole pipeline. Invoke production code THROUGH the
|
|
150
|
+
capability layer (`ainvoke_subgraph`/`ainvoke_model`), never a hand-built copy. Score the **shipped request** (the
|
|
151
|
+
exact prompt/question builder production uses, e.g. `judge_request`), not a copy of it re-typed in the eval.
|
|
152
|
+
- **Repeatability for non-deterministic models.** Use `repeats` and read `report.flips`; flips cluster near the
|
|
153
|
+
threshold and usually mean the QUESTION is ambiguous: fix the question, do not vote it away (Jev flipped 5/181
|
|
154
|
+
answers at scores 0.47-0.56; temperature/seed did not help, majority voting barely helped, rewriting the ambiguous
|
|
155
|
+
question did. The ADR-0122 boundary residue prompt went from 94-96% with flips to 460/461, zero flips across 3
|
|
156
|
+
calls). Pattern: `eval/boundary_residue_gold.py`.
|
|
125
157
|
- **Cache keys include the prompt and the method.** Any decision or extraction cache must key on the prompt text
|
|
126
158
|
and the method (decision model vs LLM, and which model), so an eval never reuses outputs a different prompt or
|
|
127
159
|
method produced (ADR-0122 ING-4d / ADR-0040 ING-9b: the residue decision cache and the clause cache).
|
|
128
|
-
- **
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
- **Env-selected** so the SAME harness runs local (dev) or on Modal (full corpus + GPU).
|
|
160
|
+
- **Keep the report.** `report.model_dump_json()` holds every item's outputs; save it next to the gold version.
|
|
161
|
+
`rescore_eval(report, gold, scorers)` re-scores it with new thresholds, a new scorer or a corrected gold, free. An
|
|
162
|
+
eval kept only as aggregate numbers can never be checked again.
|
|
132
163
|
- **Pre-flight paid bulk** (>~50 paid calls): print the exact count + cost and wait (`warn-before-bulk` rule).
|
|
133
|
-
- Stream `X/N` progress + actively monitor any run over ~30s (never launch-and-forget).
|
|
134
164
|
- **Hermetic tests never touch the network**: `tests/conftest.py` fails a test that resolves a non-local host unless
|
|
135
|
-
it carries a live marker (`model`, `store`, ...). Live evals run as
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
## 5. Langfuse
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
165
|
+
it carries a live marker (`model`, `store`, ...). Live evals run as scripts (outside pytest) or carry a live
|
|
166
|
+
marker.
|
|
167
|
+
|
|
168
|
+
## 5. Langfuse -- optional: datasets, runs and scores next to the traces
|
|
169
|
+
`arun_eval(..., langfuse=True)` (or `RAG_EVAL_BACKEND=langfuse`; the keys alone send nothing) runs the same eval on
|
|
170
|
+
Langfuse: the gold set becomes a dataset (items upserted; items no longer in the gold set archived; the version is
|
|
171
|
+
the server's latest timestamp, recorded as `report.dataset_version`), each repeat a dataset run (`report.run_urls`),
|
|
172
|
+
and each scorer's gates and pass/fail are pushed as run scores. The report is the same, scored locally from the same
|
|
173
|
+
outputs. With engine tracing on (`RAG_TRACE_LEVEL`), every model call the task makes nests under its item's trace,
|
|
174
|
+
on both backends. What was verified against Langfuse 4.15.1 (self-hosted), and what to know:
|
|
175
|
+
- **`local_only` is refused before anything is sent.** Only a self-hosted Langfuse should ever receive client data;
|
|
176
|
+
set `local_only=False` only for data that may leave the machine.
|
|
177
|
+
- **Scoring runs in your process**, not in Langfuse: its code evaluators are a 2-second, standard-library sandbox
|
|
178
|
+
with no network, so they cannot run your scorers.
|
|
179
|
+
- **The SDK's own `run_experiment` drops an item whose task raises, and blocks a running event loop**; `arun_eval`
|
|
180
|
+
handles both (an error is an error in its slot; the run is off the loop). Call `arun_eval`, not the SDK directly.
|
|
181
|
+
- **Reading observations back**: the v2 list endpoint is Cloud-only until Langfuse v4 ships in the open-source
|
|
182
|
+
release, and the v1 endpoint times out on a trace-only query: bound every read by time.
|
|
183
|
+
- Langfuse's managed LLM-as-a-judge and decision-model evaluators, and its UI prompt experiments, test a prompt in
|
|
184
|
+
Langfuse, not your pipeline: out of scope for this toolkit (a product may still use them).
|
|
185
|
+
|
|
186
|
+
## 6. A complete example
|
|
187
|
+
An expert's labelled workbook, your capability run through the capability layer, two repeats, the report kept and
|
|
188
|
+
scored again later. `my_judge` stands for your capability's call (e.g. through `ainvoke_model`); the rest runs as
|
|
189
|
+
written.
|
|
190
|
+
|
|
191
|
+
```python
|
|
192
|
+
import asyncio
|
|
193
|
+
import functools
|
|
194
|
+
from pathlib import Path
|
|
195
|
+
|
|
196
|
+
from rag_wright.api import (EvalReport, GoldMapping, arun_eval, load_gold_set, rescore_eval,
|
|
197
|
+
score_judgment)
|
|
198
|
+
|
|
199
|
+
GOLD_FILE = "gold/nli_expert_labels.xlsx" # the expert's own file
|
|
200
|
+
REPORT = "eval_runs/nli_judge.json"
|
|
201
|
+
|
|
202
|
+
mapping = GoldMapping(id="ID", input=["Premise", "Hypothesis"], expected="Label", group="Contract")
|
|
203
|
+
gold = load_gold_set(GOLD_FILE, mapping, name="nli-judge", version="2026-10-12")
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
async def judge(item):
|
|
207
|
+
return await my_judge(item.input["Premise"], item.input["Hypothesis"])
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
gate = functools.partial(score_judgment, actionable="contradiction", precision=0.8, recall=0.7)
|
|
211
|
+
report = asyncio.run(arun_eval(gold, judge, [gate], repeats=2, concurrency=8, progress=print))
|
|
212
|
+
Path(REPORT).parent.mkdir(parents=True, exist_ok=True)
|
|
213
|
+
Path(REPORT).write_text(report.model_dump_json(indent=1), encoding="utf-8")
|
|
214
|
+
print(report.passed, report.scores[0].gate, "errors", report.errors, "flips", report.flips)
|
|
215
|
+
|
|
216
|
+
stricter = functools.partial(score_judgment, actionable="contradiction", precision=0.9, recall=0.7)
|
|
217
|
+
saved = EvalReport.model_validate_json(Path(REPORT).read_text(encoding="utf-8"))
|
|
218
|
+
print("at 0.9 precision:", rescore_eval(saved, gold, [stricter]).passed)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
## 7. The TDD loop
|
|
150
222
|
1. Write the eval from the contract + a handful of real gold items → it fails (red) on the unbuilt/weak capability.
|
|
151
223
|
2. Implement the minimum to pass the gate (green).
|
|
152
224
|
3. A/B alternatives (rule / trained classifier / decision model / LLM) on the SAME gold; select on gate + diagnostics + cost + calibration.
|
|
@@ -158,7 +230,11 @@ SDK version's surface, not prose.
|
|
|
158
230
|
- **Gating on a diagnostic** (e.g. nDCG) — report it, don't threshold it.
|
|
159
231
|
- **No reliability check on a subjective gold** — you can't read a number off a gold whose own labels disagree.
|
|
160
232
|
- **Eval not isolated** to the capability (measures the whole pipeline) — you can't attribute a regression.
|
|
161
|
-
- **Scraping stdout** for metrics —
|
|
233
|
+
- **Scraping stdout** for metrics — keep and read the `EvalReport` JSON.
|
|
234
|
+
- **A failed call scored as an answer** (a timeout read as "neutral", an error read as "abstained") — it is an error;
|
|
235
|
+
`arun_eval` keeps it apart (ADR-0133).
|
|
236
|
+
- **Only aggregates kept** — an eval whose per-item outputs were not saved can never be re-scored or checked; keep
|
|
237
|
+
the report.
|
|
162
238
|
- **Faking a win by shrinking the sample / picking easy items** — real, representative, honest.
|
|
163
239
|
|
|
164
240
|
## Hand-off / where this sits
|
|
@@ -16,9 +16,14 @@ ADR-0110 and the other `docs/` paths are in the engine repository: read them the
|
|
|
16
16
|
matching your installed engine.
|
|
17
17
|
This skill is the operational checklist that ties them together.
|
|
18
18
|
|
|
19
|
+
**Which route.** A product deploys and reaches the server through the engine API, `adeploy_model_server` (the
|
|
20
|
+
section after the locked config). The raw `modal deploy` of the bundled script further down is the engine
|
|
21
|
+
developer's route, and what the API runs underneath. **When to stop it** is one rule, in "Cold start & cost": deploy
|
|
22
|
+
once, let it scale to zero between uses, never stop it between runs.
|
|
23
|
+
|
|
19
24
|
## The LOCKED production config (ADR-0110) — do not re-litigate
|
|
20
25
|
**Config B: `Qwen/Qwen3.8-27B-FP8` weights + `--kv-cache-dtype fp8`, on 1× A100-80GB, TP=1, `--max-model-len 16384`, `--gpu-memory-utilization 0.95`.**
|
|
21
|
-
- Config B (FP8 weights) is the **locked deploy** — 52.71× concurrency @16K (ADR-0110 rounds it to 53×), ~23% higher throughput, ~
|
|
26
|
+
- Config B (FP8 weights) is the **locked deploy** — 52.71× concurrency @16K (ADR-0110 rounds it to 53×), ~23% higher throughput, ~31 GB weights (30.9 GB on disk, 28.9 GiB in VRAM);
|
|
22
27
|
accuracy measured **identical to bf16** on the real compliance workload (no FP8 penalty).
|
|
23
28
|
- **Config A** (`Qwen/Qwen3.8-27B`, **bf16 weights** + FP8 KV) is the **documented FALLBACK only** — 25.47× concurrency,
|
|
24
29
|
"zero weight-loss" — use it *only* if a later clean check ever shows an FP8-weight regression. Don't default to A.
|
|
@@ -29,8 +34,8 @@ This skill is the operational checklist that ties them together.
|
|
|
29
34
|
**From the engine (PS-19): deploy, then use the server like any model.** `ModelServerSpec`'s defaults ARE the
|
|
30
35
|
locked config below (FP8 weights + FP8 KV, one A100-80GB, TP 1, 16K, 0.95, served `Qwen/Qwen3.8-27B`, hermes +
|
|
31
36
|
qwen3 parsers, image builder 2025.06); state only the concurrency target, which ADR-0110 leaves to you.
|
|
32
|
-
`adeploy_model_server` runs the deploy below with those settings, waits for `/health` (with progress; a
|
|
33
|
-
|
|
37
|
+
`adeploy_model_server` runs the deploy below with those settings, waits for `/health` (with progress; a restore from
|
|
38
|
+
the snapshot is seconds, a snapshot-building boot 4-9 min, see Cold start below), and registers a model profile with the server's own endpoint, so no `VLLM_BASE_URL` is needed:
|
|
34
39
|
|
|
35
40
|
```python
|
|
36
41
|
from rag_wright.api import EngineConfig, ModelServerSpec, adeploy_model_server, stop_model_server
|
|
@@ -38,7 +43,7 @@ from rag_wright.api import EngineConfig, ModelServerSpec, adeploy_model_server,
|
|
|
38
43
|
server = await adeploy_model_server(ModelServerSpec(name="acme-qwen", max_num_seqs=32)) # key from VLLM_API_KEY
|
|
39
44
|
config = EngineConfig(store=..., models={"general": server.model_id}) # or any model= argument
|
|
40
45
|
...
|
|
41
|
-
stop_model_server("acme-qwen")
|
|
46
|
+
stop_model_server("acme-qwen") # only to retire it: stopping discards the snapshots (see "Cold start & cost")
|
|
42
47
|
```
|
|
43
48
|
|
|
44
49
|
`amodel_server(spec)` reconnects to a server deployed earlier (a restart, another process) without redeploying.
|
|
@@ -46,7 +51,7 @@ The API key comes from the variable `ModelServerSpec.api_key_env` names (default
|
|
|
46
51
|
key, so set a real one. Needs `rag-wright[modal]` and a Modal login. One app per server name: different names give
|
|
47
52
|
different servers (and URLs), for example one per tenant.
|
|
48
53
|
|
|
49
|
-
**The
|
|
54
|
+
**The engine developer's route: the raw deploy (this succeeded):**
|
|
50
55
|
```
|
|
51
56
|
VLLM_API_KEY=<a long random string> MODAL_IMAGE_BUILDER_VERSION=2025.06 \
|
|
52
57
|
APP_NAME=rw-qwen3-modal MODEL=Qwen/Qwen3.8-27B-FP8 KV_CACHE_DTYPE=fp8 \
|
|
@@ -58,11 +63,10 @@ VLLM_API_KEY=<a long random string> MODAL_IMAGE_BUILDER_VERSION=2025.06 \
|
|
|
58
63
|
The script refuses to deploy without `VLLM_API_KEY`: Modal's web endpoint is public and unauthenticated, so vLLM's
|
|
59
64
|
`--api-key` is the only gate on a billing A100, and there is no default key. Then wire the engine: `.env`
|
|
60
65
|
`VLLM_BASE_URL=https://<workspace>--rw-qwen3-modal-serve.modal.run/v1` and the same `VLLM_API_KEY`; the profile
|
|
61
|
-
`qwen3.8-27b-modal` routes there (the seam also refuses an unset key).
|
|
62
|
-
`uv run --no-sync modal app stop rw-qwen3-modal --yes` (A100 is expensive).
|
|
66
|
+
`qwen3.8-27b-modal` routes there (the seam also refuses an unset key). When to stop it: "Cold start & cost" below.
|
|
63
67
|
|
|
64
68
|
**The engine does NOT reach Modal by default.** Every role's default is `_PRODUCT_LLM = "qwen3.8-27b-modal-or"`,
|
|
65
|
-
the same model routed through OpenRouter (
|
|
69
|
+
the same model routed through OpenRouter (a Modal cold start can still take minutes when Modal builds a snapshot). To send calls to the Modal server, set
|
|
66
70
|
`RAG_MODEL_ALL=qwen3.8-27b-modal` (all roles), a per-role `RAG_MODEL_<ROLE>`, or `EngineConfig.models`. For bulk
|
|
67
71
|
closed-vocab labeling, the reasoning-off profile `qwen3.8-27b-modal-nothink` exists (opt-in; see the reasoning
|
|
68
72
|
caveat below). `VISION_OCR` now defaults to the product LLM too, but image inputs through the Modal vLLM server are
|
|
@@ -98,25 +102,47 @@ the OFFICIAL prebuilt vLLM image** rather than pip-building vLLM:
|
|
|
98
102
|
reasoning calls take ~50–60 s; the seam's default 60 s timeout kills the ones just over the line → **retry pileup →
|
|
99
103
|
requests pile past `max_inputs` → instant `APIConnectionError` (0.0 s) cascade**. FIX: the seam reads
|
|
100
104
|
`RAG_STRUCTURED_TIMEOUT_S` (default 60) — raise it (e.g. `150`) for reasoning-ON bulk work. Server logs confirm the
|
|
101
|
-
calls actually complete 200 OK (~50 s); it was the client giving up.
|
|
105
|
+
calls actually complete 200 OK (~50 s); it was the client giving up. The total per call (all tries) follows it;
|
|
106
|
+
`RAG_MODEL_DEADLINE_S` overrides that (ADR-0133). Reasoning loops end at the profile's 8,192-token structured cap,
|
|
107
|
+
not at the deadline; keep temperature 0 (Qwen's recommended sampling did not remove them).
|
|
102
108
|
3. **Pick client concurrency empirically, below the ceiling.** 16 was stable; 20 (== `max-num-seqs`) sat at the exact
|
|
103
109
|
ceiling and risked queueing. `Running: N, Waiting: 0` + zero cancellations = healthy.
|
|
104
110
|
4. **Reasoning ON vs OFF for bulk classification:** reasoning-OFF is ~30× faster but **changes the labels**
|
|
105
111
|
(over-keeps / different distribution) — do NOT swap it in for work that must match the reasoning-teacher's gold
|
|
106
112
|
(e.g. distillation silver). Keep reasoning ON when fidelity to the gold teacher matters; accept the cost.
|
|
113
|
+
5. **Never expose vLLM's port directly (PS-20).** Sleep mode needs `VLLM_SERVER_DEV_MODE=1`, which adds
|
|
114
|
+
unauthenticated `/sleep`, `/wake_up` and `/collective_rpc` routes (`--api-key` guards only `/v1`, `/v2`,
|
|
115
|
+
`/inference`, `/cohere`). The script binds vLLM to 127.0.0.1:8001 and serves `rw_gate.py` on the public port,
|
|
116
|
+
forwarding only `/v1/*` and `/health`; keep `rw_gate.py` next to the script.
|
|
107
117
|
|
|
108
118
|
## Cold start & cost
|
|
109
|
-
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
- **The server is a class restored from a Modal GPU memory snapshot (PS-20, ADR-0132).** A boot without a snapshot
|
|
120
|
+
starts vLLM with `--enable-sleep-mode`, warms it, sleeps it at level 1 (weights to host RAM, KV discarded) and
|
|
121
|
+
Modal snapshots the container; a restore only wakes vLLM (~3.5 s) and is ready ~13 s after its container starts.
|
|
122
|
+
Modal builds the first few snapshots after a deploy (4-9 min boots; 3-4 in our runs) and now and then another
|
|
123
|
+
(a new host, a preemption): budget for an occasional slow cold start. Redeploying keeps the snapshots; **`modal app
|
|
124
|
+
stop` discards them**. Snapshots need TP=1 (the script boots without one at TP>1).
|
|
125
|
+
- Without a snapshot a cold start is ~2-4 min on Config B (114-245 s measured): about 30 s of imports in EACH of
|
|
126
|
+
vLLM's two processes (transformers' `importlib.metadata.packages_distributions()` stats every installed file),
|
|
127
|
+
a weight read of 12-154 s from the Volume (9P), then compile-cache load + CUDA-graph capture. Measured and NOT
|
|
128
|
+
worth adopting (ADR-0109 addendum): `--load-format runai_streamer`, precompiled `.pyc`, `HF_HUB_OFFLINE=1` (it
|
|
129
|
+
changes vLLM's compile-cache key every container, so each start recompiles). Poll `/health` for readiness.
|
|
130
|
+
- **When to stop it -- one rule (EV-6; it used to contradict the line above).** The A100 is billed only while a
|
|
131
|
+
container runs; the server scales to zero after 10 idle minutes (`scaledown_window=600`, no warm minimum) and then
|
|
132
|
+
costs nothing and KEEPS its snapshots, so the next request is back in ~13 s. `modal app stop` saves at most those
|
|
133
|
+
10 minutes and makes the next deploy pay a 9-15 min snapshot-building boot (2026-10-12: a stop after a failed smoke
|
|
134
|
+
run, then a redeploy, cost a 911 s boot).
|
|
135
|
+
1. **Deploy once per server name**; reuse the name (a new name builds new snapshots).
|
|
136
|
+
2. **Build the consumer first** (the bulk / label / eval script, its smoke test, its progress logging) while no
|
|
137
|
+
container runs, then warm, smoke and run in one go. Do not warm a GPU before its consumer is ready (2026-10-04:
|
|
138
|
+
a smoke-warmed A100 sat idle ~20 min while unrelated work ran).
|
|
139
|
+
3. **Between runs, and when you are done, let it scale to zero.** Never stop it between runs; a script's error
|
|
140
|
+
path must not stop it either when a fix-and-rerun is likely.
|
|
141
|
+
4. **Check it reached zero**: `modal app list` shows the app `deployed` with 0 tasks about 10 minutes after the
|
|
142
|
+
last call. If tasks remain past the window, find out why (that is the 2026-10-04 burn) and stop it.
|
|
143
|
+
5. **Stop (`modal app stop <app> --yes`, or `stop_model_server`) only to retire a server**: you will not use it
|
|
144
|
+
for a long time and do not want its endpoint up, or you are replacing its deployment. Expect the next deploy to
|
|
145
|
+
rebuild the snapshots.
|
|
120
146
|
|
|
121
147
|
## The meta-lesson
|
|
122
148
|
Config + recipe live in **ADR-0110 + the script + this skill**. Before any Qwen/Modal work: read them, don't
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"""Qwen3.8-27B as an OpenAI-compatible vLLM web server on Modal A100-80GB. Two uses, one script:
|
|
2
|
+
|
|
3
|
+
(1) QUANTIZATION ACCURACY EVAL (ADR-0110): serve one config under a stable served-name ("qwen3-eval").
|
|
4
|
+
MODEL=Qwen/Qwen3.8-27B KV_CACHE_DTYPE=auto uv run --no-sync modal deploy scripts/modal_qwen3_vllm_server.py
|
|
5
|
+
MODEL=Qwen/Qwen3.8-27B-FP8 KV_CACHE_DTYPE=fp8 uv run --no-sync modal deploy scripts/modal_qwen3_vllm_server.py
|
|
6
|
+
|
|
7
|
+
(2) 0048 part-2 JOINT RUN -- the UNIFIED endpoint both the product's agent-llm (tool-calling) and the engine
|
|
8
|
+
drive: Config B (FP8), ALL capabilities on (tool calls + reasoning + guided decoding), served under the
|
|
9
|
+
name the engine profile `qwen3.8-27b-modal` expects ("Qwen/Qwen3.8-27B"), sized for the measured ~16 peak
|
|
10
|
+
concurrency of unbounded reasoning outputs (2 GPUs to keep decode from saturating).
|
|
11
|
+
APP_NAME=rw-qwen3-modal MODEL=Qwen/Qwen3.8-27B-FP8 KV_CACHE_DTYPE=fp8 \
|
|
12
|
+
SERVED_NAME=Qwen/Qwen3.8-27B TOOL_PARSER=hermes REASONING_PARSER=qwen3 \
|
|
13
|
+
GPU=A100-80GB:2 TP=2 MAX_NUM_SEQS=32 \
|
|
14
|
+
uv run --no-sync modal deploy scripts/modal_qwen3_vllm_server.py
|
|
15
|
+
uv run --no-sync modal app stop <APP_NAME> # tear down (stop billing)
|
|
16
|
+
|
|
17
|
+
URL: https://<workspace>--<APP_NAME>-serve.modal.run (+ /v1 for the OpenAI base). Weights + the serve-path
|
|
18
|
+
torch.compile cache reuse the persistent Volumes (fast warm cold-start where a matching cache exists).
|
|
19
|
+
|
|
20
|
+
Cold start (PS-20, ADR-0132): at TP=1 the server is restored from a Modal GPU memory snapshot. A boot without one
|
|
21
|
+
starts vLLM, warms it, puts it to sleep (weights parked in host RAM) and Modal snapshots the container; a restore
|
|
22
|
+
only wakes vLLM (~13 s from container start). Modal builds the first 2-3 snapshots per GPU type, and now and then
|
|
23
|
+
another, on ordinary boots; stopping the app discards them. vLLM listens on 127.0.0.1 only: sleep mode needs its
|
|
24
|
+
unauthenticated dev routes, so the public port is `rw_gate.py`, which forwards only /v1/* and /health.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
import os
|
|
28
|
+
import subprocess
|
|
29
|
+
import time
|
|
30
|
+
import urllib.request
|
|
31
|
+
from pathlib import Path
|
|
32
|
+
|
|
33
|
+
import modal
|
|
34
|
+
|
|
35
|
+
MODEL = os.environ.get("MODEL", "Qwen/Qwen3.8-27B") # ...-FP8 for the quantized-weights config
|
|
36
|
+
KV_DTYPE = os.environ.get("KV_CACHE_DTYPE", "auto") # "auto" (bf16 KV, the reference) | "fp8"
|
|
37
|
+
GPU = os.environ.get("GPU", "A100-80GB:1")
|
|
38
|
+
TP = int(os.environ.get("TP", "1"))
|
|
39
|
+
MAX_LEN = int(os.environ.get("MAX_LEN", "16384")) # the real workload's context (9K+ prompts)
|
|
40
|
+
GPU_UTIL = os.environ.get("GPU_UTIL", "0.95")
|
|
41
|
+
MAX_NUM_SEQS = os.environ.get("MAX_NUM_SEQS", "256") # concurrency ceiling; size to the eval's ~16 peak
|
|
42
|
+
SERVED = os.environ.get("SERVED_NAME", "qwen3-eval") # served-model-name clients ask for (profile match)
|
|
43
|
+
TOOL_PARSER = os.environ.get("TOOL_PARSER", "") # "" off | "hermes" -> tool calling (the product agent)
|
|
44
|
+
REASONING_PARSER = os.environ.get("REASONING_PARSER", "") # "" off | "qwen3" -> reasoning coexists with a tool call
|
|
45
|
+
APP_NAME = os.environ.get("APP_NAME", "rw-qwen3-vllm-eval") # distinct app (=distinct URL) per purpose
|
|
46
|
+
API_KEY = os.environ.get("VLLM_API_KEY") # vLLM's --api-key: the only gate on the server's public URL
|
|
47
|
+
if not API_KEY: # no default key (PS-21): a default would be public, and would gate a billing GPU
|
|
48
|
+
raise SystemExit("set VLLM_API_KEY to the server's API key (a long random string) before deploying")
|
|
49
|
+
SNAPSHOT = TP == 1 # Modal: GPU memory snapshots do not work across several GPUs; TP>1 boots without one
|
|
50
|
+
VLLM_PORT, PUBLIC_PORT = 8001, 8000 # vLLM on loopback; the gate on the public port
|
|
51
|
+
GATE = "/root/rw_gate.py"
|
|
52
|
+
|
|
53
|
+
HF_CACHE = "/root/.cache/huggingface"
|
|
54
|
+
VLLM_CACHE = "/root/.cache/vllm"
|
|
55
|
+
hf_vol = modal.Volume.from_name("rw-hf-cache", create_if_missing=True)
|
|
56
|
+
vllm_cache_vol = modal.Volume.from_name("rw-vllm-serve-compile-cache", create_if_missing=True)
|
|
57
|
+
|
|
58
|
+
app = modal.App(APP_NAME)
|
|
59
|
+
vllm_image = (
|
|
60
|
+
# Base off the OFFICIAL prebuilt vLLM image: vllm + torch + xformers + flashinfer already installed as matched
|
|
61
|
+
# wheels, so a fresh build on a clean account compiles NOTHING (the xformers source-build / resolver failures
|
|
62
|
+
# only happen when pip/uv try to assemble that stack themselves). Latest/unpinned by design — `:latest` tracks
|
|
63
|
+
# newest vLLM, which is all we need since we only consume it. add_python omitted (the image ships Python).
|
|
64
|
+
# The vLLM image ships `python3` but no `python`; Modal's OWN pip bootstrap runs right after FROM (before any
|
|
65
|
+
# later layer) as `python -m pip …` -> exit 127. setup_dockerfile_commands runs BEFORE that bootstrap, so the
|
|
66
|
+
# symlink is in place when Modal bootstraps.
|
|
67
|
+
modal.Image.from_registry(
|
|
68
|
+
"vllm/vllm-openai:latest",
|
|
69
|
+
setup_dockerfile_commands=["RUN ln -sf $(command -v python3) /usr/local/bin/python"],
|
|
70
|
+
)
|
|
71
|
+
.entrypoint([]) # the image's ENTRYPOINT (the api_server) would hijack Modal's runtime; clear it
|
|
72
|
+
.pip_install("hf_transfer") # enable fast HF weight downloads (HF_HUB_ENABLE_HF_TRANSFER below)
|
|
73
|
+
# Bake the runtime knobs into the image env: a deployed function reads the CONTAINER's env, not the deploying
|
|
74
|
+
# shell's, so an override must live here to reach the container (same lesson as the bench script). Xet disabled
|
|
75
|
+
# so a fresh weight download's open log handle can't block a Volume commit.
|
|
76
|
+
.env({"HF_HUB_ENABLE_HF_TRANSFER": "1", "HF_HUB_DISABLE_XET": "1", "HF_HOME": HF_CACHE,
|
|
77
|
+
"MODEL": MODEL, "KV_CACHE_DTYPE": KV_DTYPE, "TP": str(TP), "MAX_LEN": str(MAX_LEN),
|
|
78
|
+
"GPU_UTIL": GPU_UTIL, "MAX_NUM_SEQS": str(MAX_NUM_SEQS), "SERVED_NAME": SERVED,
|
|
79
|
+
"TOOL_PARSER": TOOL_PARSER, "REASONING_PARSER": REASONING_PARSER, "VLLM_API_KEY": API_KEY,
|
|
80
|
+
# Sleep mode's /sleep and /wake_up exist only in dev mode; they stay on loopback (see the gate).
|
|
81
|
+
"VLLM_SERVER_DEV_MODE": "1", "RW_VLLM_PORT": str(VLLM_PORT), "RW_PUBLIC_PORT": str(PUBLIC_PORT),
|
|
82
|
+
"TORCHINDUCTOR_COMPILE_THREADS": "1"}) # Modal: torch.compile can otherwise break snapshot creation
|
|
83
|
+
.add_local_file(Path(__file__).resolve().parent / "rw_gate.py", GATE) # resolve(): scripts/ holds a symlink
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def _vllm(path: str, method: str = "GET", body: bytes | None = None, timeout: float = 600) -> int:
|
|
88
|
+
request = urllib.request.Request(f"http://127.0.0.1:{VLLM_PORT}{path}", data=body, method=method, headers={
|
|
89
|
+
"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"})
|
|
90
|
+
with urllib.request.urlopen(request, timeout=timeout) as response:
|
|
91
|
+
return response.status
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _wait_healthy(proc: subprocess.Popen) -> None:
|
|
95
|
+
while True:
|
|
96
|
+
if proc.poll() is not None:
|
|
97
|
+
raise RuntimeError(f"vLLM exited with {proc.returncode}")
|
|
98
|
+
try:
|
|
99
|
+
if _vllm("/health", timeout=5) == 200:
|
|
100
|
+
return
|
|
101
|
+
except OSError:
|
|
102
|
+
pass
|
|
103
|
+
time.sleep(1)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
@app.cls(image=vllm_image, gpu=GPU, volumes={HF_CACHE: hf_vol, VLLM_CACHE: vllm_cache_vol},
|
|
107
|
+
timeout=3600, max_containers=1, scaledown_window=600,
|
|
108
|
+
memory=65536, # host RAM for the sleeping weights (~29 GiB for Config B), which the snapshot captures
|
|
109
|
+
enable_memory_snapshot=SNAPSHOT, experimental_options={"enable_gpu_snapshot": SNAPSHOT})
|
|
110
|
+
# Without this Modal feeds the container ONE HTTP request at a time (Running:1 + "cancellation signal" floods,
|
|
111
|
+
# /health blocked) — vLLM's continuous batching never gets fed. Let many requests hit the one container; vLLM
|
|
112
|
+
# batches them internally up to --max-num-seqs.
|
|
113
|
+
@modal.concurrent(max_inputs=int(MAX_NUM_SEQS))
|
|
114
|
+
class QwenServer:
|
|
115
|
+
"""vLLM's OpenAI-compatible server for the configured Qwen config. Reuses the persisted weights + serve-path
|
|
116
|
+
torch.compile cache; compiled (production-faithful), optional FP8 KV, optional tool-calling + reasoning parsers so
|
|
117
|
+
ONE endpoint serves free-text, guided/JSON, tool calls, and reasoning together."""
|
|
118
|
+
|
|
119
|
+
@modal.enter(snap=True)
|
|
120
|
+
def start(self) -> None:
|
|
121
|
+
"""Start vLLM, warm it, and put it to sleep: the snapshot is taken after this (when SNAPSHOT is on)."""
|
|
122
|
+
hf_vol.reload()
|
|
123
|
+
vllm_cache_vol.reload()
|
|
124
|
+
args = [
|
|
125
|
+
"vllm", "serve", MODEL, "--host", "127.0.0.1", "--port", str(VLLM_PORT), "--served-model-name", SERVED,
|
|
126
|
+
"--tensor-parallel-size", str(TP), "--dtype", "bfloat16", "--max-model-len", str(MAX_LEN),
|
|
127
|
+
"--gpu-memory-utilization", GPU_UTIL, "--max-num-seqs", str(MAX_NUM_SEQS),
|
|
128
|
+
"--api-key", API_KEY, "--trust-remote-code", "--enable-sleep-mode",
|
|
129
|
+
]
|
|
130
|
+
if KV_DTYPE != "auto":
|
|
131
|
+
args += ["--kv-cache-dtype", KV_DTYPE]
|
|
132
|
+
if TOOL_PARSER: # the product's deep-agent orchestrator is a tool-caller (RuleWright Q1/Q3)
|
|
133
|
+
args += ["--enable-auto-tool-choice", "--tool-call-parser", TOOL_PARSER]
|
|
134
|
+
if REASONING_PARSER: # so reasoning coexists with a forced tool/schema instead of colliding
|
|
135
|
+
args += ["--reasoning-parser", REASONING_PARSER]
|
|
136
|
+
print(f"[qwen] serving {MODEL} as '{SERVED}' | TP={TP} max_len={MAX_LEN} util={GPU_UTIL} kv={KV_DTYPE} "
|
|
137
|
+
f"max_seqs={MAX_NUM_SEQS} tool={TOOL_PARSER or '-'} reasoning={REASONING_PARSER or '-'} "
|
|
138
|
+
f"snapshot={SNAPSHOT}", flush=True)
|
|
139
|
+
self.vllm = subprocess.Popen(args)
|
|
140
|
+
_wait_healthy(self.vllm)
|
|
141
|
+
warm = (b'{"model": "%s", "messages": [{"role": "user", "content": "Say OK."}], "max_tokens": 8, '
|
|
142
|
+
b'"chat_template_kwargs": {"enable_thinking": false}}' % SERVED.encode())
|
|
143
|
+
for _ in range(2):
|
|
144
|
+
_vllm("/v1/chat/completions", "POST", warm)
|
|
145
|
+
_vllm("/sleep?level=1", "POST", b"") # level 1: weights to host RAM (in the snapshot), KV cache discarded
|
|
146
|
+
print("[qwen] warmed and asleep; snapshot next", flush=True)
|
|
147
|
+
|
|
148
|
+
@modal.enter(snap=False)
|
|
149
|
+
def wake(self) -> None:
|
|
150
|
+
"""After a restore (or straight after `start` without one): wake vLLM, then open the public port."""
|
|
151
|
+
_vllm("/wake_up", "POST", b"")
|
|
152
|
+
_wait_healthy(self.vllm)
|
|
153
|
+
self.gate = subprocess.Popen(["python", GATE])
|
|
154
|
+
print("[qwen] awake; gate open", flush=True)
|
|
155
|
+
|
|
156
|
+
@modal.web_server(port=PUBLIC_PORT, startup_timeout=1200, label=f"{APP_NAME}-serve")
|
|
157
|
+
def serve(self) -> None:
|
|
158
|
+
"""The public URL: the gate, which forwards /v1/* and /health to vLLM."""
|
|
159
|
+
|
|
160
|
+
@modal.exit()
|
|
161
|
+
def stop(self) -> None:
|
|
162
|
+
for proc in (getattr(self, "gate", None), getattr(self, "vllm", None)):
|
|
163
|
+
if proc:
|
|
164
|
+
proc.terminate()
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""The model server's public front (PS-20): forwards only the OpenAI API (`/v1/...`) and `/health` to vLLM.
|
|
2
|
+
|
|
3
|
+
vLLM's `--api-key` guards only `/v1`, `/v2`, `/inference` and `/cohere`. Sleep mode, which the GPU snapshot needs,
|
|
4
|
+
requires `VLLM_SERVER_DEV_MODE=1`, and that adds unauthenticated `/sleep`, `/wake_up` and `/collective_rpc` routes. So
|
|
5
|
+
vLLM listens on 127.0.0.1 only and this gate is what the public URL reaches. It runs inside the server container
|
|
6
|
+
(`modal_qwen3_vllm_server.py` copies it into the image); responses stream through as they arrive.
|
|
7
|
+
"""
|
|
8
|
+
import os
|
|
9
|
+
|
|
10
|
+
UPSTREAM = f"http://127.0.0.1:{os.environ.get('RW_VLLM_PORT', '8001')}"
|
|
11
|
+
_HOP_BY_HOP = {"connection", "keep-alive", "transfer-encoding", "upgrade", "proxy-connection", "te", "trailer",
|
|
12
|
+
"host", "content-length"}
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def allowed(path: str) -> bool:
|
|
16
|
+
"""The routes the public URL may reach: the OpenAI API and the health check."""
|
|
17
|
+
return path == "/health" or path.startswith("/v1/")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
async def _forward(request):
|
|
21
|
+
from aiohttp import web
|
|
22
|
+
|
|
23
|
+
if not allowed(request.path):
|
|
24
|
+
return web.json_response({"error": "Not Found"}, status=404)
|
|
25
|
+
headers = {k: v for k, v in request.headers.items() if k.lower() not in _HOP_BY_HOP}
|
|
26
|
+
async with request.app["session"].request(request.method, UPSTREAM + request.path_qs, headers=headers,
|
|
27
|
+
data=await request.read()) as upstream:
|
|
28
|
+
response = web.StreamResponse(status=upstream.status, headers={
|
|
29
|
+
k: v for k, v in upstream.headers.items() if k.lower() not in _HOP_BY_HOP})
|
|
30
|
+
await response.prepare(request)
|
|
31
|
+
async for chunk in upstream.content.iter_any(): # streamed completions pass through as they arrive
|
|
32
|
+
await response.write(chunk)
|
|
33
|
+
await response.write_eof()
|
|
34
|
+
return response
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
async def _app():
|
|
38
|
+
from aiohttp import ClientSession, ClientTimeout, TCPConnector, web
|
|
39
|
+
|
|
40
|
+
app = web.Application(client_max_size=64 * 1024 * 1024)
|
|
41
|
+
|
|
42
|
+
async def open_session(app):
|
|
43
|
+
app["session"] = ClientSession(connector=TCPConnector(limit=0), timeout=ClientTimeout(total=None))
|
|
44
|
+
|
|
45
|
+
async def close_session(app):
|
|
46
|
+
await app["session"].close()
|
|
47
|
+
|
|
48
|
+
app.on_startup.append(open_session)
|
|
49
|
+
app.on_cleanup.append(close_session)
|
|
50
|
+
app.router.add_route("*", "/{tail:.*}", _forward)
|
|
51
|
+
return app
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
if __name__ == "__main__":
|
|
55
|
+
from aiohttp import web
|
|
56
|
+
|
|
57
|
+
web.run_app(_app(), host=os.environ.get("RW_GATE_HOST", "0.0.0.0"),
|
|
58
|
+
port=int(os.environ.get("RW_PUBLIC_PORT", "8000")), print=None)
|
|
@@ -157,7 +157,24 @@ unset. Check both before trusting a run's numbers.
|
|
|
157
157
|
Read the engine's **reference pack** (`load_reference_pack()`) as a worked template — but the contract/compliance
|
|
158
158
|
domain is only an example; your pack and capabilities are your own.
|
|
159
159
|
|
|
160
|
-
## 5.
|
|
160
|
+
## 5. Evals behind your product's backend
|
|
161
|
+
Domain experts own the gold; your UI lets them upload it, run it and compare runs. The engine gives you the pieces
|
|
162
|
+
(the `creating-evals` skill has the method and a complete example):
|
|
163
|
+
- **Upload a gold set**: `aload_gold_set(IngestSource(data=uploaded_bytes, name=filename), GoldMapping(...),
|
|
164
|
+
name=..., version=...)` -- CSV / XLSX / JSONL as the expert wrote it; a `GoldImportError` says where the file is
|
|
165
|
+
wrong, which you show as is. Client data stays `local_only` (the default).
|
|
166
|
+
- **Run it as a background job**, never inside the request: start `arun_eval(gold, task, scorers, repeats=...,
|
|
167
|
+
progress=...)` as a task you keep a reference to, return a job id at once, and let the UI poll. `progress` receives
|
|
168
|
+
`[eval] i/N <item> r<k> ok|error` lines; `evaluate_ingestion`'s async form `aevaluate_ingestion` works the same
|
|
169
|
+
way for ingestion structure. The synchronous `run_eval` raises inside a running event loop.
|
|
170
|
+
- **Return the `EvalReport`** (`report.model_dump(mode="json")`): `passed`, each scorer's gate against its
|
|
171
|
+
thresholds and its diagnostics, errors and flips kept apart, every item's outputs.
|
|
172
|
+
- **Keep run history in your store**: save each report with its gold version; `rescore_eval` scores a saved report
|
|
173
|
+
again (new thresholds, a corrected gold) without calling anything. With `langfuse=True` the runs also appear in
|
|
174
|
+
Langfuse with their links (`report.run_urls`), for teams that use it.
|
|
175
|
+
- **The task is your capability through the capability layer**, so the eval measures what production runs.
|
|
176
|
+
|
|
177
|
+
## 6. Keep the engine current
|
|
161
178
|
|
|
162
179
|
The engine releases in batches (release-please; the engine's `docs/releasing.md`), so you never chase every
|
|
163
180
|
engine PR:
|
|
@@ -185,7 +202,8 @@ mkdir -p .claude/skills && for d in "$SKILLS"/*/; do ln -sfn "${d%/}" ".claude/s
|
|
|
185
202
|
```
|
|
186
203
|
|
|
187
204
|
Re-run it after every engine upgrade (a symlink follows the installed version, but a newly added skill needs a new
|
|
188
|
-
link).
|
|
205
|
+
link). Link these, and any product-building skills another repo writes for product developers, into this repo's
|
|
206
|
+
`.claude/skills/` only, never into the global Claude Code skills, where they would apply in every repo on the machine. The Addy-Osmani spec-driven/TDD/planning skills come from their own source, as the product template says.
|
|
189
207
|
|
|
190
208
|
## Anti-patterns
|
|
191
209
|
|