mirror of
https://github.com/Sea-Haven-Industries/procurement-ingest.git
synced 2026-10-07 16:08:54 +00:00
/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.
49 lines
1.4 KiB
JSON
49 lines
1.4 KiB
JSON
{
|
|
"email_type": "new_po",
|
|
"po_number": "2D-78768854",
|
|
"po_status": "Issued - Created",
|
|
"source_system": "coupa",
|
|
"submitted_by": "Alex Fixtly",
|
|
"on_behalf_of": "Alex Fixtly",
|
|
"order_date": "05/05/26",
|
|
"revision_date": "05/05/26",
|
|
"last_opened": null,
|
|
"acknowledged_at": null,
|
|
"payment_terms": "90 NET",
|
|
"requisition_number": "71992182",
|
|
"department": null,
|
|
"view_order_url": "https://supplier.coupahost.com/orders/78768854?instance_url=https%3A%2F%2Famazon.coupahost.com%2F&supplier_id=429079&",
|
|
"supplier": {
|
|
"name": "SEA HAVEN INDUSTRIES:CORPORATE AP:SERVICES(OK6HE)"
|
|
},
|
|
"site_code": null,
|
|
"ship_to": {
|
|
"name": "WME5 - Amazon.com Services LLC (WME5)",
|
|
"address": "WME5 - Amazon.com Services LLC (WME5)\n33 ALDRICH DR\nCARIBOU, ME 04736-3887\nUnited States",
|
|
"street": "33 ALDRICH DR",
|
|
"city": "CARIBOU",
|
|
"state": "ME",
|
|
"zip": "04736-3887",
|
|
"location_code": "188152232",
|
|
"attn": "Alex Fixtly"
|
|
},
|
|
"total_amount": 283.0,
|
|
"currency": "USD",
|
|
"fiscal_year": null,
|
|
"trade": null,
|
|
"coupa_category": "Maintenance - Facilities",
|
|
"line_items": [
|
|
{
|
|
"description": "General Building - AMOC Quote Request - BBM",
|
|
"amount": 283.0,
|
|
"currency": "USD",
|
|
"need_by": "05/05/26",
|
|
"category": "Maintenance - Facilities",
|
|
"account_code": "7D-3H16-8041-31836-0000-0000-7724-000078",
|
|
"period": "2D AMOC 2026",
|
|
"quantity": null,
|
|
"unit": null,
|
|
"price": null
|
|
}
|
|
]
|
|
}
|