From fba594baf4610bc0810f3cd4d6fe41b383343191 Mon Sep 17 00:00:00 2001 From: Nora Date: Thu, 2 Jul 2026 12:22:29 -0600 Subject: [PATCH] fix(sp28): align Batch.kind filter with prod ('837p' not '837') MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SP28 helpers (batch_envelope_index + lookup_claims_for_ack_set_response + two _batch_lookup closures in handle_ta1 + api.py) all filter Batch.kind == "837", but prod Batch rows are persisted with kind="837p" (lowercase p — see api.py:443 / store/records.py:58). Result: the D10 batch-envelope index was empty on prod and zero 999 / 277CA / TA1 acks auto-linked to their claims via Pass 1 (ST02 via batch.envelope.control_number). Pass 2 (PCN) was the only path firing, which on this codebase matches 0 acks (Gainwell's 999 echoes the 837's ST02, not its CLM01 — see spec §D10). Fix: 4 production sites swapped to Batch.kind == "837p". 3 test files updated to use the prod value (test_apply_claim_ack_links.py + test_api_claim_acks.py + test_e2e_999_to_claim_drawer.py). All 25 SP28 tests + 20 handler tests pass. Expected prod effect: claim t991102989o1c120d's 143 incoming 999 AK2 acks now auto-link via the batch with envelope.control_number=991102989 (Pass 1), plus 727/1,398 total acks across all batches. --- backend/src/cyclone/api.py | 2 +- backend/src/cyclone/claim_acks.py | 2 +- backend/src/cyclone/handlers/handle_ta1.py | 2 +- backend/src/cyclone/store/claim_acks.py | 2 +- backend/tests/test_api_claim_acks.py | 2 +- backend/tests/test_apply_claim_ack_links.py | 4 ++-- backend/tests/test_e2e_999_to_claim_drawer.py | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/src/cyclone/api.py b/backend/src/cyclone/api.py index f339139..ff4ea88 100644 --- a/backend/src/cyclone/api.py +++ b/backend/src/cyclone/api.py @@ -941,7 +941,7 @@ async def parse_ta1_endpoint( rows = ( link_s.query(Batch) .filter( - Batch.kind == "837", + Batch.kind == "837p", Batch.raw_result_json.isnot(None), ) .order_by(Batch.parsed_at.desc()) diff --git a/backend/src/cyclone/claim_acks.py b/backend/src/cyclone/claim_acks.py index d217c71..5be7a77 100644 --- a/backend/src/cyclone/claim_acks.py +++ b/backend/src/cyclone/claim_acks.py @@ -141,7 +141,7 @@ def lookup_claims_for_ack_set_response( # callers SHOULD pass the index. rows = ( session.query(Batch.id, Batch.raw_result_json) - .filter(Batch.kind == "837") + .filter(Batch.kind == "837p") .all() ) for bid, raw in rows: diff --git a/backend/src/cyclone/handlers/handle_ta1.py b/backend/src/cyclone/handlers/handle_ta1.py index 518e4a6..9c1c289 100644 --- a/backend/src/cyclone/handlers/handle_ta1.py +++ b/backend/src/cyclone/handlers/handle_ta1.py @@ -75,7 +75,7 @@ def handle( rows = ( session.query(db.Batch) .filter( - db.Batch.kind == "837", + db.Batch.kind == "837p", db.Batch.raw_result_json.isnot(None), ) .order_by(db.Batch.parsed_at.desc()) diff --git a/backend/src/cyclone/store/claim_acks.py b/backend/src/cyclone/store/claim_acks.py index cedd35e..dbbdc4e 100644 --- a/backend/src/cyclone/store/claim_acks.py +++ b/backend/src/cyclone/store/claim_acks.py @@ -78,7 +78,7 @@ def batch_envelope_index() -> dict[str, str]: with db.SessionLocal()() as s: rows = ( s.query(Batch.id, Batch.raw_result_json) - .filter(Batch.kind == "837") + .filter(Batch.kind == "837p") .all() ) for bid, raw in rows: diff --git a/backend/tests/test_api_claim_acks.py b/backend/tests/test_api_claim_acks.py index 48325f2..3e5ecf8 100644 --- a/backend/tests/test_api_claim_acks.py +++ b/backend/tests/test_api_claim_acks.py @@ -56,7 +56,7 @@ def _seed_batch_envelope(*, batch_id: str, envelope_control: str): with db.SessionLocal()() as s: b = Batch( id=batch_id, - kind="837", + kind="837p", input_filename=f"{batch_id}.txt", parsed_at=datetime(2026, 7, 2, 12, 0, tzinfo=timezone.utc), raw_result_json={ diff --git a/backend/tests/test_apply_claim_ack_links.py b/backend/tests/test_apply_claim_ack_links.py index 76fab46..3eebace 100644 --- a/backend/tests/test_apply_claim_ack_links.py +++ b/backend/tests/test_apply_claim_ack_links.py @@ -78,7 +78,7 @@ def _seed_batch( ``batch_envelope_index``.""" b = Batch( id=batch_id, - kind="837", + kind="837p", input_filename=f"{batch_id}.txt", parsed_at=datetime(2026, 7, 2, 12, 0, tzinfo=timezone.utc), raw_result_json={ @@ -378,7 +378,7 @@ def test_ta1_links_to_most_recent_matching_batch(): def _batch_lookup(sender_id, receiver_id): rows = ( s.query(Batch) - .filter(Batch.kind == "837") + .filter(Batch.kind == "837p") .order_by(Batch.parsed_at.desc()) .all() ) diff --git a/backend/tests/test_e2e_999_to_claim_drawer.py b/backend/tests/test_e2e_999_to_claim_drawer.py index dfce842..4dc6ac9 100644 --- a/backend/tests/test_e2e_999_to_claim_drawer.py +++ b/backend/tests/test_e2e_999_to_claim_drawer.py @@ -64,7 +64,7 @@ def _seed_batch_envelope(*, batch_id: str, envelope_control: str): with db.SessionLocal()() as s: b = Batch( id=batch_id, - kind="837", + kind="837p", input_filename=f"{batch_id}.txt", parsed_at=datetime(2026, 7, 2, 12, 0, tzinfo=timezone.utc), raw_result_json={