AuditService.record() was generating its own timestamp internally,
discarding the original DomainEvent.timestamp. This means audit entries
recorded when an event was audited, not when the domain event actually
occurred, breaking forensic accuracy per §Audit Logging (SEC7).
Changes:
- Add `timestamp: datetime | None = None` keyword parameter to
AuditService.record(). When provided, uses it as created_at;
falls back to datetime.now(tz=UTC) for backward compatibility.
Applied to both the async queue path and the synchronous DB path.
- AuditEventSubscriber._handle_event() now passes timestamp=event.timestamp
so the original event creation time is preserved in audit entries.
- Add 3 Behave BDD scenarios covering: full pipeline timestamp
preservation, direct record() with explicit timestamp, and backward
compatibility (record() without timestamp auto-generates created_at).
- Add preserve_event_timestamp Robot integration test and helper subcommand.
- Add static source check in security_audit.robot verifying the
timestamp parameter signature exists.
ISSUES CLOSED: #719