procurement-ingest/lambdas/po/email_processor/tests/fixtures/adversarial
Adam Moussa ffa8a625a7
Scrub fixture-body PII and harden cancellation gate (sec review)
/sh-security-review of PR #105 (5 fresh-context detectors + proof-or-kill
verifier) confirmed two diff-introduced findings; both fixed here.

F3 (medium, real PII in new fixtures): the harvest scrub replaced header
tokens but left real third-party PII in message BODIES -- an Amazon
contact's name/phone/personal email in non-coupa-02.eml and an internal
t.corp.amazon.com ticket URL in comment-02.eml, plus real submitter/attn
names recurring across the new_po corpus. Replaced every personal name,
phone, personal email, and internal URL with synthetic placeholders
(QP-soft-wrap aware) across both .eml bodies and expected goldens.
Extended test_fixture_hygiene to scan BODIES (phone shapes, corp URLs,
the leaked tokens), closing the header-only gap that let this through.

F1 (medium, cancellation gate): _CANCELLATION_SUBJECT was unanchored and
matched with .search(), unlike the anchored new_po pattern -- a subject
merely ending with the cancellation phrase could be routed to the sticky-
Cancelled write. Fully anchored it and switched to .match, and added a
body-corroboration gate (the real Coupa body independently restates
'Purchase Order #<po> ... has been cancelled'); a near-miss/misrouted
subject whose body does not corroborate now fails closed to the LLM
(new reason code cancellation_body_unconfirmed).

Pre-existing (advisory, not this PR): the LLM-fallback else->save_new_po
dispatch and undelimited extraction prompt (issue #101 family) are
byte-identical to main and unchanged here.

401 tests pass; ruff/format clean; cdk synth po-ingest clean.
2026-07-16 17:17:35 -04:00
..
adv-bullet-supplier-mismatch.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-city-no-comma.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-dual-total-mismatch.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-dup-label-swap.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-duplicate-needby.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-line-non-usd.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-missing-location-code.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-missing-status.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-non-usd.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-po-id-mismatch.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-prompt-injection.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-shipto-equals-supplier.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-single-supplier-label.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-status-pending.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-supplier-not-seahaven.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-truncated-line-amount.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-unlabeled-bullet.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00
adv-url-id-mismatch.eml Scrub fixture-body PII and harden cancellation gate (sec review) 2026-07-16 17:17:35 -04:00