Context
PR #10 introduces the stdlib-only ultra_evaluation_receipt.v0.1 schema validator. Independent review and mutation tests found and fixed several semantic gaps before promotion, but Arbiter still reports two concentrated complexity hotspots:
tools/validate_ultra_evaluation_receipt.py::_validate_schema_subset — cyclomatic complexity 58
tools/validate_ultra_evaluation_receipt.py::_validate_receipt_semantics — cyclomatic complexity 58
This is accepted decomposition debt for the initial v0.1 packet, not a security finding. Bandit and Semgrep report zero findings, and the current branch has 72 tests plus 89 subtests passing on Python 3.11 and 3.13.
Acceptance criteria
- Split schema-keyword validation into focused helpers without changing supported Draft 2020-12 behavior.
- Split receipt cross-field rules by domain: model/delegation, telemetry, duplication/synthesis, timing, outcome, and routing.
- Preserve deterministic, sorted JSON-path error messages.
- Preserve all valid/invalid fixture outcomes and add direct helper tests where useful.
- Raise receipt-validator branch coverage to at least 80%.
- Keep runtime dependencies at zero.
- Run Ruff, mypy, Bandit, Semgrep, and the complete local test suite.
- Do not use GitHub Actions while organizational Actions minutes remain exhausted.
Scope boundary
Do not change the v0.1 schema contract or route policy as part of the mechanical decomposition. Any contract change requires a separate versioned proposal.
Context
PR #10 introduces the stdlib-only
ultra_evaluation_receipt.v0.1schema validator. Independent review and mutation tests found and fixed several semantic gaps before promotion, but Arbiter still reports two concentrated complexity hotspots:tools/validate_ultra_evaluation_receipt.py::_validate_schema_subset— cyclomatic complexity 58tools/validate_ultra_evaluation_receipt.py::_validate_receipt_semantics— cyclomatic complexity 58This is accepted decomposition debt for the initial v0.1 packet, not a security finding. Bandit and Semgrep report zero findings, and the current branch has 72 tests plus 89 subtests passing on Python 3.11 and 3.13.
Acceptance criteria
Scope boundary
Do not change the v0.1 schema contract or route policy as part of the mechanical decomposition. Any contract change requires a separate versioned proposal.