From 7b7b91c4384a521ea636790501aba1a8e2082f6c Mon Sep 17 00:00:00 2001 From: "Claude (agent)" <238336761+hummbl-dev@users.noreply.github.com> Date: Sat, 11 Jul 2026 13:02:53 -0400 Subject: [PATCH] feat: whole-codebase and corpus model routing policy v0.1 Closes #8 - docs/routing-policy-v0.1.md: machine-readable routing policy for whole-repository understanding and massive-source intelligence workloads with 13 workload classes, 18 route dimensions, 9 route dispositions, 12 hard gates, soft ranking by cost/latency/reliability/evidence-recency, required policy behaviors, initial candidate lanes, example route card, workload schema, and route decision schema - 8 fixtures: valid-minimal-route, invalid-missing-hard-gate, stale-evidence, privacy-conflict, missing-model-version, missing-budget-metadata, cheaper-route-rejected, preview-model-risk Refs hummbl-dev/hummbl-dev#155, hummbl-dev/autoresearch-pipeline#30, hummbl-dev/hummbl-bibliography#78, hummbl-dev/hummbl-dev#153 --- docs/routing-policy-v0.1.md | 298 ++++++++++++++++++ .../v0.1/fixtures/cheaper-route-rejected.json | 30 ++ .../fixtures/invalid-missing-hard-gate.json | 20 ++ .../fixtures/missing-budget-metadata.json | 23 ++ .../v0.1/fixtures/missing-model-version.json | 23 ++ .../v0.1/fixtures/preview-model-risk.json | 27 ++ .../v0.1/fixtures/privacy-conflict.json | 24 ++ .../v0.1/fixtures/stale-evidence.json | 26 ++ .../v0.1/fixtures/valid-minimal-route.json | 31 ++ 9 files changed, 502 insertions(+) create mode 100644 docs/routing-policy-v0.1.md create mode 100644 docs/schemas/routing-policy/v0.1/fixtures/cheaper-route-rejected.json create mode 100644 docs/schemas/routing-policy/v0.1/fixtures/invalid-missing-hard-gate.json create mode 100644 docs/schemas/routing-policy/v0.1/fixtures/missing-budget-metadata.json create mode 100644 docs/schemas/routing-policy/v0.1/fixtures/missing-model-version.json create mode 100644 docs/schemas/routing-policy/v0.1/fixtures/preview-model-risk.json create mode 100644 docs/schemas/routing-policy/v0.1/fixtures/privacy-conflict.json create mode 100644 docs/schemas/routing-policy/v0.1/fixtures/stale-evidence.json create mode 100644 docs/schemas/routing-policy/v0.1/fixtures/valid-minimal-route.json diff --git a/docs/routing-policy-v0.1.md b/docs/routing-policy-v0.1.md new file mode 100644 index 0000000..02d20a6 --- /dev/null +++ b/docs/routing-policy-v0.1.md @@ -0,0 +1,298 @@ +# Whole-Codebase and Corpus Model Routing Policy — Draft v0.1 + +## Status + +**CANDIDATE ROUTING POLICY — EVIDENCE REQUIRED — NO DEFAULT ROUTE CHANGE AUTHORIZED** + +## Governing doctrine + +> Cheapest correct model wins only after correctness, safety, privacy, +> authority, latency, reliability, reproducibility, and governance gates +> pass. + +A larger context window does not itself justify routing. + +--- + +## 1. Workload classes + +| Class | Description | +|------|-------------| +| `REPO_INVENTORY` | Catalog files, modules, dependencies | +| `REPO_ARCHITECTURE_RECONSTRUCTION` | Reconstruct architecture from code | +| `CROSS_FILE_TRACE` | Trace data/control flow across files | +| `CLAIM_AND_REFERENCE_AUDIT` | Verify claims and references | +| `ISSUE_ROOT_CAUSE` | Find root cause of an issue | +| `BOUNDED_PATCH_IMPLEMENTATION` | Implement a bounded patch | +| `INDEPENDENT_CODE_REVIEW` | Review code independently | +| `BULK_SOURCE_INGESTION` | Ingest large source corpus | +| `MULTI_DOCUMENT_SYNTHESIS` | Synthesize across documents | +| `CONTRADICTION_AND_VERSION_ANALYSIS` | Find contradictions and version drift | +| `OCR_HISTORICAL_CORPUS` | OCR and analyze historical documents | +| `MULTIMODAL_SOURCE_PACKET` | Process multimodal sources | +| `FINAL_SCHOLARLY_CLAIM_REVIEW` | Final review of scholarly claims | + +--- + +## 2. Route dimensions + +Each route must consider: + +| Dimension | Description | +|-----------|-------------| +| `source_size_tokens` | Estimated token count | +| `source_type` | Text, code, image, multimodal | +| `source_modality` | File, API, database, web | +| `private_public` | Private or public classification | +| `required_tool_surface` | Tools required (file_search, code_exec, etc.) | +| `single_context_feasibility` | Can it fit in one context window? | +| `retrieval_memory_requirement` | Retrieval/memory needed | +| `reasoning_depth` | shallow | moderate | deep | +| `citation_precision` | low | medium | high | +| `implementation_authority` | none | propose | implement | +| `latency_target` | Target latency | +| `cost_ceiling` | Maximum cost | +| `reliability_target` | Target reliability | +| `independent_review` | Required or not | +| `provider_constraints` | Approved providers | +| `regional_constraints` | Approved regions | +| `model_availability` | GA, preview, deprecated | +| `benchmark_evidence_date` | Date of benchmark evidence | + +--- + +## 3. Route dispositions + +| Disposition | Description | +|-------------|-------------| +| `REJECTED` | Model is rejected for this workload | +| `DISCOVERY_ONLY` | Model may be used for discovery only | +| `BULK_EXTRACTOR` | Model may extract bulk content | +| `BOUNDED_READER` | Model may read bounded sections | +| `PRIMARY_READER_WITH_REVIEW` | Model may be primary reader with review | +| `IMPLEMENTER_WITH_GATES` | Model may implement with gates | +| `INDEPENDENT_REVIEWER` | Model may serve as independent reviewer | +| `FINAL_SYNTHESIS_WITH_HUMAN_REVIEW` | Model may synthesize with human review | +| `PROMOTED_WITH_SCOPE` | Model is promoted with explicit scope | + +No model should be labeled universally best. + +--- + +## 4. Hard gates + +A route must pass ALL hard gates before soft ranking: + +| Gate | Description | +|------|-------------| +| `correctness` | Model can produce correct results for this workload | +| `safety` | Model meets safety requirements | +| `privacy` | Model meets privacy requirements (private data stays in approved boundary) | +| `authority` | Model has authority for the requested action | +| `latency` | Model meets latency target | +| `reliability` | Model meets reliability target | +| `reproducibility` | Model results are reproducible | +| `governance` | Model meets governance requirements | +| `model_version_verified` | Model version is verified and not stale | +| `budget_metadata` | Budget metadata is present | +| `privacy_metadata` | Privacy metadata is present | +| `authority_metadata` | Authority metadata is present | + +**Fail closed**: If any hard gate fails, the route is rejected. No silent +fallback to a cheaper or less-governed model. + +--- + +## 5. Soft ranking + +After hard gates pass, routes are ranked by: + +1. **Cost** — lowest cost wins +2. **Latency** — lower latency wins (tiebreaker) +3. **Reliability** — higher reliability wins (tiebreaker) +4. **Evidence recency** — more recent benchmark evidence wins (tiebreaker) + +--- + +## 6. Required policy behavior + +1. Select the lowest-cost route meeting all hard gates +2. Prefer tool navigation or structured memory when source size exceeds effective context +3. Require a different-provider reviewer for high-stakes claims where feasible +4. Keep private repositories and sensitive corpora within approved provider/environment boundaries +5. Escalate when benchmark coverage is missing, stale, or materially mismatched +6. Fail closed on missing model version, budget, privacy, or authority metadata +7. Record why a cheaper route was rejected +8. Include reevaluation and expiry dates for every promoted route + +--- + +## 7. Initial candidate lanes + +Subject to exact model/version verification at run time: + +| Lane | Model | Status | +|------|-------|--------| +| GPT-5.6 Sol | GPT-5.6 Sol / Codex-compatible | GA | +| Claude Fable 5 | Claude Fable 5 | GA | +| Claude Opus 4.8 | Claude Opus 4.8 | GA | +| Claude Sonnet 5 | Claude Sonnet 5 | GA | +| Gemini 3.1 Pro | Gemini 3.1 Pro Preview custom-tools | Preview | +| Gemini 3.5 Flash | Gemini 3.5 Flash | GA | +| Grok 4.5 | Grok 4.5 | GA | +| Open/local models | Declared serving and quantization | Variable | + +Preview models carry stability and deprecation risk. Aliases carry +resolution risk unless pinned or receipted. + +--- + +## 8. Example route card + +```yaml +workload: REPO_ARCHITECTURE_RECONSTRUCTION +source_classification: private +source_estimated_tokens: 640000 +required_capabilities: + - file_search + - cross_file_reasoning + - architecture_synthesis +hard_gates: + correctness: verified + safety: pass + privacy: private_within_boundary + authority: implementer_with_gates + latency: PT5M + reliability: 0.95 + reproducibility: best_effort + governance: pass +soft_rank: + - cost: lowest + - latency: PT3M +selected_route: + model: claude-opus-4.8 + provider: anthropic + disposition: PRIMARY_READER_WITH_REVIEW + review_route: + model: gpt-5.6-sol + provider: openai + disposition: INDEPENDENT_REVIEWER +benchmark_evidence_date: 2026-07-01 +reevaluation_date: 2026-08-01 +expiry_date: 2026-09-01 +rejected_cheaper_routes: + - model: gemini-3.5-flash + reason: "cross_file_reasoning benchmark below threshold" +receipt_id: route-001 +``` + +--- + +## 9. Machine-readable workload schema + +```yaml +workload_id: string +workload_class: enum +source: + size_tokens: integer + type: string + modality: string + classification: private|public +required_capabilities: [] +hard_gates: + correctness: verified|unverified|unknown + safety: pass|fail|unknown + privacy: private_within_boundary|public|unknown + authority: string + latency: string + reliability: float + reproducibility: deterministic|best_effort|unknown + governance: pass|fail|unknown +soft_rank: + - cost: lowest + - latency: string + - reliability: float +constraints: + provider: [] + region: [] + model_availability: GA|preview|deprecated + benchmark_evidence_date: string + reevaluation_date: string + expiry_date: string +``` + +--- + +## 10. Route decision schema + +```yaml +route_id: string +workload_id: string +selected_route: + model: string + provider: string + disposition: enum + review_route: + model: string + provider: string + disposition: enum +hard_gate_results: + - gate: string + result: pass|fail + evidence: string +soft_rank_results: + - criterion: string + value: string +rejected_routes: + - model: string + reason: string +benchmark_evidence_date: string +reevaluation_date: string +expiry_date: string +receipt_id: string +timestamp: string +``` + +--- + +## 11. Fixtures + +| Fixture | Type | Description | +|---------|------|-------------| +| `valid-minimal-route.json` | valid | Minimal valid route card | +| `invalid-missing-hard-gate.json` | invalid | Missing required hard gate | +| `stale-evidence.json` | stale | Benchmark evidence is stale | +| `privacy-conflict.json` | conflict | Private source routed to public provider | +| `missing-model-version.json` | invalid | Model version not verified | +| `missing-budget-metadata.json` | invalid | Budget metadata missing | +| `cheaper-route-rejected.json` | valid | Cheaper route rejected with reason | +| `preview-model-risk.json` | valid | Preview model with stability risk noted | + +--- + +## Non-goals + +- No default route change authorized +- No provider-specific implementation +- No declaration of universally best model +- No migration into Founder Mode runtime without approval + +## Unresolved questions + +1. Should the workload schema be JSON Schema, YAML, or both? +2. How should multi-model routes be represented? +3. What is the minimum benchmark evidence required? +4. How should preview model risk be quantified? + +## Rollback instructions + +This is a specification document. Rollback = revert the commit. No runtime +impact. + +## Related + +- `hummbl-dev/model-routing-as-code#8` — this issue +- `hummbl-dev/hummbl-dev#155` — parent benchmark +- `hummbl-dev/autoresearch-pipeline#30` — harness +- `hummbl-dev/hummbl-bibliography#78` — corpus pack +- `hummbl-dev/hummbl-dev#153` — master index diff --git a/docs/schemas/routing-policy/v0.1/fixtures/cheaper-route-rejected.json b/docs/schemas/routing-policy/v0.1/fixtures/cheaper-route-rejected.json new file mode 100644 index 0000000..0955ef7 --- /dev/null +++ b/docs/schemas/routing-policy/v0.1/fixtures/cheaper-route-rejected.json @@ -0,0 +1,30 @@ +{ + "fixture_id": "cheaper-route-rejected", + "type": "valid", + "description": "Cheaper route rejected with documented reason", + "route": { + "route_id": "route-007", + "workload_id": "wl-007", + "workload_class": "REPO_ARCHITECTURE_RECONSTRUCTION", + "source": {"size_tokens": 640000, "type": "code", "classification": "private"}, + "selected_route": {"model": "claude-opus-4.8", "provider": "anthropic", "disposition": "PRIMARY_READER_WITH_REVIEW"}, + "hard_gate_results": [ + {"gate": "correctness", "result": "pass", "evidence": "benchmark-007"}, + {"gate": "safety", "result": "pass", "evidence": "policy-001"}, + {"gate": "privacy", "result": "pass", "evidence": "private_within_boundary"}, + {"gate": "model_version_verified", "result": "pass", "evidence": "claude-opus-4.8@2026-07-01"}, + {"gate": "budget_metadata", "result": "pass", "evidence": "budget-007"}, + {"gate": "authority_metadata", "result": "pass", "evidence": "auth-007"} + ], + "rejected_routes": [ + {"model": "gemini-3.5-flash", "reason": "cross_file_reasoning benchmark below threshold for REPO_ARCHITECTURE_RECONSTRUCTION"}, + {"model": "claude-sonnet-5", "reason": "source_size_tokens exceeds effective single-context feasibility for this model"} + ], + "benchmark_evidence_date": "2026-07-01", + "reevaluation_date": "2026-08-01", + "expiry_date": "2026-09-01", + "receipt_id": "route-007", + "timestamp": "2026-07-11T12:00:00Z" + }, + "expected_validation": "valid" +} diff --git a/docs/schemas/routing-policy/v0.1/fixtures/invalid-missing-hard-gate.json b/docs/schemas/routing-policy/v0.1/fixtures/invalid-missing-hard-gate.json new file mode 100644 index 0000000..43202b6 --- /dev/null +++ b/docs/schemas/routing-policy/v0.1/fixtures/invalid-missing-hard-gate.json @@ -0,0 +1,20 @@ +{ + "fixture_id": "invalid-missing-hard-gate", + "type": "invalid", + "description": "Route missing required hard gate (safety)", + "route": { + "route_id": "route-002", + "workload_id": "wl-002", + "workload_class": "BOUNDED_PATCH_IMPLEMENTATION", + "selected_route": {"model": "gpt-5.6-sol", "provider": "openai", "disposition": "IMPLEMENTER_WITH_GATES"}, + "hard_gate_results": [ + {"gate": "correctness", "result": "pass", "evidence": "benchmark-002"}, + {"gate": "privacy", "result": "pass", "evidence": "private_within_boundary"} + ], + "benchmark_evidence_date": "2026-07-01", + "receipt_id": "route-002", + "timestamp": "2026-07-11T12:00:00Z" + }, + "expected_validation": "invalid", + "expected_errors": ["missing_hard_gate:safety", "missing_hard_gate:model_version_verified", "missing_hard_gate:budget_metadata", "missing_hard_gate:authority_metadata"] +} diff --git a/docs/schemas/routing-policy/v0.1/fixtures/missing-budget-metadata.json b/docs/schemas/routing-policy/v0.1/fixtures/missing-budget-metadata.json new file mode 100644 index 0000000..0c1e251 --- /dev/null +++ b/docs/schemas/routing-policy/v0.1/fixtures/missing-budget-metadata.json @@ -0,0 +1,23 @@ +{ + "fixture_id": "missing-budget-metadata", + "type": "invalid", + "description": "Budget metadata missing", + "route": { + "route_id": "route-006", + "workload_id": "wl-006", + "workload_class": "MULTI_DOCUMENT_SYNTHESIS", + "selected_route": {"model": "grok-4.5", "provider": "xai", "disposition": "FINAL_SYNTHESIS_WITH_HUMAN_REVIEW"}, + "hard_gate_results": [ + {"gate": "correctness", "result": "pass", "evidence": "benchmark-006"}, + {"gate": "safety", "result": "pass", "evidence": "policy-001"}, + {"gate": "privacy", "result": "pass", "evidence": "public"}, + {"gate": "model_version_verified", "result": "pass", "evidence": "grok-4.5@2026-07-01"}, + {"gate": "budget_metadata", "result": "fail", "evidence": "budget_not_specified"}, + {"gate": "authority_metadata", "result": "pass", "evidence": "auth-006"} + ], + "receipt_id": "route-006", + "timestamp": "2026-07-11T12:00:00Z" + }, + "expected_validation": "invalid", + "expected_errors": ["budget_metadata_missing"] +} diff --git a/docs/schemas/routing-policy/v0.1/fixtures/missing-model-version.json b/docs/schemas/routing-policy/v0.1/fixtures/missing-model-version.json new file mode 100644 index 0000000..9b6e1a4 --- /dev/null +++ b/docs/schemas/routing-policy/v0.1/fixtures/missing-model-version.json @@ -0,0 +1,23 @@ +{ + "fixture_id": "missing-model-version", + "type": "invalid", + "description": "Model version not verified", + "route": { + "route_id": "route-005", + "workload_id": "wl-005", + "workload_class": "INDEPENDENT_CODE_REVIEW", + "selected_route": {"model": "claude-opus-4.8", "provider": "anthropic", "disposition": "INDEPENDENT_REVIEWER"}, + "hard_gate_results": [ + {"gate": "correctness", "result": "pass", "evidence": "benchmark-005"}, + {"gate": "safety", "result": "pass", "evidence": "policy-001"}, + {"gate": "privacy", "result": "pass", "evidence": "private_within_boundary"}, + {"gate": "model_version_verified", "result": "fail", "evidence": "version_not_pinned"}, + {"gate": "budget_metadata", "result": "pass", "evidence": "budget-005"}, + {"gate": "authority_metadata", "result": "pass", "evidence": "auth-005"} + ], + "receipt_id": "route-005", + "timestamp": "2026-07-11T12:00:00Z" + }, + "expected_validation": "invalid", + "expected_errors": ["model_version_not_verified"] +} diff --git a/docs/schemas/routing-policy/v0.1/fixtures/preview-model-risk.json b/docs/schemas/routing-policy/v0.1/fixtures/preview-model-risk.json new file mode 100644 index 0000000..d71c526 --- /dev/null +++ b/docs/schemas/routing-policy/v0.1/fixtures/preview-model-risk.json @@ -0,0 +1,27 @@ +{ + "fixture_id": "preview-model-risk", + "type": "valid", + "description": "Preview model with stability and deprecation risk noted", + "route": { + "route_id": "route-008", + "workload_id": "wl-008", + "workload_class": "MULTIMODAL_SOURCE_PACKET", + "selected_route": {"model": "gemini-3.1-pro-preview", "provider": "google", "disposition": "DISCOVERY_ONLY"}, + "hard_gate_results": [ + {"gate": "correctness", "result": "pass", "evidence": "benchmark-008"}, + {"gate": "safety", "result": "pass", "evidence": "policy-001"}, + {"gate": "privacy", "result": "pass", "evidence": "public"}, + {"gate": "model_version_verified", "result": "pass", "evidence": "gemini-3.1-pro-preview@2026-07-01"}, + {"gate": "budget_metadata", "result": "pass", "evidence": "budget-008"}, + {"gate": "authority_metadata", "result": "pass", "evidence": "auth-008"} + ], + "risk_notes": ["preview_model_stability_risk", "deprecation_risk", "disposition_limited_to_discovery_only"], + "benchmark_evidence_date": "2026-07-01", + "reevaluation_date": "2026-07-15", + "expiry_date": "2026-08-01", + "receipt_id": "route-008", + "timestamp": "2026-07-11T12:00:00Z" + }, + "expected_validation": "valid", + "expected_warnings": ["preview_model_stability_risk"] +} diff --git a/docs/schemas/routing-policy/v0.1/fixtures/privacy-conflict.json b/docs/schemas/routing-policy/v0.1/fixtures/privacy-conflict.json new file mode 100644 index 0000000..e8e573e --- /dev/null +++ b/docs/schemas/routing-policy/v0.1/fixtures/privacy-conflict.json @@ -0,0 +1,24 @@ +{ + "fixture_id": "privacy-conflict", + "type": "conflict", + "description": "Private source routed to public-only provider", + "route": { + "route_id": "route-004", + "workload_id": "wl-004", + "workload_class": "BULK_SOURCE_INGESTION", + "source": {"size_tokens": 500000, "type": "code", "classification": "private"}, + "selected_route": {"model": "gemini-3.5-flash", "provider": "google", "disposition": "BULK_EXTRACTOR"}, + "hard_gate_results": [ + {"gate": "correctness", "result": "pass", "evidence": "benchmark-004"}, + {"gate": "safety", "result": "pass", "evidence": "policy-001"}, + {"gate": "privacy", "result": "fail", "evidence": "private_source_to_public_provider"}, + {"gate": "model_version_verified", "result": "pass", "evidence": "gemini-3.5-flash@2026-07-01"}, + {"gate": "budget_metadata", "result": "pass", "evidence": "budget-004"}, + {"gate": "authority_metadata", "result": "pass", "evidence": "auth-004"} + ], + "receipt_id": "route-004", + "timestamp": "2026-07-11T12:00:00Z" + }, + "expected_validation": "invalid", + "expected_errors": ["privacy_gate_failed"] +} diff --git a/docs/schemas/routing-policy/v0.1/fixtures/stale-evidence.json b/docs/schemas/routing-policy/v0.1/fixtures/stale-evidence.json new file mode 100644 index 0000000..06b2125 --- /dev/null +++ b/docs/schemas/routing-policy/v0.1/fixtures/stale-evidence.json @@ -0,0 +1,26 @@ +{ + "fixture_id": "stale-evidence", + "type": "stale", + "description": "Benchmark evidence is stale (>6 months old)", + "route": { + "route_id": "route-003", + "workload_id": "wl-003", + "workload_class": "CROSS_FILE_TRACE", + "selected_route": {"model": "claude-opus-4.8", "provider": "anthropic", "disposition": "PRIMARY_READER_WITH_REVIEW"}, + "hard_gate_results": [ + {"gate": "correctness", "result": "pass", "evidence": "benchmark-003"}, + {"gate": "safety", "result": "pass", "evidence": "policy-001"}, + {"gate": "privacy", "result": "pass", "evidence": "private_within_boundary"}, + {"gate": "model_version_verified", "result": "pass", "evidence": "claude-opus-4.8@2026-01-01"}, + {"gate": "budget_metadata", "result": "pass", "evidence": "budget-003"}, + {"gate": "authority_metadata", "result": "pass", "evidence": "auth-003"} + ], + "benchmark_evidence_date": "2025-12-01", + "reevaluation_date": "2026-01-01", + "expiry_date": "2026-02-01", + "receipt_id": "route-003", + "timestamp": "2026-07-11T12:00:00Z" + }, + "expected_validation": "stale", + "expected_warnings": ["benchmark_evidence_stale", "route_expired"] +} diff --git a/docs/schemas/routing-policy/v0.1/fixtures/valid-minimal-route.json b/docs/schemas/routing-policy/v0.1/fixtures/valid-minimal-route.json new file mode 100644 index 0000000..372987f --- /dev/null +++ b/docs/schemas/routing-policy/v0.1/fixtures/valid-minimal-route.json @@ -0,0 +1,31 @@ +{ + "fixture_id": "valid-minimal-route", + "type": "valid", + "description": "Minimal valid route card for REPO_INVENTORY", + "route": { + "route_id": "route-001", + "workload_id": "wl-001", + "workload_class": "REPO_INVENTORY", + "source": {"size_tokens": 50000, "type": "code", "classification": "private"}, + "selected_route": { + "model": "claude-sonnet-5", + "provider": "anthropic", + "disposition": "BOUNDED_READER" + }, + "hard_gate_results": [ + {"gate": "correctness", "result": "pass", "evidence": "benchmark-001"}, + {"gate": "safety", "result": "pass", "evidence": "policy-001"}, + {"gate": "privacy", "result": "pass", "evidence": "private_within_boundary"}, + {"gate": "model_version_verified", "result": "pass", "evidence": "claude-sonnet-5@2026-07-01"}, + {"gate": "budget_metadata", "result": "pass", "evidence": "budget-001"}, + {"gate": "authority_metadata", "result": "pass", "evidence": "auth-001"} + ], + "rejected_routes": [], + "benchmark_evidence_date": "2026-07-01", + "reevaluation_date": "2026-08-01", + "expiry_date": "2026-09-01", + "receipt_id": "route-001", + "timestamp": "2026-07-11T12:00:00Z" + }, + "expected_validation": "valid" +}