{
  "schema": "super-calendar.platform-graph.v1",
  "purpose": "Canonical navigation model for humans, runtime services, CLI clients, and MCP agents.",
  "navigationOrder": [
    "space",
    "spaceStatus",
    "calendar",
    "availabilityPolicy",
    "calendarEvent",
    "eventVenue",
    "eventParticipant",
    "invitationArtifact",
    "providerConnection",
    "contentCollection",
    "topic",
    "contentEntry",
    "audiencePrincipal",
    "deliveryEndpoint",
    "subscription",
    "deliveryPreference",
    "consentRecord",
    "channelNode",
    "channelEdge",
    "transmission",
    "providerReceipt",
    "interactionObservation"
  ],
  "entities": {
    "space": {
      "description": "Tenant and authorization boundary.",
      "owner": "dashboard/auth",
      "relations": [
        "spaceStatus",
        "calendar",
        "providerConnection",
        "contentCollection",
        "topic",
        "audiencePrincipal",
        "channelNode"
      ],
      "invariants": [
        "Every child resource belongs to exactly one Space.",
        "A client-supplied Space ID is never authorization evidence."
      ]
    },
    "spaceStatus": {
      "description": "Time-bounded operational signal such as available, busy, live, away, closed, or offline.",
      "owner": "activity",
      "relations": [
        "space",
        "contentEntry",
        "topic",
        "channelNode"
      ],
      "invariants": [
        "Transient status must declare a start and expiry so stale availability cannot remain live forever.",
        "Status is canonical content; platform stories, posts, and presence indicators are projections."
      ]
    },
    "calendar": {
      "description": "Private-by-default schedule container with an independent ACL and publication lifecycle.",
      "owner": "scheduling",
      "relations": [
        "space",
        "availabilityPolicy",
        "calendarEvent"
      ],
      "invariants": [
        "Space membership alone does not grant calendar access.",
        "Calendar publication never publishes participant identities."
      ]
    },
    "availabilityPolicy": {
      "description": "Timezone-aware recurring windows, exceptions, capacity, buffers, and booking bounds.",
      "owner": "scheduling",
      "relations": [
        "calendar",
        "calendarEvent"
      ],
      "invariants": [
        "Rules use local wall time plus an IANA timezone; slots use absolute instants.",
        "Resource capacity is independent from attendee count."
      ]
    },
    "calendarEvent": {
      "description": "Scheduled activity whose lifecycle, occupancy, visibility, importance, and notification intent are independent.",
      "owner": "scheduling",
      "relations": [
        "calendar",
        "eventVenue",
        "eventParticipant",
        "invitationArtifact",
        "contentEntry"
      ],
      "invariants": [
        "Event showAs does not encode venue or participant response.",
        "A public projection uses an explicit allowlist and excludes the participant graph."
      ]
    },
    "eventVenue": {
      "description": "Explicit none, physical, virtual, hybrid, or to-be-announced event place and access contract.",
      "owner": "scheduling",
      "relations": [
        "calendarEvent",
        "providerConnection"
      ],
      "invariants": [
        "An empty physical address is never interpreted as online.",
        "Access points store safe URIs or opaque references, never provider credentials."
      ]
    },
    "eventParticipant": {
      "description": "Invitee identity, role, RSVP request, response state, and response version.",
      "owner": "scheduling",
      "relations": [
        "calendarEvent",
        "audiencePrincipal",
        "invitationArtifact"
      ],
      "invariants": [
        "Participation state is independent from event lifecycle and resource occupancy.",
        "Participant identities are private and require event-scoped authorization."
      ]
    },
    "invitationArtifact": {
      "description": "Private iTIP REQUEST or CANCEL representation of one event revision.",
      "owner": "scheduling",
      "relations": [
        "calendarEvent",
        "eventParticipant",
        "deliveryEndpoint"
      ],
      "invariants": [
        "Invitations have stable UID and monotonic sequence values.",
        "Invitation artifacts are distinct from METHOD:PUBLISH subscription feeds."
      ]
    },
    "providerConnection": {
      "description": "Verified installation or credential set for one external provider.",
      "owner": "provider connections",
      "relations": [
        "space",
        "channelNode"
      ],
      "invariants": [
        "Secrets are represented by credentialRef only.",
        "Capabilities are discovered and persisted; callers do not guess them."
      ]
    },
    "contentCollection": {
      "description": "Versioned body of related content such as a newsletter, terms, privacy policy, rules, or knowledge base.",
      "owner": "content",
      "relations": [
        "space",
        "contentEntry",
        "topic",
        "channelNode"
      ],
      "invariants": [
        "A collection is transport-independent.",
        "Legal and policy collections keep immutable published revisions."
      ]
    },
    "topic": {
      "description": "Subscription and preference subject such as newsletter, game updates, security notices, or community rules.",
      "owner": "audience",
      "relations": [
        "space",
        "contentCollection",
        "subscription",
        "deliveryPreference"
      ],
      "invariants": [
        "Topics describe what content is about, not how it is delivered."
      ]
    },
    "contentEntry": {
      "description": "Canonical versioned message, document, post, alert, or event.",
      "owner": "content",
      "relations": [
        "contentCollection",
        "topic",
        "channelNode",
        "transmission"
      ],
      "invariants": [
        "One canonical identity survives projections to multiple platforms.",
        "Media uses controlled asset references."
      ]
    },
    "audiencePrincipal": {
      "description": "Account, contact, anonymous subscriber, external group, or managed audience.",
      "owner": "audience",
      "relations": [
        "space",
        "deliveryEndpoint",
        "subscription",
        "consentRecord"
      ],
      "invariants": [
        "A principal may have multiple independently controlled endpoints."
      ]
    },
    "deliveryEndpoint": {
      "description": "Verified receiving address or device, such as email, push subscription, phone number, or provider audience.",
      "owner": "audience",
      "relations": [
        "audiencePrincipal",
        "providerConnection",
        "deliveryPreference"
      ],
      "invariants": [
        "Addresses and tokens are secret references where applicable.",
        "Disabled or unverified endpoints cannot receive."
      ]
    },
    "subscription": {
      "description": "Relationship expressing that an audience principal follows one topic.",
      "owner": "audience",
      "relations": [
        "audiencePrincipal",
        "topic"
      ],
      "invariants": [
        "Subscription status is independent from transport.",
        "Unsubscribed is terminal until an explicit new opt-in."
      ]
    },
    "deliveryPreference": {
      "description": "Allow, deny, or inherit decision scoped to a principal, topic, endpoint, device, transport, or category.",
      "owner": "audience",
      "relations": [
        "audiencePrincipal",
        "topic",
        "deliveryEndpoint"
      ],
      "invariants": [
        "Specific scopes override general scopes.",
        "A preference cannot override revoked consent or a disabled endpoint."
      ]
    },
    "consentRecord": {
      "description": "Append-only evidence of grant or revocation for a declared delivery purpose.",
      "owner": "audience",
      "relations": [
        "audiencePrincipal",
        "deliveryEndpoint"
      ],
      "invariants": [
        "Consent is purpose-specific and not inferred from channel membership.",
        "Publication and acceptance are distinct records."
      ]
    },
    "channelNode": {
      "description": "Management node that may ingest, publish, relay, moderate, or transform canonical content.",
      "owner": "channel graph",
      "relations": [
        "space",
        "providerConnection",
        "contentCollection",
        "channelEdge"
      ],
      "invariants": [
        "Platform is an adapter capability, not the semantic identity of the node."
      ]
    },
    "channelEdge": {
      "description": "Directional policy connecting two channel nodes.",
      "owner": "channel graph",
      "relations": [
        "channelNode",
        "topic",
        "transmission"
      ],
      "invariants": [
        "Bidirectional mirroring requires two explicit edges.",
        "Transforms are declarative and bounded."
      ]
    },
    "transmission": {
      "description": "Idempotent outbox instruction for one content revision to reach one node or endpoint.",
      "owner": "delivery",
      "relations": [
        "contentEntry",
        "channelEdge",
        "deliveryEndpoint",
        "providerReceipt"
      ],
      "invariants": [
        "One revision reaches a target at most once.",
        "Uncertain provider success requires reconciliation, not blind retry."
      ]
    },
    "providerReceipt": {
      "description": "Mapping from a provider message identity to canonical content and its transmission.",
      "owner": "delivery",
      "relations": [
        "transmission",
        "contentEntry",
        "channelNode"
      ],
      "invariants": [
        "Receipts prevent webhook echoes and enable edit or removal propagation."
      ]
    },
    "interactionObservation": {
      "description": "Provider or verified first-party evidence about delivery, engagement, interest, or attendance. Never a participant RSVP decision.",
      "owner": "channel graph",
      "relations": [
        "space",
        "audiencePrincipal",
        "deliveryEndpoint",
        "providerReceipt",
        "eventParticipant"
      ],
      "invariants": [
        "Every observation is correlated through a verified immutable Space, subject, principal, and provider binding.",
        "Resend open is a detection signal, not human reading or acceptance.",
        "Discord Scheduled Event User Add/Remove expresses reversible interest, never iTIP ACCEPTED or attendance.",
        "RSVP remains owned by scheduling; lead qualification remains a separate explicit decision.",
        "No private interaction evidence may be exposed by a public calendar or channel publication."
      ]
    }
  },
  "distinctions": [
    [
      "topic",
      "what the audience follows"
    ],
    [
      "transport",
      "how a delivery moves: email, push, SMS, Telegram, Discord, or another adapter"
    ],
    [
      "endpoint",
      "where one principal or managed audience receives on a transport"
    ],
    [
      "node",
      "where content is managed or projected in the graph"
    ],
    [
      "subscription",
      "who follows a topic"
    ],
    [
      "preference",
      "whether a topic may use an endpoint or transport"
    ],
    [
      "consent",
      "whether a declared purpose has valid grant evidence"
    ],
    [
      "transmission",
      "one planned or completed delivery"
    ],
    [
      "publication",
      "whether canonical content is draft, scheduled, active, expired, or withdrawn"
    ],
    [
      "notification intent",
      "which topics and temporal triggers may request delivery; never a transport or consent grant"
    ],
    [
      "event venue",
      "where an event occurs; never whether it blocks time"
    ],
    [
      "event occupancy",
      "whether an event consumes resource capacity; never attendance state"
    ],
    [
      "participation",
      "one invitee response; never the event lifecycle"
    ],
    [
      "invitation",
      "private RSVP artifact; never a public subscription feed"
    ],
    [
      "interaction observation",
      "verified evidence from delivery endpoints and provider events; not authoritative RSVP or qualification"
    ]
  ],
  "preferenceResolution": {
    "states": [
      "allow",
      "deny",
      "inherit"
    ],
    "terminalBlocks": [
      "subscription_inactive",
      "endpoint_disabled",
      "endpoint_unverified",
      "consent_missing",
      "consent_revoked"
    ],
    "precedenceMostSpecificFirst": [
      "topic+endpoint",
      "category+endpoint",
      "topic+transport",
      "category+transport",
      "topic",
      "category",
      "endpoint",
      "transport",
      "principal",
      "space_default"
    ],
    "outcomes": [
      "allow",
      "deny",
      "defer"
    ]
  },
  "agentNavigation": {
    "readOrder": [
      "ontology",
      "space",
      "capabilities",
      "content",
      "audience",
      "graph",
      "delivery status",
      "interaction evidence"
    ],
    "mutationOrder": [
      "inspect",
      "plan",
      "authorize",
      "execute",
      "verify"
    ],
    "rules": [
      "Never infer a credential, consent, membership, or capability.",
      "Never expose endpoint addresses, device tokens, provider secrets, or private content through a public resource.",
      "Prefer stable IDs plus human-readable slugs and labels.",
      "Return explicit relations and allowed next actions with every private entity.",
      "Separate dry-run planning from mutations.",
      "Require authenticated Space authorization for private graph traversal or mutation."
    ]
  }
}
