procurement-ingest/lambdas/wo/email_processor/tests/fixtures/expected/update-plaintext-09.json
Adam Moussa 0aef18029b
Fix WO parser advisories A1-A3 (PR #99 follow-ups)
A1 — AI-fallback comment_id nondeterminism: parsed comment_time is model
output and not stable across Lambda async retries, so on the ai_fallback
path the comment_id range-key time segment now derives from the email Date
header (deterministic per S3 object) instead of the model's comment_time.
The template path is unchanged (its comment_time is a pure function of the
raw email). Bedrock invoke pins temperature 0 so retries reproduce the same
extraction. Closes the #23 reopening on the AI path.

A2 — EMF record now carries the spec-required _aws.Timestamp (epoch ms) so
CloudWatch reliably extracts the ParseOutcome datapoint that the
fallback-rate alarm depends on.

A3 — T1 New Comment capture no longer truncates at the first blank line;
multi-paragraph comments are captured through internal blanks and terminate
at the next label/separator. 17 golden files regenerated from the real
fixtures accordingly.

Hardening from the sh-security-review pass on this diff:
- _header_date_iso is total: OverflowError/OSError from an extreme Date
  header fall back to 'nocomment' instead of failing the invocation.
- _capture_block trims blanks in O(n) (no pop(0)) — removes a quadratic
  path on a crafted large blank run.
- work_order_id is enforced digits-only on BOTH parse paths before it is
  used as a DynamoDB key, so prompt-injected AI output cannot forge '#'
  range-key segments or land on an arbitrary WO.
2026-07-16 12:35:37 -04:00

18 lines
822 B
JSON

{
"address": "minim dolore nostrud se\net nostrud laboris\ntempor ut labore n",
"assigned_to": null,
"building": "XEV9",
"comment_text": "lorem lorem lorem enim dolore et consectetur minim elit minim ullamco nisi do sit ad adipiscing minim ul\n\nAll itemized quotes have to include the per line item breakdown for the labor section\n\nLabor Details\nNo. of techs\nNo. of hours\nRate\nTotal\n\nOnce that has been revised from Sea Haven we are good to go with this uplift. Thank you",
"comment_time": "2026-05-12T13:29:16",
"commenter": "dolor l",
"date_reported": null,
"description": "aliqua adipiscing dolor lore",
"due_date": null,
"email_type": "comment",
"priority": null,
"scheduled_start": null,
"severity": null,
"site_code": "XEV9",
"status": null,
"work_order_id": "13996242160"
}