You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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).
Summary
Carry the RSVP-by deadline through the wire layer for
Invite(EmbargoEvent), perCM-27-001, CM-27-006, EP-07-002, and EP-07-003.
Note that the embargo invitation is an
as_Invite, not anas_Offer(
em_propose_embargo_activity()invultron/wire/as2/factories/embargo.pyreturns
as_Invite). No vocabulary extension is needed:end_timeis inheritedfrom
as_Object(vultron/wire/as2/vocab/base/objects/base.py).Critical hazard: an embargo invitation carries two
end_timefields onenesting level apart in the same JSON document —
Invite.end_time(RSVP-by) andInvite.object_.end_time(embargo expiry, on the nestedas_EmbargoEvent).These MUST be read independently and never substituted for one another.
Acceptance Criteria
em_propose_embargo_activity()accepts an optional RSVP deadline andsets it on the returned
as_Invite's activity-levelend_time(CM-27-001).InviteToEmbargoOnCaseexposes theactivity-level
end_timeas a distinct field from the nested embargo'send_time. A test asserts both are readable and are not conflated.Invite.end_timeis normalised to UTC before storage orcomparison; a naive (non-tz-aware) value is rejected as malformed rather than
assumed UTC (CM-27-006, CS-13-001).
window is refused at construction time (EP-07-002).
end_timeis below the configured minimum isclamped up to the minimum, not rejected, and the clamp is logged
(EP-07-003).
(
AppConfig/ActorConfig, per CFG conventions), defaulting to 72h and 7 daysrespectively (EP-07-001, EP-07-002).
end_time(fallback applies, current behaviourpreserved), present-and-valid, sub-floor (clamped), and naive (rejected).
Reference
Source: #2066
Docs PR: #2210
ADR:
docs/adr/0059-embargo-invite-rsvp-deadline.mdSpecs:
case-management.yamlCM-27-001, CM-27-006;embargo-policy.yamlEP-07Notes:
notes/participant-embargo-consent.md§ "RSVP Deadlines on Embargo Invites"