Skip to content

Carry the embargo invite RSVP deadline (Invite.end_time) through the wire layer #2211

Description

@sei-ahouseholder

Summary

Carry the RSVP-by deadline through the wire layer for Invite(EmbargoEvent), per
CM-27-001, CM-27-006, EP-07-002, and EP-07-003.

Note that the embargo invitation is an as_Invite, not an as_Offer
(em_propose_embargo_activity() in vultron/wire/as2/factories/embargo.py
returns as_Invite). No vocabulary extension is needed: end_time is inherited
from as_Object (vultron/wire/as2/vocab/base/objects/base.py).

Critical hazard: an embargo invitation carries two end_time fields one
nesting level apart in the same JSON document — Invite.end_time (RSVP-by) and
Invite.object_.end_time (embargo expiry, on the nested as_EmbargoEvent).
These MUST be read independently and never substituted for one another.

Acceptance Criteria

  • AC-1: em_propose_embargo_activity() accepts an optional RSVP deadline and
    sets it on the returned as_Invite's activity-level end_time (CM-27-001).
  • AC-2: The extracted event for InviteToEmbargoOnCase exposes the
    activity-level end_time as a distinct field from the nested embargo's
    end_time. A test asserts both are readable and are not conflated.
  • AC-3: An inbound Invite.end_time is normalised to UTC before storage or
    comparison; a naive (non-tz-aware) value is rejected as malformed rather than
    assumed UTC (CM-27-006, CS-13-001).
  • AC-4: An outbound invite whose deadline is below the configured minimum
    window is refused at construction time (EP-07-002).
  • AC-5: An inbound invite whose end_time is below the configured minimum is
    clamped up to the minimum, not rejected, and the clamp is logged
    (EP-07-003).
  • AC-6: The minimum window and the fallback default window are configurable
    (AppConfig/ActorConfig, per CFG conventions), defaulting to 72h and 7 days
    respectively (EP-07-001, EP-07-002).
  • AC-7: Tests cover absent end_time (fallback applies, current behaviour
    preserved), present-and-valid, sub-floor (clamped), and naive (rejected).

Reference

Source: #2066
Docs PR: #2210
ADR: docs/adr/0059-embargo-invite-rsvp-deadline.md
Specs: case-management.yaml CM-27-001, CM-27-006; embargo-policy.yaml EP-07
Notes: notes/participant-embargo-consent.md § "RSVP Deadlines on Embargo Invites"

Metadata

Metadata

Assignees

No one assigned

    Labels

    size:M51-300 diff lines or 3-6 ACs

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions