ak.schema.calendar_event.v1
ak.schema.calendar_event.v1 · file: schemas/calendar-event.schema.json Schedule subtree carried at Strand metadata.fields.calendar and activated by ak.schema.calendar_event.v1 in Strand.schema_refs. Both directions of that binding are enforced by strand.schema.json. All intervals are half-open [start, end). Timed events carry RFC 8984 LocalDateTime wall-clock anchors resolved through timezone plus tzdb_version; this schema never carries an absolute instant.
* $ · object
Schedule subtree carried at Strand metadata.fields.calendar and activated by ak.schema.calendar_event.v1 in Strand.schema_refs. Both directions of that binding are enforced by strand.schema.json. All intervals are half-open [start, end). Timed events carry RFC 8984 LocalDateTime wall-clock anchors resolved through timezone plus tzdb_version; this schema never carries an absolute instant.
allOf · allOf[0] ·
?allOf · allOf[1] ·
?* start · oneOf[2]
Inclusive lower bound of the event interval, and the recurrence anchor. Narrowed to local_date when all_day is true and to local_date_time when it is false.
oneOf · oneOf[0] ·
string (date) · format=date · $ref ./time.schema.json#/$defs/local_dateProleptic Gregorian calendar date with no time, offset, or zone. Not an absolute instant: it resolves to an instant only through an explicitly carried IANA time zone plus TZDB version. Shape validation by this pattern is supplemented by semantic date validation.
pattern:
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$oneOf · oneOf[1] ·
string · $ref ./time.schema.json#/$defs/local_date_timeRFC 8984 LocalDateTime narrowed to whole seconds. Wall-clock time with no offset, no Z suffix, no bracketed zone, and no fractional seconds; it resolves to an instant only through an explicitly carried IANA time zone plus TZDB version. Producers MUST NOT spell whole seconds as .0 or .000. Shape validation by this pattern is supplemented by semantic date validation.
pattern:
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$* end · oneOf[2]
Exclusive upper bound of the event interval, in the same shape as start. MUST be strictly later than start in both branches; a single all-day event spells end as the following date. JSON Schema cannot express the cross-field comparison, so reducers and profiles enforce it with schema_violation.
oneOf · oneOf[0] ·
string (date) · format=date · $ref ./time.schema.json#/$defs/local_dateProleptic Gregorian calendar date with no time, offset, or zone. Not an absolute instant: it resolves to an instant only through an explicitly carried IANA time zone plus TZDB version. Shape validation by this pattern is supplemented by semantic date validation.
pattern:
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$oneOf · oneOf[1] ·
string · $ref ./time.schema.json#/$defs/local_date_timeRFC 8984 LocalDateTime narrowed to whole seconds. Wall-clock time with no offset, no Z suffix, no bracketed zone, and no fractional seconds; it resolves to an instant only through an explicitly carried IANA time zone plus TZDB version. Producers MUST NOT spell whole seconds as .0 or .000. Shape validation by this pattern is supplemented by semantic date validation.
pattern:
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$* timezone ·
stringCanonical IANA Zone name in the release named by tzdb_version. Producers MUST resolve Link aliases to their canonical Zone before signing per calendar-timezone-registry.json; this pattern only constrains shape.
pattern:
^[A-Za-z][A-Za-z0-9_+-]*(?:/[A-Za-z0-9_+-]+)*$* tzdb_version ·
stringIANA TZDB release tag (for example 2026a) whose rules resolve timezone and every derived instant. Signed with the schedule so receivers never silently substitute their locally installed release.
pattern:
^[0-9]{4}[a-z]$* all_day ·
booleanTrue selects the date branch of start/end/recurrence.until; false selects the whole-second LocalDateTime branch.
* status ·
string (enum)Whole-event schedule status. Required with no implicit default; distinct from the generic Strand stage and state axes. cancelled rejects new RSVPs and is schedule-relevant for notification.
enum:
"confirmed" "tentative" "cancelled"recurrence · object · $ref #/$defs/recurrence
RFC 8984 RecurrenceRule snake_case subset. Omitted interval means 1, omitted first_day_of_week means mo, rscale is Gregorian and skip is omit; the JSCalendar @type discriminator is implied by this schema and MUST NOT appear on the wire. Unlisted RecurrenceRule members, excluded rules, overrides, RDATE and EXDATE are rejected rather than ignored.
allOf · allOf[0] ·
?allOf · allOf[1] ·
?allOf · allOf[2] ·
?allOf · allOf[3] ·
?* frequency ·
string (enum)enum:
"daily" "weekly" "monthly" "yearly"interval ·
integerby_day · array<$ref #/$defs/n_day>
items · object · $ref #/$defs/n_day
* day ·
string (enum) · $ref #/$defs/week_dayenum:
"mo" "tu" "we" "th" "fr" "sa" "su"nth_of_period ·
integerby_month · array<string>
items ·
stringpattern:
^(?:[1-9]|1[0-2])$by_month_day · array<integer>
items ·
integerby_set_position · array<integer>
items ·
integerfirst_day_of_week ·
string (enum) · $ref #/$defs/week_dayenum:
"mo" "tu" "we" "th" "fr" "sa" "su"count ·
integeruntil · oneOf[2]
Inclusive termination bound compared against the occurrence local start with <=. Narrowed to the same branch as start/end by all_day, and MUST NOT be earlier than the base start.
oneOf · oneOf[0] ·
string (date) · format=date · $ref ./time.schema.json#/$defs/local_dateProleptic Gregorian calendar date with no time, offset, or zone. Not an absolute instant: it resolves to an instant only through an explicitly carried IANA time zone plus TZDB version. Shape validation by this pattern is supplemented by semantic date validation.
pattern:
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$oneOf · oneOf[1] ·
string · $ref ./time.schema.json#/$defs/local_date_timeRFC 8984 LocalDateTime narrowed to whole seconds. Wall-clock time with no offset, no Z suffix, no bracketed zone, and no fractional seconds; it resolves to an instant only through an explicitly carried IANA time zone plus TZDB version. Producers MUST NOT spell whole seconds as .0 or .000. Shape validation by this pattern is supplemented by semantic date validation.
pattern:
^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$location · oneOf[2]
oneOf · oneOf[0] · object · $ref #/$defs/calendar_location
title ·
string (arkret-single-line-display-text) · format=arkret-single-line-display-text · $ref string-profiles.schema.json#/$defs/display_text_256NFC multilingual single-line display text; mixed scripts, emoji, and symbols are allowed.
pattern:
^[^\u0000-\u001F\u007F-\u009F\u202A-\u202E\u2066-\u2069\uFEFF]*[^\s\u0000-\u001F\u007F-\u009F\u202A-\u202E\u2066-\u2069\uFEFF][^\u0000-\u001F\u007F-\u009F\u202A-\u202E\u2066-\u2069\uFEFF]*$address ·
stringgeo_uri ·
stringpattern:
^geo:uri ·
string (uri) · format=urioneOf · oneOf[1] · object · $ref ./encrypted-envelope.schema.json
Minimal ciphertext wire. purpose, effective scope and Event kind come from the frozen signed outer Event; mls_group_id is derived from that scope. The canonical pre-encryption header is reconstructed and is not duplicated on wire.
* version ·
const "1.0"enum:
"1.0"* content_type ·
stringpattern:
^[a-z0-9.+-]+/[a-z0-9.+-]+$* encryption_context ·
$ref #/$defs/encryption_context · $ref #/$defs/encryption_context* ciphertext ·
stringpattern:
^[A-Za-z0-9_-]+$call_id ·
stringSoft reference to an Arkret call session. It never widens access: an unresolvable or invisible call_id MUST NOT leak call state.
pattern:
^ak:call:[A-Za-z0-9_-]{44}$attendees · array<$ref #/$defs/attendee>
The single canonical schedule roster. Membership and invite projections are producer inputs only, never a second projection truth source. actor_id uniqueness is enforced by the reducer; at most one organizer is enforced here by maxContains.
items · object · $ref #/$defs/attendee
* actor_id · oneOf[2] · $ref ./common-ids.schema.json#/$defs/actor_id
Complete protocol identity for an Event author or Realm member: account carries the exact AccountId for every Station-hosted principal; service identifies a service acting as itself. The discriminator is validated against accepted registration and admission evidence; it never authorizes itself. Account and service are distinct, and no comparison may fall back to a bare principal_id. Agent and integration classification, provisioning, controller binding and credential authorization are independently verified facts, not identity variants. Account actors at different Stations MUST NOT share or inherit authority merely because their principal_id, DID controller or signing key matches, including membership, capability, RealmCommit-signing and recovery authority.
oneOf · oneOf[0] · object
* kind ·
const "account"enum:
"account"* account_id ·
$ref #/$defs/account_id · $ref #/$defs/account_idoneOf · oneOf[1] · object
* kind ·
const "service"enum:
"service"* service_id ·
$ref #/$defs/did_core_id · $ref #/$defs/did_core_idrole ·
string (enum)Attendance role. Omitted means required. organizer is display and scheduling semantics only and grants no capability.
enum:
"required" "optional" "organizer"display_name_snapshot ·
string (arkret-single-line-display-text) · format=arkret-single-line-display-text · $ref string-profiles.schema.json#/$defs/display_text_256NFC multilingual single-line display text; mixed scripts, emoji, and symbols are allowed.
pattern:
^[^\u0000-\u001F\u007F-\u009F\u202A-\u202E\u2066-\u2069\uFEFF]*[^\s\u0000-\u001F\u007F-\u009F\u202A-\u202E\u2066-\u2069\uFEFF][^\u0000-\u001F\u007F-\u009F\u202A-\u202E\u2066-\u2069\uFEFF]*$Source
- registry row:
spec/v1/artifacts/registry/schema-registry.json - schema document:
spec/v1/artifacts/schemas/calendar-event.schema.json