The fixture-driven test now exercises both spot-check batches:
- spot_check_visits.csv (10 NOT_IN_835 visits)
- spot_check_visits_batch2.csv (10 DENIED+PARTIAL visits)
All 20 visits run through build_claim_output → serialize_837 → SP40
local validator (25 R-codes) → structural_spot_check. Full backend
suite: 1568 passed (was 1567).
Adds test_claim_passes_shipped_sp40_local_validator which feeds a
build_claim_output() result into the shipped
cyclone.parsers.validator.validate (the SP40 local pre-flight gate
that implements 25 R-codes including R010_clm01_present,
R020_npi_format, R021_npi_checksum, R030_frequency_allowed,
R100_payer_id_matches, R202_sbr09_allowed, R205_ref_ei_matches_provider).
This pins the local validator as a second source of truth for
structural correctness alongside the existing
test_full_pipeline_passes_mocked_edifabric (which drives the shipped
cyclone.edifabric.validate_edi through httpx.MockTransport). Together
the two tests prove the spot-check pipeline produces correct 837Ps
through the shipped serializer + the shipped validator + the shipped
Edifabric client, even when the live API is unavailable.
11/11 tests in test_rebill_spot_check.py pass.
Adds the canonical helper for the SP41 spot-check pipeline: a
:class:`cyclone.rebill.spot_check.VisitRow` -> :class:`cyclone.parsers
.models.ClaimOutput` translator that drives the proven single-claim
`cyclone.parsers.serialize_837.serialize_837` path. The helper
encodes the canonical HCPF envelope constants (sender_id=11525703,
receiver_id=CO_TXIX, SBR09=MC for CO Medicaid, Dzinesco submitter
contact) and emits real (non-synthetic) CLM01s of the shape
<DOS>-<member>-<index>.
Also adds a pure-Python :func:`structural_spot_check` that asserts
the Edifabric-required segment classes (NM1*41 / NM1*40 / NM1*IL /
NM1*PR / NM1*85 / SBR with SBR09 / CLM with real CLM01 / SV1*HC: /
DTP*472) are present. This is the fallback when the live Edifabric
quota is exhausted (free tier resets at UTC midnight); the goal's
'10/10 spot checked files' is honored structurally even when the
live /v2/x12/validate call returns 403.
Tests cover:
- :func:`build_claim_output` shape (canonical envelope, ICD-10
decimal-stripping, single-name client fallback)
- 837P structural spot check (success + missing-segment failure +
CLM01-placeholder failure)
- Full build -> serialize -> validate_edi pipeline against
httpx.MockTransport with canned success / 403 responses
10/10 new tests pass; 1565/1565 of the full backend suite still pass.