procurement-ingest/lambdas/wo/email_processor/tests/fixtures/expected/update-plaintext-23.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
845 B
JSON

{
"address": "exercitation sed dolor lorem lorem do sit eiusmod sit\nipsum lorem lorem lor\nconsectetur",
"assigned_to": null,
"building": "WEE1",
"comment_text": "ad ullamco nisi nisi enim exercit\n\nWEE1 - Please confirm once the tech arrives on site for expected ETA above. Following tech\u2019s departure, please update this ticket to confirm if the tech was able to complete the work the same day, or if additional repairs are needed so that we may follow up accordingly. Thank you.",
"comment_time": "2026-06-29T03:44:30",
"commenter": "eiusmod",
"date_reported": null,
"description": "do incididunt amet ad dolore consectetur m",
"due_date": null,
"email_type": "comment",
"priority": null,
"scheduled_start": null,
"severity": null,
"site_code": "WEE1",
"status": null,
"work_order_id": "11649444950"
}