instructure/canvas-lms · error · PeerReview::InvalidDatesError
Peer review override due date cannot be before parent…
Error message
Peer review override due date cannot be before parent override due date
What it means
PeerReview::InvalidDatesError from the parent due_at <= child due_at check (line 176-178) in validate_dates_within_parent_boundaries: peer reviews must be due no earlier than the parent assignment/override due date. For overrides the message is 'Peer review override due date cannot be before parent override due date'; the non-override variant is 'Peer review due date cannot be before assignment due date'. This enforces the documented chain assignment due <= peer review due.
Solutions
- Raise the peer review due_at to a timestamp >= parent (override) due_at
- Or move the parent due_at earlier so the intended peer review ordering is valid
- If the workflow needs reviews before the assignment due date, note this ordering is not allowed — redesign dates to parent due <= review due
- Pre-validate: raise if parent.due_at && child.due_at && parent.due_at > child.due_at
Example fix
// before parent_due = '2026-05-10T00:00:00Z'; peer_review_due = '2026-05-05T00:00:00Z' // after parent_due = '2026-05-10T00:00:00Z'; peer_review_due = '2026-05-12T00:00:00Z'
Defensive patterns
Strategy: validation
Validate before calling
def review_due_not_before_parent_due?(parent, pr_dates) return true if parent.due_at.nil? || pr_dates[:due_at].nil? parent.due_at <= Time.zone.parse(pr_dates[:due_at].to_s) end
Try / catch
begin
validator.validate_override_dates_against_parent_override(pr_override, parent_override)
rescue PeerReview::InvalidDatesError => e
if e.message.include?('cannot be before parent override due date') || e.message.include?('before assignment due date')
pr_override.due_at = parent.due_at + 1.day
retry
end
raise
end Prevention
- Re-run peer review validation whenever the parent due date is extended
- Model review deadlines as offsets from the parent due (due_at + N days), not absolutes
- Add a regression test covering parent-due-extended-after-review-configured
- Document to teachers that reviews cannot close before the assignment is due
When it happens
Trigger: Calling validate_override_dates_against_parent_override where the parent override's due_at_overridden timestamp is later than the peer review override's due_at, or validate_peer_review_dates_against_parent_assignment where assignment.due_at > peer review due_at.
Common situations: Teacher extends the assignment due date after peer review dates were configured; API clients computing peer review due as 'assignment due minus N days' for staggered workflows (unsupported ordering); timezone shifts making the parent due appear later.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- Parent override due date cannot be before parent override…
- Peer review due date cannot be before assignment due date
- Peer review override available from date cannot be before…
- Peer review override available from date cannot be before…
- Peer review override due date cannot be before parent…
AI-assisted analysis of instructure/canvas-lms@1c9f0bb801 (2026-09-15).
Data as JSON: /api/errors/23a53d94c0822501.
Report an issue: GitHub.
Appendix: source
Thrown at app/services/peer_review/validations.rb:177
# If parent_due_at is present, validate: parent due_at <= child unlock_at
# Otherwise, fall back to: parent unlock_at <= child unlock_at
if parent_due_at && child_unlock_at && parent_due_at > child_unlock_at
raise PeerReview::InvalidDatesError,
is_override ? I18n.t("Peer review override available from date cannot be before parent override due date") : I18n.t("Peer review available from date cannot be before assignment due date")
elsif !parent_due_at && parent_unlock_at && child_unlock_at && parent_unlock_at > child_unlock_at
raise PeerReview::InvalidDatesError,
is_override ? I18n.t("Peer review override available from date cannot be before parent override available from date") : I18n.t("Peer review available from date cannot be before assignment available from date")
end
# Validate: parent unlock_at <= child due_at (for backward compatibility)
if parent_unlock_at && child_due_at && parent_unlock_at > child_due_at
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?View on GitHub (pinned to 1c9f0bb801)