rag-wright 0.9.0__tar.gz → 0.10.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.9.0 → rag_wright-0.10.0}/.claude/skills/authoring-a-capability/SKILL.md +2 -2
- rag_wright-0.10.0/.claude/skills/building-an-agent-harness/SKILL.md +607 -0
- {rag_wright-0.9.0/src/rag_wright/.agents → rag_wright-0.10.0/.claude}/skills/using-the-rag-wright-engine/SKILL.md +5 -4
- rag_wright-0.10.0/.release-please-manifest.json +3 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/CHANGELOG.md +8 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/CLAUDE.md +8 -1
- {rag_wright-0.9.0 → rag_wright-0.10.0}/PKG-INFO +3 -1
- rag_wright-0.10.0/docs/adr/0139-the-agent-harness-substrate-is-engine-scope.md +184 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/api/README.md +27 -3
- rag_wright-0.10.0/docs/api/harness.md +309 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/api/pack_sdk.md +0 -16
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/architecture.md +3 -1
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/configuration.md +21 -1
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/domain-adaptation/README.md +3 -2
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/domain-adaptation/_engine-gaps.md +3 -1
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/public-surface/plan.md +2 -1
- rag_wright-0.10.0/docs/specs/public-surface/rulewright-migration-0.10.0.md +65 -0
- rag_wright-0.10.0/docs/specs/public-surface/rulewright-migration-0.9.0.md +72 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/templates/product-starter/CLAUDE.md.template +7 -5
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/templates/product-starter/README.md +1 -1
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/templates/product-starter/playbook.md.template +1 -1
- {rag_wright-0.9.0 → rag_wright-0.10.0}/pyproject.toml +49 -1
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/build_api_docs.py +12 -0
- rag_wright-0.10.0/scripts/measure_harness_genericity.py +213 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/.agents/skills/authoring-a-capability/SKILL.md +2 -2
- rag_wright-0.10.0/src/rag_wright/.agents/skills/building-an-agent-harness/SKILL.md +607 -0
- {rag_wright-0.9.0/.claude → rag_wright-0.10.0/src/rag_wright/.agents}/skills/using-the-rag-wright-engine/SKILL.md +5 -4
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/__init__.py +5 -1
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/agents.py +6 -3
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/tracing.py +6 -2
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/workspace.py +10 -4
- rag_wright-0.10.0/src/rag_wright/harness/__init__.py +66 -0
- rag_wright-0.10.0/src/rag_wright/harness/accounting.py +80 -0
- rag_wright-0.10.0/src/rag_wright/harness/agent.py +146 -0
- rag_wright-0.10.0/src/rag_wright/harness/batch.py +115 -0
- rag_wright-0.10.0/src/rag_wright/harness/clarify.py +72 -0
- rag_wright-0.10.0/src/rag_wright/harness/confirm.py +92 -0
- rag_wright-0.10.0/src/rag_wright/harness/decisions.py +534 -0
- rag_wright-0.10.0/src/rag_wright/harness/definition.py +109 -0
- rag_wright-0.10.0/src/rag_wright/harness/dispatch.py +171 -0
- rag_wright-0.10.0/src/rag_wright/harness/errors.py +236 -0
- rag_wright-0.10.0/src/rag_wright/harness/events.py +148 -0
- rag_wright-0.10.0/src/rag_wright/harness/filesystem.py +184 -0
- rag_wright-0.10.0/src/rag_wright/harness/grading.py +568 -0
- rag_wright-0.10.0/src/rag_wright/harness/interpreter.py +100 -0
- rag_wright-0.10.0/src/rag_wright/harness/memory.py +171 -0
- rag_wright-0.10.0/src/rag_wright/harness/models.py +480 -0
- rag_wright-0.10.0/src/rag_wright/harness/rules.py +266 -0
- rag_wright-0.10.0/src/rag_wright/harness/runs.py +439 -0
- rag_wright-0.10.0/src/rag_wright/harness/scope.py +128 -0
- rag_wright-0.10.0/src/rag_wright/harness/seen.py +505 -0
- rag_wright-0.10.0/src/rag_wright/harness/skills.py +63 -0
- rag_wright-0.10.0/src/rag_wright/harness/thinking.py +85 -0
- rag_wright-0.10.0/src/rag_wright/harness/tiers.py +344 -0
- rag_wright-0.10.0/src/rag_wright/harness/tracing.py +119 -0
- rag_wright-0.10.0/src/rag_wright/harness/withhold.py +134 -0
- rag_wright-0.10.0/src/rag_wright/harness/workers.py +343 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/models/seam.py +8 -6
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/models/tracing.py +12 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/pack_sdk/__init__.py +9 -4
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/mcp/compliance_server.py +3 -3
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/capabilities/dg_extraction.py +2 -1
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/mcp/typed_property_retrieval_server.py +1 -1
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tasks.md +11 -1
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_agent_chat_model.py +10 -0
- rag_wright-0.10.0/tests/api/test_api_embedder_ps39.py +31 -0
- rag_wright-0.10.0/tests/api/test_tracing_helpers_ps32.py +30 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/arch/test_api_docs_current.py +8 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/arch/test_shipped_skills.py +1 -0
- rag_wright-0.10.0/tests/harness/test_greenfield_conformance.py +432 -0
- rag_wright-0.10.0/tests/harness/test_harness_accounting.py +115 -0
- rag_wright-0.10.0/tests/harness/test_harness_engine_wiring.py +94 -0
- rag_wright-0.10.0/tests/harness/test_harness_genericity.py +207 -0
- rag_wright-0.10.0/tests/harness/test_harness_live.py +48 -0
- rag_wright-0.10.0/tests/harness/test_harness_recorder.py +142 -0
- rag_wright-0.10.0/tests/harness/test_harness_thinking.py +197 -0
- rag_wright-0.10.0/tests/util/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/uv.lock +5 -1
- rag_wright-0.9.0/.release-please-manifest.json +0 -3
- rag_wright-0.9.0/docs/adr/0139-the-agent-harness-substrate-is-engine-scope.md +0 -95
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.claude/settings.json +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.claude/skills/building-an-ingestion-capability/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.claude/skills/classifier-opportunity-analysis/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.claude/skills/creating-evals/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.claude/skills/laya/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.claude/skills/qwen-vllm-modal/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.claude/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.claude/skills/qwen-vllm-modal/scripts/rw_gate.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.claude/skills/setfit/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.env.example +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.github/workflows/publish.yml +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.github/workflows/release-please.yml +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/.gitignore +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/LICENSE +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/README.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/SPEC.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/conftest.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/ARCHITECTURE_OVERVIEW.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/ArcadeDB_Local.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/OBSERVABILITY.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0001-stack-and-library-choices.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0002-validation-corpus-cuad-edgar.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0003-ard-registration-and-capability-kinds.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0004-entity-disambiguation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0005-relational-golden-set.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0006-model-profile.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0007-arcadedb-store-schema.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0008-unified-framework-index-docs-grounding.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0009-rlm-chunking-retained-as-configurable-capability.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0010-transformers-pinned-below-5-for-flagembedding-reranker.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0011-cuad-not-a-retrieval-benchmark-acord-for-queries.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0012-entity-mention-confidence-no-proximity-edges.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0013-entity-resolution-matching-strategy.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0014-split-generation-and-vision-to-text.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0015-rlm-dynamic-subagents-and-granted-subagents.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0016-rlm-defined-by-required-capabilities-enforced-as-tests.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0017-dynamic-dispatch-trigger-as-typed-flag.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0018-rlm-method-is-the-orchestrator-system-prompt.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0019-recursion-is-optional-for-chunking-required-for-synthesis.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0020-serialize-interpreter-sessions-per-process-ki1.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0021-capability-interface-governed-typed-io.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0022-fr-k-embedding-free-okf-navigation-experimental.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0023-cheap-model-for-okf-enrichment.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0024-reader-parallelism-lives-in-python-not-the-interpreter.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0025-retrieval-pivot-function-classify-property-graph-rerank.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0026-property-schema-and-extended-function-taxonomy.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0027-openrouter-provider-routing-by-throughput.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0028-deterministic-grounding-judge-and-flash-pro-cascade.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0029-retrieval-pipeline-domain-portability-and-adaptation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0030-model-training-standard-modal-reusable-checkpointed.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0031-single-call-chunking-for-structured-contracts.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0032-nl-to-type-two-step-reason-emit-on-gemma.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0033-unified-contract-kg-three-legs-one-graph.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0034-granite-json-schema-structured-output-profile.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0035-graph-extraction-rebacked-with-gp1b-retire-hybrid.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0036-party-clause-link-party-to-edge.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0037-clause-template-is-authoritative-code-not-generated.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0038-full-cuad-kg-on-gcp-gpu-vm-and-gcs-backup.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0039-self-hosted-open-model-stack-on-modal-a100.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0040-neuro-symbolic-extraction-fidelity-ontology-shacl-validation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0041-capability-kind-rubric-and-agent-skill-runtime-tiers.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0042-clause-level-span-id-provenance-and-content-hash-backfill.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0043-retire-cross-corpus-retrieval-standardize-on-leg-b.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0044-is-exception-to-derived-carveout-relationship.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0045-client-side-tag-parse-structured-output.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0046-acord-unified-into-one-production-kg.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0047-retire-precomputed-clause-function-gate.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0048-ingest-llm-classifier-nondestructive-reclassify.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0049-generic-customer-lens-for-ingestion.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0050-async-langgraph-ingestion.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0051-schema-bootstrap-and-feedback-driven-ontology-evolution.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0052-engine-product-split-graphwright-parked.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0053-answer-prose-output-hygiene.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0054-remove-auto-tag-from-generator-evidence.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0055-confidence-out-of-band.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0056-bound-structured-retry-wall-clock.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0057-async-engine-architecture.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0058-structure-first-chunking.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0059-recall-decoupled-from-classification-and-visible-partial-loss.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0060-scope-compliance-check-to-named-policy-sources.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0061-subject-document-compliance-per-section.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0062-tiered-ocr-scan-quality-vlm-escalation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0063-per-sentence-compliance-subject-facts.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0064-typed-properties-out-of-band-on-evidence.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0065-deontic-applicability-gates-query-side.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0066-ontology-ttl-single-source-of-truth.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0067-domain-pack-retargeting.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0068-recall-first-actor-gate-ontology-role-disjointness.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0069-reading-order-chunking-tables-figures-retrievable.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0070-text-layer-first-parsing-no-false-vlm-escalation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0071-defragmentation-reconstruct-paragraphs-from-line-items.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0072-extract-guard-furniture-and-deterministic-failure.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0073-born-digital-threshold-sparse-pages-no-vlm-escalation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0074-retry-transient-extraction-failures.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0075-per-page-vlm-escalation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0076-thread-safe-shared-embedder-reranker.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0077-concurrent-function-classification-across-chunks.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0078-dedicated-extraction-executor.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0079-product-default-granite-4.2-openrouter-routing.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0080-nested-tag-parse-and-degrade.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0081-function-independent-tagparse-clause-extraction.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0082-symbolic-gate-function-independent.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0083-executor-hop-trace-context-capture.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0084-gleaning-off-on-the-query-leg.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0085-query-constraint-extraction-tagparse.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0086-streaming-cost-capture.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0087-retrieval-relevance-score-on-rankedspan.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0088-per-span-relevance-verdict.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0089-structured-output-generation-tracing.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0090-affiliate-of-extraction.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0091-retire-partyto-edge.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0092-idempotent-write-graph.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0093-entities-by-name-seam.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0094-workspace-document-scope.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0095-span-page-provenance.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0096-carveout-keyword-normalization.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0097-caller-configurable-ingest-extraction-models.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0098-invoke-time-document-scope.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0099-mcp-tools-never-take-a-model-supplied-tenant.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0100-profile-based-model-routing.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0101-untagged-spans-reach-extraction-aspect-gate-removed.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0102-open-descriptive-list-dims-retain-verbatim.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0103-a-clause-is-a-provision-not-a-span.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0104-dense-floor-protection-in-leg-b.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0105-in-band-model-usage-accounting.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0106-document-signals-off-the-citation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0107-requirement-page-provenance.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0108-qwen3-27b-single-a100-serving-profile.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0109-vllm-cold-start-reduction.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0110-fp8-kv-cache-16k-single-a100.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0111-pin-qwen3-27b-deepinfra-bf16.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0112-relax-deepagents-pin-to-floor.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0113-llm-span-instrumentation-for-latency-attribution.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0114-setfit-default-clause-function-classifier.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0115-classifier-only-step3a-property-extraction.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0116-soft-function-scoping-classifier-lane.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0117-engine-api-layer-and-capability-runtime.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0118-engine-core-api-vs-ard-adapter-free-impl-ref-client.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0119-jev-typed-decision-model-for-compliance-closed-set-fields.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0120-rlm-sub-agent-identity-dynamic-dispatch-trigger.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0121-spacy-optional-extra-model-runtime-download.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0122-provision-boundary-deterministic-plus-decision-model-residue.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0123-batched-releases-release-please-and-consumer-dependabot.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0124-generic-ingestion-builder-and-hooks.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0125-qwen-openrouter-unpinned.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0126-unit-representative-hook-and-the-reference-vote.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0127-retire-the-okf-code.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0128-two-public-tiers-api-and-pack-sdk.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0129-laya-temperatures-and-the-sklearn-floor.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0130-deploy-the-self-hosted-model-server-from-the-engine.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0131-model-server-hardening-after-rulewright-review.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0132-model-server-cold-start-from-a-gpu-snapshot.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0133-model-call-deadline-follows-the-timeout-and-a-thinking-cap.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0134-skills-for-product-developers-are-linked-per-project-never-globally.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0135-the-seam-gives-each-event-loop-its-own-async-http-client.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0136-spreadsheet-tables-are-glued-back-across-blank-rows.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0137-generated-answers-state-their-support-and-none-is-an-abstention.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/0138-the-engine-reaches-pdfium-through-one-locked-door.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/adr/README.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/architecture/foundations-and-adding-a-domain.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/README.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/design/deontic-applicability-routing.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/design/ingestion-neuro-symbolic-gaps.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/design/semantic-subject-segmentation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/design/unify-subject-preprocessing.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/engine-issues/0037-closed-vocab-drops-verbatim-values-to-other.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.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.9.0 → rag_wright-0.10.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.9.0 → rag_wright-0.10.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.9.0 → rag_wright-0.10.0}/docs/archive/engine-issues/0041-VERIFICATION-dense-floor.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/engine-issues/0041-leg-b-discards-the-best-dense-matches-on-some-queries.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.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.9.0 → rag_wright-0.10.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.9.0 → rag_wright-0.10.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.9.0 → rag_wright-0.10.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.9.0 → rag_wright-0.10.0}/docs/archive/engine-issues/0046-appending-a-natural-follow-up-to-a-question-drops-the-clause-type.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/engine-issues/0047-an-exact-deepagents-pin-transitively-pins-every-consumer.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/engine-issues/0048-the-pinned-endpoints-latency-tail-makes-agent-runs-undebuggable-from-either-side.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-07-20_graphwright_capability_interface_reply.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-07-20b_graphwright_interface_confirmation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-07-20c_graphwright_ingestion_interfaces.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-08-30_subject_compliance_final_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-01_issue-0013-recall-first-actor-gate_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-01_ontology-source-of-truth_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-03_issue-0014-table-retrievability_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-04_bulk-ingestion-wall_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-04_issue-0016-thread-safe-embedder_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-05_observability-langfuse_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-05_tagparse-ingestion-and-granite-4.2_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-09_affiliate-of-extraction_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-09_issue-0028-partyto-retired_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-09_issue-0029-idempotent-write-graph_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-09_issue-0030-entities-by-name_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-09_observability-and-retrieval-floor_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-09_relevance-verdict_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-09_rename-run-ad-compliance-check_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-09_structured-output-cost-tracing_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-10_ingest-models-caller-configurable_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-failclosed-and-nodrift_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-10_issue-0031-followup-validate-ingested-set_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-10_issue-0031-workspace-document-scope_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-10_issue-0032-span-page-provenance_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-10_issue-0033-carveout-normalization_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-10_issue-0034-invoke-time-document-scope_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-11_issue-0035-followup-derived-guard_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-11_issue-0035-mcp-no-model-tenant_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-11_profile-based-model-routing_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-11_qwen-default-modal-or_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-11_qwen-everywhere-config_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-12_clause-granularity_0036-0039_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-12_closed-vocab_0037-0040_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-12_dense-floor-protection_0041_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-13_in-band-usage_0042_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-14_document-signals-off-citation_0044_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-14_requirement-page-provenance_0043_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-16_qwen3-27b-single-a100-serving-profile_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-18_fp8-accuracy-eval-configB_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-18_fp8-kv-16k-single-a100_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-20_deepagents-pin-relaxed_0047_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-20_llm-span-instrumentation_0048_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-answers_from_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/handoffs/2026-09-21_0048-part2-modal-scoping-questions_rulewright.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/misc/.gitkeep +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/plans/Corpus_Acquisition.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/plans/async-migration.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/plans/demo_plan.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/plans/gp1b_docling_graph_plan.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/plans/unified_contract_kg_ontology_bridge.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/plans/unified_contract_kg_plan.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/results/2026-07-24-t58-property-graph-population.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/results/2026-07-25-t58b-full-pipeline-rerank.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/archive/results/2026-07-25-t58b-topk-ordering-levers.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/concepts.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/contract_pipeline_explainer.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/corpus_ingest_recipe.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/domain-adaptation/authoring-capabilities.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/domain-adaptation/classification-and-decision-models.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/domain-adaptation/entity-resolution.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/domain-adaptation/evals-from-expert-files.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/domain-adaptation/kg-construction.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/domain-adaptation/ontology-authoring.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/classifier_model_ab.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/compliance_demo.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/compliance_gate_cc7.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/compliance_rung2_cc7.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/cuad_highlighting_cu-d1.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/dg_model_ab.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/function_gate_recall.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/generation_robustness_b_vs_c.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/nl_to_type_cu-d2.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/ocr_benchmark.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/prod1_readiness.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/prod2_readiness.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/query_side_model_ab.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/silver_granite_vs_gemma4.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/silver_provider_routing.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/eval/silver_selfhosted_gemma4_26b.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/evals.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/installation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/playbook.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/product/capability_profiles.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/product/contracts_product_roadmap.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/product/engine-api-migration-handoff.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/product/engine_async_api.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/product/new-domain-build-sequence.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/product/seam-adaptation-guide.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/proposals/compliance-ingest-classifier-decomposition.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/proposals/de-domaining-and-capability-runtime.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/proposals/new-domain-developer-journey.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/proposals/ontology-induction.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/quickstart.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/reference-pack.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/releasing.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/engine-platform/SPEC.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/engine-platform/TASKS.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/engine-prep/plan.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/evals/plan.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/ingestion-hooks/ing5-doc-audit.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/ingestion-hooks/ing8-breaking-changes.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/ingestion-hooks/plan.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/ingestion-hooks/rulewright-migration-0.2.0.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/public-surface/rulewright-arcadedb-separation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/public-surface/rulewright-migration-0.3.0.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/public-surface/rulewright-migration-0.4.0.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/public-surface/rulewright-migration-0.5.0.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/public-surface/rulewright-migration-0.6.0.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/public-surface/rulewright-migration-0.7.0.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/public-surface/rulewright-migration-0.8.0.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/specs/public-surface/rulewright-reply-2026-10-10-laya-and-sklearn.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/templates/product-starter/dependabot.yml +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/upstream/laya-temperature-range-mismatch.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/vendor/arcadedb/arcadedb-buckets-schema.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/vendor/arcadedb/arcadedb-docs-extraction.json +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/vendor/arcadedb/arcadedb-vector-embeddings.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/vendor/arcadedb/arcadedb-vector-search-tutorial.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/docs/workspaces.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/acord.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/acord_retrieval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/boundary_residue_gold.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/build_golden.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/compliance_demo/policy/community_conduct_policy.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/compliance_demo/subjects/post_borderline.txt +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/compliance_demo/subjects/post_compliant.txt +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/compliance_demo/subjects/post_violation.txt +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/condensed_pipeline.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/contract_parity_live.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/contractnli_judge.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/cuad_highlight.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/embedded_eval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/full_pipeline_rerank.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/function_ceiling.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/function_property_rerank.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/function_rerank.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/gate1_chunker_ab.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/gate2_hybrid_rerank.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/golden/relational/set.json +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/golden.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/ground_discriminator_rerank.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/harness.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/ingestion_live_smoke.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/kg_primary.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/kg_property_rerank.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/listwise_rerank.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/multihop.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/nl_to_type.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/relational_eval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/residual_decision_gold.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/segmenter_eval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/semantic_judge_gold.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/test_acord.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/test_acord_retrieval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/test_harness.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/test_multihop_set.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/eval/unit_grouper_eval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/examples/model_server.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/examples/quickstart.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/plan.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/release-please-config.json +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ab_model_overlap.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/acord_unify.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/acquire_acord.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/acquire_cuad.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/acquire_ecfr.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/acquire_edgar.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/acquire_ftc_255.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/acquire_prod1_corpus.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/audit_reclass_flips.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/author_leg_a_silver_key.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/backfill_affiliations.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/backfill_clause_span_id.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/backfill_edge_source_doc_id.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/backup_kg_to_gcs.sh +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/bootstrap_template_capture.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/bootstrap_typed_edges.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/build_api_docs.sh +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/build_cuad_clause_cache.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/build_function_routing_map.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_assemble_v2.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_assemble_v3.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_generate_hard_negatives.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_generate_hard_positives.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_generate_training.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_hybrid.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_hybrid2.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_jev_actor.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_jev_claimtypes.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_jev_operative.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_label_spans.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_laya_prep.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_laya_train.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_prep_operative.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_relabel_rubric.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_relabel_rubric2.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/cic1_train_operative.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/compare_extraction_models.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/compliance_actor_gate_smoke.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/compliance_engine_smoke.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/compliance_policy_demo.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/curate_taxonomy_gaps.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/dg_model_ab.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/diagnose_acord_knn_expansion.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/diagnose_acord_knn_rerank.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/diagnose_acord_leg_pool.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/diagnose_acord_legs.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/diagnose_acord_pool.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/diagnose_acord_relstructure.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/diagnose_acord_retrieval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/distill/eval_all.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/distill/eval_ce.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/distill/eval_listwise_b.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/distill/export_ce_dataset.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/distill/extract_features.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/distill/listwise_variants.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/distill/relational_features.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/distill/train_ce.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/distill/train_modal.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/enrich_edgar_candidates.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/eval_chunking_ab.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/eval_classifier_guided_vs_tagparse.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/eval_compliance_gold.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/extract_arcadedb_docs.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/fetch_reference_models.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/generate_contract_python.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/git_post_commit_graphify.sh +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/granite_chunker_assess.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/graph_status.sh +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ingest_acord.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ingest_compliance_async_prod2.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ingest_compliance_document_prod2.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ingest_compliance_prod2.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ingest_cuad.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ingest_cuad_full.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ingest_ftc_compliance.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ingest_prod1.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ingest_prod1_async.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ingest_smoke.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/install_git_hooks.sh +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/label_new_functions.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/legb_function_gate_recall.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/make_compliance_fixtures.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/make_compliance_gold.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/mcp_compliance_agent_demo.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/mcp_intra_document_qa_smoke.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/mcp_query_legs_agent_demo.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/measure_generation_robustness.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/measure_silver.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/merge_docs_into_framework.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/migrate_entity_cik_to_canonical_id.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/migrate_silver_evidence_autotag.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/migrate_silver_evidence_remove_autotag.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/migrate_span_fields.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/mine_scarce_functions.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_arcadedb.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_backfill.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_exception_linking.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_gemma4_vllm.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_gemma4_vllm_snapshot.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_granite_server.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_granite_throughput.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_granite_vllm_server.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_query_app.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_qwen3_27b_bench.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_qwen3_27b_snapshot.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_qwen3_vllm_server.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/modal_stack_a100.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ocr_benchmark.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ocr_preprocess.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/ontology_dimension_check.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/phase_a_leg_validate.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/populate_clause_kg.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/populate_entity_graph.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/populate_entity_graph_extracted.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/populate_property_store.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/prep_relational_verification.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/publish_manifests.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/reclassify_kg.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/refresh_framework_graph.sh +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/revert_reclass_flips.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/run_acord_retrieval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/run_clause_exception_linking.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/semantic_judge_live_validate.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/semantic_judge_probe.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/snapshot_leg_a_eval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/stack_correctness_validate.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/table_retrieval_smoke.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/train_function_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/train_legalbert_function.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/train_legalbert_modal.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/typed_rerank_validate.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/verify_wheel_install.sh +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/vllm_extraction_ab.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/vllm_kg_query_validate.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/scripts/vllm_raw_diagnostic.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/.agents/skills/building-an-ingestion-capability/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/.agents/skills/classifier-opportunity-analysis/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/.agents/skills/creating-evals/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/.agents/skills/laya/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/modal_qwen3_vllm_server.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/.agents/skills/qwen-vllm-modal/scripts/rw_gate.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/.agents/skills/setfit/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/answers.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/config.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/discover.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/documents.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/ids.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/invoke.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/kg.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/mcp.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/api/usage.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/answer_generator.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/ard.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/chunk_read.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/chunk_write.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/disambiguation.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/document_parse.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/document_scope.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/embedding.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/embedding_profiles.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/entity_resolution.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/fusion.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/graph_query.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/graph_storage.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/hybrid_search.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/invoke.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/jev_decision.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/manifests.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/parsing.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/registry.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/remote_encoders.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/reranking.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/retrieval_core.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/rlm_chunking.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/rlm_synthesis.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/scan_quality.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/sheet_tables.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/span_relevance_judgment.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/vision_to_text.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/capabilities/vlm_ocr.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/contracts/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/contracts/chunk.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/contracts/evals.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/contracts/extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/contracts/graph.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/contracts/identifiers.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/contracts/ingestion.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/contracts/provenance.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/contracts/span.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/corpus/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/corpus/canonicalize.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/corpus/document_parser.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/corpus/embedded.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/corpus/http.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/evals/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/evals/gold.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/evals/langfuse_backend.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/evals/runner.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/evals/scorers.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/ingestion/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/ingestion/builder.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/ingestion/evaluate.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/ingestion/group.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/ingestion/layout.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/ingestion/segment.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/ingestion/tables.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/models/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/models/model_servers.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/models/profiles.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/models/tag_structured.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/models/usage.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/models/weights.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/ontology/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/ontology/pack_schema.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/ontology/registry.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/capabilities/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/capabilities/assertion_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/capabilities/claim_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/capabilities/compliance_judgment.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/capabilities/compliance_store.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/capabilities/requirement_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/invokers.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/mcp/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/ontology/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/ontology/compliance_bridge.ttl +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/ontology/loader.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/ontology/packs/ftc_16cfr255.ttl +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/pack.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/schemas/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/schemas/compliance.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/skills/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/skills/claim_extraction/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/skills/claim_extraction/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/skills/claim_extraction/template.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/skills/compliance_judgment/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/skills/generic_compliance_judgment/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/skills/requirement_extraction/template.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/subgraphs/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/subgraphs/compliance_check.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/subgraphs/compliance_ingestion.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/compliance/subgraphs/requirement_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/capabilities/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/capabilities/clause_exception_linking.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_serve.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/capabilities/contract_kg_store.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/capabilities/graph_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/capabilities/highlight_serve.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/capabilities/property_boosted_retrieval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/capabilities/query_function_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/capabilities/query_understanding.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/corpus/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/corpus/cuad.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/corpus/cuad_ingestion.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/corpus/edgar.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/corpus/gcs_ingestion.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/corpus/selection.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/mcp/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/mcp/intra_document_qa_server.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/mcp/relational_qa_server.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/mcp/session_store.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/ontology/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/ontology/_generated_template_meta.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/ontology/_generated_vocab.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/ontology/clause_template.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/ontology/codegen.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/ontology/contract_bridge.ttl +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/ontology/contract_taxonomy.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/ontology/derive.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/ontology/loader.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/ontology/template_introspect.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/options.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/pack.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/schemas/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/schemas/contract_meta.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/schemas/function.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/schemas/function_routing.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/schemas/highlight.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/schemas/jurisdiction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/schemas/ontology.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/schemas/property.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/schemas/query_intent.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/schemas/value_match.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/skills/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/skills/corpus_ingest/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/skills/extraction_semantic_judge/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/skills/guidance/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/skills/guidance/chunking.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/skills/guidance/generation.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/skills/guidance/relevance.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/boundary.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/clause_function_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/clause_kg_extractor.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/cuad_labels.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/dim_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/dim_fleet.json +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/function_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/function_families.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/hybrid_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/legalbert_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/model_capabilities.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/new_function_labels.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/property_extractor.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/property_grounding.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/reclassify.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/residual_candidates.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/scarce_function_labels.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/segment.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/semantic_judge.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/symbolic_validation.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/spans/tag_clause_extractor.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/subgraphs/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/subgraphs/async_ingestion.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/subgraphs/contract_ingestion_pipeline.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/subgraphs/intra_document_qa.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/subgraphs/query_constraint_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/subgraphs/relational_qa.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/subgraphs/typed_clause_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/contracts/subgraphs/typed_property_retrieval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/packs/reference_seam.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/py.typed +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/skills/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/skills/generation/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/skills/generation/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/skills/rlm/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/skills/rlm/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/skills/rlm/agent.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/skills/span_relevance_judgment/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/skills/vision_to_text/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/skills/vision_to_text/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/spans/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/spans/page_map.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/store/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/store/arcadedb.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/store/chunk_text.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/store/seam.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/subgraphs/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/subgraphs/graph_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/subgraphs/observability.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/subgraphs/scaffold.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/subgraphs/semantic_chunking.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/util/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/util/concurrent.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/util/pdfium.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/src/rag_wright/util/spacy_model.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_agent_chat_model_live.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_answers_exports.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_bytes_ingest.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_capability_reexports.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_decision_swap_doc_example.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_discover.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_documents.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_drop_workspace.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_drop_workspace_live.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_e2e.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_invoke.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_kg.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_mcp.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_metering_tracing_exports.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_model_role_export.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_open_workspace_reconfig.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_options.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_pack_sdk.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_pack_store.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_pdf_page_count.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_public_gaps_ps38.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_usage.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_workspace.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/api/test_workspace_models.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/arch/domain_vocabulary_baseline.json +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/arch/test_doc_references.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/arch/test_engine_domain_vocabulary.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/arch/test_import_contracts.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/arch/test_lock_version.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/arch/test_packs_use_store_primitives.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/arch/test_pdfium_door.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/async_helpers.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/_fixtures/rlm_probe_skill/SKILL.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_answer_generator.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_answer_generator_async.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_assertion_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_authoring_contract.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_chunk_read.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_chunk_write.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_chunking_prompts_neutral.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_claim_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_clause_exception_linking.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_compliance_judgment.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_compliance_store.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_contract_kg_serve.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_contract_kg_store.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_contract_kg_store_reads.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_contract_taxonomy_and_spans.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_dg_adapter.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_dg_async.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_dg_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_dg_model_seam.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_dg_private.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_disambiguation.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_document_scope.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_embedding.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_embedding_profiles.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_entity_resolution.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_entity_rules_plumbing.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_fusion.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_graph_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_graph_query.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_graph_storage.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_highlight_serve.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_hybrid_search.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_jev_decision.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_manifest_validation.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_manifests.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_parsing.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_parties_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_property_boosted_retrieval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_query_function_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_query_understanding.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_registry.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_remote_encoders.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_repair_partition.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_requirement_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_reranking.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_retrieval_core.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_rlm_chunking.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_rlm_chunking_async.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_rlm_method.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_rlm_synthesis.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_runtime_registry.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_scan_quality.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_span_relevance_judgment.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_structural_boundary_discoverer.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_structural_model_fallback.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_tag_boundary_discoverer.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_tiered_ocr.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/capabilities/test_vlm_ocr.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/compliance_fakes.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/conftest.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_canonical_source_doc_id.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_chunk_record.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_compliance.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_cuad_highlight_contracts.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_function.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_function_routing.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_identifiers.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_ingestion_hooks.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_jurisdiction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_ontology.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_property.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_provenance.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/contracts/test_value_match.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/corpus/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/corpus/_ooxml_fixtures.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/corpus/test_canonicalize.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/corpus/test_cuad.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/corpus/test_cuad_ingestion.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/corpus/test_document_parser.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/corpus/test_edgar.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/corpus/test_embedded.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/corpus/test_gcs_ingestion.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/corpus/test_http.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/corpus/test_parse_wire2.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/corpus/test_selection.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/eval/test_contractnli_judge.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/eval/test_cuad_highlight_metrics.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/eval/test_kg_property_rerank.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/eval/test_nl_to_type_metrics.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/eval/test_relational_eval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/evals/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/evals/test_gold_contracts.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/evals/test_gold_import.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/evals/test_langfuse_backend.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/evals/test_runner.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/evals/test_scorer_parity.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/evals/test_scorers_a.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/evals/test_scorers_b.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/evals/test_scorers_c.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/evals/test_scorers_d.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/fixtures/ingestion/segmenter_gold.json +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/fixtures/ingestion/textile_spec_sheet.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/fixtures/ingestion/textile_test_report.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/fixtures/leg_a_silver/README.md +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/fixtures/leg_a_silver/evidence_snapshot.json +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/fixtures/table-bearing-contract.pdf +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/foundation/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/foundation/test_arcadedb_hybrid.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/foundation/test_model_seam_structured.py +0 -0
- {rag_wright-0.9.0/tests/ingestion → rag_wright-0.10.0/tests/harness}/__init__.py +0 -0
- {rag_wright-0.9.0/tests/mcp → rag_wright-0.10.0/tests/ingestion}/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_aevaluate.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_builder.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_chunk_discoverer_hook.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_concurrency_ceiling.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_document_metadata.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_evaluate.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_evaluate_labels.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_layout_segmenter.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_sheet_continuations.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_spreadsheet_content.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_table_rows.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_tuning.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_unit_grouper.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ingestion/test_unit_representative.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/journey/incidents_domain.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/journey/incidents_pack.ttl +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/journey/test_incidents_journey.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/journey/test_pack_schema.py +0 -0
- {rag_wright-0.9.0/tests/models → rag_wright-0.10.0/tests/mcp}/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/mcp/test_compliance_server.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/mcp/test_intra_document_qa_server.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/mcp/test_no_model_supplied_tenant.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/mcp/test_relational_qa_server.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/mcp/test_typed_property_retrieval_server.py +0 -0
- {rag_wright-0.9.0/tests/ontology → rag_wright-0.10.0/tests/models}/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_async_infra.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_classifier_heads_load_clean.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_model_servers.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_models_dir.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_no_gemma_default.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_profile_routing.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_profile_seam.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_seam_async.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_seam_deadline_and_cap.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_seam_event_loops.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_seam_retry.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_seam_stream.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_serving_seam.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_serving_wiring.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_tag_structured.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_tag_structured_async.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_tracing.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/models/test_usage.py +0 -0
- {rag_wright-0.9.0/tests/skills → rag_wright-0.10.0/tests/ontology}/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ontology/test_clause_template.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ontology/test_compliance_ontology_authoritative.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ontology/test_derivation.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ontology/test_entity_taxonomy.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ontology/test_generated_template_meta_in_sync.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ontology/test_generated_vocab_in_sync.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ontology/test_template_captured_in_ttl.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/ontology/test_ttl_is_source_of_truth.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/reference/test_compliance_reference.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/reference/test_contract_seam.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/scripts/test_eval_chunking_ab.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/scripts/test_eval_classifier_ab.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/scripts/test_fetch_reference_models.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/scripts/test_generation_robustness_errors.py +0 -0
- {rag_wright-0.9.0/tests/store → rag_wright-0.10.0/tests/skills}/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/skills/test_creating_evals_skill_example.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/skills/test_ingestion_skill_example.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_boundary.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_classifier_property_extractor.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_clause_classifier_tags_0005.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_clause_function_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_clause_function_classifier_async.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_clause_kg_extractor.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_clause_kg_extractor_async.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_dim_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_dim_fleet_live.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_function_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_hybrid_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_hybrid_property_extractor.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_legalbert_classifier.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_model_capabilities.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_new_function_labels.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_page_map.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_property_extractor.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_property_grounding.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_reclassify.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_residual_decision.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_scarce_function_labels.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_segment.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_segmentation_vocab.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_semantic_judge.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_setfit_clause_adapter.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_setfit_probabilities.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_span_offsets.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_stage_labels_0005.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_symbolic_validation.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/spans/test_tag_clause_extractor.py +0 -0
- {rag_wright-0.9.0/tests/subgraphs → rag_wright-0.10.0/tests/store}/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_affiliation_backfill.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_arcadedb_clause_kg.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_arcadedb_contract.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_arcadedb_property.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_arcadedb_requirement_sources.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_arcadedb_schema.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_arcadedb_span.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_chunk_text.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_concurrent_writes.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_contract_kg_store_live.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_document_metadata_live.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_document_scope.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_engine_domain_neutral.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_entities_by_name.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_kg_edges.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_kg_mutations.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_kg_read.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_kg_write.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_neutral_schema.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_store_create_flag.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/store/test_write_graph_idempotent.py +0 -0
- {rag_wright-0.9.0/tests/util → rag_wright-0.10.0/tests/subgraphs}/__init__.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_async_ingestion.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_chunk7_structure_carry.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_clause_results.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_compliance_check.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_compliance_ingestion.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_contract_ingestion_pipeline.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_contract_ingestion_pipeline_async.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_contract_ingestion_pipeline_graph_async.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_graph_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_ingest_knobs.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_ingest_segment_classify.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_intra_document_qa.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_observability.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_partial_entry_contract.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_query_constraint_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_relational_qa.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_requirement_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_scaffold.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_semantic_chunking.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_typed_clause_extraction.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/subgraphs/test_typed_property_retrieval.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/test_backfill_clause_span_id.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/test_dg_model_ab.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/test_populate_clause_kg.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/test_populate_entity_graph.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/util/test_concurrent.py +0 -0
- {rag_wright-0.9.0 → rag_wright-0.10.0}/tests/util/test_spacy_model.py +0 -0
|
@@ -39,8 +39,8 @@ MCP) follows automatically for invokable kinds; 4b (a bespoke MCP server) is opt
|
|
|
39
39
|
`async def ainvoke(resources, inputs)` (subgraph) / `def <name>(resources, inputs)` (model) in the capability's
|
|
40
40
|
own module. A subgraph factory builds over the opaque `WorkspaceHandle`, never env: its store access with
|
|
41
41
|
`pack_store(resources, YourStore)` (your pack's store extension over the workspace's store) and its models with
|
|
42
|
-
`resources.model_id(role)`; its query embedder with `
|
|
43
|
-
from the workspace's embedding profile) and its options with `resources.config`; a model factory is
|
|
42
|
+
`resources.model_id(role)`; its query embedder with `resources.embedder` (or `workspace_embedder(resources)`, its
|
|
43
|
+
`rag_wright.pack_sdk` twin; built from the workspace's embedding profile) and its options with `resources.config`; a model factory is
|
|
44
44
|
store-independent and ignores `resources`. A builder that takes the store as a keyword goes through `pack_store`
|
|
45
45
|
too: `pack_store(resources, lambda store: production_x(store=store, ...))`. The handle's underscored attributes
|
|
46
46
|
are engine-internal; the reference pack's factories show the public form. The manifest's `impl_ref="module:attr"` points to it. The invoker imports
|
|
@@ -0,0 +1,607 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: building-an-agent-harness
|
|
3
|
+
description: The blueprint for an agent harness over a retrieval engine - the three-tier loop, the eight doors the domain comes through and how to keep it out, tenancy the model cannot reach, human-in-the-loop under replay, what to do when a step does not finish, context and memory management, per-tier reasoning, and where a decision model pays. Load before building or changing a harness, an agent tier, a tool surface, a middleware or a guardrail. Built on DeepAgents/LangGraph; every rule here was paid for by a live run, and the figures were corrected once a real separation measured them.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Building an agent harness over an engine
|
|
7
|
+
|
|
8
|
+
Repository paths in this skill (`docs/`, `scripts/`, `tests/`, `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 harness 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 by a live run**, and the measurements are kept because they are why
|
|
14
|
+
> anybody follows the rule. Where a number appears, it was observed, not estimated.
|
|
15
|
+
>
|
|
16
|
+
> **What is generic and what is yours.** The loop, the error levels, the deadlines, the interrupt protocol,
|
|
17
|
+
> context and memory PLUMBING, metering and the decision taxonomy are generic: they are about running an
|
|
18
|
+
> agent, not about your domain. Your tools, your workers, your reports, your prompts, your tenancy shape,
|
|
19
|
+
> your ledger schema, your continuation types, your model choice and your checkpointer are all yours.
|
|
20
|
+
>
|
|
21
|
+
> **That split is more lopsided than it looks, and the next line is the one to believe.** Separating a
|
|
22
|
+
> 7,514-line harness yielded roughly **1,750 lines of genuinely generic substrate and ~1,900 lines of
|
|
23
|
+
> product code that had to move out of the harness package** -- the rest being prompts and tests. (That
|
|
24
|
+
> first figure was 1,300 when the separation was two thirds done; finishing it moved modules INTO the
|
|
25
|
+
> liftable set, which is the direction to expect.) If you
|
|
26
|
+
> are reading this before building, the payoff is real; if you are reading it to estimate, estimate with
|
|
27
|
+
> the script in the next section and not with this sentence.
|
|
28
|
+
|
|
29
|
+
## FIRST: check whether the engine already SHIPS the substrate
|
|
30
|
+
|
|
31
|
+
**Do not start by building. Start by importing.**
|
|
32
|
+
|
|
33
|
+
```python
|
|
34
|
+
import importlib
|
|
35
|
+
tier = importlib.import_module("rag_wright.harness") # ModuleNotFoundError -> build; otherwise consume
|
|
36
|
+
print(sorted(tier.__all__))
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**From `rag-wright` 0.10.0 the engine ships it** as `rag_wright.harness`, its third public tier (ADR-0139,
|
|
40
|
+
PS-32): the separation was handed over and adopted, and the tier declares `__all__` (reference:
|
|
41
|
+
`docs/api/harness.md`). On an older engine the import raises `ModuleNotFoundError` and everything below applies
|
|
42
|
+
as instructions. On 0.10.0 or later, **consume the tier**: most of this skill becomes background reading, and
|
|
43
|
+
following it as instructions means hand-building several thousand lines the engine ships and maintains. A
|
|
44
|
+
product declares an `AgentDefinition` (its `ToolSurface`, planning split, workers, context type satisfying
|
|
45
|
+
`RunScope`, retry set, model id, `AgentPrompts`, rules and decision points) and runs it through `start_run` /
|
|
46
|
+
`resume_run` / `stream_run`.
|
|
47
|
+
|
|
48
|
+
So check, every time, and pin what you find:
|
|
49
|
+
|
|
50
|
+
- **Record the tier's surface the way you record the engine's API**, in whatever file already holds that
|
|
51
|
+
pin, and fail your suite when reality disagrees with the record **in either direction**. A guard that
|
|
52
|
+
*skips* while the tier is absent is a guard that never runs -- and the absent state passes trivially, so
|
|
53
|
+
drive it into the published state once with a planted module or you have tested nothing.
|
|
54
|
+
- **Require the tier to declare `__all__`.** An undeclared surface makes every import a guess about what
|
|
55
|
+
is public, and under an editable or path dependency an unreleased name is indistinguishable from a
|
|
56
|
+
released one. That mistake has been made twice here.
|
|
57
|
+
- **Build the guard BEFORE you consume the tier.** One written after the first import is shaped to agree
|
|
58
|
+
with whatever you happened to import.
|
|
59
|
+
|
|
60
|
+
**What stays yours either way** is the list in the preamble above, and it does not shrink because the
|
|
61
|
+
substrate arrives pre-built: your tools, workers, prompts, tenancy shape, ledger, continuations, model
|
|
62
|
+
choice and checkpointer. **The sections below on the eight doors, tenancy the model cannot reach, the
|
|
63
|
+
replay rule, and the decision registry apply unchanged to a harness you consume** -- they are about what
|
|
64
|
+
you hand the substrate, not about how the loop is written.
|
|
65
|
+
|
|
66
|
+
**And the second product (build order step 4) survives the tier's arrival with its question inverted.**
|
|
67
|
+
Building, it asks *"did I write this generically?"* Consuming, it asks *"does the engine's tier actually
|
|
68
|
+
satisfy my seams?"* -- which is the cheaper question and the one you can answer in an afternoon, so there
|
|
69
|
+
is no version of this where writing that fake product is wasted.
|
|
70
|
+
|
|
71
|
+
## The thesis, measured -- and CORRECTED, which is the first lesson
|
|
72
|
+
|
|
73
|
+
**An earlier version of this skill said "32 modules, 7,514 lines, and only THREE import anything from the
|
|
74
|
+
product." That was wrong, and it is worth knowing how wrong before you trust anything else here.** When the
|
|
75
|
+
harness was actually separated, module by module, the figures were:
|
|
76
|
+
|
|
77
|
+
| claimed | measured |
|
|
78
|
+
|---|---|
|
|
79
|
+
| 3 modules import product code | **13** (6 of them a domain package) |
|
|
80
|
+
| 21 name no domain concept | **18** |
|
|
81
|
+
| "turning three imports into protocols, not a refactor" | **~1,900 lines of product code to move** |
|
|
82
|
+
|
|
83
|
+
The claim had been made by counting the *kinds* of door rather than the modules that walk through them, and
|
|
84
|
+
it was repeated into a downstream ADR before anybody re-measured. **If you take one thing from this
|
|
85
|
+
section: a separability claim you have not derived with a script is a guess, and it will be believed.**
|
|
86
|
+
|
|
87
|
+
What actually came out of a 7,514-line harness when it was separated: the tool registry and tool surface
|
|
88
|
+
(1,129 lines), the worker roster with its domain prompts and reports (226), the continuation types and
|
|
89
|
+
their renderer (308), the planning classification, the ledger schema, a vendor and model name, a database
|
|
90
|
+
driver, and a context type encoding the product's tenancy. **Not "mostly prompt text."**
|
|
91
|
+
|
|
92
|
+
What genuinely stayed generic, and did lift: the loop, dispatch, error levels and deadlines, retry
|
|
93
|
+
composition, the interrupt protocol, checkpoint and memory plumbing, tracing, the decision taxonomy, the
|
|
94
|
+
worker-spec builder, the report envelope. That half is real and worth the work. Finished, it was **13
|
|
95
|
+
modules and about 1,750 lines** of the 7,500 -- measured on the three axes intersected, which is the only
|
|
96
|
+
figure worth quoting because each axis alone credits modules the others fail.
|
|
97
|
+
|
|
98
|
+
## The import guard is NECESSARY and NOT SUFFICIENT -- three axes, and a second product
|
|
99
|
+
|
|
100
|
+
**This is the section the rest of the skill was missing, and its absence cost a full separation's worth of
|
|
101
|
+
rework.** "No harness module imports the retrieval primitives" is a good rule and a cheap test. It is also
|
|
102
|
+
blind to most of what actually ties a harness to one product:
|
|
103
|
+
|
|
104
|
+
| axis | question | what it caught |
|
|
105
|
+
|---|---|---|
|
|
106
|
+
| 1. imports | does a module import product code? | the obvious half |
|
|
107
|
+
| 2. vocabulary | does its CODE name a domain concept? | prompts and reports, with comments and docstrings stripped |
|
|
108
|
+
| 3. **deployment, vendor, tenancy** | does it carry a choice only THIS product made? | everything the first two missed |
|
|
109
|
+
|
|
110
|
+
Axis 3 is the one nobody writes. In a harness that passed axes 1 and 2 cleanly it found: a module
|
|
111
|
+
hardcoding `"openai:qwen/..."` and an `is_openrouter()` helper; a module importing `psycopg` and converting
|
|
112
|
+
a connection URL; four modules keying memory and ledgers on a `(customer, workspace)` pair; and -- the
|
|
113
|
+
sharpest -- **the context type every agent is built with, declaring `customer_id` and `workspace_id` as
|
|
114
|
+
fields.** A product with one tenancy level, or three, could not fill it.
|
|
115
|
+
|
|
116
|
+
**And axis 3's own first implementation was blind to that last one**, because it matched call shapes
|
|
117
|
+
(`f(customer_id=..., workspace_id=...)`) and not field declarations (`customer_id: UUID`). The most central
|
|
118
|
+
instance of the thing it checked for scored zero. **Match declarations too.**
|
|
119
|
+
|
|
120
|
+
### None of the three measures the thing you actually want
|
|
121
|
+
|
|
122
|
+
All three ask *"is the substrate coupled to this product?"* -- a necessary condition. None can ask *"is what
|
|
123
|
+
the substrate asks for usable by someone who is NOT this product?"* Those come apart, and the gap is where
|
|
124
|
+
a bad seam hides: handing the substrate three pre-computed sets scores perfectly on every axis while
|
|
125
|
+
letting the next product supply three that disagree with each other.
|
|
126
|
+
|
|
127
|
+
**So write a second product. On day one, before the seams exist.**
|
|
128
|
+
|
|
129
|
+
A ~200-line fake product in a domain with nothing in common with yours -- ours was fabric composition
|
|
130
|
+
against a legal-contract harness -- implementing each seam as it stands. Hermetic: no model, no store, no
|
|
131
|
+
credentials. Mark what it cannot do yet as `xfail(strict=True)` so a gap that closes without its exemption
|
|
132
|
+
being removed fails.
|
|
133
|
+
|
|
134
|
+
It is the cheapest high-value test in the whole harness. In one separation it caught, each time before the
|
|
135
|
+
code shipped:
|
|
136
|
+
|
|
137
|
+
- a seam design that would have let a second product state a tier split inconsistent with its own
|
|
138
|
+
classification -- it scored perfectly on all three axes;
|
|
139
|
+
- the context type encoding the first product's tenancy;
|
|
140
|
+
- a surface contract gaining a parameter (`build(..., only=)`) that an outside implementer could not have
|
|
141
|
+
known about;
|
|
142
|
+
- a required member added to a definition object, which every product must now supply.
|
|
143
|
+
|
|
144
|
+
**The rule it encodes: when a seam changes, change the fake product FIRST.** If that is awkward, the seam is
|
|
145
|
+
wrong.
|
|
146
|
+
|
|
147
|
+
## The doors the domain comes through -- there are EIGHT, not three
|
|
148
|
+
|
|
149
|
+
**An earlier version of this section said three.** When the harness was separated, these are what actually
|
|
150
|
+
had to become seams or move. Build them as doors from the start and the separation is bookkeeping; discover
|
|
151
|
+
them later and each one is a refactor with its own test fallout:
|
|
152
|
+
|
|
153
|
+
| door | shape that worked |
|
|
154
|
+
|---|---|
|
|
155
|
+
| the tool surface | one object: `build(context, resources, only=None)` + `exposed_names` |
|
|
156
|
+
| the worker roster | a tuple of factories, passed in |
|
|
157
|
+
| which operations need PLANNING | declared by the product; the substrate DERIVES the direct surface from it |
|
|
158
|
+
| the context type | a `runtime_checkable` protocol whose member is `scope: tuple[str, ...]` |
|
|
159
|
+
| accounting | an object with `collecting()`, `record(...)`, `trace_metadata` |
|
|
160
|
+
| the checkpointer | built by the product, accepted by the substrate |
|
|
161
|
+
| resuming a suspended run | the continuation renders ITSELF; the substrate asks |
|
|
162
|
+
| the agent's chat model | from the engine's model profile, never a string in the substrate |
|
|
163
|
+
|
|
164
|
+
**Collect them into ONE object the substrate is handed** -- we called it `AgentDefinition`, carrying the
|
|
165
|
+
tool surface, the planning classification, the worker roster and the context type. Four declared facts, and
|
|
166
|
+
**the substrate derives everything else**.
|
|
167
|
+
|
|
168
|
+
That last clause is the whole trick. The alternative -- let the product pass the derived sets too -- is a
|
|
169
|
+
smaller diff and scores perfectly on every axis, and it exports an invariant as a convention the next
|
|
170
|
+
product can break silently. **If a value follows from two others, derive it on the substrate side.**
|
|
171
|
+
|
|
172
|
+
### Three doors are still worth building first
|
|
173
|
+
|
|
174
|
+
Build these three and most of the rest follows:
|
|
175
|
+
|
|
176
|
+
1. **The tool surface, DERIVED from your operation set.** Never hand-list it. A hand-written manifest
|
|
177
|
+
silently omits the operation somebody added last week, and nothing fails: the capability exists, is
|
|
178
|
+
routed, is tested, is reachable by API, and the agent simply cannot see it. Derive it, and assert exact
|
|
179
|
+
equality against the operation registry.
|
|
180
|
+
2. **A tenant-bound facade over the primitives.** One object, built per run from the run's own context,
|
|
181
|
+
exposing moves the agent can recombine. The harness imports the facade and nothing below it. Two guards:
|
|
182
|
+
no method of the facade takes a tenancy key or a document scope, and every primitive that accepts a scope
|
|
183
|
+
is reachable *only* through the facade.
|
|
184
|
+
3. **The prompts.** One per tier, plus the workers' skills.
|
|
185
|
+
|
|
186
|
+
**The facade is not a tool, deliberately.** If the manifest is derived from the operation set in exact
|
|
187
|
+
equality, a facade move exposed as a tool would be a tool with no operation behind it and the ratchet would
|
|
188
|
+
rightly refuse it. The facade is for composition - what the orchestrator runs in code and what a worker
|
|
189
|
+
recombines - not for prompt-directed calling. Both properties hold because they are about different surfaces.
|
|
190
|
+
|
|
191
|
+
> **Caveat, and it is an honest one: in the harness this came from, the facade was never wired.** It was
|
|
192
|
+
> built, specified against two requirements, covered by eight tests -- and across the whole project nothing
|
|
193
|
+
> ever called it. Its bridge function had no production caller at all; the tests were the only exerciser,
|
|
194
|
+
> which is why that went unnoticed for months.
|
|
195
|
+
>
|
|
196
|
+
> **So build the facade when a tier actually needs to recombine moves in code, not because this skill lists
|
|
197
|
+
> it.** And if you build it early, put one assertion somewhere that a production path reaches it: a
|
|
198
|
+
> green test suite over an unwired component looks exactly like a working feature.
|
|
199
|
+
|
|
200
|
+
## Tenancy the model cannot reach
|
|
201
|
+
|
|
202
|
+
**The tenant never appears in a tool signature.** Pass it through the framework's injected runtime, which is
|
|
203
|
+
excluded from the schema sent to the model:
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
search(question, runtime: ToolRuntime) model sees -> ['question']
|
|
207
|
+
search(question, workspace_id: str) model sees -> ['question', 'workspace_id'] <- the leak
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
That is not stylistic. **In a product like this the documents are adversarial by origin** - somebody outside
|
|
211
|
+
your company wrote them - so an identifier the model can name is one an injected instruction inside an
|
|
212
|
+
uploaded document can name too. The same rule covers the system prompt and any event you stream to a client:
|
|
213
|
+
a workspace id in a prompt is a workspace id a document can quote back.
|
|
214
|
+
|
|
215
|
+
**Ids, not rows.** The context is serialized into the graph on every invocation. A run has no business
|
|
216
|
+
carrying a customer's billing status or a user's password hash past the model.
|
|
217
|
+
|
|
218
|
+
### Memory: four scopes, and the factory must REFUSE rather than fall back
|
|
219
|
+
|
|
220
|
+
| path | namespace | writable |
|
|
221
|
+
|---|---|---|
|
|
222
|
+
| per-workspace | `(customer, workspace, "memories")` | by the run |
|
|
223
|
+
| per-customer | `(customer, "memories")` | yes: facts true of the customer |
|
|
224
|
+
| product-authored | shipped with the product | **no** |
|
|
225
|
+
| anything else | ephemeral, for the life of the run | n/a |
|
|
226
|
+
|
|
227
|
+
**Read your library's fallback before trusting it.** The one here, given no namespace factory, falls back to
|
|
228
|
+
a legacy path returning either an agent-scoped namespace or **a single global one**. Both are catastrophic
|
|
229
|
+
and neither raises: one global namespace is every customer's memory merged silently, and an agent-scoped one
|
|
230
|
+
is shared across every user of the agent by construction - the shape library docs warn about, *"if one user
|
|
231
|
+
can write to memory that another user reads, a malicious user could inject instructions into shared state."*
|
|
232
|
+
|
|
233
|
+
**So forgetting the factory is not a crash; it is a cross-tenant merge that looks like everything working.**
|
|
234
|
+
Make the factory read the run context and raise when there is none.
|
|
235
|
+
|
|
236
|
+
**Authored knowledge and learned memory live in separate namespaces.** A skill is a file you wrote and
|
|
237
|
+
reviewed. Memory is what an agent noticed. Promoting one customer's observation into another's run is the
|
|
238
|
+
failure that separation exists to prevent, and it is a mechanism, not a tidiness preference.
|
|
239
|
+
|
|
240
|
+
## One entry point, because context is PER-INVOCATION
|
|
241
|
+
|
|
242
|
+
Runtime context is per-invocation, not per-thread: **a resume that omits it wakes every tool with a null
|
|
243
|
+
context.** Combine that with the memory fallback above and a forgetful resume reads and writes another
|
|
244
|
+
tenant's memory, silently, at the moment a human approved an action.
|
|
245
|
+
|
|
246
|
+
A rule saying "always pass the context" is obeyed until the first refactor. **Make the call site incapable of
|
|
247
|
+
omitting it:** one or two functions that take the authenticated principal, build the context themselves, and
|
|
248
|
+
expose no parameter through which a caller could supply a different one. Then guard it - nothing else may
|
|
249
|
+
invoke an agent, and nothing outside the package may build one.
|
|
250
|
+
|
|
251
|
+
## Tiers: three, and the direct surface is a requirement
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
user <-> CHAT-MANAGER conversation, threads, UI context, direct tools for unambiguous asks
|
|
255
|
+
|
|
|
256
|
+
+-- ORCHESTRATOR planning, decomposition, fan-out, re-planning
|
|
257
|
+
|
|
|
258
|
+
+-- WORKERS one skill, few tools each
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**The chat-manager's direct tools are not an optimisation.** Three tiers means three agents making model
|
|
262
|
+
calls before any tool runs, and routing *"list my documents"* through all three is latency and cost on the
|
|
263
|
+
commonest path. A model must never sit in the path of an unambiguous request.
|
|
264
|
+
|
|
265
|
+
**The split is a SUBSET, never a partition.** The orchestrator holds everything; the chat-manager holds the
|
|
266
|
+
half that needs no planning. *An operation the orchestrator cannot see is a plan it cannot make.*
|
|
267
|
+
|
|
268
|
+
**And the split is a judgement, so write it down rather than dressing it up as a derivation.** The tempting
|
|
269
|
+
rule - "an operation that names a model or a retrieval graph is a planning operation" - separates the set
|
|
270
|
+
correctly today and is a **proxy**: it misclassifies an operation that takes a judge under another name, and
|
|
271
|
+
one that traverses the graph through injected callables while belonging on the direct path. Write the split
|
|
272
|
+
down, ratchet that every exposed operation lands in exactly one half, and keep the proxy as a cross-check.
|
|
273
|
+
|
|
274
|
+
**Name the limitation out loud: the routing decision is itself a model call and there is no structural way to
|
|
275
|
+
make it.** One model call then a direct tool is what you want; whether the model takes the direct path is
|
|
276
|
+
measured, not asserted.
|
|
277
|
+
|
|
278
|
+
## Take the tool away. Do not ask the model not to use it.
|
|
279
|
+
|
|
280
|
+
**This is the single most repeated lesson in this harness**, and it has four faces:
|
|
281
|
+
|
|
282
|
+
- **A prompt saying "do not ask" is a suggestion; a tool the worker was never given is a fact.** Workers do
|
|
283
|
+
not hold the escalation tool at all, so escalating is structurally the orchestrator's decision.
|
|
284
|
+
- **Remove the parameter rather than warn about it.** One warning repeated in four places was obeyed zero
|
|
285
|
+
times in four runs; taking the parameter away fixed what a fifth instruction would not.
|
|
286
|
+
- **A bound is a count, not a request.** A tier that re-delegates the same work reads back *"complete,
|
|
287
|
+
nothing further needed"* and delegates again: measured **3 times with reasoning on, 24 times with it off**.
|
|
288
|
+
The right answer is 1, occasionally 2. Both numbers are the model's judgement, so choosing between
|
|
289
|
+
reasoning settings only picks which failure you prefer. A dispatch past the bound never runs - no model
|
|
290
|
+
call, no subagent, no second copy of a reply the tier already has. Twenty-three of those twenty-four were
|
|
291
|
+
pure waste.
|
|
292
|
+
- **Withholding is a MIDDLEWARE concern, not a model-profile one.** A provider profile keys on the *model*,
|
|
293
|
+
and every tier runs the same model - so excluding a tool there strips it from the tier that needs it. A
|
|
294
|
+
middleware is attached to a tier, which is the only seam that can say "this agent cannot do X".
|
|
295
|
+
|
|
296
|
+
Two further details that look optional and are not. **Hide the schema AND refuse the call**: filtering this
|
|
297
|
+
turn's tool list does not cover a call arriving from replayed history or a resumed run. And **a refusal is a
|
|
298
|
+
signpost, not a wall**: a bare "not found" invited seven more wrong guesses in one run; hand the tier back
|
|
299
|
+
what the earlier attempt returned and tell it to answer from that. Return a tool message, never an
|
|
300
|
+
exception - an exception reaches the error middleware, finds nothing in the taxonomy, and kills a run that
|
|
301
|
+
had merely taken a wrong turn.
|
|
302
|
+
|
|
303
|
+
## When a step does not finish: a bound says STOP, a policy says WHAT INSTEAD
|
|
304
|
+
|
|
305
|
+
Four observed failures, and the sequence of getting them wrong is the lesson:
|
|
306
|
+
|
|
307
|
+
| observed | what bounded it | what is left afterwards |
|
|
308
|
+
|---|---|---|
|
|
309
|
+
| a worker re-dispatched after it had answered and stated its coverage: 2 dispatches, 325.9s | nothing; the run was working | **not a completion failure at all** - a wrong DECISION |
|
|
310
|
+
| the whole-turn deadline killed a run that had already produced correct results | our own clock | **the finished work is in the checkpoint** |
|
|
311
|
+
| the caller's ceiling fired at 555s of a 900s budget | the CALLER's clock | **the finished work is in the checkpoint** |
|
|
312
|
+
| the grading deadline burned re-asking a model that had just timed out | retries exhausted | **nothing at all** |
|
|
313
|
+
|
|
314
|
+
**First conclusion: "these are all one bug" was wrong.** Grouping a decision failure with three completion
|
|
315
|
+
failures made one policy look sufficient for all four. Drive each one with a fault injector and inspect the
|
|
316
|
+
aftermath separately.
|
|
317
|
+
|
|
318
|
+
**Second conclusion, and it saves you a component: the finished work is UNREAD, not LOST.** Two of the four
|
|
319
|
+
leave the worker's correct answer verbatim in the checkpoint as a tool message. So "proceed with what
|
|
320
|
+
returned, report the gap" is a **read-and-report over state you already persist**, not a progress store that
|
|
321
|
+
needs designing.
|
|
322
|
+
|
|
323
|
+
**Third: the row that leaves nothing needs its own answer.** A policy that assumed partial progress would
|
|
324
|
+
render an empty result as a partial answer, which is worse than failing. "Nothing came back" must be
|
|
325
|
+
reportable as exactly that.
|
|
326
|
+
|
|
327
|
+
**Error levels, by who fixes it.** Transient failures retry; tool failures reach the model as a message it
|
|
328
|
+
can act on; missing information interrupts for a human; anything unexpected reaches a developer. Runaway
|
|
329
|
+
loops are capped - and cap model calls and tool calls per run, ending with what you have rather than raising,
|
|
330
|
+
so a partial answer still reaches the user.
|
|
331
|
+
|
|
332
|
+
**Composition order is load-bearing.** Retry middleware goes INNER, configured so exceptions reach the
|
|
333
|
+
error middleware. The other way round, a tool failure is converted to a message before the retry ever sees
|
|
334
|
+
it, and the transient level quietly never fires. Read your library's own note on ordering; it is usually
|
|
335
|
+
documented and usually ignored.
|
|
336
|
+
|
|
337
|
+
**Which failures are recoverable is product knowledge.** Keep the taxonomy in the product and the wrapping in
|
|
338
|
+
the harness.
|
|
339
|
+
|
|
340
|
+
## Human in the loop: the replay rule governs everything
|
|
341
|
+
|
|
342
|
+
**Interrupting suspends the run, and resuming REPLAYS THE NODE FROM THE START.** Pin it in a test: a node
|
|
343
|
+
that prints before and after its interrupt yields `["before", "before", "after"]`, on a fake tier and a live
|
|
344
|
+
one.
|
|
345
|
+
|
|
346
|
+
So a tool that spends money, writes a row or sends a message before its question does it **once on the way in
|
|
347
|
+
and again on the way back**, silently, because the second pass looks identical to the first.
|
|
348
|
+
|
|
349
|
+
**The rule: gather the arguments, interrupt, act only afterwards.** Take it to its conclusion - make the
|
|
350
|
+
asking tool do nothing but ask, so there is no "afterwards" to get wrong, and read the function body in a
|
|
351
|
+
test to keep it that way.
|
|
352
|
+
|
|
353
|
+
**A question is a tool, not a middleware gate.** Gating a tool the model already chose is right for "may I do
|
|
354
|
+
this?" and wrong for "which of these did you mean?". A clarification is something the model decides it needs,
|
|
355
|
+
so it must be something the model can reach for.
|
|
356
|
+
|
|
357
|
+
**Batch the questions one tier up.** Five workers each asking directly is *correct* and also terrible: five
|
|
358
|
+
interruptions arrive one at a time, each stopping everything, with no sign another is behind it. A worker
|
|
359
|
+
that would ask instead reports "blocked, I need X" through its structured result, and the orchestrator asks
|
|
360
|
+
once. The less obvious benefit is bigger: a need that reaches the orchestrator can often be answered *by* the
|
|
361
|
+
orchestrator, which already knows what the conversation settled on, and never troubles the user at all.
|
|
362
|
+
|
|
363
|
+
**Never bridge the asking tool into a code interpreter.** A question raised from inside a loop re-runs the
|
|
364
|
+
whole program on resume - every tool call it had already made, again, with nothing on screen to say so.
|
|
365
|
+
|
|
366
|
+
**And a changed subject is confirmed deterministically, never adopted silently.** The user runs one query,
|
|
367
|
+
navigates to another, types "what about this one?", and every word of the answer is fluent, cited, and about
|
|
368
|
+
the wrong object. **Asking the model to notice it is asking the failure to detect itself.** Compare the
|
|
369
|
+
incoming view against the one the thread last confirmed, before the model runs, with the last-confirmed value
|
|
370
|
+
in the checkpoint so it survives the process that started the thread.
|
|
371
|
+
|
|
372
|
+
**A continuation payload is a claim, not permission.** *"A sweep over documents A, B and C"* says what the
|
|
373
|
+
user was looking at; it does not authorise reading A, B and C. It arrives from a browser and is then read by
|
|
374
|
+
a model, so it is untrusted twice. Re-ask every identifier of the workspace through the choke point you
|
|
375
|
+
already have, keep what survives, and treat the rest as **absent rather than refused** - a stale bookmark is
|
|
376
|
+
not an error, and raising would put a foreign identifier on the model's path inside a recoverable error.
|
|
377
|
+
|
|
378
|
+
## Context management, four mechanisms
|
|
379
|
+
|
|
380
|
+
1. **One per-run record of what was already asked.** Across every recorded run - 194 tool calls - **25 were
|
|
381
|
+
byte-identical repeats**: same tool, same arguments, a second real retrieval for an answer already in the
|
|
382
|
+
transcript. Answer an identical call from the record so the operation never runs and the payload never
|
|
383
|
+
re-enters the context. Three rules: **opt-IN only** (a job's status changes while the run watches it, and
|
|
384
|
+
an asking tool must reach a person every time); key it on the **run**, not the dispatch (a worker
|
|
385
|
+
re-dispatched asks the same question in different words, and a dispatch-scoped record matches nothing);
|
|
386
|
+
and remember that what prevents a wrong answer is the **subject** check, not which brief did the asking.
|
|
387
|
+
2. **Progressive disclosure for the rare procedure.** What a tier needs on every turn belongs in its prompt
|
|
388
|
+
and must stay decisive at the margin. What it needs occasionally - how to batch a clarification, which
|
|
389
|
+
arises only when a worker comes back blocked - belongs in a skill it sees as a name and one line until it
|
|
390
|
+
applies. **The distinction is frequency, not importance.**
|
|
391
|
+
3. **Reference over value.** A surviving identifier is re-fetched by the agent, not snapshotted into the
|
|
392
|
+
prompt: fresh, re-scoped on every fetch, and an id rather than a results array.
|
|
393
|
+
4. **Structural caps, labelled as such.** Size limits on a payload exist so an oversized one is refused
|
|
394
|
+
visibly rather than trimmed silently. How big a summary *should* be is measured, not guessed - say which
|
|
395
|
+
kind of number you have written down.
|
|
396
|
+
|
|
397
|
+
## Reasoning is a per-TIER decision, and the measurement is stark
|
|
398
|
+
|
|
399
|
+
Same question, same tools, same model, only the reasoning flag differing:
|
|
400
|
+
|
|
401
|
+
| | duration | output tokens | reasoning tokens | tool chosen |
|
|
402
|
+
|---|---|---|---|---|
|
|
403
|
+
| reasoning ON | **34.8s** | 1,812 | **1,905** | the same one |
|
|
404
|
+
| reasoning OFF | **4.3s** | 42 | 0 | the same one |
|
|
405
|
+
|
|
406
|
+
**Identical decision, 8x the wall clock, 43x the output.** With no cap the reasoning is unbounded, so one
|
|
407
|
+
turn can outlive its own attempt deadline - and the retry reasons just as long, so it fails again. That is
|
|
408
|
+
how one evaluation item burned three consecutive attempts and died, and why **68% of a run's wall clock** was
|
|
409
|
+
attempts abandoned before they returned. The cost was invisible until abandoned attempts appeared in the
|
|
410
|
+
trace at all.
|
|
411
|
+
|
|
412
|
+
**Again a middleware, not a profile**, for the same reason as withholding: the profile keys on the model and
|
|
413
|
+
every tier shares it. And **merge the model settings rather than replacing them**: binding replaces the whole
|
|
414
|
+
value, so writing the reasoning flag alone drops the endpoint pin and the usage reporting that came with it.
|
|
415
|
+
Nothing fails. The variance simply comes back wearing the pin's name.
|
|
416
|
+
|
|
417
|
+
**Do not over-claim from one arm.** One question, one sample, one tier justifies turning reasoning off for
|
|
418
|
+
*that* tier. The planning tier's job is decomposition and its decisions are the hardest; leave it thinking
|
|
419
|
+
until you have measured it.
|
|
420
|
+
|
|
421
|
+
## Durability and metering
|
|
422
|
+
|
|
423
|
+
**Checkpoint into the database you already run, in its own schema.** A suspended run must outlive the
|
|
424
|
+
process that started it, and a deploy is a reload the user did not ask for - so an in-memory saver loses
|
|
425
|
+
every run awaiting a human approval. The real cost is not the driver, it is **schema ownership**: a
|
|
426
|
+
checkpointer that creates unqualified tables where your migration autogenerator is looking will produce a
|
|
427
|
+
`drop_table` for them, and a routine migration deletes every suspended run. Their own schema makes them
|
|
428
|
+
unreflected.
|
|
429
|
+
|
|
430
|
+
**Zero is a measurement; absent is not.** Record a measured zero - an agent that answered from its own
|
|
431
|
+
context still spent planning tokens. Never record an **unmeasured** run as zero: a row of zeros asserts free
|
|
432
|
+
work. **Record wall-clock duration even when cost is unmeasurable**, because a self-hosted deployment bills
|
|
433
|
+
by the second and duration is the one input that makes the run apportionable later - and it cannot be
|
|
434
|
+
backfilled. **A ledger failure never fails the run.**
|
|
435
|
+
|
|
436
|
+
**One session identifier per run**, so usage can be correlated back by it. Without that the reader falls back
|
|
437
|
+
to summing a time window and attributes anything else running at that moment to this caller - unusable the
|
|
438
|
+
moment two people ask a question at once. Gate tracing on real **configuration**, never on a package being
|
|
439
|
+
importable, and make every telemetry touch degrade to a no-op.
|
|
440
|
+
|
|
441
|
+
**The event contract is yours, not the framework's.** Forwarding raw chunks makes your client depend on node
|
|
442
|
+
names, and every middleware change becomes a front-end change. Translate into a small named set of events.
|
|
443
|
+
Put no tenancy in them - a streamed frame is more exposed than a prompt.
|
|
444
|
+
|
|
445
|
+
## Decisions: enumerate them, and say what decides each one TODAY
|
|
446
|
+
|
|
447
|
+
**A wrong decision is a stop-the-line event, and rarity is not a defence.** A decision that is wrong once in
|
|
448
|
+
fifty runs is a decision you do not control, and it will be wrong in front of a customer on the run that
|
|
449
|
+
matters. Routing, classification, dispatch, escalation and guardrail verdicts are all decisions.
|
|
450
|
+
|
|
451
|
+
So keep a registry of decision points, and give each one **four distinguishable states**, because collapsing
|
|
452
|
+
them is how gaps get miscounted in both directions:
|
|
453
|
+
|
|
454
|
+
| state | meaning |
|
|
455
|
+
|---|---|
|
|
456
|
+
| recorded | something decides it and we can see what it chose |
|
|
457
|
+
| **a real recording gap** | something decides it and nothing records it |
|
|
458
|
+
| left out on purpose | recording it here would duplicate a fact owned elsewhere - say so, with the reason |
|
|
459
|
+
| **no decider yet** | nothing makes this decision at all; name what would have to exist first |
|
|
460
|
+
|
|
461
|
+
**The last state is the one worth the effort.** An observer for a decision nobody takes records the model's
|
|
462
|
+
implicit guess as though a guardrail had ruled on it. In this harness the content-safety point was attributed
|
|
463
|
+
to "a guardrail" that measurably did not exist: every mention of injection was prose in a system prompt, the
|
|
464
|
+
only typed exception was a boundary backstop whose own docstring said it should be unreachable, and the
|
|
465
|
+
behaviour was exercised only by a test outside the harness. **Build the decider first; the observation is
|
|
466
|
+
then trivial.**
|
|
467
|
+
|
|
468
|
+
**Say plainly what decides each point today, and resist the flattering answer.** In this harness, after a
|
|
469
|
+
full phase of work: no decision model anywhere in the loop, so most points are plain model turns where *a
|
|
470
|
+
51% call and a 99% call are indistinguishable in the output*. Exactly one point returned a real confidence,
|
|
471
|
+
because a tool decided it. That asymmetry is the argument for a decision model, and it only becomes visible
|
|
472
|
+
if the registry is honest.
|
|
473
|
+
|
|
474
|
+
**Where a decision model pays, and where it must never go.** Points that are a model's implicit judgement
|
|
475
|
+
with a small fixed option space - delegate or answer, which workers, accept or re-dispatch, escalate or
|
|
476
|
+
proceed - are candidates, and the registry doubles as the labelled corpus for training one, provided the
|
|
477
|
+
decisions are recorded. **A point already decided by a typed allow-list stays deterministic: replacing a
|
|
478
|
+
deterministic check with a probabilistic one is a regression however fast it is.** Shadow-mode first, always.
|
|
479
|
+
|
|
480
|
+
**Derive a decision from what the tier DID, never from what the model announces.** A model asked to report
|
|
481
|
+
its own decision reports an intention.
|
|
482
|
+
|
|
483
|
+
## Grading your own runs
|
|
484
|
+
|
|
485
|
+
**Keep each rule as ONE object holding both the sentence the model reads and the question the grader is
|
|
486
|
+
asked.** They are deliberately different sentences for different readers - the model is told what to do, the
|
|
487
|
+
grader is asked what happened - and keeping them on one object is what stops them drifting into two copies of
|
|
488
|
+
one decision. Record on the same object where the instruction is actually delivered, because it is not always
|
|
489
|
+
a prompt: one rule here is delivered as a signpost returned on the wrong call, and a registry assuming
|
|
490
|
+
"instruction equals prompt line" would have misrepresented that.
|
|
491
|
+
|
|
492
|
+
**The detectors are the grader's TOOLS.** A grader asked *"was the worker dispatched once per question?"* can
|
|
493
|
+
be wrong; one handed a function that counts cannot. Of six rules here, **five have a deterministic detector**
|
|
494
|
+
and the sixth - whether a dispatch restated the user's request faithfully - is the only genuine judgement.
|
|
495
|
+
Keep detector-less rules rare, and know which they are.
|
|
496
|
+
|
|
497
|
+
**Write your own grading middleware rather than subclassing a framework's.** Ours used about a quarter of the
|
|
498
|
+
library's and fought the rest: the rubric lived on a shared graph key that two parallel workers cannot both
|
|
499
|
+
write (a hard concurrent-update error that presented as a **hang** and cost three live runs to name), the
|
|
500
|
+
grader was built with a bare factory so none of our middleware reached it - no retry policy, no deadline, no
|
|
501
|
+
one-answer-per-turn, which is how one grader emitted **307 identical detector calls in a single response** -
|
|
502
|
+
and a quarter of its body was revision machinery we deliberately did not use.
|
|
503
|
+
|
|
504
|
+
**Grade on a bounded clock, and a failed grade abandons the GRADE, never the run.** Give the grading pass its
|
|
505
|
+
own wall clock *and* a per-attempt clock inside the retry: without the inner one a slow call is
|
|
506
|
+
unabandonable, eats the whole budget, and reports as "passed its deadline".
|
|
507
|
+
|
|
508
|
+
**Your transcripts are adversarial by origin**, because they quote documents somebody else wrote. Fence the
|
|
509
|
+
rules, the transcript and the verdict with a per-pass nonce and escape the closer: a rubric a document can
|
|
510
|
+
impersonate is worse than no rubric.
|
|
511
|
+
|
|
512
|
+
## Framework contract drift is silent, and behaviour is the only detector
|
|
513
|
+
|
|
514
|
+
Four observed, each with a green structural suite at the time:
|
|
515
|
+
|
|
516
|
+
- **structured output became an optional tool the model may decline.** A minor version change wrapped it in a
|
|
517
|
+
strategy with no forcing; all three graders ended normally with no structured response, and the run scored
|
|
518
|
+
zero on an answer that was correct. **Asking for a nonce-fenced block and parsing it yourself removes the
|
|
519
|
+
failure by construction** - a model always emits text, there is no optional tool left to decline - and it
|
|
520
|
+
drops a model call. Interpolate the shape into the prompt *from the same constant the parser reads*, so the
|
|
521
|
+
instruction and the parser cannot become two copies of one decision.
|
|
522
|
+
- **a middleware left the base stack** and the planning tier silently lost its task-list tool.
|
|
523
|
+
- **a retry middleware returned its failure as message content**, indistinguishable to a parser from a badly
|
|
524
|
+
formatted answer - which is how a measured "81% parse rate" was entirely an artefact, and how a grader
|
|
525
|
+
re-asked a model that had just timed out. Configure retries to raise, and count "never answered"
|
|
526
|
+
separately from "wrong shape".
|
|
527
|
+
- **every generation emitted had a duration of zero** for the project's whole life.
|
|
528
|
+
|
|
529
|
+
**So: pin the behaviour you depend on with a test that DRIVES it**, not one that asserts a symbol imports.
|
|
530
|
+
Importing fine was never the question. And where a framework decision can change under you, prefer a format
|
|
531
|
+
you own.
|
|
532
|
+
|
|
533
|
+
## Instruments lie, and they lie confidently
|
|
534
|
+
|
|
535
|
+
Four wrong calls in one phase, each stated with confidence: a stall blamed on the provider from a static
|
|
536
|
+
heartbeat; workers said to hold a shell by reading a compiled tool node; a parse rate that was entirely the
|
|
537
|
+
retry artefact above; and a time split attributed to the engine that was 767.7s ours against 318s theirs.
|
|
538
|
+
|
|
539
|
+
**A guard or a number that has not been made to fail is not evidence.** Plant the violation, watch it fire,
|
|
540
|
+
restore. And when you report a cause, label it: mechanism observed, consistent-with, or timing-only.
|
|
541
|
+
|
|
542
|
+
## Build order
|
|
543
|
+
|
|
544
|
+
0. **Check whether the engine ships the substrate** (the first section above). If it does, steps 1-5 become
|
|
545
|
+
*pin its surface, then verify it against your second product*, and you resume at step 6.
|
|
546
|
+
1. **The context object and the single entry point**, with the guard that nothing else may invoke an agent.
|
|
547
|
+
**Give the context an opaque `scope: tuple[str, ...]` from the start**, not named tenancy ids -- it is
|
|
548
|
+
the hardest thing to change later, because every agent is built with it.
|
|
549
|
+
2. **The import guard**: no harness module may import the retrieval primitives.
|
|
550
|
+
3. **The three-axis measurement as a committed SCRIPT**, not a one-off. Axis 3 (deployment, vendor,
|
|
551
|
+
tenancy) is the one that finds what the others cannot, and declarations must match as well as calls.
|
|
552
|
+
4. **The second product**, ~200 lines, hermetic, strict xfails. Before the seams exist, so each seam is
|
|
553
|
+
designed against an outside implementer rather than audited afterwards. **This is the step that was
|
|
554
|
+
missing**, and the one that would have saved the most.
|
|
555
|
+
5. **The facade**, with its two guards -- when a tier needs it (see the caveat above).
|
|
556
|
+
6. **The derived tool surface**, with exact-equality against the operation registry.
|
|
557
|
+
7. **One tier, end to end**, holding the read surface directly. Three tiers before anything has run is a
|
|
558
|
+
hierarchy designed against a prediction.
|
|
559
|
+
8. **Error levels and the caps**, in the documented composition order.
|
|
560
|
+
9. **Tracing and metering**, before you tune anything - the reasoning cost above was invisible until
|
|
561
|
+
abandoned attempts appeared in the trace.
|
|
562
|
+
10. **The durable checkpointer**, in its own schema.
|
|
563
|
+
11. **The interrupt protocol**, with the replay test pinned first.
|
|
564
|
+
12. **The remaining tiers**, the roster, and the withholding middleware.
|
|
565
|
+
13. **The decision registry and the rule registry**, then grading.
|
|
566
|
+
14. **Then**, and only with runs recorded, consider a decision model on a point that has one.
|
|
567
|
+
|
|
568
|
+
## What goes in your project's own child skill
|
|
569
|
+
|
|
570
|
+
- your tier roster and which operations each tier holds, by name
|
|
571
|
+
- your prompts' locked rules, and where each is actually delivered
|
|
572
|
+
- the commands: how to run one agent locally, how to replay a recorded run, how to drive a fault
|
|
573
|
+
- your decision registry's current four-way split, and which gaps are open
|
|
574
|
+
- the defects that recurred in **your** harness, with the run that showed each one
|
|
575
|
+
|
|
576
|
+
## Verification checklist
|
|
577
|
+
|
|
578
|
+
**Written for BUILDING the substrate. If you are consuming the engine's tier (the first section), about a
|
|
579
|
+
third of these stop being yours** -- the import rule, the three-axis measurement, the vendor/driver/tenancy
|
|
580
|
+
rule, the derive-on-the-substrate-side rule, the entry point's context, the middleware order and the
|
|
581
|
+
namespace factory's refusal are all properties of code you no longer own. **Verify them rather than
|
|
582
|
+
building them, and treat a failure as a finding to raise, not a task.** Everything about your tools, your
|
|
583
|
+
prompts, your tenancy shape, your interrupts, your decisions and your grading stays yours in both worlds,
|
|
584
|
+
as does the last line.
|
|
585
|
+
|
|
586
|
+
- [ ] No harness module imports the retrieval primitives (tested)
|
|
587
|
+
- [ ] The three-axis measurement is a committed script, and axis 3 matches FIELD DECLARATIONS as well as
|
|
588
|
+
calls -- a context type declaring `customer_id` is the case that hides
|
|
589
|
+
- [ ] A second product, in an unrelated domain, builds and runs an agent on the substrate (tested,
|
|
590
|
+
hermetic). Its gaps are `xfail(strict=True)` so one that closes without its exemption being removed
|
|
591
|
+
fails
|
|
592
|
+
- [ ] Every value the substrate could DERIVE is derived there, not passed in -- a derived value crossing the
|
|
593
|
+
boundary becomes a convention the next product can break silently
|
|
594
|
+
- [ ] Nothing in the substrate names a vendor, a model, a driver or a tenancy key (tested, axis 3)
|
|
595
|
+
- [ ] When a seam changed, the second product was changed FIRST
|
|
596
|
+
- [ ] The tool manifest is derived from the operation set in exact equality (tested)
|
|
597
|
+
- [ ] No tool signature, prompt or streamed event carries a tenancy identifier (tested)
|
|
598
|
+
- [ ] The memory namespace factory RAISES without a run context; no fallback path is reachable
|
|
599
|
+
- [ ] An agent can only be invoked through the entry point, which cannot omit the context (tested)
|
|
600
|
+
- [ ] The replay behaviour of your interrupt is pinned by a test, fake and live
|
|
601
|
+
- [ ] Every tool that interrupts does nothing before its question
|
|
602
|
+
- [ ] A bound exists for model calls, tool calls and re-dispatch, and each is a count rather than a request
|
|
603
|
+
- [ ] Retry middleware is INNER of the error middleware, and failures raise rather than returning as content
|
|
604
|
+
- [ ] A measured zero is recorded; an unmeasured run is not recorded as zero
|
|
605
|
+
- [ ] Each decision point is in exactly one of the four states, and a test asserts the partition
|
|
606
|
+
- [ ] Each graded rule carries both its instruction and its criterion on one object
|
|
607
|
+
- [ ] Every new guard was proved by planting its violation and watching it fail
|
|
@@ -51,7 +51,7 @@ open-core and domain-neutral; your product brings the domain. Hard rules:
|
|
|
51
51
|
## 1. Install
|
|
52
52
|
|
|
53
53
|
```sh
|
|
54
|
-
uv add 'rag-wright>=0.
|
|
54
|
+
uv add 'rag-wright>=0.9.0' # released-product mode (PyPI); see below for local co-development
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
Stand up the runtime prerequisites you provide: ArcadeDB (the store), a model provider (OpenRouter or self-hosted
|
|
@@ -173,9 +173,10 @@ role's model). The profile decides endpoint, key and the agent turn's reasoning
|
|
|
173
173
|
vendor or vendor flag; every call, a subagent's included, is recorded into `measure_usage()` with the provider's
|
|
174
174
|
real cost and traced when tracing is on. The generic harness substrate (the loop, error levels and deadlines,
|
|
175
175
|
retries, interrupts and human-in-the-loop, replay on resume, memory practice, metering) is engine scope (engine
|
|
176
|
-
ADR-0139, PS-32):
|
|
177
|
-
|
|
178
|
-
|
|
176
|
+
ADR-0139, PS-32): the third public tier `rag_wright.harness` (engine 0.10.0 and later; reference
|
|
177
|
+
`docs/api/harness.md`, practice in the `building-an-agent-harness` skill). Declare an `AgentDefinition` and run it
|
|
178
|
+
with `start_run` / `resume_run`; never write a substrate of your own (on an older engine, keep agents thin). Your
|
|
179
|
+
product keeps its agents, tools, prompts, skills, guardrails and decision models.
|
|
179
180
|
|
|
180
181
|
**Using a self-hosted model (Qwen on Modal).** Deploy it from the engine and use its model id like any model:
|
|
181
182
|
`server = await adeploy_model_server(ModelServerSpec(name="<app>", max_num_seqs=<concurrency target>))` (the locked
|