rag-wright 0.5.1__tar.gz → 0.7.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.5.1 → rag_wright-0.7.0}/.claude/skills/qwen-vllm-modal/SKILL.md +27 -11
- rag_wright-0.7.0/.claude/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +164 -0
- rag_wright-0.7.0/.claude/skills/qwen-vllm-modal/scripts/rw_gate.py +58 -0
- {rag_wright-0.5.1/src/rag_wright/.agents → rag_wright-0.7.0/.claude}/skills/using-the-rag-wright-engine/SKILL.md +5 -1
- rag_wright-0.7.0/.release-please-manifest.json +3 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/CHANGELOG.md +19 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/CLAUDE.md +2 -2
- {rag_wright-0.5.1 → rag_wright-0.7.0}/PKG-INFO +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0109-vllm-cold-start-reduction.md +39 -0
- rag_wright-0.7.0/docs/adr/0131-model-server-hardening-after-rulewright-review.md +34 -0
- rag_wright-0.7.0/docs/adr/0132-model-server-cold-start-from-a-gpu-snapshot.md +45 -0
- rag_wright-0.7.0/docs/adr/0133-model-call-deadline-follows-the-timeout-and-a-thinking-cap.md +40 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/README.md +6 -3
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/api/README.md +19 -3
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/api/pack_sdk.md +4 -2
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/configuration.md +56 -13
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/specs/public-surface/plan.md +3 -1
- rag_wright-0.7.0/docs/specs/public-surface/rulewright-migration-0.6.0.md +43 -0
- rag_wright-0.7.0/docs/specs/public-surface/rulewright-migration-0.7.0.md +46 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/contractnli_judge.py +17 -11
- {rag_wright-0.5.1 → rag_wright-0.7.0}/examples/model_server.py +19 -9
- {rag_wright-0.5.1 → rag_wright-0.7.0}/pyproject.toml +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/compliance_engine_smoke.py +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/eval_compliance_gold.py +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/granite_chunker_assess.py +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/measure_generation_robustness.py +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_gemma4_vllm.py +4 -2
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_gemma4_vllm_snapshot.py +3 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_granite_vllm_server.py +4 -2
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_qwen3_27b_bench.py +3 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_qwen3_27b_snapshot.py +3 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_stack_a100.py +4 -2
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/phase_a_leg_validate.py +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/semantic_judge_live_validate.py +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/semantic_judge_probe.py +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/stack_correctness_validate.py +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/vllm_extraction_ab.py +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/vllm_kg_query_validate.py +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/vllm_raw_diagnostic.py +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/SKILL.md +27 -11
- rag_wright-0.7.0/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +164 -0
- rag_wright-0.7.0/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/rw_gate.py +58 -0
- {rag_wright-0.5.1/.claude → rag_wright-0.7.0/src/rag_wright/.agents}/skills/using-the-rag-wright-engine/SKILL.md +5 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/api/__init__.py +5 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/ingestion/builder.py +23 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/models/model_servers.py +84 -8
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/models/profiles.py +14 -3
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/models/seam.py +75 -18
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/capabilities/dg_extraction.py +1 -1
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tasks.md +7 -3
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/eval/test_contractnli_judge.py +11 -0
- rag_wright-0.7.0/tests/ingestion/test_concurrency_ceiling.py +59 -0
- rag_wright-0.7.0/tests/models/test_model_servers.py +343 -0
- rag_wright-0.7.0/tests/models/test_seam_deadline_and_cap.py +131 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_serving_seam.py +23 -2
- {rag_wright-0.5.1 → rag_wright-0.7.0}/uv.lock +1 -1
- rag_wright-0.5.1/.claude/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -96
- rag_wright-0.5.1/.release-please-manifest.json +0 -3
- rag_wright-0.5.1/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -96
- rag_wright-0.5.1/tests/models/test_model_servers.py +0 -149
- {rag_wright-0.5.1 → rag_wright-0.7.0}/.claude/settings.json +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/.claude/skills/authoring-a-capability/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/.claude/skills/building-an-ingestion-capability/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/.claude/skills/classifier-opportunity-analysis/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/.claude/skills/creating-evals/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/.claude/skills/laya/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/.claude/skills/setfit/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/.env.example +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/.github/workflows/publish.yml +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/.github/workflows/release-please.yml +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/.gitignore +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/LICENSE +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/README.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/SPEC.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/conftest.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/ARCHITECTURE_OVERVIEW.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/ArcadeDB_Local.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/OBSERVABILITY.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0001-stack-and-library-choices.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0002-validation-corpus-cuad-edgar.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0003-ard-registration-and-capability-kinds.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0004-entity-disambiguation.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0005-relational-golden-set.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0006-model-profile.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0007-arcadedb-store-schema.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0008-unified-framework-index-docs-grounding.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0009-rlm-chunking-retained-as-configurable-capability.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0010-transformers-pinned-below-5-for-flagembedding-reranker.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0011-cuad-not-a-retrieval-benchmark-acord-for-queries.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0012-entity-mention-confidence-no-proximity-edges.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0013-entity-resolution-matching-strategy.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0014-split-generation-and-vision-to-text.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0015-rlm-dynamic-subagents-and-granted-subagents.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0016-rlm-defined-by-required-capabilities-enforced-as-tests.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0017-dynamic-dispatch-trigger-as-typed-flag.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0018-rlm-method-is-the-orchestrator-system-prompt.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0019-recursion-is-optional-for-chunking-required-for-synthesis.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0020-serialize-interpreter-sessions-per-process-ki1.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0021-capability-interface-governed-typed-io.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0022-fr-k-embedding-free-okf-navigation-experimental.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0023-cheap-model-for-okf-enrichment.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0024-reader-parallelism-lives-in-python-not-the-interpreter.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0025-retrieval-pivot-function-classify-property-graph-rerank.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0026-property-schema-and-extended-function-taxonomy.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0027-openrouter-provider-routing-by-throughput.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0028-deterministic-grounding-judge-and-flash-pro-cascade.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0029-retrieval-pipeline-domain-portability-and-adaptation.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0030-model-training-standard-modal-reusable-checkpointed.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0031-single-call-chunking-for-structured-contracts.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0032-nl-to-type-two-step-reason-emit-on-gemma.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0033-unified-contract-kg-three-legs-one-graph.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0034-granite-json-schema-structured-output-profile.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0035-graph-extraction-rebacked-with-gp1b-retire-hybrid.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0036-party-clause-link-party-to-edge.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0037-clause-template-is-authoritative-code-not-generated.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0038-full-cuad-kg-on-gcp-gpu-vm-and-gcs-backup.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0039-self-hosted-open-model-stack-on-modal-a100.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0040-neuro-symbolic-extraction-fidelity-ontology-shacl-validation.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0041-capability-kind-rubric-and-agent-skill-runtime-tiers.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0042-clause-level-span-id-provenance-and-content-hash-backfill.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0043-retire-cross-corpus-retrieval-standardize-on-leg-b.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0044-is-exception-to-derived-carveout-relationship.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0045-client-side-tag-parse-structured-output.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0046-acord-unified-into-one-production-kg.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0047-retire-precomputed-clause-function-gate.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0048-ingest-llm-classifier-nondestructive-reclassify.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0049-generic-customer-lens-for-ingestion.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0050-async-langgraph-ingestion.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0051-schema-bootstrap-and-feedback-driven-ontology-evolution.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0052-engine-product-split-graphwright-parked.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0053-answer-prose-output-hygiene.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0054-remove-auto-tag-from-generator-evidence.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0055-confidence-out-of-band.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0056-bound-structured-retry-wall-clock.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0057-async-engine-architecture.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0058-structure-first-chunking.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0059-recall-decoupled-from-classification-and-visible-partial-loss.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0060-scope-compliance-check-to-named-policy-sources.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0061-subject-document-compliance-per-section.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0062-tiered-ocr-scan-quality-vlm-escalation.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0063-per-sentence-compliance-subject-facts.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0064-typed-properties-out-of-band-on-evidence.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0065-deontic-applicability-gates-query-side.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0066-ontology-ttl-single-source-of-truth.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0067-domain-pack-retargeting.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0068-recall-first-actor-gate-ontology-role-disjointness.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0069-reading-order-chunking-tables-figures-retrievable.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0070-text-layer-first-parsing-no-false-vlm-escalation.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0071-defragmentation-reconstruct-paragraphs-from-line-items.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0072-extract-guard-furniture-and-deterministic-failure.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0073-born-digital-threshold-sparse-pages-no-vlm-escalation.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0074-retry-transient-extraction-failures.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0075-per-page-vlm-escalation.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0076-thread-safe-shared-embedder-reranker.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0077-concurrent-function-classification-across-chunks.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0078-dedicated-extraction-executor.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0079-product-default-granite-4.2-openrouter-routing.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0080-nested-tag-parse-and-degrade.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0081-function-independent-tagparse-clause-extraction.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0082-symbolic-gate-function-independent.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0083-executor-hop-trace-context-capture.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0084-gleaning-off-on-the-query-leg.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0085-query-constraint-extraction-tagparse.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0086-streaming-cost-capture.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0087-retrieval-relevance-score-on-rankedspan.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0088-per-span-relevance-verdict.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0089-structured-output-generation-tracing.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0090-affiliate-of-extraction.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0091-retire-partyto-edge.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0092-idempotent-write-graph.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0093-entities-by-name-seam.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0094-workspace-document-scope.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0095-span-page-provenance.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0096-carveout-keyword-normalization.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0097-caller-configurable-ingest-extraction-models.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0098-invoke-time-document-scope.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0099-mcp-tools-never-take-a-model-supplied-tenant.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0100-profile-based-model-routing.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0101-untagged-spans-reach-extraction-aspect-gate-removed.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0102-open-descriptive-list-dims-retain-verbatim.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0103-a-clause-is-a-provision-not-a-span.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0104-dense-floor-protection-in-leg-b.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0105-in-band-model-usage-accounting.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0106-document-signals-off-the-citation.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0107-requirement-page-provenance.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0108-qwen3-27b-single-a100-serving-profile.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0110-fp8-kv-cache-16k-single-a100.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0111-pin-qwen3-27b-deepinfra-bf16.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0112-relax-deepagents-pin-to-floor.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0113-llm-span-instrumentation-for-latency-attribution.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0114-setfit-default-clause-function-classifier.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0115-classifier-only-step3a-property-extraction.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0116-soft-function-scoping-classifier-lane.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0117-engine-api-layer-and-capability-runtime.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0118-engine-core-api-vs-ard-adapter-free-impl-ref-client.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0119-jev-typed-decision-model-for-compliance-closed-set-fields.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0120-rlm-sub-agent-identity-dynamic-dispatch-trigger.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0121-spacy-optional-extra-model-runtime-download.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0122-provision-boundary-deterministic-plus-decision-model-residue.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0123-batched-releases-release-please-and-consumer-dependabot.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0124-generic-ingestion-builder-and-hooks.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0125-qwen-openrouter-unpinned.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0126-unit-representative-hook-and-the-reference-vote.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0127-retire-the-okf-code.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0128-two-public-tiers-api-and-pack-sdk.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0129-laya-temperatures-and-the-sklearn-floor.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/adr/0130-deploy-the-self-hosted-model-server-from-the-engine.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/architecture/foundations-and-adding-a-domain.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/architecture.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/README.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/design/deontic-applicability-routing.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/design/ingestion-neuro-symbolic-gaps.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/design/semantic-subject-segmentation.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/design/unify-subject-preprocessing.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/engine-issues/0037-closed-vocab-drops-verbatim-values-to-other.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.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.5.1 → rag_wright-0.7.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.5.1 → rag_wright-0.7.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.5.1 → rag_wright-0.7.0}/docs/archive/engine-issues/0041-VERIFICATION-dense-floor.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/engine-issues/0041-leg-b-discards-the-best-dense-matches-on-some-queries.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.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.5.1 → rag_wright-0.7.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.5.1 → rag_wright-0.7.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.5.1 → rag_wright-0.7.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.5.1 → rag_wright-0.7.0}/docs/archive/engine-issues/0046-appending-a-natural-follow-up-to-a-question-drops-the-clause-type.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/engine-issues/0047-an-exact-deepagents-pin-transitively-pins-every-consumer.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/engine-issues/0048-the-pinned-endpoints-latency-tail-makes-agent-runs-undebuggable-from-either-side.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-07-20_graphwright_capability_interface_reply.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-07-20b_graphwright_interface_confirmation.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-07-20c_graphwright_ingestion_interfaces.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-08-30_subject_compliance_final_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-01_issue-0013-recall-first-actor-gate_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-01_ontology-source-of-truth_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-03_issue-0014-table-retrievability_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-04_bulk-ingestion-wall_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-04_issue-0016-thread-safe-embedder_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-05_observability-langfuse_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-05_tagparse-ingestion-and-granite-4.2_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-09_affiliate-of-extraction_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-09_issue-0028-partyto-retired_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-09_issue-0029-idempotent-write-graph_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-09_issue-0030-entities-by-name_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-09_observability-and-retrieval-floor_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-09_relevance-verdict_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-09_rename-run-ad-compliance-check_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-09_structured-output-cost-tracing_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-10_ingest-models-caller-configurable_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-failclosed-and-nodrift_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-validate-ingested-set_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-10_issue-0031-workspace-document-scope_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-10_issue-0032-span-page-provenance_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-10_issue-0033-carveout-normalization_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-10_issue-0034-invoke-time-document-scope_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-11_issue-0035-followup-derived-guard_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-11_issue-0035-mcp-no-model-tenant_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-11_profile-based-model-routing_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-11_qwen-default-modal-or_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-11_qwen-everywhere-config_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-12_clause-granularity_0036-0039_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-12_closed-vocab_0037-0040_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-12_dense-floor-protection_0041_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-13_in-band-usage_0042_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-14_document-signals-off-citation_0044_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-14_requirement-page-provenance_0043_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-16_qwen3-27b-single-a100-serving-profile_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-18_fp8-accuracy-eval-configB_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-18_fp8-kv-16k-single-a100_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-20_deepagents-pin-relaxed_0047_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-20_llm-span-instrumentation_0048_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-answers_from_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-scoping-questions_rulewright.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/misc/.gitkeep +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/plans/Corpus_Acquisition.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/plans/async-migration.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/plans/demo_plan.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/plans/gp1b_docling_graph_plan.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/plans/unified_contract_kg_ontology_bridge.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/plans/unified_contract_kg_plan.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/results/2026-07-24-t58-property-graph-population.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/results/2026-07-25-t58b-full-pipeline-rerank.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/archive/results/2026-07-25-t58b-topk-ordering-levers.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/concepts.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/contract_pipeline_explainer.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/corpus_ingest_recipe.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/domain-adaptation/README.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/domain-adaptation/_engine-gaps.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/domain-adaptation/authoring-capabilities.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/domain-adaptation/classification-and-decision-models.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/domain-adaptation/entity-resolution.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/domain-adaptation/kg-construction.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/domain-adaptation/ontology-authoring.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/classifier_model_ab.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/compliance_demo.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/compliance_gate_cc7.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/compliance_rung2_cc7.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/cuad_highlighting_cu-d1.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/dg_model_ab.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/function_gate_recall.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/generation_robustness_b_vs_c.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/nl_to_type_cu-d2.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/ocr_benchmark.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/prod1_readiness.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/prod2_readiness.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/query_side_model_ab.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/silver_granite_vs_gemma4.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/silver_provider_routing.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/eval/silver_selfhosted_gemma4_26b.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/installation.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/playbook.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/product/capability_profiles.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/product/contracts_product_roadmap.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/product/engine-api-migration-handoff.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/product/engine_async_api.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/product/new-domain-build-sequence.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/product/seam-adaptation-guide.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/proposals/compliance-ingest-classifier-decomposition.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/proposals/de-domaining-and-capability-runtime.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/proposals/new-domain-developer-journey.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/proposals/ontology-induction.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/quickstart.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/reference-pack.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/releasing.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/specs/engine-platform/SPEC.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/specs/engine-platform/TASKS.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/specs/engine-prep/plan.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/specs/ingestion-hooks/ing5-doc-audit.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/specs/ingestion-hooks/ing8-breaking-changes.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/specs/ingestion-hooks/plan.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/specs/ingestion-hooks/rulewright-migration-0.2.0.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/specs/public-surface/rulewright-migration-0.3.0.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/specs/public-surface/rulewright-migration-0.4.0.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/specs/public-surface/rulewright-migration-0.5.0.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/specs/public-surface/rulewright-reply-2026-10-10-laya-and-sklearn.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/templates/product-starter/CLAUDE.md.template +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/templates/product-starter/README.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/templates/product-starter/dependabot.yml +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/templates/product-starter/playbook.md.template +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/upstream/laya-temperature-range-mismatch.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/vendor/arcadedb/arcadedb-buckets-schema.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/vendor/arcadedb/arcadedb-docs-extraction.json +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/vendor/arcadedb/arcadedb-vector-embeddings.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/vendor/arcadedb/arcadedb-vector-search-tutorial.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/docs/workspaces.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/acord.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/acord_retrieval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/boundary_residue_gold.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/build_golden.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/compliance_demo/policy/community_conduct_policy.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/compliance_demo/subjects/post_borderline.txt +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/compliance_demo/subjects/post_compliant.txt +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/compliance_demo/subjects/post_violation.txt +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/condensed_pipeline.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/contract_parity_live.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/cuad_highlight.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/embedded_eval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/full_pipeline_rerank.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/function_ceiling.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/function_property_rerank.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/function_rerank.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/gate1_chunker_ab.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/gate2_hybrid_rerank.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/golden/relational/set.json +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/golden.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/ground_discriminator_rerank.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/harness.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/ingestion_live_smoke.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/kg_primary.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/kg_property_rerank.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/listwise_rerank.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/multihop.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/nl_to_type.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/relational_eval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/residual_decision_gold.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/segmenter_eval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/semantic_judge_gold.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/test_acord.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/test_acord_retrieval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/test_harness.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/test_multihop_set.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/eval/unit_grouper_eval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/examples/quickstart.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/plan.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/release-please-config.json +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ab_model_overlap.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/acord_unify.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/acquire_acord.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/acquire_cuad.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/acquire_ecfr.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/acquire_edgar.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/acquire_ftc_255.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/acquire_prod1_corpus.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/audit_reclass_flips.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/author_leg_a_silver_key.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/backfill_affiliations.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/backfill_clause_span_id.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/backfill_edge_source_doc_id.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/backup_kg_to_gcs.sh +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/bootstrap_template_capture.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/bootstrap_typed_edges.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/build_api_docs.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/build_api_docs.sh +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/build_cuad_clause_cache.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/build_function_routing_map.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_assemble_v2.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_assemble_v3.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_generate_hard_negatives.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_generate_hard_positives.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_generate_training.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_hybrid.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_hybrid2.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_jev_actor.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_jev_claimtypes.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_jev_operative.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_label_spans.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_laya_prep.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_laya_train.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_prep_operative.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_relabel_rubric.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_relabel_rubric2.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/cic1_train_operative.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/compare_extraction_models.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/compliance_actor_gate_smoke.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/compliance_policy_demo.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/curate_taxonomy_gaps.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/dg_model_ab.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/diagnose_acord_knn_expansion.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/diagnose_acord_knn_rerank.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/diagnose_acord_leg_pool.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/diagnose_acord_legs.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/diagnose_acord_pool.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/diagnose_acord_relstructure.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/diagnose_acord_retrieval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/distill/eval_all.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/distill/eval_ce.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/distill/eval_listwise_b.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/distill/export_ce_dataset.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/distill/extract_features.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/distill/listwise_variants.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/distill/relational_features.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/distill/train_ce.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/distill/train_modal.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/enrich_edgar_candidates.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/eval_chunking_ab.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/eval_classifier_guided_vs_tagparse.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/extract_arcadedb_docs.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/fetch_reference_models.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/generate_contract_python.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/git_post_commit_graphify.sh +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/graph_status.sh +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ingest_acord.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ingest_compliance_async_prod2.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ingest_compliance_document_prod2.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ingest_compliance_prod2.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ingest_cuad.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ingest_cuad_full.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ingest_ftc_compliance.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ingest_prod1.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ingest_prod1_async.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ingest_smoke.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/install_git_hooks.sh +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/label_new_functions.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/legb_function_gate_recall.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/make_compliance_fixtures.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/make_compliance_gold.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/mcp_compliance_agent_demo.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/mcp_intra_document_qa_smoke.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/mcp_query_legs_agent_demo.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/measure_silver.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/merge_docs_into_framework.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/migrate_entity_cik_to_canonical_id.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/migrate_silver_evidence_autotag.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/migrate_silver_evidence_remove_autotag.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/migrate_span_fields.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/mine_scarce_functions.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_arcadedb.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_backfill.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_exception_linking.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_granite_server.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_granite_throughput.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_query_app.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/modal_qwen3_vllm_server.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ocr_benchmark.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ocr_preprocess.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/ontology_dimension_check.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/populate_clause_kg.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/populate_entity_graph.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/populate_entity_graph_extracted.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/populate_property_store.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/prep_relational_verification.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/publish_manifests.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/reclassify_kg.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/refresh_framework_graph.sh +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/revert_reclass_flips.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/run_acord_retrieval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/run_clause_exception_linking.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/snapshot_leg_a_eval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/table_retrieval_smoke.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/train_function_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/train_legalbert_function.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/train_legalbert_modal.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/typed_rerank_validate.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/scripts/verify_wheel_install.sh +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/.agents/skills/authoring-a-capability/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/.agents/skills/building-an-ingestion-capability/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/.agents/skills/classifier-opportunity-analysis/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/.agents/skills/creating-evals/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/.agents/skills/laya/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/.agents/skills/setfit/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/api/answers.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/api/config.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/api/discover.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/api/documents.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/api/ids.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/api/invoke.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/api/kg.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/api/mcp.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/api/tracing.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/api/usage.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/api/workspace.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/answer_generator.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/ard.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/chunk_read.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/chunk_write.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/disambiguation.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/document_parse.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/document_scope.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/embedding.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/embedding_profiles.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/entity_resolution.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/fusion.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/graph_query.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/graph_storage.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/hybrid_search.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/invoke.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/jev_decision.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/manifests.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/parsing.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/registry.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/remote_encoders.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/reranking.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/retrieval_core.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/rlm_chunking.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/rlm_synthesis.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/scan_quality.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/span_relevance_judgment.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/vision_to_text.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/capabilities/vlm_ocr.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/contracts/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/contracts/chunk.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/contracts/extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/contracts/graph.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/contracts/identifiers.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/contracts/ingestion.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/contracts/provenance.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/contracts/span.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/corpus/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/corpus/canonicalize.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/corpus/document_parser.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/corpus/embedded.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/corpus/http.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/ingestion/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/ingestion/evaluate.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/ingestion/group.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/ingestion/layout.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/ingestion/segment.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/ingestion/tables.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/models/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/models/tag_structured.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/models/tracing.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/models/usage.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/models/weights.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/ontology/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/ontology/pack_schema.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/ontology/registry.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/pack_sdk/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/capabilities/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/capabilities/assertion_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/capabilities/claim_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/capabilities/compliance_judgment.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/capabilities/compliance_store.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/capabilities/requirement_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/invokers.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/mcp/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/mcp/compliance_server.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/ontology/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/ontology/compliance_bridge.ttl +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/ontology/loader.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/ontology/packs/ftc_16cfr255.ttl +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/pack.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/schemas/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/schemas/compliance.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/skills/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/skills/claim_extraction/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/skills/claim_extraction/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/skills/claim_extraction/template.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/skills/compliance_judgment/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/skills/generic_compliance_judgment/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/template.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/subgraphs/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/subgraphs/compliance_check.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/subgraphs/compliance_ingestion.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/compliance/subgraphs/requirement_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/capabilities/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/capabilities/clause_exception_linking.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_serve.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_store.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/capabilities/graph_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/capabilities/highlight_serve.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/capabilities/property_boosted_retrieval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/capabilities/query_function_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/capabilities/query_understanding.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/corpus/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/corpus/cuad.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/corpus/cuad_ingestion.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/corpus/edgar.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/corpus/gcs_ingestion.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/corpus/selection.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/mcp/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/mcp/intra_document_qa_server.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/mcp/relational_qa_server.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/mcp/session_store.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/mcp/typed_property_retrieval_server.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/ontology/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/ontology/_generated_template_meta.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/ontology/_generated_vocab.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/ontology/clause_template.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/ontology/codegen.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/ontology/contract_bridge.ttl +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/ontology/contract_taxonomy.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/ontology/derive.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/ontology/loader.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/ontology/template_introspect.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/options.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/pack.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/schemas/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/schemas/contract_meta.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/schemas/function.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/schemas/function_routing.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/schemas/highlight.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/schemas/jurisdiction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/schemas/ontology.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/schemas/property.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/schemas/query_intent.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/schemas/value_match.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/skills/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/skills/corpus_ingest/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/skills/guidance/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/skills/guidance/chunking.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/skills/guidance/generation.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/skills/guidance/relevance.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/boundary.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/clause_function_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/clause_kg_extractor.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/cuad_labels.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/dim_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/dim_fleet.json +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/function_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/function_families.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/hybrid_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/legalbert_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/model_capabilities.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/new_function_labels.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/property_extractor.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/property_grounding.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/reclassify.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/residual_candidates.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/scarce_function_labels.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/segment.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/semantic_judge.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/symbolic_validation.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/spans/tag_clause_extractor.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/subgraphs/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/subgraphs/async_ingestion.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/subgraphs/contract_ingestion_pipeline.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/subgraphs/intra_document_qa.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/subgraphs/query_constraint_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/subgraphs/relational_qa.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/subgraphs/typed_clause_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/contracts/subgraphs/typed_property_retrieval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/packs/reference_seam.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/py.typed +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/skills/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/skills/generation/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/skills/generation/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/skills/rlm/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/skills/rlm/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/skills/rlm/agent.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/skills/span_relevance_judgment/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/skills/vision_to_text/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/skills/vision_to_text/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/spans/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/spans/page_map.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/store/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/store/arcadedb.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/store/chunk_text.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/store/seam.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/subgraphs/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/subgraphs/graph_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/subgraphs/observability.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/subgraphs/scaffold.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/subgraphs/semantic_chunking.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/util/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/util/concurrent.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/src/rag_wright/util/spacy_model.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_answers_exports.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_bytes_ingest.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_capability_reexports.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_decision_swap_doc_example.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_discover.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_documents.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_e2e.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_invoke.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_kg.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_mcp.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_metering_tracing_exports.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_model_role_export.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_open_workspace_reconfig.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_options.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_pack_sdk.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_pack_store.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_usage.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_workspace.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/api/test_workspace_models.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/arch/domain_vocabulary_baseline.json +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/arch/test_api_docs_current.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/arch/test_doc_references.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/arch/test_engine_domain_vocabulary.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/arch/test_import_contracts.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/arch/test_packs_use_store_primitives.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/arch/test_shipped_skills.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/async_helpers.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/_fixtures/rlm_probe_skill/SKILL.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_answer_generator.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_answer_generator_async.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_assertion_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_authoring_contract.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_chunk_read.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_chunk_write.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_chunking_prompts_neutral.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_claim_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_clause_exception_linking.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_compliance_judgment.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_compliance_store.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_contract_kg_serve.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_contract_kg_store.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_contract_kg_store_reads.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_contract_taxonomy_and_spans.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_dg_adapter.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_dg_async.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_dg_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_dg_model_seam.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_dg_private.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_disambiguation.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_document_scope.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_embedding.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_embedding_profiles.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_entity_resolution.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_entity_rules_plumbing.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_fusion.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_graph_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_graph_query.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_graph_storage.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_highlight_serve.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_hybrid_search.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_jev_decision.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_manifest_validation.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_manifests.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_parsing.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_parties_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_property_boosted_retrieval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_query_function_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_query_understanding.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_registry.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_remote_encoders.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_repair_partition.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_requirement_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_reranking.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_retrieval_core.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_rlm_chunking.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_rlm_chunking_async.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_rlm_method.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_rlm_synthesis.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_runtime_registry.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_scan_quality.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_span_relevance_judgment.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_structural_boundary_discoverer.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_structural_model_fallback.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_tag_boundary_discoverer.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_tiered_ocr.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/capabilities/test_vlm_ocr.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/compliance_fakes.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/conftest.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_canonical_source_doc_id.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_chunk_record.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_compliance.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_cuad_highlight_contracts.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_function.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_function_routing.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_identifiers.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_ingestion_hooks.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_jurisdiction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_ontology.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_property.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_provenance.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/contracts/test_value_match.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/corpus/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/corpus/_ooxml_fixtures.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/corpus/test_canonicalize.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/corpus/test_cuad.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/corpus/test_cuad_ingestion.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/corpus/test_document_parser.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/corpus/test_edgar.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/corpus/test_embedded.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/corpus/test_gcs_ingestion.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/corpus/test_http.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/corpus/test_parse_wire2.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/corpus/test_selection.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/eval/test_cuad_highlight_metrics.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/eval/test_kg_property_rerank.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/eval/test_nl_to_type_metrics.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/eval/test_relational_eval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/fixtures/ingestion/segmenter_gold.json +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/fixtures/ingestion/textile_spec_sheet.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/fixtures/ingestion/textile_test_report.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/fixtures/leg_a_silver/README.md +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/fixtures/leg_a_silver/evidence_snapshot.json +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/fixtures/table-bearing-contract.pdf +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/foundation/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/foundation/test_arcadedb_hybrid.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/foundation/test_model_seam_structured.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ingestion/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ingestion/test_builder.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ingestion/test_chunk_discoverer_hook.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ingestion/test_document_metadata.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ingestion/test_evaluate.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ingestion/test_evaluate_labels.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ingestion/test_layout_segmenter.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ingestion/test_spreadsheet_content.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ingestion/test_table_rows.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ingestion/test_tuning.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ingestion/test_unit_grouper.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ingestion/test_unit_representative.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/journey/incidents_domain.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/journey/incidents_pack.ttl +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/journey/test_incidents_journey.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/journey/test_pack_schema.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/mcp/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/mcp/test_compliance_server.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/mcp/test_intra_document_qa_server.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/mcp/test_no_model_supplied_tenant.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/mcp/test_relational_qa_server.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/mcp/test_typed_property_retrieval_server.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_async_infra.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_classifier_heads_load_clean.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_models_dir.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_no_gemma_default.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_profile_routing.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_profile_seam.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_seam_async.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_seam_retry.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_seam_stream.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_serving_wiring.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_tag_structured.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_tag_structured_async.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_tracing.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/models/test_usage.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ontology/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ontology/test_clause_template.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ontology/test_compliance_ontology_authoritative.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ontology/test_derivation.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ontology/test_entity_taxonomy.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ontology/test_generated_template_meta_in_sync.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ontology/test_generated_vocab_in_sync.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ontology/test_template_captured_in_ttl.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/ontology/test_ttl_is_source_of_truth.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/reference/test_compliance_reference.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/reference/test_contract_seam.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/scripts/test_eval_chunking_ab.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/scripts/test_eval_classifier_ab.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/scripts/test_fetch_reference_models.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/skills/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/skills/test_ingestion_skill_example.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_boundary.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_classifier_property_extractor.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_clause_classifier_tags_0005.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_clause_function_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_clause_function_classifier_async.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_clause_kg_extractor.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_clause_kg_extractor_async.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_dim_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_dim_fleet_live.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_function_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_hybrid_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_hybrid_property_extractor.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_legalbert_classifier.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_model_capabilities.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_new_function_labels.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_page_map.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_property_extractor.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_property_grounding.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_reclassify.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_residual_decision.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_scarce_function_labels.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_segment.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_segmentation_vocab.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_semantic_judge.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_setfit_clause_adapter.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_setfit_probabilities.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_span_offsets.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_stage_labels_0005.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_symbolic_validation.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/spans/test_tag_clause_extractor.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_affiliation_backfill.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_arcadedb_clause_kg.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_arcadedb_contract.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_arcadedb_property.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_arcadedb_requirement_sources.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_arcadedb_schema.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_arcadedb_span.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_chunk_text.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_concurrent_writes.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_contract_kg_store_live.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_document_metadata_live.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_document_scope.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_engine_domain_neutral.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_entities_by_name.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_kg_edges.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_kg_mutations.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_kg_read.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_kg_write.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_neutral_schema.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/store/test_write_graph_idempotent.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_async_ingestion.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_chunk7_structure_carry.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_clause_results.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_compliance_check.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_compliance_ingestion.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_contract_ingestion_pipeline.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_contract_ingestion_pipeline_async.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_contract_ingestion_pipeline_graph_async.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_graph_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_ingest_knobs.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_ingest_segment_classify.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_intra_document_qa.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_observability.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_partial_entry_contract.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_query_constraint_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_relational_qa.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_requirement_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_scaffold.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_semantic_chunking.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_typed_clause_extraction.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/subgraphs/test_typed_property_retrieval.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/test_backfill_clause_span_id.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/test_dg_model_ab.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/test_populate_clause_kg.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/test_populate_entity_graph.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/util/__init__.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/util/test_concurrent.py +0 -0
- {rag_wright-0.5.1 → rag_wright-0.7.0}/tests/util/test_spacy_model.py +0 -0
|
@@ -18,7 +18,7 @@ This skill is the operational checklist that ties them together.
|
|
|
18
18
|
|
|
19
19
|
## The LOCKED production config (ADR-0110) — do not re-litigate
|
|
20
20
|
**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, ~
|
|
21
|
+
- 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
22
|
accuracy measured **identical to bf16** on the real compliance workload (no FP8 penalty).
|
|
23
23
|
- **Config A** (`Qwen/Qwen3.8-27B`, **bf16 weights** + FP8 KV) is the **documented FALLBACK only** — 25.47× concurrency,
|
|
24
24
|
"zero weight-loss" — use it *only* if a later clean check ever shows an FP8-weight regression. Don't default to A.
|
|
@@ -29,8 +29,8 @@ This skill is the operational checklist that ties them together.
|
|
|
29
29
|
**From the engine (PS-19): deploy, then use the server like any model.** `ModelServerSpec`'s defaults ARE the
|
|
30
30
|
locked config below (FP8 weights + FP8 KV, one A100-80GB, TP 1, 16K, 0.95, served `Qwen/Qwen3.8-27B`, hermes +
|
|
31
31
|
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
|
-
|
|
32
|
+
`adeploy_model_server` runs the deploy below with those settings, waits for `/health` (with progress; a restore from
|
|
33
|
+
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
34
|
|
|
35
35
|
```python
|
|
36
36
|
from rag_wright.api import EngineConfig, ModelServerSpec, adeploy_model_server, stop_model_server
|
|
@@ -48,19 +48,21 @@ different servers (and URLs), for example one per tenant.
|
|
|
48
48
|
|
|
49
49
|
**The exact working deploy (this succeeded):**
|
|
50
50
|
```
|
|
51
|
-
MODAL_IMAGE_BUILDER_VERSION=2025.06 \
|
|
51
|
+
VLLM_API_KEY=<a long random string> MODAL_IMAGE_BUILDER_VERSION=2025.06 \
|
|
52
52
|
APP_NAME=rw-qwen3-modal MODEL=Qwen/Qwen3.8-27B-FP8 KV_CACHE_DTYPE=fp8 \
|
|
53
53
|
SERVED_NAME=Qwen/Qwen3.8-27B TOOL_PARSER=hermes REASONING_PARSER=qwen3 \
|
|
54
54
|
GPU=A100-80GB:1 TP=1 MAX_LEN=16384 GPU_UTIL=0.95 MAX_NUM_SEQS=<target> \
|
|
55
55
|
uv run --no-sync modal deploy scripts/modal_qwen3_vllm_server.py
|
|
56
56
|
```
|
|
57
57
|
(From a product repo, deploy the copy in this skill's directory: `.claude/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py` once the skills are linked.)
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
The script refuses to deploy without `VLLM_API_KEY`: Modal's web endpoint is public and unauthenticated, so vLLM's
|
|
59
|
+
`--api-key` is the only gate on a billing A100, and there is no default key. Then wire the engine: `.env`
|
|
60
|
+
`VLLM_BASE_URL=https://<workspace>--rw-qwen3-modal-serve.modal.run/v1` and the same `VLLM_API_KEY`; the profile
|
|
61
|
+
`qwen3.8-27b-modal` routes there (the seam also refuses an unset key). **Stop billing when done:**
|
|
60
62
|
`uv run --no-sync modal app stop rw-qwen3-modal --yes` (A100 is expensive).
|
|
61
63
|
|
|
62
64
|
**The engine does NOT reach Modal by default.** Every role's default is `_PRODUCT_LLM = "qwen3.8-27b-modal-or"`,
|
|
63
|
-
the same model routed through OpenRouter (
|
|
65
|
+
the same model routed through OpenRouter (a Modal cold start can still take minutes when Modal builds a snapshot). To send calls to the Modal server, set
|
|
64
66
|
`RAG_MODEL_ALL=qwen3.8-27b-modal` (all roles), a per-role `RAG_MODEL_<ROLE>`, or `EngineConfig.models`. For bulk
|
|
65
67
|
closed-vocab labeling, the reasoning-off profile `qwen3.8-27b-modal-nothink` exists (opt-in; see the reasoning
|
|
66
68
|
caveat below). `VISION_OCR` now defaults to the product LLM too, but image inputs through the Modal vLLM server are
|
|
@@ -96,17 +98,31 @@ the OFFICIAL prebuilt vLLM image** rather than pip-building vLLM:
|
|
|
96
98
|
reasoning calls take ~50–60 s; the seam's default 60 s timeout kills the ones just over the line → **retry pileup →
|
|
97
99
|
requests pile past `max_inputs` → instant `APIConnectionError` (0.0 s) cascade**. FIX: the seam reads
|
|
98
100
|
`RAG_STRUCTURED_TIMEOUT_S` (default 60) — raise it (e.g. `150`) for reasoning-ON bulk work. Server logs confirm the
|
|
99
|
-
calls actually complete 200 OK (~50 s); it was the client giving up.
|
|
101
|
+
calls actually complete 200 OK (~50 s); it was the client giving up. The total per call (all tries) follows it;
|
|
102
|
+
`RAG_MODEL_DEADLINE_S` overrides that (ADR-0133). Reasoning loops end at the profile's 8,192-token structured cap,
|
|
103
|
+
not at the deadline; keep temperature 0 (Qwen's recommended sampling did not remove them).
|
|
100
104
|
3. **Pick client concurrency empirically, below the ceiling.** 16 was stable; 20 (== `max-num-seqs`) sat at the exact
|
|
101
105
|
ceiling and risked queueing. `Running: N, Waiting: 0` + zero cancellations = healthy.
|
|
102
106
|
4. **Reasoning ON vs OFF for bulk classification:** reasoning-OFF is ~30× faster but **changes the labels**
|
|
103
107
|
(over-keeps / different distribution) — do NOT swap it in for work that must match the reasoning-teacher's gold
|
|
104
108
|
(e.g. distillation silver). Keep reasoning ON when fidelity to the gold teacher matters; accept the cost.
|
|
109
|
+
5. **Never expose vLLM's port directly (PS-20).** Sleep mode needs `VLLM_SERVER_DEV_MODE=1`, which adds
|
|
110
|
+
unauthenticated `/sleep`, `/wake_up` and `/collective_rpc` routes (`--api-key` guards only `/v1`, `/v2`,
|
|
111
|
+
`/inference`, `/cohere`). The script binds vLLM to 127.0.0.1:8001 and serves `rw_gate.py` on the public port,
|
|
112
|
+
forwarding only `/v1/*` and `/health`; keep `rw_gate.py` next to the script.
|
|
105
113
|
|
|
106
114
|
## Cold start & cost
|
|
107
|
-
-
|
|
108
|
-
|
|
109
|
-
|
|
115
|
+
- **The server is a class restored from a Modal GPU memory snapshot (PS-20, ADR-0132).** A boot without a snapshot
|
|
116
|
+
starts vLLM with `--enable-sleep-mode`, warms it, sleeps it at level 1 (weights to host RAM, KV discarded) and
|
|
117
|
+
Modal snapshots the container; a restore only wakes vLLM (~3.5 s) and is ready ~13 s after its container starts.
|
|
118
|
+
Modal builds the first few snapshots after a deploy (4-9 min boots; 3-4 in our runs) and now and then another
|
|
119
|
+
(a new host, a preemption): budget for an occasional slow cold start. Redeploying keeps the snapshots; **`modal app
|
|
120
|
+
stop` discards them**. Snapshots need TP=1 (the script boots without one at TP>1).
|
|
121
|
+
- 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
|
|
122
|
+
vLLM's two processes (transformers' `importlib.metadata.packages_distributions()` stats every installed file),
|
|
123
|
+
a weight read of 12-154 s from the Volume (9P), then compile-cache load + CUDA-graph capture. Measured and NOT
|
|
124
|
+
worth adopting (ADR-0109 addendum): `--load-format runai_streamer`, precompiled `.pyc`, `HF_HUB_OFFLINE=1` (it
|
|
125
|
+
changes vLLM's compile-cache key every container, so each start recompiles). Poll `/health` for readiness.
|
|
110
126
|
- **A100 is billed while up — `modal app stop <app> --yes` the moment you're done.** Verify with `modal app list`
|
|
111
127
|
(state `stopped`, 0 tasks) + endpoint 404.
|
|
112
128
|
- **Do NOT warm the GPU before the consumer is ready, and do NOT trust auto-scaledown to protect billing** (burned
|
|
@@ -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)
|
|
@@ -141,7 +141,11 @@ Work the domain-adaptation guide, grounding each engine call (step 2) and writin
|
|
|
141
141
|
`server = await adeploy_model_server(ModelServerSpec(name="<app>", max_num_seqs=<concurrency target>))` (the locked
|
|
142
142
|
setup of the `qwen-vllm-modal` skill; needs `rag-wright[modal]`, a Modal login and `VLLM_API_KEY` in `.env`), then
|
|
143
143
|
`EngineConfig(models={"general": server.model_id, ...})`. Other processes reconnect with `amodel_server(spec)`;
|
|
144
|
-
call `await_model_server(server)` before traffic (cold start is minutes
|
|
144
|
+
call `await_model_server(server, timeout_s=<startup budget>)` before traffic (cold start is minutes; the default
|
|
145
|
+
waits 25 min); `stop_model_server(name)` stops billing. `amodel_server_status(spec)` looks without waking it (deployed,
|
|
146
|
+
running, healthy, weights cached). There is no default `VLLM_API_KEY`. Count concurrency end to end: `aingest` runs
|
|
147
|
+
`min(document_concurrency, documents) x extract_concurrency` calls per run, parallel runs add up, and the sum must
|
|
148
|
+
stay below `max_num_seqs` (`aingest` warns when its own peak exceeds it).
|
|
145
149
|
Full walk-through: `docs/configuration.md`, "A self-hosted model server".
|
|
146
150
|
|
|
147
151
|
**Using the decision model (Jev).** Register `jev_decision` (from `engine_capabilities()`) and set
|
|
@@ -4,6 +4,25 @@ All notable changes to RAG_Wright are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project aims to follow
|
|
5
5
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.7.0](https://github.com/fzaidi-dai/RAG_Wright/compare/0.6.0...0.7.0) (2026-10-11)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* **PS-20:** the model server cold-starts from a Modal GPU memory snapshot behind a public-route gate (ADR-0132) ([1305237](https://github.com/fzaidi-dai/RAG_Wright/commit/13052378c57f31d126d281cda49c614ca9e7207b))
|
|
13
|
+
* **PS-22:** the model-call deadline follows the configured timeout; a profile caps thinking models' structured output (ADR-0133) ([d327813](https://github.com/fzaidi-dai/RAG_Wright/commit/d3278130aaae10e7af3c326e503612337e7336cb))
|
|
14
|
+
|
|
15
|
+
## [0.6.0](https://github.com/fzaidi-dai/RAG_Wright/compare/0.5.1...0.6.0) (2026-10-10)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### ⚠ BREAKING CHANGES
|
|
19
|
+
|
|
20
|
+
* **PS-21:** a self-hosted server call or deploy with VLLM_API_KEY (or the profile's api_key_env) unset now raises instead of using the default key "rw-vllm-dev-key".
|
|
21
|
+
|
|
22
|
+
### Bug Fixes
|
|
23
|
+
|
|
24
|
+
* **PS-21:** no default model-server key; concurrency ceiling, status and clearer errors (ADR-0131) ([a73a4fd](https://github.com/fzaidi-dai/RAG_Wright/commit/a73a4fd9595a9f8d70d95d393147ba10a1f1718b))
|
|
25
|
+
|
|
7
26
|
## [0.5.1](https://github.com/fzaidi-dai/RAG_Wright/compare/0.5.0...0.5.1) (2026-10-10)
|
|
8
27
|
|
|
9
28
|
|
|
@@ -55,10 +55,10 @@ The failure mode to avoid, which has happened before: a command fails with "modu
|
|
|
55
55
|
|
|
56
56
|
## Start of every session
|
|
57
57
|
|
|
58
|
-
> **CURRENT STATE (2026-10-
|
|
58
|
+
> **CURRENT STATE (2026-10-11): the public-surface workstream is COMPLETE and released as `rag-wright` 0.6.0** (ledger
|
|
59
59
|
> `docs/specs/public-surface/plan.md`, ADR-0128: two public tiers, `rag_wright.api` for a product's seam and
|
|
60
60
|
> `rag_wright.pack_sdk` for a pack's code, enforced by import contracts and a domain-vocabulary guard). Next:
|
|
61
|
-
> RuleWright moves from `docs/specs/public-surface/rulewright-migration-0.3.0.md` then `rulewright-migration-0.4.0.md` and `-0.
|
|
61
|
+
> RuleWright moves from `docs/specs/public-surface/rulewright-migration-0.3.0.md` then `rulewright-migration-0.4.0.md`, `-0.5.0.md` and `-0.6.0.md`; PS-R4 (the unit-labelling eval) is done, unreleased. Before it,
|
|
62
62
|
> the **ingestion-hooks** workstream (ADR-0124) is
|
|
63
63
|
> COMPLETE and released as **`rag-wright` 0.2.0** (PyPI + GitHub tag/release `0.2.0`; release process
|
|
64
64
|
> `docs/releasing.md`): the generic `build_ingestion` with hooks and domain-neutral defaults, the neutral default
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: rag-wright
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: A domain-retargetable, open-core engine for hybrid retrieval + knowledge-graph RAG: parsing, chunking, embedding, hybrid search, reranking, graph extraction, entity resolution, ontology-driven knowledge, and a capability runtime.
|
|
5
5
|
Project-URL: Homepage, https://github.com/fzaidi-dai/RAG_Wright
|
|
6
6
|
Project-URL: Repository, https://github.com/fzaidi-dai/RAG_Wright
|
|
@@ -45,6 +45,44 @@ Plausible target after the snapshot is built: **~10–20s cold restart**, well u
|
|
|
45
45
|
- **Fallback if the alpha proves unstable:** the §4 supporting trims alone do NOT reach sub-60s (per the reframe), so the fallback for a hard sub-60s SLA reverts to keep-one-warm (the ruled-out cost) until the snapshot path matures.
|
|
46
46
|
- No engine code changes here; this is deployment/serving infrastructure for the product substrate (ADR-0039). This ADR sets direction and diagnosis; a follow-up will record the prototype's measured result.
|
|
47
47
|
|
|
48
|
+
## Addendum (2026-10-11): `runai_streamer` measured on Modal, not adopted
|
|
49
|
+
|
|
50
|
+
The §4 trim `--load-format runai_streamer` was measured on the locked Config B (ADR-0110: `Qwen/Qwen3.8-27B-FP8`,
|
|
51
|
+
fp8 KV, 1×A100-80GB, TP=1, 16K) with the weights cached on the `rw-hf-cache` Volume and the AOT compile cache hit in
|
|
52
|
+
every run. It is already in the `vllm/vllm-openai` image (vLLM's Dockerfile installs `runai-model-streamer`), and it
|
|
53
|
+
streams from the Hugging Face cache when given a repo id. Seven cold starts, timed from container start:
|
|
54
|
+
|
|
55
|
+
| Loader | Weight read (s) | "Model loading" (s) | Container start → ready (s) |
|
|
56
|
+
|---|---|---|---|
|
|
57
|
+
| default | 40.6 / 26.5 / 11.6 | 46.8 / 36.8 / 17.0 | 146 / 245 / 114 |
|
|
58
|
+
| `runai_streamer`, concurrency 16 | 30 / 31 / 56 | 36.9 / 61.9 / 64.8 | 154 / 167 / 185 |
|
|
59
|
+
| `runai_streamer`, concurrency 32 | 45 | 57.0 | 218 |
|
|
60
|
+
|
|
61
|
+
**Decision: keep the default loader.** Means: weight read 26 s (default) against 39 s (streamer at 16); start to
|
|
62
|
+
ready 168 s against 169 s. On a Modal Volume the read rate swings 0.76 to 2.7 GB/s with the default loader alone,
|
|
63
|
+
depending on whether the files are already cached, which is larger than any loader effect; the streamer's
|
|
64
|
+
published gains (2.4× on local NVMe, up to 6× from object storage) do not transfer. The streamer's "Model loading"
|
|
65
|
+
also carries ~30 s beyond its read. The weight read is 10-30% of a cold start; the remainder is process start
|
|
66
|
+
(~70-120 s before the load begins) and engine init (~30-50 s), which confirms the reframe above: the cold-start
|
|
67
|
+
work is the snapshot path, not the loader.
|
|
68
|
+
|
|
69
|
+
Two corrections to figures above. Config B's weights are **30.9 GB on disk (28.9 GiB in VRAM)**, not ~27 GB. The
|
|
70
|
+
current cold start with weights and compile cache warm is **~2-4 minutes** (114-245 s here), not the ~481 s
|
|
71
|
+
measured for the bf16 model in September.
|
|
72
|
+
|
|
73
|
+
## Addendum (2026-10-11): where the non-snapshot cold start goes, and the outcome
|
|
74
|
+
|
|
75
|
+
Timed from the server function's start in three default-loader cold starts (146 / 245 / 114 s): the API server
|
|
76
|
+
process reaching its arguments 30 / 80 / 31 s; the engine process initialised 31 / 70 / 29 s later; model loading
|
|
77
|
+
47 / 37 / 17 s; compile-cache load and CUDA-graph capture 31 / 45 / 31 s. The first two are imports: on a CPU
|
|
78
|
+
container the API server's import takes 37 s cold and 28-29 s warm, the same with every module precompiled to
|
|
79
|
+
bytecode (so not compilation). The largest single cost is transformers' `import_utils`, whose import calls
|
|
80
|
+
`importlib.metadata.packages_distributions()` (it stats every file of every installed package) and reads its own
|
|
81
|
+
model modules (21,413 `stat` calls in one `import transformers`). `HF_HUB_OFFLINE=1` removes the Hub lookups but
|
|
82
|
+
resolves the model to a local snapshot path, which changed vLLM's compile-cache key in each container (a 73-104 s
|
|
83
|
+
recompile per start), so it is not adopted. **Outcome: the snapshot path (decision 2-3 above) is adopted; see
|
|
84
|
+
ADR-0132.**
|
|
85
|
+
|
|
48
86
|
### Sources
|
|
49
87
|
- Modal GPU snapshots (alpha, what's captured): https://modal.com/blog/gpu-mem-snapshots ; caveats (multi-GPU incompat, storage-bound caveat, torch.compile): https://modal.com/docs/guide/memory-snapshots ; vLLM example: https://modal.com/docs/examples/lfm_snapshot , https://modal.com/docs/examples/gpu_snapshot
|
|
50
88
|
- Cold-start is CPU-bound; Tensorizer fastest: https://arxiv.org/abs/2606.07362 ; 35B breakdown: https://route179.dev/2026/06/30/optimizing-vllm-cold-start-with-model-streaming-and-compile-caching/
|
|
@@ -52,3 +90,4 @@ Plausible target after the snapshot is built: **~10–20s cold restart**, well u
|
|
|
52
90
|
- vLLM loaders: runai_streamer https://docs.vllm.ai/en/stable/models/extensions/runai_model_streamer/ ; Tensorizer https://docs.vllm.ai/en/v0.10.1/models/extensions/tensorizer.html
|
|
53
91
|
- vLLM CUDA graphs / capture cost: https://docs.vllm.ai/en/stable/design/cuda_graphs/
|
|
54
92
|
- Modal Volume 1–2 GB/s, keep-warm knobs: https://modal.com/docs/guide/high-performance-llm-inference , https://modal.com/docs/guide/cold-start , https://modal.com/docs/guide/scale
|
|
93
|
+
- vLLM loaders (cont.): runai_streamer source https://github.com/vllm-project/vllm/blob/main/vllm/model_executor/model_loader/runai_streamer_loader.py ; route179 35B breakdown (2.4× on NVMe) above
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# ADR-0131: No default server key anywhere; a model's concurrency ceiling travels with its id
|
|
2
|
+
|
|
3
|
+
**Status:** accepted · **Date:** 2026-10-11 · **Related:** ADR-0130 (deploy the model server from the engine),
|
|
4
|
+
ADR-0110 (`max_num_seqs` is the concurrency target), PS-21 (RuleWright's model-server review)
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
RuleWright's first use of the model-server API found five gaps. The deploy script (and six dev scripts) fell back to
|
|
9
|
+
a key committed in the repo when `VLLM_API_KEY` was unset, and Modal's web endpoint is public and unauthenticated, so
|
|
10
|
+
the raw `modal deploy` path the skill documents put a billing A100 behind a published key; the seam sent the same
|
|
11
|
+
default. A product could not tell whether its load fits the server, because the engine's own ingestion fan-out
|
|
12
|
+
multiplies with the product's and nothing compared it to `max_num_seqs`. Cache state, a not-deployed error and the
|
|
13
|
+
startup timeout were also unclear.
|
|
14
|
+
|
|
15
|
+
## Decision
|
|
16
|
+
|
|
17
|
+
1. No default key. Every Modal vLLM server script raises on an unset `VLLM_API_KEY` (and bakes it into the image
|
|
18
|
+
env, which the container reads); the seam's `vllm` backend raises instead of sending a default. A test fails if
|
|
19
|
+
the old default string reappears under `src/`, `scripts/` or `docs/*.md`. Breaking, approved.
|
|
20
|
+
2. `ModelProfile.max_concurrency` (optional; approved schema change): the most requests the model's server batches
|
|
21
|
+
at once. A deployed server registers its `max_num_seqs` there. `aingest` warns (a `RuntimeWarning` and a progress
|
|
22
|
+
line) when `min(document_concurrency, documents) x extract_concurrency` exceeds the ceiling of any model the
|
|
23
|
+
workspace resolves. It cannot see a product's other parallel runs; the docs give the arithmetic.
|
|
24
|
+
3. `amodel_server_status(spec)`: deployed, running, healthy, weights cached. It asks `/health` only of a running
|
|
25
|
+
container (a request to a scaled-down server starts a cold start) and reads the weights Volume (`rw-hf-cache`,
|
|
26
|
+
pinned to the script by a test).
|
|
27
|
+
4. `ModelServerNotDeployed` (a `RuntimeError`) replaces Modal's raw `NotFoundError`; `astop_model_server` is the async
|
|
28
|
+
stop.
|
|
29
|
+
|
|
30
|
+
## Consequences
|
|
31
|
+
|
|
32
|
+
- A hand deploy or a client without `VLLM_API_KEY` now fails with a message naming the variable.
|
|
33
|
+
- The ingestion warning covers the generic pipeline's extractor fan-out; other callers (a pack's own concurrency,
|
|
34
|
+
queries) are covered by the documented arithmetic, not a check.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# ADR-0132: The model server cold-starts from a Modal GPU memory snapshot, behind a public-route gate
|
|
2
|
+
|
|
3
|
+
**Status:** accepted · **Date:** 2026-10-11 · **Related:** ADR-0109 (cold-start reduction: direction and the
|
|
4
|
+
measurements behind it), ADR-0110 (Config B), ADR-0130/0131 (the model-server API), PS-20
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
A cold start of the self-hosted Qwen server (Config B on one A100) took 114-245 s, sometimes more, every time a
|
|
9
|
+
scaled-down server got a request. Measured on 2026-10-11 (ADR-0109 addenda): about 30 s of imports in each of vLLM's
|
|
10
|
+
two processes, a 12-154 s weight read from the Volume, then compile-cache load and CUDA-graph capture. The levers
|
|
11
|
+
that do not remove startup were measured and rejected: the Run:ai streamer, precompiled bytecode, and
|
|
12
|
+
`HF_HUB_OFFLINE=1` (it changes vLLM's compile-cache key in every container, so each start recompiles).
|
|
13
|
+
|
|
14
|
+
## Decision
|
|
15
|
+
|
|
16
|
+
1. **The server is a Modal class restored from a GPU memory snapshot** (`enable_memory_snapshot` +
|
|
17
|
+
`experimental_options={"enable_gpu_snapshot": True}`, alpha). `@modal.enter(snap=True)` starts vLLM with
|
|
18
|
+
`--enable-sleep-mode`, warms it with two requests and sleeps it at level 1 (weights to host RAM, ~29 GiB, KV
|
|
19
|
+
discarded; the class requests 64 GiB of memory); Modal snapshots the container. `@modal.enter(snap=False)` wakes
|
|
20
|
+
vLLM. `TORCHINDUCTOR_COMPILE_THREADS=1` as Modal requires. Snapshots only at TP=1 (Modal: incompatible with
|
|
21
|
+
several GPUs); TP>1 boots without one.
|
|
22
|
+
2. **vLLM listens on 127.0.0.1 only; the public port is `rw_gate.py`**, which forwards `/v1/*` and `/health` and
|
|
23
|
+
returns 404 for everything else. Sleep mode needs `VLLM_SERVER_DEV_MODE=1`, which adds unauthenticated `/sleep`,
|
|
24
|
+
`/wake_up` and `/collective_rpc` routes, and vLLM's `--api-key` guards only `/v1`, `/v2`, `/inference` and
|
|
25
|
+
`/cohere` (v0.30.0 `serve/middleware/authenticate.py`). Modal's published vLLM snapshot examples expose those
|
|
26
|
+
routes publicly; we do not.
|
|
27
|
+
3. **The URL does not change**: `@modal.web_server(..., label=f"{APP_NAME}-serve")` keeps
|
|
28
|
+
`https://<workspace>--<app>-serve.modal.run`. The engine looks the server up as
|
|
29
|
+
`modal.Cls.from_name(name, "QwenServer")().serve` (the URL and the container count; Modal's public
|
|
30
|
+
`Function.from_name` refuses a class's `<Class>.*` name). The public API is unchanged.
|
|
31
|
+
|
|
32
|
+
## Consequences
|
|
33
|
+
|
|
34
|
+
- **A restore is ready ~13 s after its container starts** (wake ~3.5 s); 21-67 s end to end in our runs, including
|
|
35
|
+
getting a container. One restore took ~112 s (Modal loading the snapshot slowly).
|
|
36
|
+
- **Modal decides per container whether to restore or build**, and a build is a full boot plus the snapshot: 4-9
|
|
37
|
+
minutes. It built 3-4 snapshots after each deploy in our runs (one after a GPU preemption) and another later in
|
|
38
|
+
one run. So a scaled-to-zero server usually answers in seconds and occasionally makes a request wait minutes; a
|
|
39
|
+
product that cannot accept that keeps the server warm during working hours.
|
|
40
|
+
- **Redeploying keeps the snapshots; stopping the app discards them**, so the next deploy pays the builds again.
|
|
41
|
+
- **Alpha-feature risk** stays (Modal labels GPU snapshots alpha). If a restore fails, Modal boots the container in
|
|
42
|
+
full, which is the pre-snapshot behaviour.
|
|
43
|
+
- Live gate (engine API only): deploy, a question metered on the server's model id, status while up, public
|
|
44
|
+
`/sleep` and `/collective_rpc` 404, three cold starts, a redeploy then a restored cold start (67 s), stop, status
|
|
45
|
+
not deployed. Prototype runs: restores in 4 of 11 cold starts across two deployments, all after the first builds.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# ADR-0133: The model-call deadline follows the configured timeout, and a thinking model's structured output is capped by its profile
|
|
2
|
+
|
|
3
|
+
**Status:** accepted · **Date:** 2026-10-11 · **Related:** ADR-0056/0057 (one bounded retry layer; the async
|
|
4
|
+
wall-clock deadline), ADR-0110 (the timeout trap on reasoning-on calls), PS-22
|
|
5
|
+
|
|
6
|
+
## Context
|
|
7
|
+
|
|
8
|
+
The 2026-10-11 sampling A/B (ContractNLI, 150 pairs, thinking on, Qwen on our A100) found two things:
|
|
9
|
+
|
|
10
|
+
1. The async seam cancelled every logical call at a fixed 180 s (`_MODEL_DEADLINE_S`), whatever
|
|
11
|
+
`RAG_STRUCTURED_TIMEOUT_S` said. The docs and the qwen skill tell people to raise that per-try timeout for
|
|
12
|
+
reasoning-on work, and past 180 s in total it did nothing. A loop and a slow healthy call both ended as
|
|
13
|
+
`ModelCallTimeout`, and the ContractNLI eval scored that as "neutral".
|
|
14
|
+
2. Reasoning loops are real and random: one pair ran to 8,192 tokens in 1 of 3 tries at Qwen's recommended
|
|
15
|
+
sampling, and correct verdicts took up to ~7k tokens. Qwen's recommended sampling did not remove loops (greedy
|
|
16
|
+
stays the default).
|
|
17
|
+
|
|
18
|
+
## Decision
|
|
19
|
+
|
|
20
|
+
1. **`model_deadline_s()`** is `RAG_MODEL_DEADLINE_S` when set; otherwise the per-try timeout times the tries plus
|
|
21
|
+
the largest backoffs, never under 180 s. Every async seam call runs under it, and `ModelCallTimeout` names both
|
|
22
|
+
settings.
|
|
23
|
+
2. **`ModelProfile.structured_max_tokens`** is the default `max_tokens` for a forced structured call (a caller's own
|
|
24
|
+
value wins). The four thinking-on Qwen profiles set 8,192, so a loop ends at `finish_reason=length`, a parse
|
|
25
|
+
failure the bounded retry handles, rather than at the deadline. A server deployed from the engine inherits it.
|
|
26
|
+
3. **The cap never fails a call that worked without it.** vLLM rejects a request whose prompt plus `max_tokens`
|
|
27
|
+
exceeds the context with a 400 naming `input_tokens` (`vllm/renderers/params.py`), so that error is answered by
|
|
28
|
+
sending the call once more without the cap. A caller's own `max_tokens` keeps today's behaviour (no retry).
|
|
29
|
+
4. `eval/contractnli_judge.py` reports failed calls as errors, never as a verdict.
|
|
30
|
+
|
|
31
|
+
Rejected: vLLM's `thinking_token_budget` (needs `--reasoning-config` on the server and is not supported by vLLM's V2
|
|
32
|
+
model runner yet, and it is vLLM-only), and higher sampling temperature as a loop fix (measured, above).
|
|
33
|
+
|
|
34
|
+
## Consequences
|
|
35
|
+
|
|
36
|
+
- Raising `RAG_STRUCTURED_TIMEOUT_S` now raises the total budget too; the default is ~182 s (was 180 s).
|
|
37
|
+
- A looping thinking call costs at most 8,192 output tokens per try instead of running until cancelled.
|
|
38
|
+
- Free-text calls are not capped by the profile (thinking is off on that path in every Qwen profile).
|
|
39
|
+
- RuleWright: callers that turn a failed call into a result should treat `ModelCallTimeout` as an error, not a
|
|
40
|
+
verdict (`rulewright-migration-0.7.0.md`).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Architecture Decision Records — index
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
and 0121–
|
|
3
|
+
131 ADR files (0001–0119, plus 0120 — the former duplicate `0015`, renumbered 2026-10-05 to repair the collision —
|
|
4
|
+
and 0121–0133). ADRs are an
|
|
5
5
|
immutable, cross-referenced decision log: nothing here is moved or renumbered — legacy records carry a `Status:`
|
|
6
6
|
banner pointing to what replaced them. This index groups them so a newcomer isn't drowned.
|
|
7
7
|
|
|
@@ -186,4 +186,7 @@ framing that still appears in older ADRs and the root `SPEC.md`/`plan.md`.
|
|
|
186
186
|
0127 Retire the OKF code ·
|
|
187
187
|
0128 Two public tiers: `rag_wright.api` for products, `rag_wright.pack_sdk` for packs ·
|
|
188
188
|
0129 The shipped Laya temperatures stay as fitted; scikit-learn floor at 1.9.1 ·
|
|
189
|
-
0130 A product deploys the self-hosted model server from the engine and uses it like any model
|
|
189
|
+
0130 A product deploys the self-hosted model server from the engine and uses it like any model ·
|
|
190
|
+
0131 No default server key anywhere; a model's concurrency ceiling travels with its id ·
|
|
191
|
+
0132 The model server cold-starts from a Modal GPU memory snapshot, behind a public-route gate ·
|
|
192
|
+
0133 The model-call deadline follows the configured timeout; a thinking model's structured output is capped by its profile
|