rag-wright 0.10.0__tar.gz → 0.11.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.10.0 → rag_wright-0.11.0}/.claude/skills/authoring-a-capability/SKILL.md +14 -2
- rag_wright-0.11.0/.claude/skills/building-a-product-backend/SKILL.md +323 -0
- rag_wright-0.11.0/.claude/skills/building-a-product-frontend/SKILL.md +271 -0
- {rag_wright-0.10.0/src/rag_wright/.agents → rag_wright-0.11.0/.claude}/skills/building-an-ingestion-capability/SKILL.md +36 -1
- {rag_wright-0.10.0/src/rag_wright/.agents → rag_wright-0.11.0/.claude}/skills/creating-evals/SKILL.md +20 -0
- rag_wright-0.11.0/.claude/skills/specifying-a-product-on-the-engine/SKILL.md +223 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.claude/skills/using-the-rag-wright-engine/SKILL.md +33 -13
- rag_wright-0.11.0/.release-please-manifest.json +3 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/CHANGELOG.md +7 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/CLAUDE.md +1 -1
- {rag_wright-0.10.0 → rag_wright-0.11.0}/PKG-INFO +1 -1
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/domain-adaptation/README.md +11 -4
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/domain-adaptation/_engine-gaps.md +12 -1
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/domain-adaptation/authoring-capabilities.md +12 -6
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/domain-adaptation/classification-and-decision-models.md +3 -1
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/domain-adaptation/ontology-authoring.md +18 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/installation.md +4 -2
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/public-surface/plan.md +3 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/public-surface/rulewright-migration-0.10.0.md +1 -1
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/templates/product-starter/CLAUDE.md.template +10 -6
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/templates/product-starter/README.md +7 -5
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/templates/product-starter/playbook.md.template +9 -5
- {rag_wright-0.10.0 → rag_wright-0.11.0}/pyproject.toml +1 -1
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/.agents/skills/authoring-a-capability/SKILL.md +14 -2
- rag_wright-0.11.0/src/rag_wright/.agents/skills/building-a-product-backend/SKILL.md +323 -0
- rag_wright-0.11.0/src/rag_wright/.agents/skills/building-a-product-frontend/SKILL.md +271 -0
- {rag_wright-0.10.0/.claude → rag_wright-0.11.0/src/rag_wright/.agents}/skills/building-an-ingestion-capability/SKILL.md +36 -1
- {rag_wright-0.10.0/.claude → rag_wright-0.11.0/src/rag_wright/.agents}/skills/creating-evals/SKILL.md +20 -0
- rag_wright-0.11.0/src/rag_wright/.agents/skills/specifying-a-product-on-the-engine/SKILL.md +223 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/.agents/skills/using-the-rag-wright-engine/SKILL.md +33 -13
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tasks.md +1 -1
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/arch/test_shipped_skills.py +3 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/uv.lock +1 -1
- rag_wright-0.10.0/.release-please-manifest.json +0 -3
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.claude/settings.json +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.claude/skills/building-an-agent-harness/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.claude/skills/classifier-opportunity-analysis/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.claude/skills/laya/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.claude/skills/qwen-vllm-modal/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.claude/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.claude/skills/qwen-vllm-modal/scripts/rw_gate.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.claude/skills/setfit/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.env.example +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.github/workflows/publish.yml +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.github/workflows/release-please.yml +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/.gitignore +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/LICENSE +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/README.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/SPEC.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/conftest.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/ARCHITECTURE_OVERVIEW.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/ArcadeDB_Local.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/OBSERVABILITY.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0001-stack-and-library-choices.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0002-validation-corpus-cuad-edgar.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0003-ard-registration-and-capability-kinds.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0004-entity-disambiguation.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0005-relational-golden-set.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0006-model-profile.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0007-arcadedb-store-schema.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0008-unified-framework-index-docs-grounding.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0009-rlm-chunking-retained-as-configurable-capability.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0010-transformers-pinned-below-5-for-flagembedding-reranker.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0011-cuad-not-a-retrieval-benchmark-acord-for-queries.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0012-entity-mention-confidence-no-proximity-edges.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0013-entity-resolution-matching-strategy.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0014-split-generation-and-vision-to-text.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0015-rlm-dynamic-subagents-and-granted-subagents.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0016-rlm-defined-by-required-capabilities-enforced-as-tests.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0017-dynamic-dispatch-trigger-as-typed-flag.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0018-rlm-method-is-the-orchestrator-system-prompt.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0019-recursion-is-optional-for-chunking-required-for-synthesis.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0020-serialize-interpreter-sessions-per-process-ki1.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0021-capability-interface-governed-typed-io.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0022-fr-k-embedding-free-okf-navigation-experimental.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0023-cheap-model-for-okf-enrichment.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0024-reader-parallelism-lives-in-python-not-the-interpreter.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0025-retrieval-pivot-function-classify-property-graph-rerank.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0026-property-schema-and-extended-function-taxonomy.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0027-openrouter-provider-routing-by-throughput.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0028-deterministic-grounding-judge-and-flash-pro-cascade.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0029-retrieval-pipeline-domain-portability-and-adaptation.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0030-model-training-standard-modal-reusable-checkpointed.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0031-single-call-chunking-for-structured-contracts.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0032-nl-to-type-two-step-reason-emit-on-gemma.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0033-unified-contract-kg-three-legs-one-graph.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0034-granite-json-schema-structured-output-profile.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0035-graph-extraction-rebacked-with-gp1b-retire-hybrid.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0036-party-clause-link-party-to-edge.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0037-clause-template-is-authoritative-code-not-generated.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0038-full-cuad-kg-on-gcp-gpu-vm-and-gcs-backup.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0039-self-hosted-open-model-stack-on-modal-a100.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0040-neuro-symbolic-extraction-fidelity-ontology-shacl-validation.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0041-capability-kind-rubric-and-agent-skill-runtime-tiers.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0042-clause-level-span-id-provenance-and-content-hash-backfill.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0043-retire-cross-corpus-retrieval-standardize-on-leg-b.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0044-is-exception-to-derived-carveout-relationship.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0045-client-side-tag-parse-structured-output.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0046-acord-unified-into-one-production-kg.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0047-retire-precomputed-clause-function-gate.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0048-ingest-llm-classifier-nondestructive-reclassify.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0049-generic-customer-lens-for-ingestion.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0050-async-langgraph-ingestion.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0051-schema-bootstrap-and-feedback-driven-ontology-evolution.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0052-engine-product-split-graphwright-parked.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0053-answer-prose-output-hygiene.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0054-remove-auto-tag-from-generator-evidence.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0055-confidence-out-of-band.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0056-bound-structured-retry-wall-clock.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0057-async-engine-architecture.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0058-structure-first-chunking.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0059-recall-decoupled-from-classification-and-visible-partial-loss.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0060-scope-compliance-check-to-named-policy-sources.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0061-subject-document-compliance-per-section.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0062-tiered-ocr-scan-quality-vlm-escalation.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0063-per-sentence-compliance-subject-facts.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0064-typed-properties-out-of-band-on-evidence.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0065-deontic-applicability-gates-query-side.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0066-ontology-ttl-single-source-of-truth.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0067-domain-pack-retargeting.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0068-recall-first-actor-gate-ontology-role-disjointness.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0069-reading-order-chunking-tables-figures-retrievable.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0070-text-layer-first-parsing-no-false-vlm-escalation.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0071-defragmentation-reconstruct-paragraphs-from-line-items.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0072-extract-guard-furniture-and-deterministic-failure.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0073-born-digital-threshold-sparse-pages-no-vlm-escalation.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0074-retry-transient-extraction-failures.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0075-per-page-vlm-escalation.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0076-thread-safe-shared-embedder-reranker.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0077-concurrent-function-classification-across-chunks.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0078-dedicated-extraction-executor.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0079-product-default-granite-4.2-openrouter-routing.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0080-nested-tag-parse-and-degrade.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0081-function-independent-tagparse-clause-extraction.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0082-symbolic-gate-function-independent.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0083-executor-hop-trace-context-capture.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0084-gleaning-off-on-the-query-leg.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0085-query-constraint-extraction-tagparse.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0086-streaming-cost-capture.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0087-retrieval-relevance-score-on-rankedspan.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0088-per-span-relevance-verdict.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0089-structured-output-generation-tracing.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0090-affiliate-of-extraction.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0091-retire-partyto-edge.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0092-idempotent-write-graph.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0093-entities-by-name-seam.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0094-workspace-document-scope.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0095-span-page-provenance.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0096-carveout-keyword-normalization.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0097-caller-configurable-ingest-extraction-models.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0098-invoke-time-document-scope.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0099-mcp-tools-never-take-a-model-supplied-tenant.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0100-profile-based-model-routing.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0101-untagged-spans-reach-extraction-aspect-gate-removed.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0102-open-descriptive-list-dims-retain-verbatim.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0103-a-clause-is-a-provision-not-a-span.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0104-dense-floor-protection-in-leg-b.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0105-in-band-model-usage-accounting.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0106-document-signals-off-the-citation.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0107-requirement-page-provenance.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0108-qwen3-27b-single-a100-serving-profile.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0109-vllm-cold-start-reduction.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0110-fp8-kv-cache-16k-single-a100.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0111-pin-qwen3-27b-deepinfra-bf16.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0112-relax-deepagents-pin-to-floor.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0113-llm-span-instrumentation-for-latency-attribution.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0114-setfit-default-clause-function-classifier.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0115-classifier-only-step3a-property-extraction.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0116-soft-function-scoping-classifier-lane.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0117-engine-api-layer-and-capability-runtime.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0118-engine-core-api-vs-ard-adapter-free-impl-ref-client.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0119-jev-typed-decision-model-for-compliance-closed-set-fields.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0120-rlm-sub-agent-identity-dynamic-dispatch-trigger.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0121-spacy-optional-extra-model-runtime-download.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0122-provision-boundary-deterministic-plus-decision-model-residue.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0123-batched-releases-release-please-and-consumer-dependabot.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0124-generic-ingestion-builder-and-hooks.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0125-qwen-openrouter-unpinned.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0126-unit-representative-hook-and-the-reference-vote.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0127-retire-the-okf-code.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0128-two-public-tiers-api-and-pack-sdk.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0129-laya-temperatures-and-the-sklearn-floor.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0130-deploy-the-self-hosted-model-server-from-the-engine.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0131-model-server-hardening-after-rulewright-review.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0132-model-server-cold-start-from-a-gpu-snapshot.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0133-model-call-deadline-follows-the-timeout-and-a-thinking-cap.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0134-skills-for-product-developers-are-linked-per-project-never-globally.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0135-the-seam-gives-each-event-loop-its-own-async-http-client.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0136-spreadsheet-tables-are-glued-back-across-blank-rows.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0137-generated-answers-state-their-support-and-none-is-an-abstention.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0138-the-engine-reaches-pdfium-through-one-locked-door.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/0139-the-agent-harness-substrate-is-engine-scope.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/adr/README.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/api/README.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/api/harness.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/api/pack_sdk.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/architecture/foundations-and-adding-a-domain.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/architecture.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/README.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/design/deontic-applicability-routing.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/design/ingestion-neuro-symbolic-gaps.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/design/semantic-subject-segmentation.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/design/unify-subject-preprocessing.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/engine-issues/0037-closed-vocab-drops-verbatim-values-to-other.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.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.10.0 → rag_wright-0.11.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.10.0 → rag_wright-0.11.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.10.0 → rag_wright-0.11.0}/docs/archive/engine-issues/0041-VERIFICATION-dense-floor.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/engine-issues/0041-leg-b-discards-the-best-dense-matches-on-some-queries.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.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.10.0 → rag_wright-0.11.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.10.0 → rag_wright-0.11.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.10.0 → rag_wright-0.11.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.10.0 → rag_wright-0.11.0}/docs/archive/engine-issues/0046-appending-a-natural-follow-up-to-a-question-drops-the-clause-type.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/engine-issues/0047-an-exact-deepagents-pin-transitively-pins-every-consumer.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/engine-issues/0048-the-pinned-endpoints-latency-tail-makes-agent-runs-undebuggable-from-either-side.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-07-20_graphwright_capability_interface_reply.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-07-20b_graphwright_interface_confirmation.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-07-20c_graphwright_ingestion_interfaces.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-08-30_subject_compliance_final_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-01_issue-0013-recall-first-actor-gate_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-01_ontology-source-of-truth_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-03_issue-0014-table-retrievability_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-04_bulk-ingestion-wall_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-04_issue-0016-thread-safe-embedder_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-05_observability-langfuse_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-05_tagparse-ingestion-and-granite-4.2_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-09_affiliate-of-extraction_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-09_issue-0028-partyto-retired_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-09_issue-0029-idempotent-write-graph_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-09_issue-0030-entities-by-name_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-09_observability-and-retrieval-floor_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-09_relevance-verdict_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-09_rename-run-ad-compliance-check_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-09_structured-output-cost-tracing_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-10_ingest-models-caller-configurable_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-failclosed-and-nodrift_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-validate-ingested-set_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-10_issue-0031-workspace-document-scope_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-10_issue-0032-span-page-provenance_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-10_issue-0033-carveout-normalization_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-10_issue-0034-invoke-time-document-scope_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-11_issue-0035-followup-derived-guard_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-11_issue-0035-mcp-no-model-tenant_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-11_profile-based-model-routing_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-11_qwen-default-modal-or_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-11_qwen-everywhere-config_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-12_clause-granularity_0036-0039_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-12_closed-vocab_0037-0040_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-12_dense-floor-protection_0041_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-13_in-band-usage_0042_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-14_document-signals-off-citation_0044_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-14_requirement-page-provenance_0043_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-16_qwen3-27b-single-a100-serving-profile_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-18_fp8-accuracy-eval-configB_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-18_fp8-kv-16k-single-a100_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-20_deepagents-pin-relaxed_0047_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-20_llm-span-instrumentation_0048_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-answers_from_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-scoping-questions_rulewright.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/misc/.gitkeep +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/plans/Corpus_Acquisition.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/plans/async-migration.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/plans/demo_plan.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/plans/gp1b_docling_graph_plan.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/plans/unified_contract_kg_ontology_bridge.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/plans/unified_contract_kg_plan.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/results/2026-07-24-t58-property-graph-population.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/results/2026-07-25-t58b-full-pipeline-rerank.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/archive/results/2026-07-25-t58b-topk-ordering-levers.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/concepts.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/configuration.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/contract_pipeline_explainer.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/corpus_ingest_recipe.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/domain-adaptation/entity-resolution.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/domain-adaptation/evals-from-expert-files.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/domain-adaptation/kg-construction.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/classifier_model_ab.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/compliance_demo.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/compliance_gate_cc7.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/compliance_rung2_cc7.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/cuad_highlighting_cu-d1.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/dg_model_ab.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/function_gate_recall.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/generation_robustness_b_vs_c.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/nl_to_type_cu-d2.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/ocr_benchmark.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/prod1_readiness.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/prod2_readiness.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/query_side_model_ab.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/silver_granite_vs_gemma4.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/silver_provider_routing.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/eval/silver_selfhosted_gemma4_26b.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/evals.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/playbook.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/product/capability_profiles.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/product/contracts_product_roadmap.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/product/engine-api-migration-handoff.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/product/engine_async_api.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/product/new-domain-build-sequence.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/product/seam-adaptation-guide.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/proposals/compliance-ingest-classifier-decomposition.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/proposals/de-domaining-and-capability-runtime.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/proposals/new-domain-developer-journey.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/proposals/ontology-induction.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/quickstart.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/reference-pack.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/releasing.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/engine-platform/SPEC.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/engine-platform/TASKS.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/engine-prep/plan.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/evals/plan.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/ingestion-hooks/ing5-doc-audit.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/ingestion-hooks/ing8-breaking-changes.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/ingestion-hooks/plan.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/ingestion-hooks/rulewright-migration-0.2.0.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/public-surface/rulewright-arcadedb-separation.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/public-surface/rulewright-migration-0.3.0.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/public-surface/rulewright-migration-0.4.0.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/public-surface/rulewright-migration-0.5.0.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/public-surface/rulewright-migration-0.6.0.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/public-surface/rulewright-migration-0.7.0.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/public-surface/rulewright-migration-0.8.0.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/public-surface/rulewright-migration-0.9.0.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/specs/public-surface/rulewright-reply-2026-10-10-laya-and-sklearn.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/templates/product-starter/dependabot.yml +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/upstream/laya-temperature-range-mismatch.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/vendor/arcadedb/arcadedb-buckets-schema.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/vendor/arcadedb/arcadedb-docs-extraction.json +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/vendor/arcadedb/arcadedb-vector-embeddings.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/vendor/arcadedb/arcadedb-vector-search-tutorial.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/docs/workspaces.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/acord.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/acord_retrieval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/boundary_residue_gold.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/build_golden.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/compliance_demo/policy/community_conduct_policy.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/compliance_demo/subjects/post_borderline.txt +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/compliance_demo/subjects/post_compliant.txt +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/compliance_demo/subjects/post_violation.txt +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/condensed_pipeline.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/contract_parity_live.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/contractnli_judge.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/cuad_highlight.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/embedded_eval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/full_pipeline_rerank.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/function_ceiling.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/function_property_rerank.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/function_rerank.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/gate1_chunker_ab.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/gate2_hybrid_rerank.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/golden/relational/set.json +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/golden.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/ground_discriminator_rerank.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/harness.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/ingestion_live_smoke.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/kg_primary.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/kg_property_rerank.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/listwise_rerank.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/multihop.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/nl_to_type.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/relational_eval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/residual_decision_gold.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/segmenter_eval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/semantic_judge_gold.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/test_acord.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/test_acord_retrieval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/test_harness.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/test_multihop_set.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/eval/unit_grouper_eval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/examples/model_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/examples/quickstart.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/plan.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/release-please-config.json +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ab_model_overlap.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/acord_unify.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/acquire_acord.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/acquire_cuad.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/acquire_ecfr.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/acquire_edgar.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/acquire_ftc_255.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/acquire_prod1_corpus.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/audit_reclass_flips.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/author_leg_a_silver_key.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/backfill_affiliations.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/backfill_clause_span_id.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/backfill_edge_source_doc_id.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/backup_kg_to_gcs.sh +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/bootstrap_template_capture.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/bootstrap_typed_edges.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/build_api_docs.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/build_api_docs.sh +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/build_cuad_clause_cache.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/build_function_routing_map.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_assemble_v2.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_assemble_v3.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_generate_hard_negatives.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_generate_hard_positives.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_generate_training.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_hybrid.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_hybrid2.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_jev_actor.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_jev_claimtypes.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_jev_operative.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_label_spans.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_laya_prep.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_laya_train.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_prep_operative.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_relabel_rubric.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_relabel_rubric2.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/cic1_train_operative.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/compare_extraction_models.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/compliance_actor_gate_smoke.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/compliance_engine_smoke.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/compliance_policy_demo.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/curate_taxonomy_gaps.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/dg_model_ab.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/diagnose_acord_knn_expansion.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/diagnose_acord_knn_rerank.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/diagnose_acord_leg_pool.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/diagnose_acord_legs.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/diagnose_acord_pool.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/diagnose_acord_relstructure.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/diagnose_acord_retrieval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/distill/eval_all.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/distill/eval_ce.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/distill/eval_listwise_b.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/distill/export_ce_dataset.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/distill/extract_features.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/distill/listwise_variants.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/distill/relational_features.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/distill/train_ce.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/distill/train_modal.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/enrich_edgar_candidates.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/eval_chunking_ab.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/eval_classifier_guided_vs_tagparse.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/eval_compliance_gold.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/extract_arcadedb_docs.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/fetch_reference_models.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/generate_contract_python.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/git_post_commit_graphify.sh +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/granite_chunker_assess.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/graph_status.sh +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ingest_acord.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ingest_compliance_async_prod2.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ingest_compliance_document_prod2.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ingest_compliance_prod2.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ingest_cuad.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ingest_cuad_full.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ingest_ftc_compliance.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ingest_prod1.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ingest_prod1_async.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ingest_smoke.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/install_git_hooks.sh +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/label_new_functions.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/legb_function_gate_recall.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/make_compliance_fixtures.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/make_compliance_gold.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/mcp_compliance_agent_demo.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/mcp_intra_document_qa_smoke.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/mcp_query_legs_agent_demo.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/measure_generation_robustness.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/measure_harness_genericity.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/measure_silver.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/merge_docs_into_framework.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/migrate_entity_cik_to_canonical_id.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/migrate_silver_evidence_autotag.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/migrate_silver_evidence_remove_autotag.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/migrate_span_fields.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/mine_scarce_functions.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_arcadedb.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_backfill.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_exception_linking.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_gemma4_vllm.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_gemma4_vllm_snapshot.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_granite_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_granite_throughput.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_granite_vllm_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_query_app.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_qwen3_27b_bench.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_qwen3_27b_snapshot.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_qwen3_vllm_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/modal_stack_a100.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ocr_benchmark.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ocr_preprocess.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/ontology_dimension_check.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/phase_a_leg_validate.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/populate_clause_kg.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/populate_entity_graph.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/populate_entity_graph_extracted.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/populate_property_store.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/prep_relational_verification.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/publish_manifests.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/reclassify_kg.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/refresh_framework_graph.sh +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/revert_reclass_flips.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/run_acord_retrieval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/run_clause_exception_linking.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/semantic_judge_live_validate.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/semantic_judge_probe.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/snapshot_leg_a_eval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/stack_correctness_validate.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/table_retrieval_smoke.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/train_function_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/train_legalbert_function.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/train_legalbert_modal.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/typed_rerank_validate.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/verify_wheel_install.sh +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/vllm_extraction_ab.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/vllm_kg_query_validate.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/scripts/vllm_raw_diagnostic.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/.agents/skills/building-an-agent-harness/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/.agents/skills/classifier-opportunity-analysis/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/.agents/skills/laya/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/rw_gate.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/.agents/skills/setfit/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/agents.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/answers.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/config.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/discover.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/documents.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/ids.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/invoke.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/kg.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/mcp.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/tracing.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/usage.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/api/workspace.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/answer_generator.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/ard.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/chunk_read.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/chunk_write.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/disambiguation.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/document_parse.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/document_scope.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/embedding.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/embedding_profiles.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/entity_resolution.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/fusion.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/graph_query.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/graph_storage.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/hybrid_search.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/invoke.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/jev_decision.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/manifests.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/parsing.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/registry.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/remote_encoders.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/reranking.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/retrieval_core.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/rlm_chunking.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/rlm_synthesis.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/scan_quality.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/sheet_tables.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/span_relevance_judgment.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/vision_to_text.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/capabilities/vlm_ocr.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/contracts/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/contracts/chunk.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/contracts/evals.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/contracts/extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/contracts/graph.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/contracts/identifiers.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/contracts/ingestion.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/contracts/provenance.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/contracts/span.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/corpus/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/corpus/canonicalize.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/corpus/document_parser.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/corpus/embedded.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/corpus/http.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/evals/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/evals/gold.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/evals/langfuse_backend.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/evals/runner.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/evals/scorers.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/accounting.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/agent.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/batch.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/clarify.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/confirm.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/decisions.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/definition.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/dispatch.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/errors.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/events.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/filesystem.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/grading.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/interpreter.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/memory.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/models.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/rules.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/runs.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/scope.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/seen.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/skills.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/thinking.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/tiers.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/tracing.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/withhold.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/harness/workers.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/ingestion/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/ingestion/builder.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/ingestion/evaluate.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/ingestion/group.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/ingestion/layout.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/ingestion/segment.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/ingestion/tables.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/models/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/models/model_servers.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/models/profiles.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/models/seam.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/models/tag_structured.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/models/tracing.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/models/usage.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/models/weights.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/ontology/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/ontology/pack_schema.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/ontology/registry.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/pack_sdk/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/capabilities/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/capabilities/assertion_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/capabilities/claim_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/capabilities/compliance_judgment.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/capabilities/compliance_store.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/capabilities/requirement_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/invokers.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/mcp/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/mcp/compliance_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/ontology/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/ontology/compliance_bridge.ttl +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/ontology/loader.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/ontology/packs/ftc_16cfr255.ttl +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/pack.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/schemas/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/schemas/compliance.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/skills/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/skills/claim_extraction/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/skills/claim_extraction/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/skills/claim_extraction/template.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/skills/compliance_judgment/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/skills/generic_compliance_judgment/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/template.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/subgraphs/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/subgraphs/compliance_check.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/subgraphs/compliance_ingestion.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/compliance/subgraphs/requirement_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/capabilities/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/capabilities/clause_exception_linking.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_serve.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_store.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/capabilities/dg_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/capabilities/graph_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/capabilities/highlight_serve.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/capabilities/property_boosted_retrieval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/capabilities/query_function_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/capabilities/query_understanding.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/corpus/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/corpus/cuad.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/corpus/cuad_ingestion.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/corpus/edgar.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/corpus/gcs_ingestion.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/corpus/selection.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/mcp/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/mcp/intra_document_qa_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/mcp/relational_qa_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/mcp/session_store.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/mcp/typed_property_retrieval_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/ontology/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/ontology/_generated_template_meta.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/ontology/_generated_vocab.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/ontology/clause_template.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/ontology/codegen.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/ontology/contract_bridge.ttl +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/ontology/contract_taxonomy.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/ontology/derive.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/ontology/loader.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/ontology/template_introspect.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/options.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/pack.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/schemas/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/schemas/contract_meta.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/schemas/function.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/schemas/function_routing.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/schemas/highlight.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/schemas/jurisdiction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/schemas/ontology.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/schemas/property.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/schemas/query_intent.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/schemas/value_match.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/skills/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/skills/corpus_ingest/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/skills/guidance/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/skills/guidance/chunking.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/skills/guidance/generation.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/skills/guidance/relevance.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/boundary.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/clause_function_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/clause_kg_extractor.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/cuad_labels.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/dim_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/dim_fleet.json +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/function_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/function_families.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/hybrid_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/legalbert_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/model_capabilities.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/new_function_labels.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/property_extractor.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/property_grounding.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/reclassify.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/residual_candidates.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/scarce_function_labels.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/segment.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/semantic_judge.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/symbolic_validation.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/spans/tag_clause_extractor.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/subgraphs/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/subgraphs/async_ingestion.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/subgraphs/contract_ingestion_pipeline.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/subgraphs/intra_document_qa.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/subgraphs/query_constraint_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/subgraphs/relational_qa.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/subgraphs/typed_clause_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/contracts/subgraphs/typed_property_retrieval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/packs/reference_seam.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/py.typed +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/skills/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/skills/generation/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/skills/generation/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/skills/rlm/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/skills/rlm/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/skills/rlm/agent.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/skills/span_relevance_judgment/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/skills/vision_to_text/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/skills/vision_to_text/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/spans/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/spans/page_map.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/store/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/store/arcadedb.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/store/chunk_text.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/store/seam.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/subgraphs/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/subgraphs/graph_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/subgraphs/observability.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/subgraphs/scaffold.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/subgraphs/semantic_chunking.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/util/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/util/concurrent.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/util/pdfium.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/src/rag_wright/util/spacy_model.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_agent_chat_model.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_agent_chat_model_live.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_answers_exports.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_api_embedder_ps39.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_bytes_ingest.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_capability_reexports.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_decision_swap_doc_example.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_discover.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_documents.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_drop_workspace.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_drop_workspace_live.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_e2e.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_invoke.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_kg.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_mcp.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_metering_tracing_exports.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_model_role_export.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_open_workspace_reconfig.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_options.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_pack_sdk.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_pack_store.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_pdf_page_count.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_public_gaps_ps38.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_tracing_helpers_ps32.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_usage.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_workspace.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/api/test_workspace_models.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/arch/domain_vocabulary_baseline.json +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/arch/test_api_docs_current.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/arch/test_doc_references.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/arch/test_engine_domain_vocabulary.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/arch/test_import_contracts.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/arch/test_lock_version.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/arch/test_packs_use_store_primitives.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/arch/test_pdfium_door.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/async_helpers.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/_fixtures/rlm_probe_skill/SKILL.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_answer_generator.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_answer_generator_async.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_assertion_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_authoring_contract.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_chunk_read.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_chunk_write.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_chunking_prompts_neutral.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_claim_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_clause_exception_linking.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_compliance_judgment.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_compliance_store.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_contract_kg_serve.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_contract_kg_store.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_contract_kg_store_reads.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_contract_taxonomy_and_spans.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_dg_adapter.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_dg_async.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_dg_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_dg_model_seam.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_dg_private.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_disambiguation.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_document_scope.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_embedding.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_embedding_profiles.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_entity_resolution.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_entity_rules_plumbing.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_fusion.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_graph_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_graph_query.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_graph_storage.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_highlight_serve.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_hybrid_search.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_jev_decision.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_manifest_validation.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_manifests.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_parsing.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_parties_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_property_boosted_retrieval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_query_function_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_query_understanding.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_registry.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_remote_encoders.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_repair_partition.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_requirement_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_reranking.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_retrieval_core.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_rlm_chunking.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_rlm_chunking_async.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_rlm_method.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_rlm_synthesis.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_runtime_registry.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_scan_quality.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_span_relevance_judgment.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_structural_boundary_discoverer.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_structural_model_fallback.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_tag_boundary_discoverer.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_tiered_ocr.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/capabilities/test_vlm_ocr.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/compliance_fakes.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/conftest.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_canonical_source_doc_id.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_chunk_record.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_compliance.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_cuad_highlight_contracts.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_function.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_function_routing.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_identifiers.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_ingestion_hooks.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_jurisdiction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_ontology.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_property.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_provenance.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/contracts/test_value_match.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/corpus/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/corpus/_ooxml_fixtures.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/corpus/test_canonicalize.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/corpus/test_cuad.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/corpus/test_cuad_ingestion.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/corpus/test_document_parser.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/corpus/test_edgar.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/corpus/test_embedded.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/corpus/test_gcs_ingestion.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/corpus/test_http.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/corpus/test_parse_wire2.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/corpus/test_selection.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/eval/test_contractnli_judge.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/eval/test_cuad_highlight_metrics.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/eval/test_kg_property_rerank.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/eval/test_nl_to_type_metrics.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/eval/test_relational_eval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/evals/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/evals/test_gold_contracts.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/evals/test_gold_import.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/evals/test_langfuse_backend.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/evals/test_runner.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/evals/test_scorer_parity.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/evals/test_scorers_a.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/evals/test_scorers_b.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/evals/test_scorers_c.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/evals/test_scorers_d.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/fixtures/ingestion/segmenter_gold.json +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/fixtures/ingestion/textile_spec_sheet.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/fixtures/ingestion/textile_test_report.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/fixtures/leg_a_silver/README.md +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/fixtures/leg_a_silver/evidence_snapshot.json +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/fixtures/table-bearing-contract.pdf +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/foundation/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/foundation/test_arcadedb_hybrid.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/foundation/test_model_seam_structured.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/harness/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/harness/test_greenfield_conformance.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/harness/test_harness_accounting.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/harness/test_harness_engine_wiring.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/harness/test_harness_genericity.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/harness/test_harness_live.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/harness/test_harness_recorder.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/harness/test_harness_thinking.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_aevaluate.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_builder.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_chunk_discoverer_hook.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_concurrency_ceiling.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_document_metadata.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_evaluate.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_evaluate_labels.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_layout_segmenter.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_sheet_continuations.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_spreadsheet_content.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_table_rows.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_tuning.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_unit_grouper.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ingestion/test_unit_representative.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/journey/incidents_domain.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/journey/incidents_pack.ttl +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/journey/test_incidents_journey.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/journey/test_pack_schema.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/mcp/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/mcp/test_compliance_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/mcp/test_intra_document_qa_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/mcp/test_no_model_supplied_tenant.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/mcp/test_relational_qa_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/mcp/test_typed_property_retrieval_server.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_async_infra.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_classifier_heads_load_clean.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_model_servers.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_models_dir.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_no_gemma_default.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_profile_routing.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_profile_seam.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_seam_async.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_seam_deadline_and_cap.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_seam_event_loops.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_seam_retry.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_seam_stream.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_serving_seam.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_serving_wiring.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_tag_structured.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_tag_structured_async.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_tracing.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/models/test_usage.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ontology/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ontology/test_clause_template.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ontology/test_compliance_ontology_authoritative.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ontology/test_derivation.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ontology/test_entity_taxonomy.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ontology/test_generated_template_meta_in_sync.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ontology/test_generated_vocab_in_sync.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ontology/test_template_captured_in_ttl.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/ontology/test_ttl_is_source_of_truth.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/reference/test_compliance_reference.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/reference/test_contract_seam.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/scripts/test_eval_chunking_ab.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/scripts/test_eval_classifier_ab.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/scripts/test_fetch_reference_models.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/scripts/test_generation_robustness_errors.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/skills/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/skills/test_creating_evals_skill_example.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/skills/test_ingestion_skill_example.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_boundary.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_classifier_property_extractor.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_clause_classifier_tags_0005.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_clause_function_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_clause_function_classifier_async.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_clause_kg_extractor.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_clause_kg_extractor_async.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_dim_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_dim_fleet_live.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_function_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_hybrid_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_hybrid_property_extractor.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_legalbert_classifier.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_model_capabilities.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_new_function_labels.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_page_map.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_property_extractor.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_property_grounding.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_reclassify.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_residual_decision.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_scarce_function_labels.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_segment.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_segmentation_vocab.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_semantic_judge.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_setfit_clause_adapter.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_setfit_probabilities.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_span_offsets.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_stage_labels_0005.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_symbolic_validation.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/spans/test_tag_clause_extractor.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_affiliation_backfill.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_arcadedb_clause_kg.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_arcadedb_contract.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_arcadedb_property.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_arcadedb_requirement_sources.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_arcadedb_schema.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_arcadedb_span.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_chunk_text.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_concurrent_writes.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_contract_kg_store_live.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_document_metadata_live.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_document_scope.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_engine_domain_neutral.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_entities_by_name.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_kg_edges.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_kg_mutations.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_kg_read.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_kg_write.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_neutral_schema.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_store_create_flag.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/store/test_write_graph_idempotent.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_async_ingestion.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_chunk7_structure_carry.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_clause_results.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_compliance_check.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_compliance_ingestion.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_contract_ingestion_pipeline.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_contract_ingestion_pipeline_async.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_contract_ingestion_pipeline_graph_async.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_graph_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_ingest_knobs.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_ingest_segment_classify.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_intra_document_qa.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_observability.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_partial_entry_contract.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_query_constraint_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_relational_qa.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_requirement_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_scaffold.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_semantic_chunking.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_typed_clause_extraction.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/subgraphs/test_typed_property_retrieval.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/test_backfill_clause_span_id.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/test_dg_model_ab.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/test_populate_clause_kg.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/test_populate_entity_graph.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/util/__init__.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/util/test_concurrent.py +0 -0
- {rag_wright-0.10.0 → rag_wright-0.11.0}/tests/util/test_spacy_model.py +0 -0
|
@@ -28,6 +28,13 @@ authoring surface from `rag_wright.api`: `CapabilityManifest`, `register_capabil
|
|
|
28
28
|
`engine_capabilities`, `register_canonical_slugs`, `canonical_capability_slugs`, `load_reference_pack`,
|
|
29
29
|
`reference_pack` (the same objects as in `capabilities/manifests.py` and `capabilities/registry.py`).
|
|
30
30
|
|
|
31
|
+
**In a product** (the usual case for a new domain): your capabilities live in your own pack package, for example
|
|
32
|
+
`src/<product>/pack/subgraphs/<slug>.py` and `src/<product>/pack/capabilities/<slug>.py`, with a
|
|
33
|
+
`src/<product>/pack/__init__.py` exposing `register()`; everything below applies unchanged, with your pack module in
|
|
34
|
+
place of the engine's `packs/...` paths. Name your slugs with your product's prefix (`<product>_<capability>`), so they
|
|
35
|
+
can never collide with the engine's or the reference pack's. If your subgraph imports `langgraph` directly, declare it
|
|
36
|
+
in your own dependencies (`uv add langgraph`): a transitive dependency of the engine is not yours to rely on.
|
|
37
|
+
|
|
31
38
|
## The four surfaces (the definition of done)
|
|
32
39
|
|
|
33
40
|
A finished capability touches these: 1 (implementation) is for EVERY kind; 2 (the invoke factory + `impl_ref`) is
|
|
@@ -71,6 +78,10 @@ MCP) follows automatically for invokable kinds; 4b (a bespoke MCP server) is opt
|
|
|
71
78
|
kind that invoker serves (`KeyError` / `ValueError` otherwise), then imports the `impl_ref` via
|
|
72
79
|
`capabilities.invoke.capability_impl` — AND exposable over MCP (surface 4b), with **zero engine edits**.
|
|
73
80
|
|
|
81
|
+
5. **The eval, written first** (`creating-evals`): the capability's executable acceptance, run through the
|
|
82
|
+
capability layer (`ainvoke_subgraph` / `ainvoke_model`), so it measures what production runs. A capability without
|
|
83
|
+
one is not done.
|
|
84
|
+
|
|
74
85
|
4b. **MCP exposure** (optional) — any invokable capability is already an MCP tool with zero extra code via
|
|
75
86
|
`api/mcp.py::build_capability_mcp(slug, resources=ws)` (EP-RT-2). Write a bespoke FastMCP server only
|
|
76
87
|
when you want a CURATED, typed tool signature instead of the generic opaque-`inputs` surface.
|
|
@@ -109,8 +120,9 @@ MCP) follows automatically for invokable kinds; 4b (a bespoke MCP server) is opt
|
|
|
109
120
|
`packs/compliance/skills/compliance_judgment/SKILL.md`) + the agent runtime (e.g. `skills/rlm/`). It is LOADED (progressive
|
|
110
121
|
disclosure), not called: no `ResponseBounds`. Declare `requires=(...)` for a closure over other skills and
|
|
111
122
|
`skill_runtime` (`SkillRuntime`, from `rag_wright.pack_sdk`) for its intrinsic runtime.
|
|
112
|
-
- A product's agent
|
|
113
|
-
|
|
123
|
+
- A product's agent is not a capability kind yet (an `agent` kind is a later engine workstream, PS-33). Build it on the
|
|
124
|
+
engine's harness tier, `rag_wright.harness` (an `AgentDefinition` run with `start_run` / `resume_run`; the
|
|
125
|
+
`building-an-agent-harness` skill); its tools call your capabilities by name, through your operations.
|
|
114
126
|
|
|
115
127
|
### mcp_tool — a capability exposed over MCP
|
|
116
128
|
- A distinct ARD identity (`<slug>_mcp`) for the same underlying capability exposed as a cross-agent MCP tool.
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: building-a-product-backend
|
|
3
|
+
description: The architecture of a product backend over a retrieval engine - the four units and the one dependency law, the placement test for every new operation, the operation layer that gives a route and an agent one implementation, tenancy that cannot be forgotten, jobs as a queue of items, and the guards that make each of these fail loudly instead of drifting. Load at the START of a new product's backend and before adding any route, operation, table or engine call. Pairs with building-a-product-frontend and building-an-agent-harness.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Building a product backend over an engine
|
|
7
|
+
|
|
8
|
+
Repository paths in this skill (`docs/`, `src/`) are in the engine repository: read them there or on GitHub, at the tag matching your installed engine.
|
|
9
|
+
|
|
10
|
+
> **This skill was distilled from a shipped backend and is written for a DIFFERENT product.** It ships in the
|
|
11
|
+
> engine wheel; link it into your repo's `.claude/skills/` (`docs/installation.md`).
|
|
12
|
+
>
|
|
13
|
+
> **Every rule below was paid for**, and the measurements are kept because they are why anybody follows the
|
|
14
|
+
> rule. Its two companions cover the other surfaces: `building-a-product-frontend` and
|
|
15
|
+
> `building-an-agent-harness`.
|
|
16
|
+
>
|
|
17
|
+
> **The one sentence.** Your backend is not thin HTTP over engine calls. It is where **product policy**
|
|
18
|
+
> lives, and almost every decision below is about making sure that policy has exactly one home and cannot
|
|
19
|
+
> be re-derived, forgotten or bypassed.
|
|
20
|
+
|
|
21
|
+
## Four units, one dependency law
|
|
22
|
+
|
|
23
|
+
| unit | owns |
|
|
24
|
+
|---|---|
|
|
25
|
+
| **engine** | capabilities, the ontology machinery, the generic ingestion and query primitives, the capability registry |
|
|
26
|
+
| **agent harness** | the loop, memory, delegation, interrupts, deadlines, run grading: the engine's `rag_wright.harness` tier |
|
|
27
|
+
| **UI core** | shell, workspaces, users, roles, the chat surface, the table and state primitives |
|
|
28
|
+
| **product** | your domain pack (`.ttl` + capabilities), the routes for your deterministic use cases, the operations behind them, the agent's definition (tools, workers, prompts, rules) |
|
|
29
|
+
|
|
30
|
+
**Product -> Harness -> Engine, and Product -> Engine. Never upward.** The engine and its harness tier enforce
|
|
31
|
+
their half with import contracts; your half is a boundary test in your repo: product code imports only
|
|
32
|
+
`rag_wright.api`, `rag_wright.pack_sdk` (pack code) and `rag_wright.harness` (agent code).
|
|
33
|
+
|
|
34
|
+
**Fix the UI core / product boundary inside your repo on day one**, so a later split is a move rather than an
|
|
35
|
+
untangling. The failure mode is "keep it in mind as a requirement": in the product this comes from, zero of
|
|
36
|
+
seventeen architecture decisions governed the front end, its conventions lived in recall, and it drifted. **A
|
|
37
|
+
convention is only enforced when violating it fails loudly.**
|
|
38
|
+
|
|
39
|
+
## Where your domain's pipelines live: your pack, on the engine's primitives
|
|
40
|
+
|
|
41
|
+
The engine is domain-neutral. It ships three kinds of thing, and a new domain uses each differently:
|
|
42
|
+
|
|
43
|
+
| kind | examples | what you do |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| **mechanism** | the store, model profiles, tracing, encoders, the registry, document parsing | use it as is |
|
|
46
|
+
| **generic primitives** | `build_ingestion` and its hooks, hybrid search, graph query, answer generation, span judging, the decision model | compose them |
|
|
47
|
+
| **the reference pack** | a contract-ingestion pipeline, a compliance check | read it as a worked example; never your domain |
|
|
48
|
+
|
|
49
|
+
**Your domain's composites are your pack's capabilities.** An ingestion pipeline for your documents is
|
|
50
|
+
`build_ingestion` plus your extractor and hooks; a query workflow is your capability composing the engine's
|
|
51
|
+
primitives; both are registered with the engine (`register_capability`, `load_pack`) so a route, an agent and
|
|
52
|
+
an eval all invoke them by name. The `authoring-a-capability` and `building-an-ingestion-capability` skills
|
|
53
|
+
carry the how.
|
|
54
|
+
|
|
55
|
+
**Do not re-implement a primitive, and do not reach past the public tiers for one.** The measured reason: a
|
|
56
|
+
domain pipeline that imported 21 engine internals broke at runtime, on a customer's corpus, when the engine
|
|
57
|
+
removed ONE of them, while the product's suite reported 644 passed, 1 failed (a monkeypatch test). Through the
|
|
58
|
+
public tiers that change is a named diff in your surface snapshot instead.
|
|
59
|
+
|
|
60
|
+
**When a primitive does not fit, that is an engine request, not a fork.** Write it in your
|
|
61
|
+
`docs/engine-requests/` with the evidence, and meanwhile drop to the next primitive down in your own
|
|
62
|
+
capability; never copy engine code into the product.
|
|
63
|
+
|
|
64
|
+
**IP exposure is a packaging question, not a placement one.** A domain workflow that must stay proprietary is
|
|
65
|
+
your closed pack, depending on the open engine; it never needs the engine to know about it.
|
|
66
|
+
|
|
67
|
+
## The placement test, for every new user operation
|
|
68
|
+
|
|
69
|
+
> **Product policy -> product. Use-case shape -> engine.**
|
|
70
|
+
>
|
|
71
|
+
> - Does it depend on **tenancy, roles, workspace selection, billing, or a UI or agent affordance**?
|
|
72
|
+
> **Product.**
|
|
73
|
+
> - Is it domain knowledge or a domain pipeline (vocabulary, schema, extraction, a typed query)? **Your
|
|
74
|
+
> pack**: the `.ttl` plus capabilities registered with the engine, invoked by name.
|
|
75
|
+
> - Would any product of any domain reuse it unchanged, and does no public primitive cover it? **An engine
|
|
76
|
+
> request.**
|
|
77
|
+
|
|
78
|
+
**Tenancy is the sharpest discriminator.** The engine owns the mechanism (a store, a document filter); the
|
|
79
|
+
product supplies the values (which store, and which documents this workspace selected).
|
|
80
|
+
|
|
81
|
+
Apply it in both directions and trust the answer. Grading, coverage, corpus-wide sweeps, export and named
|
|
82
|
+
conditions all stayed in the product here, because **what counts as a match is a product judgement** and
|
|
83
|
+
burying it in the seam would have made it unreviewable. Same test, opposite answer, and it was right.
|
|
84
|
+
|
|
85
|
+
## The operation layer: one implementation, two callers
|
|
86
|
+
|
|
87
|
+
**This is the most important decision in this skill.** You have two drivers - a click and an agent turn -
|
|
88
|
+
and they must be the same code.
|
|
89
|
+
|
|
90
|
+
| layer | holds |
|
|
91
|
+
|---|---|
|
|
92
|
+
| `workflows/` (primitives) | `grade`, `coverage`, `search`, `correct`, `export_*`. **Pure, tenancy-free, unit-testable.** |
|
|
93
|
+
| **`operations/`** | **composition and policy.** One function per user operation, taking a tenant and scope context, returning a typed result. |
|
|
94
|
+
| `api/routes/` | **HTTP only.** Parse, call the operation, serialize, status codes. |
|
|
95
|
+
|
|
96
|
+
**The route calls the operation. The agent's tool IS the same operation.** Identical output by construction
|
|
97
|
+
rather than by discipline.
|
|
98
|
+
|
|
99
|
+
**The measurement that forces it.** One route here was 76 lines composing SIX steps: canonicalise the inputs,
|
|
100
|
+
run the search against the tenant's graph, **grade** the results against product policy, resolve display
|
|
101
|
+
names scoped to the customer, compute **coverage over what was SUBMITTED rather than what retrieval
|
|
102
|
+
returned**, and assemble. An agent calling the underlying primitive would get raw results and have to
|
|
103
|
+
re-derive four of those - so **the same question would return a different answer depending on whether the
|
|
104
|
+
user clicked or typed, and the chat answer would be the one with no grading policy behind it.**
|
|
105
|
+
|
|
106
|
+
**Enforce it:** a route module may not import the primitives. It reaches them only through an operation.
|
|
107
|
+
That one import rule is what makes the layer real.
|
|
108
|
+
|
|
109
|
+
**Make the operations a registry, and prove the two callers agree.** Give each operation an id, a version, typed
|
|
110
|
+
parameters (with the sources of their dropdown values), a result shape and whether it writes; the UI's menu and the
|
|
111
|
+
agent's tool surface are both built from it. Then a **parity test** invokes each read-only operation both ways (the
|
|
112
|
+
route, the agent's tool) on fixed data and asserts identical results, and a second test asserts no operation that
|
|
113
|
+
writes is on the agent's tool surface unless the spec says so: a store write reached from chat is a write no person
|
|
114
|
+
confirmed.
|
|
115
|
+
|
|
116
|
+
## The API is the product, so make the claim CHECKABLE
|
|
117
|
+
|
|
118
|
+
Saying "the API is the product" changes nothing. Two ratchets do:
|
|
119
|
+
|
|
120
|
+
1. **Every table has a route.** A data model with no way to reach it is a feature that does not exist.
|
|
121
|
+
2. **Every route in the published schema is named by at least one test**, with an **empty** exemption map and
|
|
122
|
+
exact equality.
|
|
123
|
+
|
|
124
|
+
**Write the second one carefully, because the first draft of ours was vacuous.** It scanned every test file
|
|
125
|
+
including itself, and its own docstring named the one untested route - so it passed on exactly the broken
|
|
126
|
+
surface it was built to catch. **A guard satisfiable by its own prose proves nothing.** Exclude the guard's
|
|
127
|
+
own file, and prove it with an **assembled** sentinel path so the file's text cannot satisfy its own scan.
|
|
128
|
+
|
|
129
|
+
Fixed, it immediately found a second untested route. And the untested route it was written for had been
|
|
130
|
+
returning **500 on every real request for five tasks of green suites**: the pieces either side had fifteen
|
|
131
|
+
tests and three tests respectively. **What nobody tested was the wiring between them**, which is all a
|
|
132
|
+
handler is.
|
|
133
|
+
|
|
134
|
+
## Tenancy you cannot forget
|
|
135
|
+
|
|
136
|
+
**Derive the per-customer store name; never store one.** A pure function of the tenancy key. Ids are unique,
|
|
137
|
+
so two customers cannot produce one name, and there is **no stored value to go stale, be copied between
|
|
138
|
+
environments, or be left empty**. Route every resolution through **one choke point**.
|
|
139
|
+
|
|
140
|
+
**If you support a per-customer override, make the column UNIQUE.** Then two customers pointing at one store
|
|
141
|
+
is impossible rather than unlikely. (And any test that sets such an override must release it on teardown, or
|
|
142
|
+
the next run fails on the constraint rather than on anything it was testing.)
|
|
143
|
+
|
|
144
|
+
**Deny by default, as a database fact.** Membership is a row in a link table and its absence is a refusal.
|
|
145
|
+
Give it a **composite primary key** so "one membership per user per workspace" is enforced by the database
|
|
146
|
+
rather than by an `if not already_a_member` somebody has to remember.
|
|
147
|
+
|
|
148
|
+
### The corpus belongs to the CUSTOMER; a workspace is a SELECTION over it
|
|
149
|
+
|
|
150
|
+
Ingestion puts an item in the customer's corpus **once**. Membership in a workspace is a separate
|
|
151
|
+
many-to-many fact: one item may be selected into several workspaces.
|
|
152
|
+
|
|
153
|
+
(A single-tenant product with one shared corpus still benefits from the selection model the day a second
|
|
154
|
+
team or project arrives; if you defer it, record the decision.)
|
|
155
|
+
|
|
156
|
+
**This is the decision a new product most often gets wrong**, by attaching documents to a workspace directly.
|
|
157
|
+
Get it right and re-use costs nothing, scoping is one join, and "the same document in two workspaces" is not a
|
|
158
|
+
duplicate ingest.
|
|
159
|
+
|
|
160
|
+
### Resolve the scope INSIDE the operation, never take it as an argument
|
|
161
|
+
|
|
162
|
+
The operation asks the store which items this workspace may search and passes that list into every query. A
|
|
163
|
+
caller that forgot would query the whole customer's corpus **with nothing on screen to say so**.
|
|
164
|
+
|
|
165
|
+
**And short-circuit an empty selection before touching the engine.** This is a correctness fix, not an
|
|
166
|
+
optimisation: found by opening the page in a browser, a workspace with nothing ingested returned **HTTP
|
|
167
|
+
500**, because the first thing a graph traversal touches is a type that a database nobody has ingested into
|
|
168
|
+
does not have. So the **first thing a new customer sees** failed with "Internal Server Error". Short-circuit
|
|
169
|
+
in the product rather than catching the engine's error: an empty selection is a legitimate state you already
|
|
170
|
+
know about, and swallowing a store exception would also hide a genuinely broken store.
|
|
171
|
+
|
|
172
|
+
**No route may take a client-supplied handle without scoping it**, and the durable half is a guard that
|
|
173
|
+
proves the *next* route will too. A test that two routes call the check is worth much less than a test that
|
|
174
|
+
every route must.
|
|
175
|
+
|
|
176
|
+
## Jobs: product-owned, and the unit of queuing is ONE ITEM
|
|
177
|
+
|
|
178
|
+
The product owns the job lifecycle end to end: the record, its status, stage, counts and tenancy.
|
|
179
|
+
|
|
180
|
+
**A bulk operation is not one row.** Make it a **parent** coordinator row that processes nothing and holds
|
|
181
|
+
the batch outcome, plus **N child** rows, each carrying one item's storage key and a foreign key back to the
|
|
182
|
+
parent. One row per batch cannot be resumed, cannot report per-item progress, and cannot be retried
|
|
183
|
+
selectively.
|
|
184
|
+
|
|
185
|
+
**A lost item is its VERDICT, not its job status.** Define one predicate - with a SQL twin so the API and the
|
|
186
|
+
database agree - for "this item was lost": the job failed, **or** the work's own verdict says it failed.
|
|
187
|
+
**A partial result is not a loss**, and that boundary belongs to the engine's own outcome type: a partially
|
|
188
|
+
ingested item is written and can be queried, it simply lost some extractions, and calling it a failure offers
|
|
189
|
+
a retry that re-ingests something already in the graph.
|
|
190
|
+
|
|
191
|
+
**Lease fields go in typed columns**, because the queue filters and orders on them.
|
|
192
|
+
|
|
193
|
+
## The data model: typed columns for the spine, JSONB for the volatile
|
|
194
|
+
|
|
195
|
+
Decide per field with a stated test rather than by taste. **A typed column** if any of these holds: the store
|
|
196
|
+
**filters, orders, joins or aggregates** on it; it must be **constrained** (not-null, unique, a foreign key, a
|
|
197
|
+
bounded set). **JSONB** for the rest - payloads, reports, volatile nested shapes.
|
|
198
|
+
|
|
199
|
+
**Then walk the metadata in a test**, so the principle cannot be violated accidentally. A principle nobody
|
|
200
|
+
*can* break beats one everybody has to remember.
|
|
201
|
+
|
|
202
|
+
### Two schemas, one database, one owner each
|
|
203
|
+
|
|
204
|
+
If a framework creates its own tables (a checkpointer, a queue, a cache), **give it its own schema**.
|
|
205
|
+
|
|
206
|
+
The failure otherwise is severe and quiet: your migration autogenerator walks your models, finds tables in
|
|
207
|
+
its schema with no model behind them, and writes a `drop_table` for each. A routine migration then **deletes
|
|
208
|
+
every suspended run**. In a separate schema they are simply not reflected.
|
|
209
|
+
|
|
210
|
+
## Identity: two paths, one session
|
|
211
|
+
|
|
212
|
+
Federated sign-in and password sign-in converge on **one server-side, revocable session record**, with a
|
|
213
|
+
token in an HttpOnly cookie. Two paths, one session, one revocation story.
|
|
214
|
+
|
|
215
|
+
- **A signup records an ATTEMPT; confirming the emailed token is what provisions the account.** Hold the
|
|
216
|
+
pending signup with an already-hashed password and its own hashed, single-use, short-lived token.
|
|
217
|
+
- **Consume every single-use token atomically**: one `UPDATE ... WHERE used_at IS NULL RETURNING`. Not a read
|
|
218
|
+
then a write.
|
|
219
|
+
- **A federated callback that reads an email and issues a session IS an account-takeover primitive** unless
|
|
220
|
+
something asserts the person owns that address. The provider's verified-email claim is the only thing that
|
|
221
|
+
does. Gate linking on it.
|
|
222
|
+
|
|
223
|
+
**Uploads go client-to-storage through a signed URL.** The API issues the URL and handles control traffic
|
|
224
|
+
only; bytes never pass through your process. It removes a whole class of timeout, memory and size problems
|
|
225
|
+
before they exist.
|
|
226
|
+
|
|
227
|
+
## Policy stays in the product, even when the engine could hold it
|
|
228
|
+
|
|
229
|
+
The pattern to copy: **the engine reports the FACT, the product decides the GROUPING.** The engine judges
|
|
230
|
+
each result against a condition and returns a verdict with a rationale and a confidence; the product decides
|
|
231
|
+
which verdicts count as matched, possible or not-found, and what that means for the user.
|
|
232
|
+
|
|
233
|
+
Keep it in the product and it is reviewable, testable and changeable per product. Bury it in the seam and
|
|
234
|
+
nobody can see what the number meant.
|
|
235
|
+
|
|
236
|
+
**Related: do not cache what the layer below already caches correctly.** Read the engine's caching before
|
|
237
|
+
adding yours. A second cache is a second answer to one question, which is the failure the single-home rule
|
|
238
|
+
above exists to prevent.
|
|
239
|
+
|
|
240
|
+
## The seam, and reaching for an internal honestly
|
|
241
|
+
|
|
242
|
+
One module is the engine's door. Import the engine's **public API** and nothing deeper; assert it with a
|
|
243
|
+
boundary test.
|
|
244
|
+
|
|
245
|
+
When you genuinely need something the public tiers do not carry yet, **write the engine request** and keep
|
|
246
|
+
your interim on the public surface (a coarser primitive, a product-side composition), recorded with the
|
|
247
|
+
request it waits on, and a ratchet that **fails the moment the engine publishes it**. Then adoption is a
|
|
248
|
+
*deletion* - drop the fallback, drop the line - rather than something to remember. Never import an engine
|
|
249
|
+
internal to bridge the gap. Also snapshot the engine's public surface (`rag_wright.api.__all__`, and the
|
|
250
|
+
`pack_sdk` and `harness` tiers you use) so drift is a named diff rather than a mystery failure three layers
|
|
251
|
+
into a call site.
|
|
252
|
+
|
|
253
|
+
**And a moved engine is normal.** Guard the thing that can reach you - the published surface - not the
|
|
254
|
+
commit. A guard that fires on every unrelated release is a guard people learn to ignore.
|
|
255
|
+
|
|
256
|
+
## Testing a product over an engine
|
|
257
|
+
|
|
258
|
+
**Put a LIVE test on every engine seam.** Fakes prove your mapping; only a live run proves the integration.
|
|
259
|
+
The measurement: of four defects in one seam task, **three were invisible to unit tests**, and the worst - a
|
|
260
|
+
model of the wrong type passed where another was required - failed as an **opaque error inside the engine's
|
|
261
|
+
own guard**, so the fast suite stayed green while the integration was broken.
|
|
262
|
+
|
|
263
|
+
**Keep the expensive markers out of the default run, and then actually run them.** Three tests here sat
|
|
264
|
+
broken across three tasks because a retrieval signature changed while the default suite - which deselects
|
|
265
|
+
the database-marked tests - kept reporting green. **Run the database-marked suite before committing anything
|
|
266
|
+
that touches a route, a shared fixture or the seam.**
|
|
267
|
+
|
|
268
|
+
**Separate "needs a database" from "spends money".** Tests carrying both markers perform real ingests and
|
|
269
|
+
spend real credits on every run. Exclude the paying ones by default and run them deliberately.
|
|
270
|
+
|
|
271
|
+
**Salt a live ingest fixture.** Fixed bytes pin a live test to a stale artefact from a previous engine
|
|
272
|
+
version, which here cost three wrong conclusions in one day.
|
|
273
|
+
|
|
274
|
+
**And never run the browser suite against the same database as the integration suite.** There is one queue:
|
|
275
|
+
the browser harness starts a real worker, the worker claims the integration tests' jobs, and three of them
|
|
276
|
+
fail with the correct code in front of you.
|
|
277
|
+
|
|
278
|
+
## Build order
|
|
279
|
+
|
|
280
|
+
1. **The relational store and the migration tool**, with the schema split decided up front.
|
|
281
|
+
2. **The data-model guard** that walks your metadata. It is cheap now and an audit later.
|
|
282
|
+
3. **Identity and the session**, both paths, with the single-use token consumed atomically.
|
|
283
|
+
4. **Tenancy**: the derived name, the one choke point, membership deny-by-default.
|
|
284
|
+
5. **The seam**, the public-surface snapshot and the boundary test.
|
|
285
|
+
6. **The customer corpus and the workspace-as-selection tables.** Before any ingest.
|
|
286
|
+
7. **Jobs**: parent and child rows, leases in typed columns, the lost-item predicate.
|
|
287
|
+
8. **Uploads via signed URLs.**
|
|
288
|
+
9. **One operation end to end** - primitive, operation, route - and the import rule that keeps routes out of
|
|
289
|
+
the primitives.
|
|
290
|
+
10. **The two API ratchets**, each proved by planting its violation.
|
|
291
|
+
11. **A live seam test**, before you trust any of the above.
|
|
292
|
+
12. **Then the rest of the operations.** The shape is set and each one is cheap.
|
|
293
|
+
|
|
294
|
+
## What goes in your project's own child skill
|
|
295
|
+
|
|
296
|
+
- your placement-test decisions, by operation, with the answer and the reason
|
|
297
|
+
- your seam's interim list and the engine gaps each waits on
|
|
298
|
+
- the commands: migrations, the marked suites, the live seam test, provisioning an account
|
|
299
|
+
- the defects that recurred in **your** backend, with the evidence for each
|
|
300
|
+
- which policy decisions are deliberately the product's, so nobody "simplifies" one into the seam
|
|
301
|
+
|
|
302
|
+
## Verification checklist
|
|
303
|
+
|
|
304
|
+
- [ ] Product code imports the engine only through `rag_wright.api`, `rag_wright.pack_sdk` and `rag_wright.harness` (tested)
|
|
305
|
+
- [ ] No route module imports a primitive; it reaches them through an operation (tested)
|
|
306
|
+
- [ ] Each read-only operation returns the same result from the route and from the agent's tool (a parity test)
|
|
307
|
+
- [ ] No store-writing operation is on the agent's tool surface unless the spec says so (tested)
|
|
308
|
+
- [ ] Every table is reachable by a route (tested)
|
|
309
|
+
- [ ] Every route in the published schema is named by a test, exemption map EMPTY, and the guard excludes
|
|
310
|
+
its own file
|
|
311
|
+
- [ ] The per-customer store name is derived, not stored, and resolved in one place
|
|
312
|
+
- [ ] Any per-customer override column is UNIQUE
|
|
313
|
+
- [ ] Membership absence is a refusal, with a composite primary key behind it
|
|
314
|
+
- [ ] Every operation resolves its own scope and short-circuits an empty selection before the engine
|
|
315
|
+
- [ ] No route accepts a client-supplied handle without scoping it (tested for ALL routes, not two)
|
|
316
|
+
- [ ] Single-use tokens are consumed by one atomic statement
|
|
317
|
+
- [ ] Federated linking is gated on a verified-email claim
|
|
318
|
+
- [ ] Every field is in a typed column or JSONB by the stated test, and a guard walks the metadata
|
|
319
|
+
- [ ] Any framework-owned tables live in their own schema
|
|
320
|
+
- [ ] A partial result is not reported as a loss
|
|
321
|
+
- [ ] Every engine seam has a LIVE test
|
|
322
|
+
- [ ] The database-marked suite was run before committing a route, fixture or seam change
|
|
323
|
+
- [ ] Every new guard was proved by planting its violation and watching it fail
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: building-a-product-frontend
|
|
3
|
+
description: The architecture and build ORDER for a product front end over a retrieval/agent engine - the core/product seam, generating the API client from the schema, the URL as state of record, one data-access layer, and the three test tiers in the order you need them. Load at the START of a new product's UI, and before changing the shape of an existing one. Craft (composition, a11y, states) is frontend-ui-engineering, which still applies.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Building a product front end over an engine
|
|
7
|
+
|
|
8
|
+
Repository paths in this skill (`docs/`, `src/`) are in the engine repository: read them there or on GitHub, at the tag matching your installed engine.
|
|
9
|
+
|
|
10
|
+
> **This skill was distilled from a shipped product and is written for a DIFFERENT one.** It ships in the
|
|
11
|
+
> engine wheel; link it into your repo's `.claude/skills/` (`docs/installation.md`). Its companion craft skill,
|
|
12
|
+
> `frontend-ui-engineering`, is one of the shared way-of-working skills. The agent surface it ends with is built
|
|
13
|
+
> on the engine's `rag_wright.harness` tier (`building-an-agent-harness`).
|
|
14
|
+
>
|
|
15
|
+
> **It is PRODUCT-AGNOSTIC on purpose, and every number in it is measured.** Each decision below was paid
|
|
16
|
+
> for once, by shipping; the measurements are kept because they are why anybody follows the rule. What is
|
|
17
|
+
> specific to a single codebase -- its locked choices, its primitives, its paths -- belongs in a
|
|
18
|
+
> project-scoped child skill of your own, never in this file. The last section says what to put there.
|
|
19
|
+
>
|
|
20
|
+
> **It is the ARCHITECTURE skill, not the craft skill.** `frontend-ui-engineering` covers composition,
|
|
21
|
+
> accessibility, spacing, states, and the ways UI defects hide from a green suite. Load both. Where that
|
|
22
|
+
> skill already says something, this one points at it rather than repeating it.
|
|
23
|
+
|
|
24
|
+
## The shape every one of these products has
|
|
25
|
+
|
|
26
|
+
A front end over a document-retrieval-plus-agent engine is, every time, the same six things:
|
|
27
|
+
|
|
28
|
+
1. **Identity**: password and federated sign-in, one session, email verification, password reset.
|
|
29
|
+
2. **Tenancy**: an account, workspaces inside it, membership and roles, deny-by-default authorization.
|
|
30
|
+
3. **A corpus**: upload, ingestion progress, a library of what has been ingested, a per-item detail view
|
|
31
|
+
with the source rendered and its extracted records beside it.
|
|
32
|
+
4. **Deterministic operations**: menu-driven, parameterised, reached by a click. Each returns a result that
|
|
33
|
+
cites its evidence.
|
|
34
|
+
5. **An agent surface**: chat that can pick up from a deterministic result, ask for more, take feedback, and
|
|
35
|
+
answer open questions.
|
|
36
|
+
6. **Housekeeping**: settings, members, usage and spend.
|
|
37
|
+
|
|
38
|
+
**What changes between products is the entities and the operations. The structure around them does not.**
|
|
39
|
+
That is why this skill exists, and it is also the exact limit of what can be shared: see the seam below.
|
|
40
|
+
|
|
41
|
+
## Decision 1: two directories, and the dependency arrow points one way
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
src/core/ knows NOTHING about the domain. Shell, layout, tables, auth pages, theme,
|
|
45
|
+
data-access plumbing, settings. The thing you carry to the NEXT product.
|
|
46
|
+
src/product/ the domain. Entity names, the operation surfaces, the copy, the registries.
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**The core reads registries the product populates.** Navigation is the first one: the product declares its
|
|
50
|
+
surfaces (path, label, icon, which ones appear in nav) and the shell renders whatever it is given. The core
|
|
51
|
+
never imports from the product; the product imports from the core.
|
|
52
|
+
|
|
53
|
+
**Enforce it with a scan, not with intent.** A test that greps the core directory for the domain's own words
|
|
54
|
+
-- comments and docstrings included -- and fails on any hit. Two properties make it work:
|
|
55
|
+
|
|
56
|
+
- **Comments count.** A core component commented "this is where the invoice total goes" is coupled; the next
|
|
57
|
+
person writes code to match the comment.
|
|
58
|
+
- **Strip paths and references before scanning**, or a legitimate pointer to a domain document trips it and
|
|
59
|
+
somebody adds an exemption, and then the exemption list is the guard.
|
|
60
|
+
|
|
61
|
+
Write this test with the second directory, on the first day. Retrofitting it means auditing everything.
|
|
62
|
+
|
|
63
|
+
### The seam is a discipline, NOT a framework
|
|
64
|
+
|
|
65
|
+
**Do not build a plugin loader, dynamic module registration, a theming engine, or config-driven forms.**
|
|
66
|
+
Adaptation is **import-then-customize**: the next product copies or depends on the core, declares its own
|
|
67
|
+
registries, and writes its own result surfaces.
|
|
68
|
+
|
|
69
|
+
This is the most tempting decision to get wrong, so here is the reason in full. A result surface looks
|
|
70
|
+
generic -- read a parameter from the URL, run a query, render loading/error/empty, group the rows, cite each
|
|
71
|
+
one. Most of it is. But a small number of branches in those pages encode **domain truths, not layout**:
|
|
72
|
+
|
|
73
|
+
- *"Not found is not the same as none."* An unrecognised name must not render like a clean, empty result:
|
|
74
|
+
one says "we have nothing on this", the other says "you are exposed to nothing", and only one of them is
|
|
75
|
+
true. A typo must never read as an all-clear.
|
|
76
|
+
- *"These two groups must never be merged."* A parent organisation and its subsidiary are different parties;
|
|
77
|
+
pooling their records into one total misstates who is responsible for what. The separation is a fact about
|
|
78
|
+
the world, enforced in the rendering.
|
|
79
|
+
|
|
80
|
+
A configuration schema has two options for a rule like that. It cannot express it -- and the generated page
|
|
81
|
+
is plausible, well laid out, and wrong, which is the most expensive kind of wrong in a product people make
|
|
82
|
+
decisions from. Or it can express it, and the configuration is now a programming language with no type
|
|
83
|
+
checker, no tests and no reviewer. **Generalise the shell, the plumbing and the primitives; write the result
|
|
84
|
+
surfaces.** They are the cheapest part and the part that carries the meaning.
|
|
85
|
+
|
|
86
|
+
## Decision 2: GENERATE the API client from the schema
|
|
87
|
+
|
|
88
|
+
If the backend publishes a machine-readable schema -- and a modern Python or TypeScript backend does, for
|
|
89
|
+
free -- **the client is generated, never hand-mirrored.**
|
|
90
|
+
|
|
91
|
+
Measured, on the product this skill comes from: a hand-written client reached **1,154 lines, 87 exports and
|
|
92
|
+
24 endpoint string literals**, and its own header comment admitted the schema was the real source of truth
|
|
93
|
+
"if they ever drift". They had already drifted: a comment two-thirds down recorded that the field names
|
|
94
|
+
there had gone stale behind the backend **twice**.
|
|
95
|
+
|
|
96
|
+
The discipline that makes generation work in practice:
|
|
97
|
+
|
|
98
|
+
- **Commit the generated file.** A diff in a pull request is how a breaking backend change becomes visible
|
|
99
|
+
instead of a runtime surprise.
|
|
100
|
+
- **Regenerate in CI and fail on a dirty tree.** Otherwise the generated file is a hand-written file with
|
|
101
|
+
extra steps.
|
|
102
|
+
- **Hand-write only the thin layer above it**: auth headers, error normalisation, the query-key factory.
|
|
103
|
+
- **Change the client type in the SAME commit as the backend type.** A field that became optional while the
|
|
104
|
+
client still types it as required is a dereference that survives a full green suite and a clean build.
|
|
105
|
+
|
|
106
|
+
## Decision 3: the URL is the state of record
|
|
107
|
+
|
|
108
|
+
Page, filters, sort, selection, which panel is open, which tab is active -- all of it in the URL, none of it
|
|
109
|
+
in component state.
|
|
110
|
+
|
|
111
|
+
Three reasons, and the third is the one people forget: it is shareable, the back button is correct by
|
|
112
|
+
construction, and **an agent can hand the user a link to what it just did**. In a product where a chat turn
|
|
113
|
+
and a click are both first-class ways to reach a surface, state the agent cannot address is state the agent
|
|
114
|
+
cannot hand back.
|
|
115
|
+
|
|
116
|
+
**Write the guard when the first consumer lands.** Deferring it is reasonable while there is nothing to
|
|
117
|
+
guard; what fails is the deferral with a named trigger that nobody checks. If you defer, write the trigger
|
|
118
|
+
down where the next person will look, not only in the ticket.
|
|
119
|
+
|
|
120
|
+
## Decision 4: one data-access layer, two guards
|
|
121
|
+
|
|
122
|
+
A query-key factory is the only place keys are built; no component calls `fetch` directly. Both guards are a
|
|
123
|
+
source scan, both take minutes, and both are provable by planting their violation:
|
|
124
|
+
|
|
125
|
+
- no inline key array outside the factory
|
|
126
|
+
- no `fetch(` in a component
|
|
127
|
+
|
|
128
|
+
A library's own `refetch()` goes *through* the layer and is the opposite of a violation -- make sure the
|
|
129
|
+
guard knows the difference, or it will be disabled by the first person it annoys.
|
|
130
|
+
|
|
131
|
+
## Decision 5: one table primitive, and the allow-list that must not grow
|
|
132
|
+
|
|
133
|
+
Build the table once, and allow a raw `<table>` element in exactly that one file. Everything else that needs
|
|
134
|
+
a table uses the primitive; if the primitive cannot do it, extend the primitive.
|
|
135
|
+
|
|
136
|
+
**Adding a file to the allow-list without it BEING the primitive is how a rule becomes an exemption list.**
|
|
137
|
+
The guard should make that edit conspicuous: one line, in a file whose name says what it is for.
|
|
138
|
+
|
|
139
|
+
Make pagination props optional. An unpaginated listing that renders "N rows" is better than a pager over a
|
|
140
|
+
single page -- and see the arithmetic warning below before you let a page size anywhere near a count.
|
|
141
|
+
|
|
142
|
+
## The three test tiers, and the ORDER is the lesson
|
|
143
|
+
|
|
144
|
+
| tier | answers | structurally blind to |
|
|
145
|
+
|---|---|---|
|
|
146
|
+
| **unit / jsdom** | does this component behave? | **anything visual -- jsdom computes no CSS** |
|
|
147
|
+
| **browser, against the BUILT artifact** | does what we already know to check still hold? | anything nobody thought to assert |
|
|
148
|
+
| **a person or agent looking at it** | **what did nobody think to check?** | regressions -- it runs once |
|
|
149
|
+
|
|
150
|
+
`frontend-ui-engineering` has the detail on what each tier cannot see and how to pick between them. What
|
|
151
|
+
belongs here is the **sequencing**, because this is the thing a new product gets wrong:
|
|
152
|
+
|
|
153
|
+
**Stand up the browser tier before your second surface, not after your ninth.** Adopted late, it arrives as
|
|
154
|
+
a backlog of surfaces nobody has ever watched render -- and the first run finds defects on all of them at
|
|
155
|
+
once, in a batch too large to attribute to the change that caused each one. Measured on the product this
|
|
156
|
+
comes from: once the discovery tier existed, it found a real defect on **every single surface built**, and
|
|
157
|
+
the majority were invisible to every automated tier in the repo -- an invisible sign-in button, a duplicated
|
|
158
|
+
main landmark, every control under the minimum hit area, a document rendered at a third of its intended
|
|
159
|
+
size, two adjacent controls reading as one, a content region narrower than the panel beside it, and a white
|
|
160
|
+
screen on a page whose component tests were entirely green.
|
|
161
|
+
|
|
162
|
+
**The browser tier runs against the production build**, not the dev server. The server harness for it:
|
|
163
|
+
|
|
164
|
+
- its **own** database, created and migrated for the run -- never the development database
|
|
165
|
+
- the test account provisioned through the **real** provisioning command, so the path under test is the path
|
|
166
|
+
users take
|
|
167
|
+
- a **build**, then serve the build the way production serves it
|
|
168
|
+
- **rebuild on every run**, or a planted source change never reaches the browser and a guard you are proving
|
|
169
|
+
cannot fail
|
|
170
|
+
- **kill any hand-started dev server first.** A harness that reuses an existing server will serve a stale
|
|
171
|
+
build, and the fix you just made appears to fail
|
|
172
|
+
|
|
173
|
+
Two traps worth naming in advance: a production build does **not** double-invoke effects, so anything that
|
|
174
|
+
only manifests under development-mode strict rendering belongs in the jsdom tier and could never fail in the
|
|
175
|
+
browser; and an accessibility sweep over *mocked* pages never renders the real shell, which is how nested
|
|
176
|
+
landmarks survive indefinitely.
|
|
177
|
+
|
|
178
|
+
**Drive the browser by element reference. Never by screen coordinates.** Locator-first frameworks make the
|
|
179
|
+
mistake inexpressible; a browser-automation plugin will happily take a pixel, and nothing but this rule
|
|
180
|
+
stops you. A stale reference is the signal to re-read the page, never to reach for coordinates. And after a
|
|
181
|
+
click that navigates or submits, wait and confirm before the next step -- racing a sign-in request with a
|
|
182
|
+
navigation makes a route guard bounce it, which looks exactly like broken authentication.
|
|
183
|
+
|
|
184
|
+
**Anything the discovery tier finds becomes a browser test in the same change.** A finding left as an
|
|
185
|
+
anecdote is a defect that comes back; the repeated pattern is a human finding the same fault three times
|
|
186
|
+
because no run of it ever became an assertion.
|
|
187
|
+
|
|
188
|
+
## Rules that each cost a real defect, in portable form
|
|
189
|
+
|
|
190
|
+
**A feature ends at the surface.** A backend change whose UI lands "next task" does not land. Ship the
|
|
191
|
+
surface in the same commit, and check what neighbouring commits touched before calling a task done. A
|
|
192
|
+
structural guard helps -- a new table with no route fails -- but nothing enforces "and a person can reach
|
|
193
|
+
it" except looking.
|
|
194
|
+
|
|
195
|
+
**A failed load must never render as an empty result.** "You have none" and "we could not read what you
|
|
196
|
+
have" are different claims, and in a product people act on, one of them is a false assurance. Same shape
|
|
197
|
+
everywhere: "no results" versus "no such record"; "not retained" versus "retention expired".
|
|
198
|
+
|
|
199
|
+
**Every data surface defines loading, empty AND error.** Guard it by scanning for the three states, and make
|
|
200
|
+
any exemption a written line in the file that says why -- a surface addressed by an id has no "no results"
|
|
201
|
+
case. A silent exemption is how "every data surface" becomes "most of them".
|
|
202
|
+
|
|
203
|
+
**A page size is a presentation choice and must never become an arithmetic one.** A list capped at 100
|
|
204
|
+
feeding a coverage numerator reports "100 of 100 processed" for a 500-item job. If a number means coverage,
|
|
205
|
+
it comes from the count, never from the page.
|
|
206
|
+
|
|
207
|
+
**Never present text the user did not write as theirs.** An assembled excerpt shown under "in your document"
|
|
208
|
+
attributes words to somebody in an order they never used. If the backend labels which spans are verbatim and
|
|
209
|
+
which are reconstructed, read the label instead of guessing, and never invent a filename for pasted input.
|
|
210
|
+
|
|
211
|
+
**Hit areas: measure them, do not eyeball them.** Every control in the product this comes from was under the
|
|
212
|
+
minimum until one was measured in a real browser. A text input is its own target and cannot borrow an
|
|
213
|
+
adjacent button's padding.
|
|
214
|
+
|
|
215
|
+
**A list the UI owns is a capability the UI will silently lack**, and **any guard with a hand-maintained list
|
|
216
|
+
goes stale silently**. Both are in `frontend-ui-engineering` with the mechanics; they are listed here because
|
|
217
|
+
they bite hardest in exactly this kind of product, where the backend's capability set grows every week.
|
|
218
|
+
|
|
219
|
+
## The build order for a new product
|
|
220
|
+
|
|
221
|
+
Doing these out of order is what costs the rework:
|
|
222
|
+
|
|
223
|
+
1. **Scaffold, then the seam.** Two directories and the vocabulary scan over the core, before the second
|
|
224
|
+
component exists.
|
|
225
|
+
2. **Generate the client.** Before any surface. Everything downstream types against it.
|
|
226
|
+
3. **The data-access layer and its two guards.** Cheap now, an audit later.
|
|
227
|
+
4. **Identity and tenancy surfaces.** They are the most portable code you will write and they exercise the
|
|
228
|
+
shell, routing and the session end to end.
|
|
229
|
+
5. **The shell: regions, navigation registry, theme tokens.** Resist centring the content region if a detail
|
|
230
|
+
panel will ever sit beside it -- then make each surface constrain its own measure, and assert it.
|
|
231
|
+
6. **The table primitive**, with its allow-list guard, before the second listing.
|
|
232
|
+
7. **The browser-tier harness** -- own database, real provisioning, build, serve, rebuild per run.
|
|
233
|
+
8. **The first corpus surface** (upload, progress, library, detail). This is where ingestion contracts get
|
|
234
|
+
real.
|
|
235
|
+
9. **One deterministic operation end to end**, with citations, through all three tiers. Look at it in a
|
|
236
|
+
browser before calling it done.
|
|
237
|
+
10. **Then the rest of the operations.** By now the shape is set and each one is cheap.
|
|
238
|
+
11. **The agent surface last**, because it needs the operations to exist and the URL state to be addressable.
|
|
239
|
+
|
|
240
|
+
## What goes in your project's own child skill
|
|
241
|
+
|
|
242
|
+
This skill carries what is true of any product of this shape. Put in the project-scoped child the things a
|
|
243
|
+
reader cannot derive:
|
|
244
|
+
|
|
245
|
+
- your locked decisions, with what a violation looks like, and the fact that changing one needs a recorded
|
|
246
|
+
decision rather than a judgement call
|
|
247
|
+
- your primitives, by path: the table, the shell, the query-key factory, the states helper
|
|
248
|
+
- the commands: how to run each tier, where specs live, what the e2e server script does
|
|
249
|
+
- the defects that have actually recurred in **your** codebase, with the evidence that makes them stick
|
|
250
|
+
- current debts: a guard that was deferred, a decision made but not yet built
|
|
251
|
+
|
|
252
|
+
Keep that file in front of the person *before* they write code, not in review. A decision recorded only in
|
|
253
|
+
an architecture document is a decision that gets violated with the document already in place.
|
|
254
|
+
|
|
255
|
+
## Verification checklist
|
|
256
|
+
|
|
257
|
+
- [ ] The core directory has a vocabulary scan over it, comments included, and it passes
|
|
258
|
+
- [ ] Nothing in the core imports from the product
|
|
259
|
+
- [ ] The API client is generated from the published schema, committed, and regenerated in CI
|
|
260
|
+
- [ ] Any client type mirroring a backend contract changed in the SAME commit as the backend
|
|
261
|
+
- [ ] Navigation-shaped state is in the URL, not component state
|
|
262
|
+
- [ ] Reads go through the query-key factory; no `fetch(` in a component
|
|
263
|
+
- [ ] No raw table outside the primitive; the allow-list did not grow
|
|
264
|
+
- [ ] Every data surface has loading, empty and error, or a written exemption saying why
|
|
265
|
+
- [ ] A failed load renders as a failure, never as an empty result
|
|
266
|
+
- [ ] Anything visual is asserted in a browser against the BUILT artifact, not in jsdom
|
|
267
|
+
- [ ] The guard for whatever changed was proved by planting its violation and watching it fail
|
|
268
|
+
- [ ] A new or substantially changed surface was OPENED and looked at, and anything found became a browser
|
|
269
|
+
test in the same change
|
|
270
|
+
- [ ] No screen-coordinate interaction anywhere in the change or its tests
|
|
271
|
+
- [ ] The backend change this belongs to ships its surface in the same commit
|