instructure/canvas-lms · error · PeerReview::InvalidDatesError
Peer review override due date cannot be after parent…
Error message
Peer review override due date cannot be after parent override until date
What it means
PeerReview::InvalidDatesError raised by PeerReview::Validations#validate_dates_within_parent_boundaries when a child due_at exceeds the parent's lock_at (until) date. When is_override is true the peer review override due date is later than the parent assignment override's until date; otherwise the peer review due date is later than the parent assignment's until date. Canvas enforces the ordering assignment until date >= peer review due date so reviews are locked before the assignment.
Solutions
- Set the peer review due_at to be on or before the parent (override) lock_at/until date
- Extend the parent assignment override's lock_at (with lock_at_overridden=true) so it is >= the peer review due date
- Clear the parent lock_at if no hard until boundary is needed
Example fix
// before
{ peer_review: { due_at: '2026-10-10', assignment: { lock_at: '2026-10-01' } } }
// after
{ peer_review: { due_at: '2026-09-30', assignment: { lock_at: '2026-10-01' } } } Defensive patterns
Strategy: validation
Validate before calling
raise ArgumentError, 'peer review due_at must be <= assignment lock_at' if peer.due_at && parent.lock_at && peer.due_at > parent.lock_at
Try / catch
begin
PeerReview::Service.call(...)
rescue PeerReview::InvalidDatesError => e
render json: { error: e.message }, status: :unprocessable_entity
end Prevention
- Keep the ordering: assignment unlock_at <= assignment due_at <= peer review due_at <= peer review until date <= assignment lock_at
- When editing any one date, re-validate the whole date chain
- Never set a parent lock_at earlier than an existing peer review due date
When it happens
Trigger: Calling a peer review service that runs validate_override_dates_against_parent_override (creating/updating a peer review override whose due_at > parent override lock_at with lock_at_overridden) or validate_peer_review_dates_against_parent_assignment (setting peer_review_dates.due_at after parent_assignment.lock_at). The message variant depends on is_override.
Common situations: Setting an assignment lock_at earlier than the peer review due date; extending a peer review due date after the parent override's until date was already set; importing/copying assignments with shifted date ranges.
Understand the failure class
Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.
Related errors
- Peer review due date cannot be after assignment until date
- Course does not exist
- Override does not exist
- Section does not exist
- Set id is required
AI-assisted analysis of instructure/canvas-lms@1c9f0bb801 (2026-09-15).
Data as JSON: /api/errors/f07ad62f941815db.
Report an issue: GitHub.
Appendix: source
Thrown at app/services/peer_review/validations.rb:189
raise PeerReview::InvalidDatesError,
is_override ? I18n.t("Peer review override due date cannot be before parent override available from date") : I18n.t("Peer review due date cannot be before assignment available from date")
end
# Validate: parent due_at <= child due_at
if parent_due_at && child_due_at && parent_due_at > child_due_at
raise PeerReview::InvalidDatesError,
is_override ? I18n.t("Peer review override due date cannot be before parent override due date") : I18n.t("Peer review due date cannot be before assignment due date")
end
# Validate: child due_at <= parent lock_at
if child_due_at && parent_lock_at && child_due_at > parent_lock_at
raise PeerReview::InvalidDatesError,
is_override ? I18n.t("Peer review override due date cannot be after parent override until date") : I18n.t("Peer review due date cannot be after assignment until date")
end
# Validate: child lock_at <= parent lock_at
if child_lock_at && parent_lock_at && child_lock_at > parent_lock_at
raise PeerReview::InvalidDatesError,
is_override ? I18n.t("Peer review override until date cannot be after parent override until date") : I18n.t("Peer review until date cannot be after assignment until date")
end
end
def validate_set_type_required(set_type)
raise PeerReview::SetTypeRequiredError, I18n.t("Set type is required") unless set_type.present?
end
def validate_set_id_required(set_id)
raise PeerReview::SetIdRequiredError, I18n.t("Set id is required") unless set_id.present?
end
def validate_override_exists(override)
raise PeerReview::OverrideNotFoundError, I18n.t("Override does not exist") unless override.present?
end
def validate_section_exists(section)
raise PeerReview::SectionNotFoundError, I18n.t("Section does not exist") unless section.present?View on GitHub (pinned to 1c9f0bb801)