rag-wright 0.12.0__tar.gz → 0.14.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.12.0 → rag_wright-0.14.0}/.claude/skills/authoring-a-capability/SKILL.md +9 -3
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/building-an-ingestion-capability/SKILL.md +14 -1
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/specifying-a-product-on-the-engine/SKILL.md +1 -1
- {rag_wright-0.12.0/src/rag_wright/.agents → rag_wright-0.14.0/.claude}/skills/using-the-rag-wright-engine/SKILL.md +7 -3
- rag_wright-0.14.0/.release-please-manifest.json +3 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/CHANGELOG.md +24 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/CLAUDE.md +12 -2
- {rag_wright-0.12.0 → rag_wright-0.14.0}/PKG-INFO +1 -1
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/ArcadeDB_Local.md +1 -1
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0062-tiered-ocr-scan-quality-vlm-escalation.md +11 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0124-generic-ingestion-builder-and-hooks.md +25 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/api/README.md +54 -4
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/architecture.md +4 -2
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/concepts.md +6 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/configuration.md +5 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/domain-adaptation/README.md +1 -1
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/domain-adaptation/_engine-gaps.md +5 -1
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/domain-adaptation/authoring-capabilities.md +4 -3
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/installation.md +11 -4
- rag_wright-0.14.0/docs/specs/langgraph-ingestion/plan.md +77 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/plan.md +5 -1
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/rulewright-migration-0.12.0.md +2 -2
- rag_wright-0.14.0/docs/specs/public-surface/rulewright-migration-0.13.0.md +34 -0
- rag_wright-0.14.0/docs/specs/public-surface/rulewright-migration-0.14.0.md +45 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/templates/product-starter/CLAUDE.md.template +2 -1
- {rag_wright-0.12.0 → rag_wright-0.14.0}/pyproject.toml +1 -1
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/migrate_span_fields.py +5 -6
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/authoring-a-capability/SKILL.md +9 -3
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/building-an-ingestion-capability/SKILL.md +14 -1
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/specifying-a-product-on-the-engine/SKILL.md +1 -1
- {rag_wright-0.12.0/.claude → rag_wright-0.14.0/src/rag_wright/.agents}/skills/using-the-rag-wright-engine/SKILL.md +7 -3
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/__init__.py +9 -5
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/kg.py +34 -4
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/workspace.py +22 -1
- rag_wright-0.14.0/src/rag_wright/capabilities/parse_audit.py +88 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/parsing.py +11 -6
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/scan_quality.py +21 -7
- rag_wright-0.14.0/src/rag_wright/capabilities/span_search.py +102 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/ingestion/builder.py +304 -60
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/store/arcadedb.py +12 -18
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/store/seam.py +35 -3
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tasks.md +5 -1
- rag_wright-0.14.0/tests/api/test_migrate_span_fields.py +67 -0
- rag_wright-0.14.0/tests/capabilities/test_parse_audit.py +149 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_scan_quality.py +32 -0
- rag_wright-0.14.0/tests/capabilities/test_span_search.py +129 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_tiered_ocr.py +73 -0
- rag_wright-0.14.0/tests/fixtures/ingestion/parity.json +3195 -0
- rag_wright-0.14.0/tests/fixtures/ingestion/parity_blank.pdf +29 -0
- rag_wright-0.14.0/tests/fixtures/ingestion/parity_cover_with_attachment.pdf +0 -0
- rag_wright-0.14.0/tests/fixtures/ingestion/parity_db_with_a_broken_report.xlsx +0 -0
- rag_wright-0.14.0/tests/fixtures/ingestion/parity_db_with_reports.xlsx +0 -0
- rag_wright-0.14.0/tests/fixtures/ingestion/parity_grid.xlsx +0 -0
- rag_wright-0.14.0/tests/ingestion/test_graph_live.py +84 -0
- rag_wright-0.14.0/tests/ingestion/test_graph_parity.py +424 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_arcadedb_span.py +16 -0
- rag_wright-0.14.0/tests/store/test_kg_range.py +64 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/uv.lock +1 -1
- rag_wright-0.12.0/.release-please-manifest.json +0 -3
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/settings.json +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/building-a-product-backend/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/building-a-product-frontend/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/building-an-agent-harness/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/classifier-opportunity-analysis/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/creating-evals/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/laya/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/qwen-vllm-modal/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/qwen-vllm-modal/scripts/rw_gate.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/setfit/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.env.example +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.github/workflows/publish.yml +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.github/workflows/release-please.yml +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/.gitignore +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/LICENSE +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/README.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/SPEC.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/conftest.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/ARCHITECTURE_OVERVIEW.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/OBSERVABILITY.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0001-stack-and-library-choices.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0002-validation-corpus-cuad-edgar.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0003-ard-registration-and-capability-kinds.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0004-entity-disambiguation.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0005-relational-golden-set.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0006-model-profile.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0007-arcadedb-store-schema.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0008-unified-framework-index-docs-grounding.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0009-rlm-chunking-retained-as-configurable-capability.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0010-transformers-pinned-below-5-for-flagembedding-reranker.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0011-cuad-not-a-retrieval-benchmark-acord-for-queries.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0012-entity-mention-confidence-no-proximity-edges.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0013-entity-resolution-matching-strategy.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0014-split-generation-and-vision-to-text.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0015-rlm-dynamic-subagents-and-granted-subagents.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0016-rlm-defined-by-required-capabilities-enforced-as-tests.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0017-dynamic-dispatch-trigger-as-typed-flag.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0018-rlm-method-is-the-orchestrator-system-prompt.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0019-recursion-is-optional-for-chunking-required-for-synthesis.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0020-serialize-interpreter-sessions-per-process-ki1.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0021-capability-interface-governed-typed-io.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0022-fr-k-embedding-free-okf-navigation-experimental.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0023-cheap-model-for-okf-enrichment.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0024-reader-parallelism-lives-in-python-not-the-interpreter.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0025-retrieval-pivot-function-classify-property-graph-rerank.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0026-property-schema-and-extended-function-taxonomy.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0027-openrouter-provider-routing-by-throughput.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0028-deterministic-grounding-judge-and-flash-pro-cascade.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0029-retrieval-pipeline-domain-portability-and-adaptation.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0030-model-training-standard-modal-reusable-checkpointed.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0031-single-call-chunking-for-structured-contracts.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0032-nl-to-type-two-step-reason-emit-on-gemma.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0033-unified-contract-kg-three-legs-one-graph.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0034-granite-json-schema-structured-output-profile.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0035-graph-extraction-rebacked-with-gp1b-retire-hybrid.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0036-party-clause-link-party-to-edge.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0037-clause-template-is-authoritative-code-not-generated.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0038-full-cuad-kg-on-gcp-gpu-vm-and-gcs-backup.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0039-self-hosted-open-model-stack-on-modal-a100.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0040-neuro-symbolic-extraction-fidelity-ontology-shacl-validation.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0041-capability-kind-rubric-and-agent-skill-runtime-tiers.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0042-clause-level-span-id-provenance-and-content-hash-backfill.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0043-retire-cross-corpus-retrieval-standardize-on-leg-b.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0044-is-exception-to-derived-carveout-relationship.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0045-client-side-tag-parse-structured-output.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0046-acord-unified-into-one-production-kg.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0047-retire-precomputed-clause-function-gate.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0048-ingest-llm-classifier-nondestructive-reclassify.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0049-generic-customer-lens-for-ingestion.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0050-async-langgraph-ingestion.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0051-schema-bootstrap-and-feedback-driven-ontology-evolution.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0052-engine-product-split-graphwright-parked.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0053-answer-prose-output-hygiene.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0054-remove-auto-tag-from-generator-evidence.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0055-confidence-out-of-band.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0056-bound-structured-retry-wall-clock.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0057-async-engine-architecture.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0058-structure-first-chunking.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0059-recall-decoupled-from-classification-and-visible-partial-loss.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0060-scope-compliance-check-to-named-policy-sources.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0061-subject-document-compliance-per-section.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0063-per-sentence-compliance-subject-facts.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0064-typed-properties-out-of-band-on-evidence.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0065-deontic-applicability-gates-query-side.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0066-ontology-ttl-single-source-of-truth.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0067-domain-pack-retargeting.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0068-recall-first-actor-gate-ontology-role-disjointness.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0069-reading-order-chunking-tables-figures-retrievable.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0070-text-layer-first-parsing-no-false-vlm-escalation.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0071-defragmentation-reconstruct-paragraphs-from-line-items.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0072-extract-guard-furniture-and-deterministic-failure.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0073-born-digital-threshold-sparse-pages-no-vlm-escalation.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0074-retry-transient-extraction-failures.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0075-per-page-vlm-escalation.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0076-thread-safe-shared-embedder-reranker.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0077-concurrent-function-classification-across-chunks.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0078-dedicated-extraction-executor.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0079-product-default-granite-4.2-openrouter-routing.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0080-nested-tag-parse-and-degrade.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0081-function-independent-tagparse-clause-extraction.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0082-symbolic-gate-function-independent.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0083-executor-hop-trace-context-capture.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0084-gleaning-off-on-the-query-leg.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0085-query-constraint-extraction-tagparse.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0086-streaming-cost-capture.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0087-retrieval-relevance-score-on-rankedspan.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0088-per-span-relevance-verdict.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0089-structured-output-generation-tracing.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0090-affiliate-of-extraction.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0091-retire-partyto-edge.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0092-idempotent-write-graph.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0093-entities-by-name-seam.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0094-workspace-document-scope.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0095-span-page-provenance.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0096-carveout-keyword-normalization.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0097-caller-configurable-ingest-extraction-models.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0098-invoke-time-document-scope.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0099-mcp-tools-never-take-a-model-supplied-tenant.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0100-profile-based-model-routing.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0101-untagged-spans-reach-extraction-aspect-gate-removed.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0102-open-descriptive-list-dims-retain-verbatim.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0103-a-clause-is-a-provision-not-a-span.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0104-dense-floor-protection-in-leg-b.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0105-in-band-model-usage-accounting.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0106-document-signals-off-the-citation.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0107-requirement-page-provenance.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0108-qwen3-27b-single-a100-serving-profile.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0109-vllm-cold-start-reduction.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0110-fp8-kv-cache-16k-single-a100.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0111-pin-qwen3-27b-deepinfra-bf16.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0112-relax-deepagents-pin-to-floor.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0113-llm-span-instrumentation-for-latency-attribution.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0114-setfit-default-clause-function-classifier.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0115-classifier-only-step3a-property-extraction.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0116-soft-function-scoping-classifier-lane.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0117-engine-api-layer-and-capability-runtime.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0118-engine-core-api-vs-ard-adapter-free-impl-ref-client.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0119-jev-typed-decision-model-for-compliance-closed-set-fields.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0120-rlm-sub-agent-identity-dynamic-dispatch-trigger.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0121-spacy-optional-extra-model-runtime-download.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0122-provision-boundary-deterministic-plus-decision-model-residue.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0123-batched-releases-release-please-and-consumer-dependabot.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0125-qwen-openrouter-unpinned.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0126-unit-representative-hook-and-the-reference-vote.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0127-retire-the-okf-code.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0128-two-public-tiers-api-and-pack-sdk.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0129-laya-temperatures-and-the-sklearn-floor.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0130-deploy-the-self-hosted-model-server-from-the-engine.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0131-model-server-hardening-after-rulewright-review.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0132-model-server-cold-start-from-a-gpu-snapshot.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0133-model-call-deadline-follows-the-timeout-and-a-thinking-cap.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0134-skills-for-product-developers-are-linked-per-project-never-globally.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0135-the-seam-gives-each-event-loop-its-own-async-http-client.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0136-spreadsheet-tables-are-glued-back-across-blank-rows.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0137-generated-answers-state-their-support-and-none-is-an-abstention.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0138-the-engine-reaches-pdfium-through-one-locked-door.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0139-the-agent-harness-substrate-is-engine-scope.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/README.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/api/harness.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/api/pack_sdk.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/architecture/foundations-and-adding-a-domain.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/README.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/design/deontic-applicability-routing.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/design/ingestion-neuro-symbolic-gaps.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/design/semantic-subject-segmentation.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/design/unify-subject-preprocessing.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/engine-issues/0037-closed-vocab-drops-verbatim-values-to-other.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.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.12.0 → rag_wright-0.14.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.12.0 → rag_wright-0.14.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.12.0 → rag_wright-0.14.0}/docs/archive/engine-issues/0041-VERIFICATION-dense-floor.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/engine-issues/0041-leg-b-discards-the-best-dense-matches-on-some-queries.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.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.12.0 → rag_wright-0.14.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.12.0 → rag_wright-0.14.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.12.0 → rag_wright-0.14.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.12.0 → rag_wright-0.14.0}/docs/archive/engine-issues/0046-appending-a-natural-follow-up-to-a-question-drops-the-clause-type.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/engine-issues/0047-an-exact-deepagents-pin-transitively-pins-every-consumer.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/engine-issues/0048-the-pinned-endpoints-latency-tail-makes-agent-runs-undebuggable-from-either-side.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-07-20_graphwright_capability_interface_reply.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-07-20b_graphwright_interface_confirmation.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-07-20c_graphwright_ingestion_interfaces.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-08-30_subject_compliance_final_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-01_issue-0013-recall-first-actor-gate_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-01_ontology-source-of-truth_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-03_issue-0014-table-retrievability_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-04_bulk-ingestion-wall_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-04_issue-0016-thread-safe-embedder_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-05_observability-langfuse_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-05_tagparse-ingestion-and-granite-4.2_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-09_affiliate-of-extraction_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-09_issue-0028-partyto-retired_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-09_issue-0029-idempotent-write-graph_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-09_issue-0030-entities-by-name_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-09_observability-and-retrieval-floor_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-09_relevance-verdict_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-09_rename-run-ad-compliance-check_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-09_structured-output-cost-tracing_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-10_ingest-models-caller-configurable_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-failclosed-and-nodrift_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-validate-ingested-set_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-10_issue-0031-workspace-document-scope_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-10_issue-0032-span-page-provenance_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-10_issue-0033-carveout-normalization_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-10_issue-0034-invoke-time-document-scope_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-11_issue-0035-followup-derived-guard_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-11_issue-0035-mcp-no-model-tenant_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-11_profile-based-model-routing_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-11_qwen-default-modal-or_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-11_qwen-everywhere-config_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-12_clause-granularity_0036-0039_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-12_closed-vocab_0037-0040_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-12_dense-floor-protection_0041_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-13_in-band-usage_0042_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-14_document-signals-off-citation_0044_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-14_requirement-page-provenance_0043_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-16_qwen3-27b-single-a100-serving-profile_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-18_fp8-accuracy-eval-configB_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-18_fp8-kv-16k-single-a100_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-20_deepagents-pin-relaxed_0047_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-20_llm-span-instrumentation_0048_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-answers_from_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-scoping-questions_rulewright.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/misc/.gitkeep +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/plans/Corpus_Acquisition.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/plans/async-migration.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/plans/demo_plan.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/plans/gp1b_docling_graph_plan.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/plans/unified_contract_kg_ontology_bridge.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/plans/unified_contract_kg_plan.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/results/2026-07-24-t58-property-graph-population.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/results/2026-07-25-t58b-full-pipeline-rerank.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/archive/results/2026-07-25-t58b-topk-ordering-levers.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/contract_pipeline_explainer.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/corpus_ingest_recipe.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/domain-adaptation/classification-and-decision-models.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/domain-adaptation/entity-resolution.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/domain-adaptation/evals-from-expert-files.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/domain-adaptation/kg-construction.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/domain-adaptation/ontology-authoring.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/classifier_model_ab.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/compliance_demo.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/compliance_gate_cc7.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/compliance_rung2_cc7.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/cuad_highlighting_cu-d1.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/dg_model_ab.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/function_gate_recall.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/generation_robustness_b_vs_c.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/nl_to_type_cu-d2.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/ocr_benchmark.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/prod1_readiness.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/prod2_readiness.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/query_side_model_ab.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/silver_granite_vs_gemma4.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/silver_provider_routing.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/eval/silver_selfhosted_gemma4_26b.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/evals.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/harness.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/playbook.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/product/capability_profiles.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/product/contracts_product_roadmap.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/product/engine-api-migration-handoff.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/product/engine_async_api.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/product/new-domain-build-sequence.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/product/seam-adaptation-guide.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/proposals/compliance-ingest-classifier-decomposition.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/proposals/de-domaining-and-capability-runtime.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/proposals/new-domain-developer-journey.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/proposals/ontology-induction.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/quickstart.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/reference-pack.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/releasing.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/engine-platform/SPEC.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/engine-platform/TASKS.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/engine-prep/plan.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/evals/plan.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/ingestion-hooks/ing5-doc-audit.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/ingestion-hooks/ing8-breaking-changes.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/ingestion-hooks/plan.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/ingestion-hooks/rulewright-migration-0.2.0.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/rulewright-arcadedb-separation.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/rulewright-migration-0.10.0.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/rulewright-migration-0.11.0.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/rulewright-migration-0.3.0.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/rulewright-migration-0.4.0.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/rulewright-migration-0.5.0.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/rulewright-migration-0.6.0.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/rulewright-migration-0.7.0.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/rulewright-migration-0.8.0.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/rulewright-migration-0.9.0.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/specs/public-surface/rulewright-reply-2026-10-10-laya-and-sklearn.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/templates/product-starter/README.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/templates/product-starter/dependabot.yml +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/templates/product-starter/playbook.md.template +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/upstream/laya-temperature-range-mismatch.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/vendor/arcadedb/arcadedb-buckets-schema.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/vendor/arcadedb/arcadedb-docs-extraction.json +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/vendor/arcadedb/arcadedb-vector-embeddings.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/vendor/arcadedb/arcadedb-vector-search-tutorial.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/docs/workspaces.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/acord.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/acord_retrieval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/boundary_residue_gold.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/build_golden.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/compliance_demo/policy/community_conduct_policy.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/compliance_demo/subjects/post_borderline.txt +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/compliance_demo/subjects/post_compliant.txt +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/compliance_demo/subjects/post_violation.txt +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/condensed_pipeline.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/contract_parity_live.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/contractnli_judge.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/cuad_highlight.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/embedded_eval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/full_pipeline_rerank.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/function_ceiling.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/function_property_rerank.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/function_rerank.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/gate1_chunker_ab.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/gate2_hybrid_rerank.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/golden/relational/set.json +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/golden.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/ground_discriminator_rerank.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/harness.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/ingestion_live_smoke.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/kg_primary.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/kg_property_rerank.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/listwise_rerank.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/multihop.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/nl_to_type.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/relational_eval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/residual_decision_gold.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/segmenter_eval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/semantic_judge_gold.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/test_acord.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/test_acord_retrieval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/test_harness.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/test_multihop_set.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/eval/unit_grouper_eval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/examples/model_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/examples/quickstart.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/plan.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/release-please-config.json +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ab_model_overlap.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/acord_unify.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/acquire_acord.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/acquire_cuad.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/acquire_ecfr.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/acquire_edgar.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/acquire_ftc_255.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/acquire_prod1_corpus.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/audit_reclass_flips.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/author_leg_a_silver_key.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/backfill_affiliations.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/backfill_clause_span_id.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/backfill_edge_source_doc_id.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/backup_kg_to_gcs.sh +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/bootstrap_template_capture.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/bootstrap_typed_edges.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/build_api_docs.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/build_api_docs.sh +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/build_cuad_clause_cache.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/build_function_routing_map.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/build_harness_doc.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_assemble_v2.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_assemble_v3.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_generate_hard_negatives.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_generate_hard_positives.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_generate_training.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_hybrid.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_hybrid2.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_jev_actor.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_jev_claimtypes.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_jev_operative.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_label_spans.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_laya_prep.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_laya_train.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_prep_operative.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_relabel_rubric.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_relabel_rubric2.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/cic1_train_operative.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/compare_extraction_models.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/compliance_actor_gate_smoke.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/compliance_engine_smoke.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/compliance_policy_demo.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/curate_taxonomy_gaps.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/dg_model_ab.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/diagnose_acord_knn_expansion.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/diagnose_acord_knn_rerank.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/diagnose_acord_leg_pool.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/diagnose_acord_legs.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/diagnose_acord_pool.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/diagnose_acord_relstructure.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/diagnose_acord_retrieval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/distill/eval_all.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/distill/eval_ce.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/distill/eval_listwise_b.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/distill/export_ce_dataset.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/distill/extract_features.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/distill/listwise_variants.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/distill/relational_features.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/distill/train_ce.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/distill/train_modal.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/enrich_edgar_candidates.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/eval_chunking_ab.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/eval_classifier_guided_vs_tagparse.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/eval_compliance_gold.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/extract_arcadedb_docs.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/fetch_reference_models.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/generate_contract_python.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/git_post_commit_graphify.sh +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/granite_chunker_assess.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/graph_status.sh +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ingest_acord.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ingest_compliance_async_prod2.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ingest_compliance_document_prod2.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ingest_compliance_prod2.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ingest_cuad.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ingest_cuad_full.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ingest_ftc_compliance.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ingest_prod1.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ingest_prod1_async.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ingest_smoke.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/install_git_hooks.sh +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/label_new_functions.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/legb_function_gate_recall.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/make_compliance_fixtures.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/make_compliance_gold.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/mcp_compliance_agent_demo.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/mcp_intra_document_qa_smoke.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/mcp_query_legs_agent_demo.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/measure_generation_robustness.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/measure_harness_genericity.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/measure_silver.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/merge_docs_into_framework.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/migrate_entity_cik_to_canonical_id.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/migrate_silver_evidence_autotag.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/migrate_silver_evidence_remove_autotag.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/mine_scarce_functions.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_arcadedb.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_backfill.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_exception_linking.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_gemma4_vllm.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_gemma4_vllm_snapshot.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_granite_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_granite_throughput.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_granite_vllm_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_query_app.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_qwen3_27b_bench.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_qwen3_27b_snapshot.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_qwen3_vllm_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/modal_stack_a100.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ocr_benchmark.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ocr_preprocess.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/ontology_dimension_check.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/phase_a_leg_validate.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/populate_clause_kg.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/populate_entity_graph.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/populate_entity_graph_extracted.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/populate_property_store.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/prep_relational_verification.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/publish_manifests.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/reclassify_kg.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/refresh_framework_graph.sh +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/revert_reclass_flips.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/run_acord_retrieval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/run_clause_exception_linking.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/semantic_judge_live_validate.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/semantic_judge_probe.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/snapshot_leg_a_eval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/stack_correctness_validate.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/table_retrieval_smoke.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/train_function_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/train_legalbert_function.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/train_legalbert_modal.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/typed_rerank_validate.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/verify_wheel_install.sh +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/vllm_extraction_ab.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/vllm_kg_query_validate.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/scripts/vllm_raw_diagnostic.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/building-a-product-backend/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/building-a-product-frontend/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/building-an-agent-harness/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/classifier-opportunity-analysis/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/creating-evals/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/laya/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/rw_gate.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/.agents/skills/setfit/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/agents.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/answers.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/config.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/discover.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/documents.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/ids.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/invoke.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/mcp.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/tracing.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/api/usage.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/answer_generator.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/ard.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/chunk_read.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/chunk_write.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/disambiguation.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/document_parse.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/document_scope.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/embedding.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/embedding_profiles.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/entity_resolution.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/fusion.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/graph_query.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/graph_storage.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/hybrid_search.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/invoke.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/jev_decision.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/manifests.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/registry.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/remote_encoders.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/reranking.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/retrieval_core.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/rlm_chunking.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/rlm_synthesis.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/sheet_tables.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/span_relevance_judgment.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/vision_to_text.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/capabilities/vlm_ocr.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/contracts/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/contracts/chunk.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/contracts/evals.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/contracts/extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/contracts/graph.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/contracts/identifiers.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/contracts/ingestion.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/contracts/provenance.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/contracts/span.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/corpus/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/corpus/canonicalize.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/corpus/document_parser.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/corpus/embedded.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/corpus/http.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/evals/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/evals/gold.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/evals/langfuse_backend.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/evals/runner.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/evals/scorers.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/accounting.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/agent.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/batch.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/clarify.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/confirm.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/decisions.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/definition.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/dispatch.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/errors.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/events.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/filesystem.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/grading.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/interpreter.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/memory.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/models.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/rules.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/runs.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/scope.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/seen.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/skills.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/thinking.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/tiers.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/tracing.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/withhold.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/harness/workers.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/ingestion/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/ingestion/evaluate.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/ingestion/group.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/ingestion/layout.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/ingestion/segment.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/ingestion/tables.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/models/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/models/model_servers.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/models/profiles.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/models/seam.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/models/tag_structured.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/models/tracing.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/models/usage.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/models/weights.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/ontology/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/ontology/pack_schema.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/ontology/registry.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/pack_sdk/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/capabilities/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/capabilities/assertion_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/capabilities/claim_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/capabilities/compliance_judgment.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/capabilities/compliance_store.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/capabilities/requirement_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/invokers.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/mcp/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/mcp/compliance_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/ontology/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/ontology/compliance_bridge.ttl +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/ontology/loader.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/ontology/packs/ftc_16cfr255.ttl +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/pack.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/schemas/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/schemas/compliance.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/skills/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/skills/claim_extraction/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/skills/claim_extraction/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/skills/claim_extraction/template.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/skills/compliance_judgment/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/skills/generic_compliance_judgment/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/template.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/subgraphs/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/subgraphs/compliance_check.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/subgraphs/compliance_ingestion.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/compliance/subgraphs/requirement_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/capabilities/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/capabilities/clause_exception_linking.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_serve.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_store.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/capabilities/dg_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/capabilities/graph_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/capabilities/highlight_serve.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/capabilities/property_boosted_retrieval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/capabilities/query_function_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/capabilities/query_understanding.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/corpus/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/corpus/cuad.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/corpus/cuad_ingestion.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/corpus/edgar.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/corpus/gcs_ingestion.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/corpus/selection.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/mcp/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/mcp/intra_document_qa_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/mcp/relational_qa_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/mcp/session_store.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/mcp/typed_property_retrieval_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/ontology/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/ontology/_generated_template_meta.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/ontology/_generated_vocab.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/ontology/clause_template.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/ontology/codegen.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/ontology/contract_bridge.ttl +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/ontology/contract_taxonomy.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/ontology/derive.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/ontology/loader.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/ontology/template_introspect.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/options.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/pack.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/schemas/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/schemas/contract_meta.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/schemas/function.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/schemas/function_routing.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/schemas/highlight.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/schemas/jurisdiction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/schemas/ontology.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/schemas/property.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/schemas/query_intent.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/schemas/value_match.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/skills/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/skills/corpus_ingest/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/skills/guidance/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/skills/guidance/chunking.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/skills/guidance/generation.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/skills/guidance/relevance.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/boundary.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/clause_function_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/clause_kg_extractor.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/cuad_labels.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/dim_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/dim_fleet.json +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/function_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/function_families.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/hybrid_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/legalbert_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/model_capabilities.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/new_function_labels.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/property_extractor.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/property_grounding.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/reclassify.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/residual_candidates.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/scarce_function_labels.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/segment.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/semantic_judge.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/symbolic_validation.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/spans/tag_clause_extractor.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/subgraphs/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/subgraphs/async_ingestion.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/subgraphs/contract_ingestion_pipeline.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/subgraphs/intra_document_qa.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/subgraphs/query_constraint_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/subgraphs/relational_qa.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/subgraphs/typed_clause_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/contracts/subgraphs/typed_property_retrieval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/packs/reference_seam.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/py.typed +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/skills/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/skills/generation/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/skills/generation/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/skills/rlm/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/skills/rlm/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/skills/rlm/agent.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/skills/span_relevance_judgment/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/skills/vision_to_text/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/skills/vision_to_text/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/spans/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/spans/page_map.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/store/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/store/chunk_text.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/subgraphs/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/subgraphs/graph_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/subgraphs/observability.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/subgraphs/scaffold.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/subgraphs/semantic_chunking.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/util/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/util/concurrent.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/util/pdfium.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/src/rag_wright/util/spacy_model.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_agent_chat_model.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_agent_chat_model_live.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_answers_exports.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_api_embedder_ps39.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_bytes_ingest.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_capability_reexports.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_decision_swap_doc_example.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_discover.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_documents.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_drop_workspace.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_drop_workspace_live.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_e2e.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_invoke.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_kg.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_mcp.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_metering_tracing_exports.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_model_role_export.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_open_workspace_reconfig.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_options.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_pack_sdk.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_pack_store.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_pdf_page_count.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_public_gaps_ps38.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_tracing_helpers_ps32.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_usage.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_workspace.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/api/test_workspace_models.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/arch/domain_vocabulary_baseline.json +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/arch/test_api_docs_current.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/arch/test_doc_references.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/arch/test_engine_domain_vocabulary.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/arch/test_import_contracts.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/arch/test_lock_version.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/arch/test_packs_use_store_primitives.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/arch/test_pdfium_door.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/arch/test_shipped_skills.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/async_helpers.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/_fixtures/rlm_probe_skill/SKILL.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_answer_generator.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_answer_generator_async.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_assertion_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_authoring_contract.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_chunk_read.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_chunk_write.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_chunking_prompts_neutral.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_claim_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_clause_exception_linking.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_compliance_judgment.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_compliance_store.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_contract_kg_serve.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_contract_kg_store.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_contract_kg_store_reads.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_contract_taxonomy_and_spans.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_dg_adapter.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_dg_async.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_dg_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_dg_model_seam.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_dg_private.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_disambiguation.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_document_scope.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_embedding.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_embedding_profiles.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_entity_resolution.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_entity_rules_plumbing.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_fusion.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_graph_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_graph_query.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_graph_storage.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_highlight_serve.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_hybrid_search.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_jev_decision.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_manifest_validation.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_manifests.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_parsing.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_parties_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_property_boosted_retrieval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_query_function_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_query_understanding.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_registry.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_remote_encoders.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_repair_partition.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_requirement_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_reranking.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_retrieval_core.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_rlm_chunking.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_rlm_chunking_async.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_rlm_method.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_rlm_synthesis.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_runtime_registry.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_span_relevance_judgment.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_structural_boundary_discoverer.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_structural_model_fallback.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_tag_boundary_discoverer.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/capabilities/test_vlm_ocr.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/compliance_fakes.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/conftest.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_canonical_source_doc_id.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_chunk_record.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_compliance.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_cuad_highlight_contracts.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_function.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_function_routing.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_identifiers.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_ingestion_hooks.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_jurisdiction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_ontology.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_property.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_provenance.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/contracts/test_value_match.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/corpus/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/corpus/_ooxml_fixtures.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/corpus/test_canonicalize.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/corpus/test_cuad.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/corpus/test_cuad_ingestion.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/corpus/test_document_parser.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/corpus/test_edgar.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/corpus/test_embedded.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/corpus/test_gcs_ingestion.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/corpus/test_http.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/corpus/test_parse_wire2.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/corpus/test_selection.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/eval/test_contractnli_judge.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/eval/test_cuad_highlight_metrics.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/eval/test_kg_property_rerank.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/eval/test_nl_to_type_metrics.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/eval/test_relational_eval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/evals/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/evals/test_gold_contracts.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/evals/test_gold_import.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/evals/test_langfuse_backend.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/evals/test_runner.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/evals/test_scorer_parity.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/evals/test_scorers_a.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/evals/test_scorers_b.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/evals/test_scorers_c.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/evals/test_scorers_d.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/fixtures/ingestion/segmenter_gold.json +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/fixtures/ingestion/textile_spec_sheet.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/fixtures/ingestion/textile_test_report.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/fixtures/leg_a_silver/README.md +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/fixtures/leg_a_silver/evidence_snapshot.json +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/fixtures/table-bearing-contract.pdf +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/foundation/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/foundation/test_arcadedb_hybrid.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/foundation/test_model_seam_structured.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/harness/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/harness/test_greenfield_conformance.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/harness/test_harness_accounting.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/harness/test_harness_engine_wiring.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/harness/test_harness_genericity.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/harness/test_harness_live.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/harness/test_harness_recorder.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/harness/test_harness_thinking.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_aevaluate.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_builder.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_chunk_discoverer_hook.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_concurrency_ceiling.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_document_metadata.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_evaluate.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_evaluate_labels.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_layout_segmenter.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_sheet_continuations.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_spreadsheet_content.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_table_rows.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_tuning.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_unit_grouper.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ingestion/test_unit_representative.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/journey/incidents_domain.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/journey/incidents_pack.ttl +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/journey/test_incidents_journey.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/journey/test_pack_schema.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/mcp/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/mcp/test_compliance_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/mcp/test_intra_document_qa_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/mcp/test_no_model_supplied_tenant.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/mcp/test_relational_qa_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/mcp/test_typed_property_retrieval_server.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_async_infra.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_classifier_heads_load_clean.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_model_servers.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_models_dir.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_no_gemma_default.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_profile_routing.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_profile_seam.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_seam_async.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_seam_deadline_and_cap.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_seam_event_loops.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_seam_retry.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_seam_stream.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_serving_seam.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_serving_wiring.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_tag_structured.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_tag_structured_async.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_tracing.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/models/test_usage.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ontology/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ontology/test_clause_template.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ontology/test_compliance_ontology_authoritative.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ontology/test_derivation.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ontology/test_entity_taxonomy.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ontology/test_generated_template_meta_in_sync.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ontology/test_generated_vocab_in_sync.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ontology/test_template_captured_in_ttl.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/ontology/test_ttl_is_source_of_truth.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/reference/test_compliance_reference.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/reference/test_contract_seam.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/scripts/test_eval_chunking_ab.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/scripts/test_eval_classifier_ab.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/scripts/test_fetch_reference_models.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/scripts/test_generation_robustness_errors.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/skills/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/skills/test_creating_evals_skill_example.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/skills/test_ingestion_skill_example.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_boundary.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_classifier_property_extractor.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_clause_classifier_tags_0005.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_clause_function_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_clause_function_classifier_async.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_clause_kg_extractor.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_clause_kg_extractor_async.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_dim_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_dim_fleet_live.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_function_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_hybrid_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_hybrid_property_extractor.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_legalbert_classifier.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_model_capabilities.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_new_function_labels.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_page_map.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_property_extractor.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_property_grounding.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_reclassify.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_residual_decision.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_scarce_function_labels.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_segment.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_segmentation_vocab.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_semantic_judge.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_setfit_clause_adapter.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_setfit_probabilities.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_span_offsets.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_stage_labels_0005.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_symbolic_validation.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/spans/test_tag_clause_extractor.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_affiliation_backfill.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_arcadedb_clause_kg.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_arcadedb_contract.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_arcadedb_property.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_arcadedb_requirement_sources.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_arcadedb_schema.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_chunk_text.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_concurrent_writes.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_contract_kg_store_live.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_document_metadata_live.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_document_scope.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_engine_domain_neutral.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_entities_by_name.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_kg_edges.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_kg_mutations.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_kg_read.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_kg_write.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_neutral_schema.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_store_create_flag.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/store/test_write_graph_idempotent.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_async_ingestion.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_chunk7_structure_carry.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_clause_results.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_compliance_check.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_compliance_ingestion.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_contract_ingestion_pipeline.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_contract_ingestion_pipeline_async.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_contract_ingestion_pipeline_graph_async.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_graph_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_ingest_knobs.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_ingest_segment_classify.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_intra_document_qa.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_observability.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_partial_entry_contract.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_query_constraint_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_relational_qa.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_requirement_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_scaffold.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_semantic_chunking.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_typed_clause_extraction.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/subgraphs/test_typed_property_retrieval.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/test_backfill_clause_span_id.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/test_dg_model_ab.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/test_populate_clause_kg.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/test_populate_entity_graph.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/util/__init__.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/util/test_concurrent.py +0 -0
- {rag_wright-0.12.0 → rag_wright-0.14.0}/tests/util/test_spacy_model.py +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: authoring-a-capability
|
|
3
3
|
description: >-
|
|
4
|
-
How to author a new RAG_Wright
|
|
5
|
-
so it is registered, ARD-discoverable, and invokable by name
|
|
6
|
-
|
|
4
|
+
How to author a new capability on RAG_Wright, in your product's own pack or in the engine, of any kind
|
|
5
|
+
(subgraph, function, model, agent_skill, mcp_tool), so it is registered, ARD-discoverable, and invokable by name
|
|
6
|
+
through the engine API. Use it whenever a product (or the engine) adds a capability: it gives the shared registration + ARD + invocation
|
|
7
7
|
contract (the four surfaces + the definition of done), the per-kind implementation specifics, and the
|
|
8
8
|
conformance guardrail that keeps the catalog honest. Grounded against the real code; keep it in step with it.
|
|
9
9
|
---
|
|
@@ -93,6 +93,12 @@ MCP) follows automatically for invokable kinds; 4b (a bespoke MCP server) is opt
|
|
|
93
93
|
(the reference pack: `packs/contracts/subgraphs/typed_property_retrieval.py`). A `production_<slug>(*, store, ...) -> CompiledGraph` builder: `g = StateGraph(_State)`,
|
|
94
94
|
add nodes/edges with `START`/`END`, `return g.compile()`. Nodes call functions/models (compose).
|
|
95
95
|
- **Invoke:** the co-located `async def ainvoke(resources, inputs)` factory (impl_ref target) builds + awaits the graph.
|
|
96
|
+
- **An ingestion capability already has its graph.** `build_ingestion(...)` compiles one (LGI, ADR-0124): its
|
|
97
|
+
`production_<slug>` returns `pipeline.graph(ws, cache_dir=...)` (the whole run: each source through the
|
|
98
|
+
per-document graph parse -> chunk -> segment -> index -> extract -> write -> hooks -> children), and its `ainvoke`
|
|
99
|
+
runs `await pipeline.aingest(resources, sources, cache_dir=...)`. Do not wrap it in a second `StateGraph`. For a
|
|
100
|
+
long ingest, pass your own LangGraph checkpointer and a `run_id` to `aingest` so an interrupted run resumes
|
|
101
|
+
(`building-an-ingestion-capability`).
|
|
96
102
|
- Retry/dead-letter come from the graph scaffold, not the invoker. `CapabilityManifest` has no contract field (only
|
|
97
103
|
the internal `CapabilityRegistry.register(contract=...)` takes one); where the typed I/O must be declared, set
|
|
98
104
|
`capability_interface` on the manifest (`CapabilityInterface`, from `rag_wright.pack_sdk`).
|
{rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/building-an-ingestion-capability/SKILL.md
RENAMED
|
@@ -154,6 +154,10 @@ category.
|
|
|
154
154
|
|
|
155
155
|
## 5. Spreadsheets, tables and embedded files
|
|
156
156
|
|
|
157
|
+
- **Blank PDF pages** are read as empty, never sent to the vision model (engine 0.13.0). On a parse cache built
|
|
158
|
+
by an earlier engine with `VISION_OCR` configured, run `find_blank_pages_with_text(cache_dir, sources)` once:
|
|
159
|
+
delete each finding's `cache_files` and re-ingest that document (its blank pages may hold invented text).
|
|
160
|
+
|
|
157
161
|
- **Hidden sheets** are ingested by default; `IngestSource(include_hidden_sheets=False)` skips them (listed in
|
|
158
162
|
`DocumentReport.skipped_hidden_sheets`).
|
|
159
163
|
- **Blank rows inside a table**: the parse cuts a sheet's table at every blank row; the engine glues a piece back
|
|
@@ -193,6 +197,13 @@ category.
|
|
|
193
197
|
whose continuation rows sit under its main row needs a `unit_grouper=` that keeps them together, or a
|
|
194
198
|
`document_hook=` that reads the whole table with `table_rows` and writes the grouped record. An entity several units
|
|
195
199
|
mention (a case its trial rows share) is emitted by its key from each unit and upserted by that key.
|
|
200
|
+
- **Resume a long ingest instead of restarting it.** Pass a LangGraph checkpointer (yours, for example a Postgres
|
|
201
|
+
saver; the engine ships none) and a `run_id` naming the run:
|
|
202
|
+
`await pipeline.aingest(ws, sources, cache_dir=CACHE, checkpointer=saver, run_id=batch_id)`. If the process stops,
|
|
203
|
+
call it again with the same sources, `cache_dir`, checkpointer and `run_id`: each document carries on from its last
|
|
204
|
+
finished stage, and nothing that finished runs again (no repeat extractor calls). A finished `run_id`, or different
|
|
205
|
+
sources, raise `ValueError`: a new run gets a new id. The graph state is built-in values only, so it works under
|
|
206
|
+
LangGraph's strict msgpack mode; a tuple inside a record's free-form `props` comes back as a list after a resume.
|
|
196
207
|
- **Re-ingest.** Parsing is cached by content hash, so re-running is cheap. The default writer upserts nodes by their
|
|
197
208
|
key but is not fully idempotent for edges (engine gap G8): when a source is re-run, remove its previous records
|
|
198
209
|
first (`kg_delete` on the provenance your records carry, such as a per-source property) and write again.
|
|
@@ -212,7 +223,9 @@ category.
|
|
|
212
223
|
cost per document before a bulk run.
|
|
213
224
|
5. **Register the pipeline as a capability** (`authoring-a-capability`): a subgraph whose `ainvoke(resources, inputs)`
|
|
214
225
|
builds it with `build_ingestion` over the workspace and runs `aingest`, so your product's ingest workflow, an
|
|
215
|
-
agent and an eval all invoke it by name.
|
|
226
|
+
agent and an eval all invoke it by name. The pipeline IS a LangGraph graph: `pipeline.graph(ws, cache_dir=...)`
|
|
227
|
+
returns the compiled run (each source through the per-document graph), which is what your `production_<slug>`
|
|
228
|
+
returns; do not wrap it in another graph.
|
|
216
229
|
6. **Field-level accuracy, not only structure**: `evaluate_ingestion` checks units; the records' values are checked
|
|
217
230
|
against gold records (`creating-evals`, extraction scoring over what `kg_read` returns).
|
|
218
231
|
|
{rag_wright-0.12.0 → rag_wright-0.14.0}/.claude/skills/specifying-a-product-on-the-engine/SKILL.md
RENAMED
|
@@ -58,7 +58,7 @@ Every product item lands in one or more of these. The route column is where the
|
|
|
58
58
|
| **Domain knowledge**: vocabulary, schema, constraints, synonyms, decision criteria | "controlled vocabularies", "the ontology", "mandatory fields", "valid ranges" | `EngineConfig(pack=...)` (the store creates the declared types on `open_workspace`); your capabilities read value sets and SHACL shapes with `rdflib` / `pyshacl` | `authoring-a-capability` | ontology authoring |
|
|
59
59
|
| **Ingestion**: documents, spreadsheets, images, embedded files into the graph | "parse the forms", "load the lab reports", "idempotent re-runs" | `build_ingestion` (your extractor + optional hooks) → `aingest`; `IngestSource`, `IngestionTuning`, `table_rows` / `TableRow`, `evaluate_ingestion`, `check_extraction`; `KgNode` / `KgEdge` | `building-an-ingestion-capability` | KG construction |
|
|
60
60
|
| **Entity and registry resolution** | "resolve against the yarn register", "queue unresolved mentions" | your `document_hook`; the entity-resolution building blocks on `rag_wright.pack_sdk` | `building-an-ingestion-capability` | entity resolution |
|
|
61
|
-
| **A typed query or retrieval** | "find similar cases", "filter the table", "the dossier" | a query capability of your pack composing the primitives (`kg_read`, `kg_edges`, `NOT_NULL`, hybrid search from `rag_wright.
|
|
61
|
+
| **A typed query or retrieval** | "find similar cases", "filter the table", "the dossier" | a query capability of your pack composing the primitives (`kg_read`, `kg_edges`, `NOT_NULL`, `Range`, hybrid span search with `span_search` from `rag_wright.api`), registered with `CapabilityManifest` + `register_capability` / `load_pack`, invoked with `ainvoke_subgraph` | `authoring-a-capability` | authoring capabilities |
|
|
62
62
|
| **A cited answer, or a refusal** | "every answer cites its source", "say when it is not in the records" | `agenerate_answer` over `EvidenceItem`s (an answer states its support; "none" abstains), `ajudge_spans` | `authoring-a-capability` | concepts (answers) |
|
|
63
63
|
| **A typed decision or classification** | "classify the structure", "which of these is it" | `classifier-opportunity-analysis` first; then rules, a trained classifier, or the decision model (`jev_decision` from `engine_capabilities()`, criteria in the pack) | `classifier-opportunity-analysis` → `setfit` / `laya` | classification and decision models |
|
|
64
64
|
| **A deterministic workflow behind a button** (mode **D**) | "upload, confirm, save", "export CSV" | a product **operation** (one function per user operation) calling your capabilities; the route calls the operation | `building-a-product-backend` | domain-adaptation step 8 |
|
|
@@ -27,8 +27,11 @@ open-core and domain-neutral; your product brings the domain. Hard rules:
|
|
|
27
27
|
`EngineConfig`/`StoreConfig` (`StoreConfig.from_env()` reads `ARCADEDB_*`)/`open_workspace`
|
|
28
28
|
(`temporary_workspace`/`drop_workspace` for disposable and removed databases), the invokers
|
|
29
29
|
(`ainvoke_subgraph`/`invoke_model`/`ainvoke_model`), discovery (`capability_index`/`discover`), the KG accessors
|
|
30
|
-
(`kg_read
|
|
31
|
-
|
|
30
|
+
(`kg_read`, `kg_write`, `kg_edges`, `kg_count`/`kg_delete`/`kg_update`, all filtering by `where` values that
|
|
31
|
+
are equality, a list for membership, `NOT_NULL` or a `Range(gt=, ge=, lt=, le=)` on any number of fields,
|
|
32
|
+
evaluated in the store;
|
|
33
|
+
`entities_by_name`, `span_positions`), hybrid span search (`span_search` / `aspan_search`: cited spans from
|
|
34
|
+
the dense and sparse index, fused in the store), `pack_store(ws, cls)` (build your pack's store extension over the
|
|
32
35
|
workspace's store; the store itself stays private), metering and tracing (`measure_usage`, `record_usage`,
|
|
33
36
|
`traced_run`/`traced_step`, and for code emitting its own generations `tracing_on`/`trace_level`/
|
|
34
37
|
`start_generation`/`finish_generation`/`flush_tracing`), the query embedder (`ws.embedder` where you hold a
|
|
@@ -38,7 +41,8 @@ open-core and domain-neutral; your product brings the domain. Hard rules:
|
|
|
38
41
|
(`parse_document`/`aparse_document`, `parse_document_bytes`/`aparse_document_bytes` for uploads,
|
|
39
42
|
`source_document`/`table_rows`, `decode_bbox`, `document_of`), and the **ingestion surface**: `build_ingestion`
|
|
40
43
|
(returns an `IngestionPipeline`; `await pipeline.aingest(ws, sources, cache_dir=...)` returns an
|
|
41
|
-
`IngestionReport
|
|
44
|
+
`IngestionReport`; the pipeline is a LangGraph graph, `pipeline.graph(ws, cache_dir=...)`, and `aingest` with
|
|
45
|
+
`checkpointer=` and `run_id=` resumes an interrupted run), its hook contracts (`Segmenter`, `SpanTagger`, `UnitGrouper`, `BoundaryDecider`,
|
|
42
46
|
`UnitRepresentative`, `BoundaryDiscoverer` with `default_chunk_discoverer(guidance=...)`, `Extractor`,
|
|
43
47
|
`RecordWriter`, `DocumentHook`, checked by `check_tiling`/`check_units`/`check_extraction`), `IngestionTuning`,
|
|
44
48
|
`IngestSource` (a `path`, or `data` + `name` for bytes; `table_mode`, `include_hidden_sheets`, your own `metadata`
|
|
@@ -4,6 +4,30 @@ 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.14.0](https://github.com/fzaidi-dai/RAG_Wright/compare/0.13.0...0.14.0) (2026-10-17)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
* **LGI-1:** each document is ingested through a LangGraph graph of the stages ([24c15df](https://github.com/fzaidi-dai/RAG_Wright/commit/24c15dfc692b463382f18b183c551127e7092c0c))
|
|
13
|
+
* **LGI-2:** the whole ingest run is one LangGraph graph ([e38e9c8](https://github.com/fzaidi-dai/RAG_Wright/commit/e38e9c8733fb0bcb4da51e71e3e7093fbde4b9c3))
|
|
14
|
+
* **LGI-3:** an interrupted ingest resumes from its last finished stage ([9970189](https://github.com/fzaidi-dai/RAG_Wright/commit/9970189d6d5759dc4a1eeaccb35d734cc05e886e))
|
|
15
|
+
|
|
16
|
+
## [0.13.0](https://github.com/fzaidi-dai/RAG_Wright/compare/0.12.0...0.13.0) (2026-10-15)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Features
|
|
20
|
+
|
|
21
|
+
* **PS-35:** migrate a pre-0.2.0 database's Span fields through rag_wright.api ([856f956](https://github.com/fzaidi-dai/RAG_Wright/commit/856f956f674c731d170878d44ec3fef980a10ba9))
|
|
22
|
+
* **PS-44:** range filters on any number of KG fields, evaluated in the store (TexWright ER-1) ([cc62c49](https://github.com/fzaidi-dai/RAG_Wright/commit/cc62c49000161567869d46127bb158db16106c28))
|
|
23
|
+
* **PS-45:** a public hybrid span search on rag_wright.api (engine gap G24) ([4aa802f](https://github.com/fzaidi-dai/RAG_Wright/commit/4aa802fdc6cf12a3c732aa7a41e4de6240dd05da))
|
|
24
|
+
* **PS-47:** find cached parses holding text a VLM invented for a blank page ([ff92d81](https://github.com/fzaidi-dai/RAG_Wright/commit/ff92d81956590002418ef50f41dee54e0b0b6ef8))
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
### Bug Fixes
|
|
28
|
+
|
|
29
|
+
* **PS-46:** a page with no ink is blank, never escalated to the VLM (TexWright 2026-10-15) ([fc633a8](https://github.com/fzaidi-dai/RAG_Wright/commit/fc633a84aa52a89de5b79d90b50d80f7d622d792))
|
|
30
|
+
|
|
7
31
|
## [0.12.0](https://github.com/fzaidi-dai/RAG_Wright/compare/0.11.0...0.12.0) (2026-10-15)
|
|
8
32
|
|
|
9
33
|
|
|
@@ -55,9 +55,19 @@ 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-17): the LangGraph ingestion workstream is COMPLETE, unreleased** (LGI-1..5,
|
|
59
|
+
> `docs/specs/langgraph-ingestion/plan.md`, ADR-0124 amended): `build_ingestion` is a LangGraph graph
|
|
60
|
+
> (`IngestionPipeline.graph`, per-document `document_graph`), `aingest(..., checkpointer=, run_id=)` resumes an
|
|
61
|
+
> interrupted run (built-in state, strict msgpack safe), `IngestionReport.from_dict`; live old-vs-new parity identical;
|
|
62
|
+
> guide `rulewright-migration-0.14.0.md` (next release 0.14.0). Next: PS-48 (harness tests onto the fabric fixture,
|
|
63
|
+
> proposed, not started), EV-7, PS-30, PS-33. Before it,
|
|
64
|
+
> **(2026-10-15): `rag-wright` 0.13.0 is RELEASED** (PR #15): PS-35 `migrate_span_fields` on the API,
|
|
65
|
+
> PS-44 `Range` KG filters (TexWright ER-1), PS-45 `span_search` (G24), PS-46 blank PDF pages never sent to the VLM
|
|
66
|
+
> (TexWright's report; ADR-0062 amended), PS-47 `find_blank_pages_with_text` (audit of pre-fix parse caches); guide
|
|
67
|
+
> `rulewright-migration-0.13.0.md`. Open: harness behaviour tests onto the fabric fixture, EV-7, PS-30, PS-33. Before it,
|
|
68
|
+
> **`rag-wright` 0.11.0 is RELEASED** (PR #13: PS-40 the product-building skills ship,
|
|
59
69
|
> PS-41 the skills audit, PS-42 by-slug registration; RuleWright's guide `docs/specs/public-surface/rulewright-migration-0.11.0.md`).
|
|
60
|
-
> **PS-43
|
|
70
|
+
> **PS-43 RELEASED as 0.12.0 (2026-10-15, PR #14)**: `worker_spec(definition=)`, `docs/harness.md` (tables generated by
|
|
61
71
|
> `scripts/build_harness_doc.py`), the harness source cleared of RuleWright's vocabulary with a guard; guide
|
|
62
72
|
> `rulewright-migration-0.12.0.md`. Before it,
|
|
63
73
|
> **(2026-10-14): PS-32 done: the agent harness is the engine's third public tier `rag_wright.harness`**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: rag-wright
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.14.0
|
|
4
4
|
Summary: A domain-retargetable, open-core engine for hybrid retrieval + knowledge-graph RAG: parsing, chunking, embedding, hybrid search, reranking, graph extraction, entity resolution, ontology-driven knowledge, and a capability runtime.
|
|
5
5
|
Project-URL: Homepage, https://github.com/fzaidi-dai/RAG_Wright
|
|
6
6
|
Project-URL: Repository, https://github.com/fzaidi-dai/RAG_Wright
|
|
@@ -60,7 +60,7 @@ typed edges, and `ComplianceStore` creates `Requirement`, so they appear the fir
|
|
|
60
60
|
|
|
61
61
|
A database created before the `Span` field rename (`contract_id`, `function`, `functions` became `document_id`,
|
|
62
62
|
`primary_tag`, `tags`) is refused by `ensure_schema` with a `RuntimeError`; migrate it once with
|
|
63
|
-
`
|
|
63
|
+
`migrate_span_fields(config, corpus=...)` from `rag_wright.api` ([installation](installation.md)).
|
|
64
64
|
|
|
65
65
|
## Stop / reset
|
|
66
66
|
|
{rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0062-tiered-ocr-scan-quality-vlm-escalation.md
RENAMED
|
@@ -84,3 +84,14 @@ now, a self-hosted vLLM-Gemma-4 later for data sovereignty (only `base_url` chan
|
|
|
84
84
|
as the escalation provider for data sovereignty; (3) routing the vision call **through the async model seam**
|
|
85
85
|
for true thread cancellation (today `to_thread` unblocks the caller at the deadline but the docling thread
|
|
86
86
|
runs on); (4) classical preprocessing stays available as a cheap first pass but is not the heavy-scan fix.
|
|
87
|
+
|
|
88
|
+
## Amendment (2026-10-15, PS-46): a blank page is not degraded
|
|
89
|
+
|
|
90
|
+
A page with no ink read as both "blurry" (a white page has Laplacian variance 0) and "faint" (no pixel below 128),
|
|
91
|
+
so it was escalated, and a VLM asked to transcribe an empty page invents one (TexWright: meeting minutes in another
|
|
92
|
+
language, kept in the parse). The gate now measures `ink_frac` (pixels below 200, faint grey included) and returns
|
|
93
|
+
`ScanQuality.BLANK` for a page with no OCR text and `ink_frac` at most 1e-4: never escalated, never flagged
|
|
94
|
+
needs-rescan, listed in `TieredOCRReport.blank_pages`. Measured margin: blank 0; the heavy faint scan 0.077-0.082
|
|
95
|
+
(its `dark_frac` is 0.0025, which is why `dark_frac` alone cannot separate it); the sparsest real fixture page
|
|
96
|
+
0.019. The post-escalation check stays a flag rather than dropping the VLM text: it is an English word-rate test,
|
|
97
|
+
and a correct transcription of a page with few common words (a number-heavy table) fails it.
|
{rag_wright-0.12.0 → rag_wright-0.14.0}/docs/adr/0124-generic-ingestion-builder-and-hooks.md
RENAMED
|
@@ -253,3 +253,28 @@ writing to change one decision (engine gaps G3/G4).
|
|
|
253
253
|
(7,297 blocks, 14,059 spans) fingerprint identically before and after; a live Aimmune re-ingest is record-identical
|
|
254
254
|
to ING-8e. `tests/spans/test_segmentation_vocab.py` locks the vocabulary and checks the built patterns decide as the
|
|
255
255
|
original literals did.
|
|
256
|
+
|
|
257
|
+
## LGI-1 addendum (2026-10-17): each document runs through a LangGraph graph
|
|
258
|
+
|
|
259
|
+
- **Context.** Products register their `build_ingestion` pipeline as a `subgraph` capability, but the generic path
|
|
260
|
+
was plain asyncio: no graph existed, so the capability kind's promise (a compiled `StateGraph`) did not hold, and
|
|
261
|
+
the graph version of ingestion (ADR-0050) lived only in the reference pack.
|
|
262
|
+
- **Decision.** `IngestionPipeline.document_graph(ws, stages)` builds the per-document graph over the same
|
|
263
|
+
`IngestionStages`: parse -> chunk -> segment -> index -> extract -> write -> document_hook -> document_node ->
|
|
264
|
+
children, with every stage routing a failure to a `dead_letter` node (never raised). Embedded files run through the
|
|
265
|
+
same graph. `aingest` drives it, one compiled graph per run. Stages stay sequential per document (index before
|
|
266
|
+
extract), as before. Plan and ledger: `docs/specs/langgraph-ingestion/plan.md` (LGI-2 the run graph, LGI-3 resume).
|
|
267
|
+
- **Consequences.** No public signature, report or progress line changed. Parity is held by a record captured from
|
|
268
|
+
the asyncio driver before the change (`tests/fixtures/ingestion/parity.json`, 11 scenarios: reports, store
|
|
269
|
+
contents, hook calls, progress lines), with the scenario inputs committed because freshly built PDFs and OOXML
|
|
270
|
+
files carry random ids and timestamps.
|
|
271
|
+
- **LGI-2 (2026-10-17): the run is one graph.** `IngestionPipeline.graph(ws, *, cache_dir)` compiles the whole run:
|
|
272
|
+
`start` sends each source to `document` (the per-document graph; at most `document_concurrency` in flight, by a
|
|
273
|
+
semaphore in the node so a direct caller needs no config), `finish` builds the `IngestionReport`. `aingest` runs
|
|
274
|
+
it. The report's documents are now in source order (they were in completion order, which varied run to run).
|
|
275
|
+
- **LGI-3 (2026-10-17): an interrupted run resumes.** `aingest(..., checkpointer=, run_id=)` checkpoints every stage
|
|
276
|
+
of every document (embedded children included) on the thread `run_id`; calling it again with the same sources and
|
|
277
|
+
`run_id` resumes from each document's last finished stage. A finished run, different sources, or only one of the
|
|
278
|
+
two arguments raise `ValueError`. The graph state holds built-in values only (each node loads the typed values it
|
|
279
|
+
needs), because LangGraph's strict msgpack mode blocks the engine's types; a tuple in a record's free-form `props`
|
|
280
|
+
comes back as a list after a resume. `IngestionReport.from_dict` rebuilds the report from `graph()`'s output.
|
|
@@ -68,6 +68,10 @@ Members: `STRUCTURED_REASONING` (`'structured_reasoning'`), `STRUCTURED_REASONIN
|
|
|
68
68
|
|
|
69
69
|
One ranked capability match from `discover` — enough for an agent to pick and invoke it by `slug`.
|
|
70
70
|
|
|
71
|
+
### `SpanHit(*, span_id: str, text: str, document_id: str, doc_start: Optional[int] = None, doc_end: Optional[int] = None, pages: list[int] = [], bbox: Optional[tuple[float, float, float, float]] = None, primary_tag: str = '', rank: int, found_by: tuple[str, ...]) -> None`
|
|
72
|
+
|
|
73
|
+
One cited span from `span_search`, best first. `found_by` says which legs found it: `"hybrid"` (the fused dense + sparse search) and/or `"dense"` (the dense floor). `bbox` is `(l, t, r, b)` or None.
|
|
74
|
+
|
|
71
75
|
### `KgNode(type: 'str', key_field: 'str', props: 'dict[str, object]') -> None`
|
|
72
76
|
|
|
73
77
|
A typed KG node to upsert (DD-1b, ADR-0117): `type` is the vertex type, `key_field` the identity field to upsert on, `props` the fields (including `key_field`) as DOMAIN-NATIVE values. The store encodes each prop by its pack-declared storage type -- the caller never serializes to the store's wire format.
|
|
@@ -76,6 +80,18 @@ A typed KG node to upsert (DD-1b, ADR-0117): `type` is the vertex type, `key_fie
|
|
|
76
80
|
|
|
77
81
|
A typed KG edge to create between two nodes identified by (type, key_field, key). `props` are native values (edge properties are type-driven: edges declare no storage schema).
|
|
78
82
|
|
|
83
|
+
### `Range(gt: 'Optional[object]' = None, ge: 'Optional[object]' = None, lt: 'Optional[object]' = None, le: 'Optional[object]' = None) -> None`
|
|
84
|
+
|
|
85
|
+
A `where` value meaning a comparison, evaluated in the store (ER-1): `gt` (>), `ge` (>=), `lt` (<), `le` (<=), at most one lower and one upper bound, at least one bound. Bounds are scalars (numbers compare as numbers, strings lexically). Any number of fields may carry one, beside equality, membership and `NOT_NULL`, on every KG call that takes `where`: `where={"weight": Range(ge=180, le=220), "tensile": Range(gt=400)}`.
|
|
86
|
+
|
|
87
|
+
#### `Range.terms(self) -> 'list[tuple[str, object]]'`
|
|
88
|
+
|
|
89
|
+
`[(operator, bound), ...]`, lower bound first.
|
|
90
|
+
|
|
91
|
+
### `BlankPageText(*, source: str, pages: dict[int, str], cache_files: list[str]) -> None`
|
|
92
|
+
|
|
93
|
+
One cached parse with text on blank pages. `source` is the PDF's path (or the name given with its bytes), `pages` maps each blank page to the text the cached parse holds there, and `cache_files` are the cached parse(s) and their OCR sidecar: delete them, then re-ingest the document so it is parsed again.
|
|
94
|
+
|
|
79
95
|
### `EvidenceItem(*, chunk_id: str, text: str, confidence: Optional[str] = None, properties: Optional[list[dict]] = None) -> None`
|
|
80
96
|
|
|
81
97
|
One piece of grounding evidence: a chunk's text, its `chunk_id` (the citation), and — for a graph-derived fact — its confidence tag (surfaced to the generator, FR-S.4).
|
|
@@ -170,10 +186,28 @@ Built by `build_ingestion`; run with `await pipeline.aingest(ws, sources, cache_
|
|
|
170
186
|
|
|
171
187
|
Advanced: the individual stage functions bound to a workspace (its store, ingest embedder and tuning), for a domain that drives the stages itself (the reference contract pipeline does). Most domains only need `aingest`.
|
|
172
188
|
|
|
173
|
-
#### `IngestionPipeline.aingest(self, ws: 'Any', sources: 'Sequence[Union[str, Path, IngestSource]]', *, cache_dir: 'Union[str, Path]') -> 'IngestionReport'`
|
|
189
|
+
#### `IngestionPipeline.aingest(self, ws: 'Any', sources: 'Sequence[Union[str, Path, IngestSource]]', *, cache_dir: 'Union[str, Path]', checkpointer: 'Any' = None, run_id: 'Optional[str]' = None) -> 'IngestionReport'`
|
|
174
190
|
|
|
175
191
|
Ingest every source (and its embedded children) into the workspace `ws` (from `open_workspace`). `sources` are file paths or `IngestSource`s (a path, or in-memory bytes with a file name); `cache_dir` holds the content-hash-gated parse and chunk caches (a re-ingest of an unchanged file re-uses them). Documents run concurrently up to `tuning.document_concurrency`; a document that fails is dead-lettered in its `DocumentReport`, never raised. Returns the `IngestionReport`. Every model role resolves through the workspace's `EngineConfig.models` (PS-14).
|
|
176
192
|
|
|
193
|
+
LGI-3, resuming: pass a LangGraph `checkpointer` (yours, e.g. a Postgres saver) and a `run_id` naming the run. If the process stops mid-run, call `aingest` again with the same sources, `cache_dir`, checkpointer and `run_id`: it carries on from the last finished stage of each document, re-running none that finished. A `run_id` whose run finished raises `ValueError` (start a new run with a new id), as do different sources.
|
|
194
|
+
|
|
195
|
+
#### `IngestionPipeline.graph(self, ws: 'Any', *, cache_dir: 'Union[str, Path]', checkpointer: 'Any' = None) -> 'Any'`
|
|
196
|
+
|
|
197
|
+
LGI-2: the whole run as one compiled LangGraph `StateGraph`, bound to the workspace `ws`:
|
|
198
|
+
|
|
199
|
+
start --(one Send per source)--> document --> finish
|
|
200
|
+
|
|
201
|
+
`document` runs one source through `document_graph` (embedded files included); at most `tuning.document_concurrency` documents are in flight. The input is `{"sources": [...]}` (file paths or `IngestSource`s); the output's `report` is the `IngestionReport` as plain data (`IngestionReport.from_dict` rebuilds it), its documents in source order. This is what `aingest` runs (without `aingest`'s workspace model scoping: wrap the call in `use_workspace_models(ws)` when the workspace overrides model roles). Progress goes to the pipeline's `progress` callback. With a `checkpointer`, every stage of every document is checkpointed on the thread named by the call's `configurable.thread_id` (see `aingest` for resuming). The state holds only built-in values (dicts, lists, strings, numbers, bytes, dates), so it round-trips through any saver, including LangGraph's strict msgpack mode; a tuple inside a record's free-form `props` comes back from a checkpoint as a list.
|
|
202
|
+
|
|
203
|
+
#### `IngestionPipeline.document_graph(self, ws: 'Any', stages: 'IngestionStages') -> 'Any'`
|
|
204
|
+
|
|
205
|
+
LGI-1: the per-document ingestion graph, a compiled LangGraph `StateGraph` over `stages` (bound to `ws`):
|
|
206
|
+
|
|
207
|
+
parse -> chunk -> segment -> index -> extract -> write -> document_hook -> document_node -> children
|
|
208
|
+
|
|
209
|
+
A stage that raises routes to `dead_letter`, which ends the document with its `DocumentReport.dead_letter` set (never raised, so one bad document never stops the run). `children` ingests each embedded file through this same graph, then links it to its parent. The input is `{doc_id, source, parent_id, child, depth}`; the output's `reports` is the document's `DocumentReport` followed by its children's.
|
|
210
|
+
|
|
177
211
|
### `IngestionReport(documents: 'list[DocumentReport]' = <factory>) -> None`
|
|
178
212
|
|
|
179
213
|
The result of `IngestionPipeline.aingest`: one `DocumentReport` per document (embedded children included). `failed` counts the dead-lettered documents and `succeeded` the rest (properties).
|
|
@@ -296,7 +330,7 @@ The semantic boundary-discovery seam: decide chunk boundaries as a partition of
|
|
|
296
330
|
|
|
297
331
|
### `open_workspace(config: 'EngineConfig', *, corpus: 'str', reset: 'bool' = False, create: 'bool' = True) -> 'WorkspaceHandle'`
|
|
298
332
|
|
|
299
|
-
Resolve (and cache) the workspace for `corpus` (the backend database name) from `config`. Ensures the schema: the neutral engine types, plus `config.pack`'s declared types when set. Raises `RuntimeError` on a database whose `Span` type still has the pre-ING-8d field names (migrate it with `
|
|
333
|
+
Resolve (and cache) the workspace for `corpus` (the backend database name) from `config`. Ensures the schema: the neutral engine types, plus `config.pack`'s declared types when set. Raises `RuntimeError` on a database whose `Span` type still has the pre-ING-8d field names (migrate it with `migrate_span_fields`). Returns an opaque `WorkspaceHandle`. `reset=True` drops + recreates the database (test/clean-slate) and bypasses the cache. A missing database is created (logged): that is how a new corpus is provisioned. `create=False` raises `LookupError` instead (PS-27) -- use it wherever the corpus must already exist, so a wrong name fails loudly rather than opening an empty graph.
|
|
300
334
|
|
|
301
335
|
One handle per store and corpus is cached for the process. An equal `config` returns it; a different one (new models, options, credentials or pack) returns a new handle that replaces it from then on, so a configuration change takes effect without a restart (PS-16). The new handle reuses the store when the store settings and the pack are unchanged, and the query embedder when the embedding profile is unchanged; a call still holding the old handle finishes on the old config.
|
|
302
336
|
|
|
@@ -304,6 +338,10 @@ One handle per store and corpus is cached for the process. An equal `config` ret
|
|
|
304
338
|
|
|
305
339
|
Drop the database `corpus` (PS-37): everything in it, the retrieval index and the knowledge graph, is deleted and cannot be recovered. Returns True if it existed, False if there was nothing to drop. A cached handle for it is closed and forgotten, so a later `open_workspace` starts fresh. A missing or blank `corpus` raises `ValueError`: the name is always explicit, never a default database.
|
|
306
340
|
|
|
341
|
+
### `migrate_span_fields(config: 'EngineConfig', *, corpus: 'str', batch: 'int' = 5000, progress: 'Optional[Callable[[int, int], None]]' = None) -> 'int'`
|
|
342
|
+
|
|
343
|
+
Migrate the database `corpus` from the pre-0.2.0 `Span` field names (`contract_id`, `function`, `functions`) to the generic ones (`document_id`, `primary_tag`, `tags`), the database `open_workspace` refuses until this has run (PS-35). Values are copied in batches of `batch` and the old properties dropped; `progress(done, total)` is called after each batch. Idempotent: returns the number of records moved, 0 when already migrated. The database must exist (`LookupError` otherwise; it is never created), and a missing or blank `corpus` raises `ValueError`. Afterwards the schema is checked, so a database this returns for opens with `open_workspace`.
|
|
344
|
+
|
|
307
345
|
### `temporary_workspace(config: 'EngineConfig', *, prefix: 'str' = 'tmp') -> 'Iterator[WorkspaceHandle]'`
|
|
308
346
|
|
|
309
347
|
A workspace on a fresh database, `<prefix>_<12 hex>`, dropped when the block exits, whether it succeeds or raises (PS-37). For a probe or a measurement whose database must not outlive it: `with temporary_workspace(config, prefix="probe") as ws: ...`.
|
|
@@ -386,7 +424,7 @@ Rank the live ARD catalog by semantic match to `query`; return the top `k` (opti
|
|
|
386
424
|
|
|
387
425
|
### `kg_read(ws: 'WorkspaceHandle', node_type: 'str', *, where: 'Optional[dict]' = None, fields: 'Optional[list]' = None, distinct: 'Optional[str]' = None, order_by: 'Optional[str]' = None, limit: 'Optional[int]' = None, key_range: 'Optional[tuple]' = None) -> 'list[dict]'`
|
|
388
426
|
|
|
389
|
-
Read typed nodes of `node_type` from the workspace (see `Store.kg_read`).
|
|
427
|
+
Read typed nodes of `node_type` from the workspace (see `Store.kg_read`). Each `where` value is a scalar (equality), a list (membership; an empty list is scope-to-nothing -> `[]`), `NOT_NULL` (presence) or a `Range` (comparisons, on any number of fields: `{"weight": Range(ge=180, le=220), "tensile": Range(gt=400)}`); all filters are AND-ed and evaluated in the store. `key_range=(field, lo, hi)` is the half-open shorthand (`lo <= field < hi`). Then projection, distinct, order and limit.
|
|
390
428
|
|
|
391
429
|
### `kg_write(ws: 'WorkspaceHandle', nodes: 'list', edges: 'Any' = ()) -> 'None'`
|
|
392
430
|
|
|
@@ -398,7 +436,7 @@ Generic edge TRAVERSAL over the workspace (see `Store.kg_edges`): node-start out
|
|
|
398
436
|
|
|
399
437
|
### `kg_count(ws: 'WorkspaceHandle', type_name: 'str', *, where: 'Optional[dict]' = None, key_range: 'Optional[tuple]' = None) -> 'int'`
|
|
400
438
|
|
|
401
|
-
The number of vertices or edges of `type_name` matching `where` / `key_range` (see `Store.kg_count`).
|
|
439
|
+
The number of vertices or edges of `type_name` matching `where` / `key_range` (see `Store.kg_count`); `where` as in `kg_read`, `Range` values included.
|
|
402
440
|
|
|
403
441
|
### `kg_delete(ws: 'WorkspaceHandle', type_name: 'str', *, where: 'Optional[dict]' = None, key_range: 'Optional[tuple]' = None) -> 'int'`
|
|
404
442
|
|
|
@@ -416,6 +454,14 @@ Resolve an entity NAME to every entity node it matches: `[{entity_id, name, enti
|
|
|
416
454
|
|
|
417
455
|
Every span of `document` with its position provenance, ordered by document position. Each row: `span_id`, `parent_chunk_id`, `span_index`, `text`, `primary_tag` (the span tagger's primary tag, "" if untagged), `document_id`, `doc_start` / `doc_end` (document-absolute offsets), `pages`, and `bbox` DECODED to a `(l, t, r, b)` tuple or None. The engine MECHANISM behind a product's citation/highlight types -- the product wraps these rows into its own presentation type (e.g. `SpanLocation`).
|
|
418
456
|
|
|
457
|
+
### `span_search(ws: 'WorkspaceHandle', query: 'str', *, k: 'int' = 10, documents: 'Optional[list]' = None, tag: 'Optional[str]' = None, dense_floor: 'int' = 3) -> 'list'`
|
|
458
|
+
|
|
459
|
+
Hybrid search over the workspace's span index (every ingested span, embedded dense and sparse): the two legs fused by Reciprocal Rank Fusion in the store, with the top `dense_floor` pure-dense spans guaranteed a place, so a strong semantic match a common-token query would push out of the fused pool is kept (0 turns it off). Returns up to `k` `SpanHit`s, best first, each citation-ready: `span_id`, `text`, `document_id`, `doc_start` / `doc_end`, `pages`, `bbox`, `primary_tag`, `rank`, and `found_by` (`"hybrid"` and/or `"dense"`). `documents` scopes it to those source documents in the store (`None` = all, `[]` = nothing); `tag` keeps one primary tag. No reranking: compose `BGEReranker` over the hits if you want one. Raises `RuntimeError` when the workspace has no embedder.
|
|
460
|
+
|
|
461
|
+
### `aspan_search(ws: 'WorkspaceHandle', query: 'str', *, k: 'int' = 10, documents: 'Optional[list]' = None, tag: 'Optional[str]' = None, dense_floor: 'int' = 3) -> 'list'`
|
|
462
|
+
|
|
463
|
+
`span_search` off the event loop (the query embedding and the store calls block), for an async caller.
|
|
464
|
+
|
|
419
465
|
### `document_of(entity_id: 'str') -> 'str'`
|
|
420
466
|
|
|
421
467
|
The source-document id embedded in a chunk/span/unit id (`<source_doc_id>:<idx>:<hash>` -> the first, delimiter-safe segment). Empty in -> empty out.
|
|
@@ -448,6 +494,10 @@ The number of pages in a PDF (a path or the PDF's bytes), read under the engine'
|
|
|
448
494
|
|
|
449
495
|
The async, deadline-bounded twin of `parse_document_bytes` (ADR-0057): runs the docling parse off the event loop.
|
|
450
496
|
|
|
497
|
+
### `find_blank_pages_with_text(cache_dir: 'Any', sources: 'Iterable[Source]' = (), *, progress: 'Optional[Callable[[int, int], None]]' = None) -> 'list[BlankPageText]'`
|
|
498
|
+
|
|
499
|
+
Audit the parse cache under `cache_dir` (the one given to `parse_document`, or to `aingest`, which keeps its parses in `parsed/`; searched recursively) for text on blank pages. `sources` are the documents' PDFs, as paths or `(name, bytes)`; files embedded in a parsed package are stored in the cache and audited without being passed. A source that is not a PDF, or has no cached parse, is skipped. `progress(done, total)` is called after each PDF. Raises `FileNotFoundError` when `cache_dir` does not exist.
|
|
500
|
+
|
|
451
501
|
### `agenerate_answer(query: 'str', evidence: 'list[EvidenceItem]', *, ws: 'Any', guidance: 'Optional[str]' = None) -> 'GeneratedAnswer'`
|
|
452
502
|
|
|
453
503
|
A grounded, cited answer to `query` over `evidence`, or an abstention. Empty evidence abstains without a model call; a citation not in the evidence is dropped, and an answer left with no valid citation becomes an abstention (no claim without a citation). `answer_kind` says whether the evidence fully supported the answer (`answered`), only partly (`partial`) or not at all (`abstained`). `guidance` adds your domain's wording to the domain-neutral method.
|
|
@@ -30,7 +30,7 @@ Everything a product touches is re-exported from `rag_wright.api`; the packages
|
|
|
30
30
|
| `api/` | the stable, domain-agnostic public surface: config, workspace, invokers, KG accessors, ids, usage | **yes** (in the enforced source set) |
|
|
31
31
|
| `pack_sdk/` | the pack-author tier (PS-8b): re-exports of the engine building blocks a domain pack's code needs beyond `api` (identifiers, the model seam, the LangGraph scaffold, the store protocol, the generic capabilities a pack composes); a pack imports only `api` and `pack_sdk` | **yes** |
|
|
32
32
|
| `capabilities/` | the capability catalog + ARD runtime — `CapabilityManifest`, `registry`, `manifests`, the adapter-free `invoke` client; plus the generic primitives (graph query, retrieval core, embedding, disambiguation, entity resolution, the decision model) | **yes** |
|
|
33
|
-
| `ingestion/` | the generic ingestion mechanism (ADR-0124): `build_ingestion`
|
|
33
|
+
| `ingestion/` | the generic ingestion mechanism (ADR-0124): `build_ingestion` (a LangGraph graph over the shared `IngestionStages`, resumable), the default layout segmenter and structural unit grouper, `table_rows`, `evaluate_ingestion` | **yes** |
|
|
34
34
|
| `subgraphs/` | the generic LangGraph scaffolding (`scaffold.py`), semantic chunking, graph extraction and observability; domain graphs live in their pack | **yes** |
|
|
35
35
|
| `models/` | the model-profile seam: `ModelRole`, `profiles`, `seam`, `tag_structured`, usage/tracing | **yes** |
|
|
36
36
|
| `store/` | the single ArcadeDB store behind the seam: `arcadedb` (only the engine types and generic reads/writes; a pack's own store methods live in the pack, e.g. `ContractKGStore`, `ComplianceStore`), `seam` (`KgNode`/`KgEdge`/`NOT_NULL`), `chunk_text` | **yes** |
|
|
@@ -76,7 +76,9 @@ expensive stages are content-hash gated so re-ingest is cheap. Entity extraction
|
|
|
76
76
|
attachments become child documents linked by `EmbeddedIn` / `AttachedTo`).
|
|
77
77
|
|
|
78
78
|
A new domain does not build this pipeline: it calls `build_ingestion(extractor, ...)` (in `rag_wright.ingestion`,
|
|
79
|
-
re-exported from `rag_wright.api`) with its hooks. The
|
|
79
|
+
re-exported from `rag_wright.api`) with its hooks. The pipeline is a LangGraph graph (`IngestionPipeline.graph`: one
|
|
80
|
+
run graph sending each source to a per-document graph of the stages), so a product's ingestion capability is a real
|
|
81
|
+
`subgraph`, and a run given a checkpointer and a `run_id` resumes where it stopped. The engine owns parse, chunk, segment, index, group and write;
|
|
80
82
|
the domain supplies the extractor and overrides only the hooks it needs. The default segmenter follows the docling
|
|
81
83
|
layout and the default unit grouper is structural. The reference `contract_ingestion_pipeline` drives the same
|
|
82
84
|
shared `IngestionStages` with legal hooks (a legal segmenter, a clause-function span tagger, a provision grouper
|
|
@@ -106,6 +106,12 @@ pipeline = build_ingestion(extractor, segmenter=None, span_tagger=None, unit_gro
|
|
|
106
106
|
report = await pipeline.aingest(ws, sources, cache_dir="cache/")
|
|
107
107
|
```
|
|
108
108
|
|
|
109
|
+
- **It is a LangGraph graph.** `pipeline.graph(ws, cache_dir=...)` is the compiled run: each source goes through the
|
|
110
|
+
per-document graph (parse, chunk, segment, index, extract, write, the document hook, the `Document` node, then its
|
|
111
|
+
embedded files through the same graph), at most `document_concurrency` documents at a time; a stage that fails
|
|
112
|
+
dead-letters its document, never the run. `aingest` runs it, and with `checkpointer=` and `run_id=` an interrupted
|
|
113
|
+
run resumes from each document's last finished stage.
|
|
114
|
+
|
|
109
115
|
- **The engine owns the mechanism:** parse (PDF, Office, spreadsheets incl. hidden sheets), chunk, segment each chunk
|
|
110
116
|
into spans that tile it, index the spans (dense + sparse), group spans into extraction **units**, run the
|
|
111
117
|
extractor on each unit concurrently, write, and record one `Document` node per document. Embedded files and PDF
|
|
@@ -109,6 +109,11 @@ and how to manage workspaces.
|
|
|
109
109
|
deployment serves a single model; OCR resolves its endpoint and flags through the same profile as every other
|
|
110
110
|
call. Override one role with `RAG_MODEL_<ROLE>` (e.g. `RAG_MODEL_VISION_OCR`, `RAG_MODEL_GENERAL`), or every
|
|
111
111
|
role at once with `RAG_MODEL_ALL`; the role-specific variable wins.
|
|
112
|
+
- **Blank PDF pages** are never sent to `VISION_OCR` (0.13.0, PS-46): a page with no ink has nothing to read, and a
|
|
113
|
+
vision model asked to transcribe one invents a page. A parse cached by an earlier engine with `VISION_OCR`
|
|
114
|
+
configured may still hold such text: `find_blank_pages_with_text(cache_dir, sources)` lists every page that is
|
|
115
|
+
blank in the source PDF but has text in its cached parse (files embedded in a parsed package are found in the
|
|
116
|
+
cache without being passed). Delete each finding's `cache_files`, then re-ingest the document.
|
|
112
117
|
- **Structured output** is client-side tag-parse (ADR-0045); any provider flags live in the profile.
|
|
113
118
|
- **A self-hosted Qwen server**: see [A self-hosted model server](#a-self-hosted-model-server-qwen-on-modal) below.
|
|
114
119
|
- **Decision models** (e.g. Jev) are reached through a `DecisionModelProfile` (default `jev-1.13`;
|
|
@@ -42,7 +42,7 @@ ADR-0117/0118 engine API + capability runtime). Read [Concepts](../concepts.md)
|
|
|
42
42
|
(segmenter, span tagger, unit grouper, boundary decider, writer, a per-document hook)
|
|
43
43
|
→ [KG construction](kg-construction.md) and the `building-an-ingestion-capability` skill. Your query graphs, domain functions, and skills **compose the engine's
|
|
44
44
|
generic primitives from the public tiers** (graph reads and query, embedding, typed ranking, reranking,
|
|
45
|
-
answers, parsing, chunking
|
|
45
|
+
answers, parsing, chunking, and hybrid span search with `span_search`) and register only your OWN domain graphs/models/skills via `register_capability(manifest)` with an
|
|
46
46
|
`impl_ref`, invocable (and MCP-exposable) with zero engine edits. Package them as a pack module that exposes
|
|
47
47
|
`register()` and load it with `load_pack("<your module>")`.
|
|
48
48
|
→ [Authoring capabilities](authoring-capabilities.md).
|
|
@@ -190,7 +190,7 @@ they are the real "does a new customer benefit?" items. The genuine engine ones
|
|
|
190
190
|
- **Table rows:** `table_rows(source_document)` returns every parsed table's rows as exact cells (`TableRow`), and a
|
|
191
191
|
one-row unit carries its row as `Unit.table_row` (ING-7).
|
|
192
192
|
|
|
193
|
-
### G24: No public hybrid search or fusion primitive
|
|
193
|
+
### G24: No public hybrid search or fusion primitive (closed)
|
|
194
194
|
- **Where:** the engine's own retrieval legs run hybrid (dense + sparse) span search and rank fusion internally, and
|
|
195
195
|
the authoring guide used to say a capability composes them "by direct import"; neither is on `rag_wright.api` or
|
|
196
196
|
`rag_wright.pack_sdk`.
|
|
@@ -199,6 +199,10 @@ they are the real "does a new customer benefit?" items. The genuine engine ones
|
|
|
199
199
|
what it embeds itself, beside a structured leg (`kg_read`, `typed_constraint_match_rank`).
|
|
200
200
|
- **Proposed:** a public hybrid span search over a workspace (query text, filters, k) returning cited spans, with the
|
|
201
201
|
fusion and reranking it already applies; on `rag_wright.pack_sdk` for pack capabilities.
|
|
202
|
+
- **Closed by PS-45:** `span_search(ws, query, *, k, documents, tag, dense_floor)` and `aspan_search` on
|
|
203
|
+
`rag_wright.api` (which pack code may also import): the store-side RRF fusion of the dense and sparse span
|
|
204
|
+
legs plus the dense floor (ADR-0104), returning citation-ready `SpanHit`s. Reranking stays the caller's
|
|
205
|
+
(`BGEReranker`), as it was in the engine's own leg.
|
|
202
206
|
- Surfaced: the TexWright specification (2026-10-14).
|
|
203
207
|
|
|
204
208
|
## Prerequisites a domain provides (not engine gaps)
|
|
@@ -114,9 +114,10 @@ slug. Write good `representative_queries` (2–5, phrased like real tasks) — t
|
|
|
114
114
|
Your capabilities **compose the engine's generic primitives from the public tiers** (`rag_wright.api` and
|
|
115
115
|
`rag_wright.pack_sdk`: the knowledge-graph reads `kg_read` / `kg_edges`, graph query, embedding (`ws.embedder`,
|
|
116
116
|
`cosine`), typed ranking (`typed_constraint_match_rank`), reranking (`BGEReranker`), answers (`agenerate_answer`,
|
|
117
|
-
`ajudge_spans`),
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
`ajudge_spans`), hybrid span search (`span_search` / `aspan_search`: the dense and sparse legs fused in the store,
|
|
118
|
+
with a dense floor, returning cited spans), parsing and chunking); you register only your OWN domain
|
|
119
|
+
graphs/models/skills. Don't wrap or re-register an engine primitive, and check a primitive is on a tier before
|
|
120
|
+
designing around it.
|
|
120
121
|
|
|
121
122
|
## Definition of done
|
|
122
123
|
|
|
@@ -131,13 +131,20 @@ To serve open models yourself instead, set `RAG_SERVING=vllm` with `VLLM_BASE_UR
|
|
|
131
131
|
|
|
132
132
|
`open_workspace` (through `ensure_schema`) refuses a database whose `Span` type still has the old field names
|
|
133
133
|
(`contract_id`, `function`, `functions`; renamed to `document_id`, `primary_tag`, `tags`) and raises a `RuntimeError`
|
|
134
|
-
naming the fix. Migrate each such database once, in place
|
|
135
|
-
|
|
134
|
+
naming the fix. Migrate each such database once, in place, with `migrate_span_fields` from `rag_wright.api`. It is
|
|
135
|
+
idempotent (it returns the number of spans moved, 0 when already migrated), never creates a database, and reports
|
|
136
|
+
progress after each batch:
|
|
136
137
|
|
|
137
|
-
```
|
|
138
|
-
|
|
138
|
+
```python
|
|
139
|
+
from rag_wright.api import EngineConfig, StoreConfig, migrate_span_fields
|
|
140
|
+
|
|
141
|
+
config = EngineConfig(store=StoreConfig.from_env())
|
|
142
|
+
moved = migrate_span_fields(config, corpus="my_corpus",
|
|
143
|
+
progress=lambda done, total: print(f"[migrate] {done}/{total}"))
|
|
139
144
|
```
|
|
140
145
|
|
|
146
|
+
From an engine checkout, `uv run python -u scripts/migrate_span_fields.py <database>` does the same.
|
|
147
|
+
|
|
141
148
|
Every other breaking change since 0.1.0, with the exact change a consumer makes, is in
|
|
142
149
|
[`specs/ingestion-hooks/ing8-breaking-changes.md`](specs/ingestion-hooks/ing8-breaking-changes.md).
|
|
143
150
|
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# LangGraph ingestion: plan and ledger (LGI)
|
|
2
|
+
|
|
3
|
+
Status: COMPLETE 2026-10-17 (LGI-1 to LGI-5); approved 2026-10-17 (decisions: sequential index then extract; run graph + document subgraph; serialization measured in LGI-3). Runs before PS-48 (the harness tests onto the fabric fixture).
|
|
4
|
+
|
|
5
|
+
## Why
|
|
6
|
+
|
|
7
|
+
`build_ingestion` (ADR-0124) is the engine's generic ingestion path, and every product's ingestion capability is
|
|
8
|
+
built on it (TexWright's `texwright_ingestion` and `texwright_screen_ingestion`). It is plain asyncio: `aingest`
|
|
9
|
+
runs `IngestionStages` per document with `asyncio.gather` and a semaphore. No LangGraph graph exists on that path.
|
|
10
|
+
Yet the `authoring-a-capability` skill defines the `subgraph` kind as "a compiled LangGraph `StateGraph`", and
|
|
11
|
+
`building-an-ingestion-capability` tells a product to register its pipeline as a `subgraph`. So every product
|
|
12
|
+
registers a "subgraph" that has no graph, and gets none of what the graph gives: durable resume of a long ingest
|
|
13
|
+
from a checkpointer, per-node streaming, and the substrate for a later `interrupt()` review step. The graph
|
|
14
|
+
version (ADR-0050's async ingestion) exists only in the reference pack (`contract_ingestion_pipeline`,
|
|
15
|
+
`async_ingestion`), not on the generic path.
|
|
16
|
+
|
|
17
|
+
## Goal
|
|
18
|
+
|
|
19
|
+
`build_ingestion` builds a LangGraph graph, and `aingest` runs it. A product's ingestion capability is then a real
|
|
20
|
+
`subgraph`: its `production_<slug>` returns `pipeline.graph(...)`, its `ainvoke` stays `pipeline.aingest(...)`.
|
|
21
|
+
|
|
22
|
+
**Nothing breaks.** `build_ingestion`'s parameters, `aingest(ws, sources, *, cache_dir)`, `IngestionReport` /
|
|
23
|
+
`DocumentReport`, the `[ingest] i/N` progress lines, dead-letter semantics and `IngestionStages` (used directly by
|
|
24
|
+
RuleWright's and the reference pack's contract pipelines) are unchanged. Additions only, so a `feat:` (0.14.0).
|
|
25
|
+
|
|
26
|
+
## Design
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
run graph (IngestionPipeline.graph(ws, *, cache_dir, checkpointer=None))
|
|
30
|
+
START --Send per source--> document (the per-document subgraph) --> END report = reducer over documents
|
|
31
|
+
at most tuning.document_concurrency documents in flight (a semaphore in the node)
|
|
32
|
+
|
|
33
|
+
document subgraph
|
|
34
|
+
parse -> chunk -> segment -> index -> extract -> write -> document_hook -> document_node -> children --> END
|
|
35
|
+
|any stage raises: the document's DocumentReport.dead_letter = "<Type>: <message>" --> END (never raised)
|
|
36
|
+
children: each embedded file / attachment through the same document subgraph (depth cap 2, as today),
|
|
37
|
+
then its EmbeddedIn / AttachedTo links
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
- **The nodes ARE `IngestionStages`.** One implementation of each stage, now with three drivers' worth of reuse:
|
|
41
|
+
the generic graph, the reference pack's contract graph, and any product driving the stages itself.
|
|
42
|
+
- **Order and semantics match today's driver exactly**: stages sequential per document (index before extract),
|
|
43
|
+
documents concurrent up to `document_concurrency`, children after their parent, same dead-letter strings, same
|
|
44
|
+
progress lines. Parity is the acceptance gate, measured, not assumed.
|
|
45
|
+
- **State stays small and serializable.** The parse is not held in state: the `parse` node fills the
|
|
46
|
+
content-hash parse cache and later nodes reload from it (they already do, through `IngestionStages.parsed`).
|
|
47
|
+
State holds the chunks, tagged spans, units/extractions and the report fields.
|
|
48
|
+
- **Durable resume is opt-in.** `checkpointer=` (any LangGraph saver; the product supplies its own, e.g. Postgres,
|
|
49
|
+
as with the harness: ADR-0139, no Postgres extra in the engine) plus a `run_id` used as the thread id. Re-running
|
|
50
|
+
an interrupted ingest with the same `run_id` skips documents and stages already checkpointed. Without a
|
|
51
|
+
checkpointer, behaviour is today's.
|
|
52
|
+
- **No retry policy added.** Today a stage failure dead-letters the document; that stays (a `RetryPolicy` would
|
|
53
|
+
change behaviour and cost). The graph makes it a one-line addition later if a product asks.
|
|
54
|
+
|
|
55
|
+
## Open questions (decide before LGI-1)
|
|
56
|
+
|
|
57
|
+
1. **Parallel index and extract after segment?** The reference pack fans them out; on the generic path they are
|
|
58
|
+
independent (embedding vs the extractor). A wall-clock gain on model-backed extractors, but a change of order
|
|
59
|
+
in store writes. **Recommendation: keep sequential here (parity), measure the gain in a later task.**
|
|
60
|
+
2. **Run graph or per-document graph only?** The run graph (one `aingest` call over its sources; a "run", named by `run_id`; not a `corpus`, which is the database name) (Send fan-out) makes the whole ingest one
|
|
61
|
+
compiled graph, so the capability is one graph and a checkpointer covers the run. **Recommendation: both, as
|
|
62
|
+
designed (the per-document subgraph is a node of the run graph).**
|
|
63
|
+
3. **Checkpoint serialization of the stage values** (pydantic chunks/spans/units, dataclass `KgNode`/`KgEdge`):
|
|
64
|
+
LangGraph's serializer must round-trip them. Measured in LGI-3; if a type does not round-trip, it is converted
|
|
65
|
+
at the node boundary, never by changing the public contracts.
|
|
66
|
+
|
|
67
|
+
## Ledger
|
|
68
|
+
|
|
69
|
+
| Id | Task | Acceptance (verify) | Status |
|
|
70
|
+
|---|---|---|---|
|
|
71
|
+
| LGI-1 | The per-document subgraph over `IngestionStages` (nodes above, dead-letter route, children through the same subgraph); `aingest` drives it per document, documents still fanned out as today. Parity fixture recorded FIRST from the current driver: `IngestionReport`s and store contents for the existing hermetic ingestion fixtures (text, PDF, spreadsheet with embedded children and links, a failing extractor, a failing document) | the recorded parity fixture equal after the change; the whole existing ingestion suite green unchanged; ADR-0124 amended (and ADR-0050's note that the generic path is not a graph) | done 2026-10-17 (`document_graph`; parity 11/11 scenarios; suite 2297 passed) |
|
|
72
|
+
| LGI-2 | The run graph: `IngestionPipeline.graph(ws, *, cache_dir)` public, Send fan-out per source, at most `document_concurrency` documents in flight (a semaphore inside the `document` node, so a direct `graph()` caller gets it without passing a config), the report reduced from the documents; `aingest` = run the run graph | parity fixture equal; a concurrency test (peak documents in flight = `document_concurrency`); progress lines identical (the `[ingest] start N=` / `i/N` / `done` lines asserted); API docs regenerated | done 2026-10-17 (`graph()`; parity 11/11; source-order report; suite 2304 passed) |
|
|
73
|
+
| LGI-3 | Durable resume: `checkpointer=` and `run_id=` on `graph()` and `aingest`; state round-trips through the saver | hermetic, `InMemorySaver`: an ingest interrupted mid-run (a node raises a non-dead-letter interruption on document 2) resumed with the same `run_id` re-runs no completed stage (extractor and embedder call counts) and yields the same report as an uninterrupted run; without a checkpointer behaviour is unchanged | done 2026-10-17 (`checkpointer=`/`run_id=`; built-in state, strict serde green; suite 2311 passed) |
|
|
74
|
+
| LGI-4 | The capability shape and docs: `authoring-a-capability` (the `subgraph` kind: an ingestion capability's `production_<slug>` returns `pipeline.graph(...)`), `building-an-ingestion-capability` step 5 (resume with the product's checkpointer, the run id), `docs/architecture.md` / `concepts.md` ingestion sections; the product-starter templates if they show the ingest | doc-reference, shipped-skills and ingestion-skill-example guards green; the skill example runs the graph | done 2026-10-17 (both skills, concepts, architecture, the consumer skill and the starter template) |
|
|
75
|
+
| LGI-5 | Live parity and handover: a live `build_ingestion` run on real parses (the PS-47 workbook with an embedded PDF, and a PDF set) before and after: same `IngestionReport`, same store counts per type; a live resume with a real checkpointer; RuleWright and TexWright notes (nothing to change; the new optional resume) | live tests green; the migration notes written | done 2026-10-17 (live old-vs-new identical: 10 documents, 394 spans, 55 records, links; live crash-and-resume green; RuleWright guide 0.14.0) |
|
|
76
|
+
|
|
77
|
+
Each task is one approval gate; one commit per approved task.
|