Rule layers

Rules cascade from the org down to each calendar owner. The owner always wins on any field they explicitly set.

Layer model

Org defaults
    ↓
Owner overrides
    ↓
Effective rules (what Openavail enforces)

Two layers. No team layer in v1 (planned for v1.5). Every calendar owner inherits the org defaults and can override any field for themselves.

Org defaults

Set in Dashboard → Rules → Org defaults. These apply to every calendar owner who hasn't overridden a given field.

SettingDescriptionDefault
working_hoursDays and hours available for bookingMon–Fri 09:00–17:00 UTC
buffer_minutesMinimum gap between consecutive meetings15
max_meetings_per_dayHard cap on bookings per day8
sacred_meeting_age_hoursHow old a committed booking must be before it's immune to preemption24

Owner overrides

Calendar owners set their own rules in Dashboard → Calendars → [owner] → Rules. Any field left blank inherits from the org default.

Example:

Org:  working_hours start=09:00, buffer=15 min
CEO:  working_hours start=10:00  (explicit)
CEO effective:  start=10:00, buffer=15 min  ← inherits buffer

Merge semantics

  • If an owner has set a field → their value is used
  • If an owner has NOT set a field → the org default is used
  • Neither layer can leave a required field undefined — the org default must cover all fields

Sacred meetings

A booking becomes sacred — immune to displacement regardless of priority — when any of these three signals is present:

SignalHow it works
AgeCommitted more than sacred_meeting_age_hours ago (default 24 h). Configurable per org — raise it for long planning cycles, lower it for fast-moving teams.
External RSVPAt least one external attendee has accepted the invite on the calendar provider. Detected automatically by the reconciler; no config required.
Human originThe event was created directly in Google or Outlook (not via an agent). The reconciler identifies these by the absence of an Openavail correlation tag.

Any one signal is sufficient. Once a meeting is sacred:

  • No agent can preempt it, even at max priority
  • Preempt attempts return Reject(reason: SACRED_MEETING)
  • The audit log records the attempt as action: rejected, reason: sacred

sacred_meeting_age_hours controls only the age signal. The RSVP and human-origin signals are always active and cannot be disabled.