Time Contract
Time is the personal calendar and task authority. It owns calendars, appointments, tasks, schedule views, recurrence, reminders, and calendar mirrors of objects owned by other domains.
A bare event is a Social event. A scheduled Time object is an appointment
or calendar event; an actionable Time object is a task.
Ownership
Time owns:
- calendars
- appointments (
VEVENT) - tasks (
VTODO) - calendar slots and time boundaries
- recurrence rules and occurrence expansion
- reminder definitions (
VALARM) - calendar object sources
- calendar workspace payloads as compatibility presentation content
- calendar mirrors of Social events
- DAV integration through credentials issued by API
Boundaries:
- Social owns Social event identity, visibility, RSVP, participants, and discussion.
- Time owns the calendar entry or mirror used to render that Social event on calendars.
- World owns composed object identity, effective permissions, relationships, placement, runtime routing, focus, and workspace composition.
- Runtimes own panels, rails, markers, lists, meshes, interaction, and rendering.
Producer object route
World consumes Time object sources from:
GET /objects
Time returns:
| Field | Type | Meaning |
|---|---|---|
objects.appointments |
array | Calendar event object sources |
objects.tasks |
array | Task object sources |
This is the service-to-World route. It is not a runtime route. Runtimes do not call it.
Time object source
Time appointments and tasks follow the object source contract.
| Field | Type | Meaning |
|---|---|---|
source.service |
string | time |
source.resource_type |
string | calendar_event or task |
source.resource_id |
string | Stable Time object id |
object_type |
string | calendar_event or task |
title |
string | Calendar event or task title |
summary |
string | Time, location, and calendar summary when available |
state |
object | Runtime-safe Time object state from the canonical calendar object |
domain_permissions.can_view |
boolean | Member may view the Time object |
domain_permissions.can_update |
boolean | Member may update Time-owned editable fields |
domain_permissions.can_delete |
boolean | Member may delete the Time object |
domain_actions |
array | open_time_object, update_time_object, and delete_time_object semantic actions |
relationships |
array | Empty unless Time owns a service-local relationship |
Time object sources must not include panels, rails, docks, stacks, Surface ids, runtime URLs, or placement. World maps Time object sources into canonical World objects and World-routed actions.
Runtime routes through World
Runtimes use World URLs for visible Time behavior:
GET /world/panels/time?view={day|week|month|agenda|tasks}&date={YYYY-MM-DD}&timezone={IANA timezone}
POST /world/calendars
PATCH /world/calendars/{id}
DELETE /world/calendars/{id}
POST /world/time/objects
PATCH /world/time/objects/{id}
DELETE /world/time/objects/{id}
World relays calendar workspace behavior to Time and composes returned content into the center-stack calendar surface. The transient panel bridge is not the calendar workspace.
Service routes
Time exposes service-level routes for calendar behavior:
GET /events
POST /events
GET /events/{id}
PATCH /events/{id}
DELETE /events/{id}
GET /tasks
POST /tasks
GET /tasks/{id}
PATCH /tasks/{id}
DELETE /tasks/{id}
POST /integrations/social/events
GET /objects
Runtimes do not call these routes directly. Social may use /integrations/social/events to push Social event mirrors into Time.
Social event mirrors
When a Social event has calendar relevance, Time stores a mirror with source metadata:
| Field | Meaning |
|---|---|
source_service |
social |
source_object_type |
event |
source_object_id |
Social event id |
The mirror lets Time render the event in calendars and schedule views. It does not transfer event ownership from Social to Time.
Mirror lifecycle:
- Social creates or updates the mirror through Time when the Social event changes.
- Time owns the calendar presentation fields for the mirror.
- Social owns the event identity, visibility, RSVP, participants, and discussion fields.
- Runtimes refresh through World after Time or Social writes; they do not call Social to resolve the mirror.
Edit authority
Calendar-only entries are edited through Time.
Social event mirrors are edited according to the field being changed:
| Change | Authority |
|---|---|
| Calendar display, reminder, calendar placement | Time |
| Event title, summary, visibility, RSVP, participants, community context, discussion | Social |
| Event time bounds for a Social event | Social first; Time mirrors the result |
Social mirrors reject Time or DAV edits to Social-owned fields. Calendar assignment, display color, local visibility, and alarms remain Time-owned and survive later Social synchronization.
Canonical calendar objects
Each Time calendar is a mixed CalDAV collection that may contain both VEVENT and VTODO objects. The canonical object stores the complete iCalendar payload plus indexed fields used for range, task, ownership, and source queries.
- Appointments support start/end, all-day state, timezone, location, RRULE, recurrence exceptions, and VALARM.
- Tasks support start, due date, completion, status, priority, RRULE, and VALARM.
- Native Time APIs and CalDAV read and write the same canonical objects.
- Push, email, and background alarm delivery are outside this milestone; reminder definitions still round-trip through Time and DAV.
Calendar workspace
The Time payload supplies view, anchor_date, range, timezone,
calendars, appointments, tasks, editable-field metadata, and action
URLs. Day, week, month, agenda, and tasks are distinct views with previous,
next, and today navigation. Workspace refreshes preserve the selected view,
anchor date, and timezone. Runtimes render the payload inside the durable
surface_calendar; they must not substitute a transient panel or generic
list.
CalDAV
Time exposes standards-based DAV collections externally at
https://services.elonn.com/caldav/. Members authenticate with their normal
Elonn email or username and account password; API remains the credential
authority and Time never reads password hashes. /dav/ remains a compatibility
alias on the Time host. Required behavior includes principal discovery,
calendar home discovery, mixed VEVENT/VTODO collections, object CRUD, ETags,
sync tokens, calendar-query, and calendar-multiget.
Runtime rules
- Runtimes must call World, not Time, for visible calendar workspace state.
- Runtimes must label Time-owned objects as calendar events or time events.
- Runtimes must not call Social to resolve calendar mirrors.
- Runtimes must treat
source_serviceandsource_object_typeas ownership metadata, not as runtime routing instructions. - Runtimes do not consume
GET /objects; World consumes it and translates the result.