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.
| Setting | Description | Default |
|---|---|---|
working_hours | Days and hours available for booking | Mon–Fri 09:00–17:00 UTC |
buffer_minutes | Minimum gap between consecutive meetings | 15 |
max_meetings_per_day | Hard cap on bookings per day | 8 |
sacred_meeting_age_hours | How old a committed booking must be before it's immune to preemption | 24 |
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:
| Signal | How it works |
|---|---|
| Age | Committed 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 RSVP | At least one external attendee has accepted the invite on the calendar provider. Detected automatically by the reconciler; no config required. |
| Human origin | The 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.