{
  "catalog_version": 1,
  "events": [
    {
      "audience": "owner",
      "bus": true,
      "description": "A DNS-01 challenge was written, and where it went: the operator's own zone, the hub bridge, or both. Never the challenge value.",
      "level": "info",
      "name": "airdress.acme.challenge_path",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A DNS-01 challenge was written, and where it went: the operator's own zone, the hub bridge, or both. Never the challenge value.",
        "properties": {
          "name": {
            "type": "string"
          },
          "path": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "path"
        ],
        "title": "ChallengePathChosen",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The airdress turned out to be delegated, so the hub's half of DNS-01 is retired for good: challenges go to this operator's own zone alone.",
      "level": "info",
      "name": "airdress.acme.hub_bridge_retired",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The airdress turned out to be delegated, so the hub's half of DNS-01 is retired for good: challenges go to this operator's own zone alone.",
        "properties": {
          "name": {
            "description": "The challenge record name being written when it was learnt.",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "title": "HubBridgeRetired",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A request to the host-local admin listener did not carry the admin credential and was refused. `presented` says whether a wrong one was.",
      "level": "warn",
      "name": "airdress.admin.credential_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A request to the host-local admin listener did not carry the admin credential and was refused. `presented` says whether a wrong one was.",
        "properties": {
          "path": {
            "type": "string"
          },
          "presented": {
            "type": "boolean"
          }
        },
        "required": [
          "path",
          "presented"
        ],
        "title": "AdminCredentialRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The admin credential could not be written under `dir`, so every admin TLS request is refused.",
      "level": "error",
      "name": "airdress.admin.credential_unavailable",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The admin credential could not be written under `dir`, so every admin TLS request is refused.",
        "properties": {
          "dir": {
            "type": "string"
          },
          "error": {
            "type": "string"
          }
        },
        "required": [
          "dir",
          "error"
        ],
        "title": "AdminCredentialUnavailable",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The admin listener was not started: its bind address is invalid, or (with `bind`) it could not be bound. The operator serves on without it.",
      "level": "error",
      "name": "airdress.admin.not_started",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The admin listener was not started: its bind address is invalid, or (with `bind`) it could not be bound. The operator serves on without it.",
        "properties": {
          "bind": {
            "type": [
              "string",
              "null"
            ]
          },
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ],
        "title": "AdminNotStarted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A request reached the admin listener from beyond loopback and was refused.",
      "level": "warn",
      "name": "airdress.admin.peer_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A request reached the admin listener from beyond loopback and was refused.",
        "properties": {
          "peer": {
            "type": "string"
          }
        },
        "required": [
          "peer"
        ],
        "title": "AdminPeerRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The admin listener stopped serving with an error.",
      "level": "error",
      "name": "airdress.admin.stopped",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The admin listener stopped serving with an error.",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ],
        "title": "AdminStopped",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The root key pinned for this airdress is not the agent's sealed root key: peer clients reject the agent's credential until the divergence is resolved.",
      "level": "warn",
      "name": "airdress.agent.root_key_diverged",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The root key pinned for this airdress is not the agent's sealed root key: peer clients reject the agent's credential until the divergence is resolved.",
        "properties": {
          "airdress": {
            "type": "string"
          }
        },
        "required": [
          "airdress"
        ],
        "title": "AgentRootKeyDiverged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A federated peer's root key was pinned the first time it was seen (trust on first use). The key itself is not in the event.",
      "level": "info",
      "name": "airdress.agent.root_key_pinned_on_first_contact",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A federated peer's root key was pinned the first time it was seen (trust on first use). The key itself is not in the event.",
        "properties": {
          "airdress": {
            "description": "The peer airdress whose root key was pinned.",
            "type": "string"
          }
        },
        "required": [
          "airdress"
        ],
        "title": "PeerRootKeyPinned",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": false,
      "description": "This operator attested a remote session's bus write with its attestation key. `kid` names the public key; `client` the hub client the session came through. One per remote write.",
      "level": "info",
      "name": "airdress.agent_bus.attestation.issued",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "This operator attested a remote session's bus write with its attestation key. `kid` names the public key; `client` the hub client the session came through. One per remote write.",
        "properties": {
          "client": {
            "type": "string"
          },
          "kid": {
            "type": "string"
          },
          "op": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "client",
          "kid",
          "op",
          "principal_id",
          "session"
        ],
        "title": "AgentBusAttestationIssued",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A session acquired a claim, with a new fencing number.",
      "level": "info",
      "name": "airdress.agent_bus.claim.acquired",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A session acquired a claim, with a new fencing number.",
        "properties": {
          "claim": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          },
          "token": {
            "format": "int64",
            "type": "integer"
          },
          "topic": {
            "type": "string"
          }
        },
        "required": [
          "claim",
          "principal_id",
          "session",
          "token",
          "topic"
        ],
        "title": "AgentBusClaimAcquired",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A claim was freed from the host CLI, whoever held it.",
      "level": "warn",
      "name": "airdress.agent_bus.claim.broken",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A claim was freed from the host CLI, whoever held it.",
        "properties": {
          "claim": {
            "type": "string"
          },
          "last_token": {
            "format": "int64",
            "type": "integer"
          },
          "topic": {
            "type": "string"
          }
        },
        "required": [
          "claim",
          "last_token",
          "topic"
        ],
        "title": "AgentBusClaimBroken",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A held claim was handed to a named session in one step.",
      "level": "info",
      "name": "airdress.agent_bus.claim.handed_off",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A held claim was handed to a named session in one step.",
        "properties": {
          "claim": {
            "type": "string"
          },
          "from": {
            "format": "uuid",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "to": {
            "format": "uuid",
            "type": "string"
          },
          "token": {
            "format": "int64",
            "type": "integer"
          },
          "topic": {
            "type": "string"
          }
        },
        "required": [
          "claim",
          "from",
          "principal_id",
          "to",
          "token",
          "topic"
        ],
        "title": "AgentBusClaimHandedOff",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A claim's lease ran out and another session took it.",
      "level": "info",
      "name": "airdress.agent_bus.claim.lapsed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A claim's lease ran out and another session took it.",
        "properties": {
          "claim": {
            "type": "string"
          },
          "previous_holder": {
            "format": "uuid",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "topic": {
            "type": "string"
          }
        },
        "required": [
          "claim",
          "previous_holder",
          "principal_id",
          "topic"
        ],
        "title": "AgentBusClaimLapsed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A fenced write was refused: its token no longer holds the claim. `current_token` is the claim's latest fencing number.",
      "level": "info",
      "name": "airdress.agent_bus.fence.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A fenced write was refused: its token no longer holds the claim. `current_token` is the claim's latest fencing number.",
        "properties": {
          "claim": {
            "type": "string"
          },
          "current_token": {
            "format": "int64",
            "type": "integer"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "token": {
            "format": "int64",
            "type": "integer"
          },
          "topic": {
            "type": "string"
          }
        },
        "required": [
          "claim",
          "current_token",
          "principal_id",
          "token",
          "topic"
        ],
        "title": "AgentBusFenceRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A refused bus write: an operator-attested write met a topic that accepts only device-signed writes.",
      "level": "info",
      "name": "airdress.agent_bus.message.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A refused bus write: an operator-attested write met a topic that accepts only device-signed writes.",
        "properties": {
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "principal_id",
          "reason"
        ],
        "title": "AgentBusMessageRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A topic's policy changed: by the owner through the route (`relaxed` says whether device signatures stopped being required), or from the host (`by` is `host`).",
      "level": "info",
      "name": "airdress.agent_bus.policy.changed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A topic's policy changed: by the owner through the route (`relaxed` says whether device signatures stopped being required), or from the host (`by` is `host`).",
        "properties": {
          "by": {
            "type": [
              "string",
              "null"
            ]
          },
          "relaxed": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "require_device_signature": {
            "type": "boolean"
          },
          "retention_hours": {
            "format": "int32",
            "type": "integer"
          },
          "topic": {
            "type": "string"
          }
        },
        "required": [
          "require_device_signature",
          "retention_hours",
          "topic"
        ],
        "title": "AgentBusPolicyChanged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "An agent bus session ended, and what it held was released. `reason` is `client`, `owner`, `expired`, `principal_revoked`, `suspended`, `not_enabled`, …",
      "level": "info",
      "name": "airdress.agent_bus.session.ended",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An agent bus session ended, and what it held was released. `reason` is `client`, `owner`, `expired`, `principal_revoked`, `suspended`, `not_enabled`, …",
        "properties": {
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "principal_id",
          "reason",
          "session"
        ],
        "title": "AgentBusSessionEnded",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "An agent bus session started. `attestation` is `device` or `operator`.",
      "level": "info",
      "name": "airdress.agent_bus.session.started",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An agent bus session started. `attestation` is `device` or `operator`.",
        "properties": {
          "attestation": {
            "type": "string"
          },
          "harness": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "attestation",
          "harness",
          "label",
          "principal_id",
          "session"
        ],
        "title": "AgentBusSessionStarted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A device-signed bus write was refused: its signature did not verify over the canonical bytes, or (`reason: replayed`) its nonce was already used. The device is the person's own agent enrollment.",
      "level": "warn",
      "name": "airdress.agent_bus.signature.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A device-signed bus write was refused: its signature did not verify over the canonical bytes, or (`reason: replayed`) its nonce was already used. The device is the person's own agent enrollment.",
        "properties": {
          "enrollment": {
            "format": "uuid",
            "type": "string"
          },
          "op": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "enrollment",
          "op",
          "principal_id"
        ],
        "title": "AgentBusSignatureRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A compare-and-set state write named a version that is no longer current.",
      "level": "info",
      "name": "airdress.agent_bus.state.conflict",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A compare-and-set state write named a version that is no longer current.",
        "properties": {
          "current_version": {
            "format": "int64",
            "type": "integer"
          },
          "if_version": {
            "format": "int64",
            "type": "integer"
          },
          "key": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "topic": {
            "type": "string"
          }
        },
        "required": [
          "current_version",
          "if_version",
          "key",
          "principal_id",
          "topic"
        ],
        "title": "AgentBusStateConflict",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A sweep pass changed something: sessions expired or ended for a revoked device or person, and messages, nonces, ended sessions and empty topics past retention removed. Counts only.",
      "level": "info",
      "name": "airdress.agent_bus.sweep.completed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A sweep pass changed something: sessions expired or ended for a revoked device or person, and messages, nonces, ended sessions and empty topics past retention removed. Counts only.",
        "properties": {
          "messages": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "nonces": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "sessions_ended_revoked": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "sessions_expired": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "sessions_forgotten": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "topics": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "messages",
          "nonces",
          "sessions_ended_revoked",
          "sessions_expired",
          "sessions_forgotten",
          "topics"
        ],
        "title": "AgentBusSweepCompleted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An owner device recorded the commit that added the agent's leaf to the conversation's group, at this epoch.",
      "level": "info",
      "name": "airdress.agent_chat.added",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An owner device recorded the commit that added the agent's leaf to the conversation's group, at this epoch.",
        "properties": {
          "assignment": {
            "format": "uuid",
            "type": "string"
          },
          "by": {
            "description": "The owner device's enrollment.",
            "format": "uuid",
            "type": "string"
          },
          "conversation": {
            "format": "uuid",
            "type": "string"
          },
          "epoch": {
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "assignment",
          "by",
          "conversation",
          "epoch"
        ],
        "title": "AgentLeafAdded",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The owner assigned a conversation to one of their agent devices.",
      "level": "info",
      "name": "airdress.agent_chat.assigned",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner assigned a conversation to one of their agent devices.",
        "properties": {
          "agent": {
            "description": "The agent device's enrollment.",
            "format": "uuid",
            "type": "string"
          },
          "by_device": {
            "description": "The owner device that decided, when a device did.",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "conversation": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "agent",
          "conversation"
        ],
        "title": "AgentAssigned",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An agent device's own conversation with this operator's agent was created the first time it asked for one.",
      "level": "info",
      "name": "airdress.agent_chat.lane_created",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An agent device's own conversation with this operator's agent was created the first time it asked for one.",
        "properties": {
          "conversation": {
            "format": "uuid",
            "type": "string"
          },
          "enrollment": {
            "description": "The agent device's enrollment.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "conversation",
          "enrollment"
        ],
        "title": "AgentLaneCreated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "An agent device wrote to this operator's agent without a lane of its own, so the message reached nobody. Said for each such message.",
      "level": "warn",
      "name": "airdress.agent_chat.no_lane",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An agent device wrote to this operator's agent without a lane of its own, so the message reached nobody. Said for each such message.",
        "properties": {
          "enrollment": {
            "description": "The agent device's enrollment.",
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "enrollment"
        ],
        "title": "AgentLaneMissing",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An owner device recorded the commit that removed the agent's leaf from the conversation's group, at this epoch.",
      "level": "info",
      "name": "airdress.agent_chat.removed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An owner device recorded the commit that removed the agent's leaf from the conversation's group, at this epoch.",
        "properties": {
          "assignment": {
            "format": "uuid",
            "type": "string"
          },
          "by": {
            "description": "The owner device's enrollment.",
            "format": "uuid",
            "type": "string"
          },
          "conversation": {
            "format": "uuid",
            "type": "string"
          },
          "epoch": {
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "assignment",
          "by",
          "conversation",
          "epoch"
        ],
        "title": "AgentLeafRemoved",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An agent device's assignment to a conversation ended; nothing more is fanned out to it.",
      "level": "info",
      "name": "airdress.agent_chat.unassigned",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An agent device's assignment to a conversation ended; nothing more is fanned out to it.",
        "properties": {
          "assignment": {
            "format": "uuid",
            "type": "string"
          },
          "by_device": {
            "description": "The owner device that decided, when a device did.",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "conversation": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "assignment",
          "conversation"
        ],
        "title": "AgentUnassigned",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An agent device reached a route outside what an agent may, and was refused.",
      "level": "warn",
      "name": "airdress.agent_device.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An agent device reached a route outside what an agent may, and was refused.",
        "properties": {
          "method": {
            "type": "string"
          },
          "path": {
            "description": "The matched route template, never the concrete path.",
            "type": "string"
          }
        },
        "required": [
          "method",
          "path"
        ],
        "title": "AgentDeviceRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An agent device's delegation was renewed in place by an approved join request.",
      "level": "info",
      "name": "airdress.agent_device.renewed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An agent device's delegation was renewed in place by an approved join request.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "enrollment_id": {
            "format": "uuid",
            "type": "string"
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "enrollment_id",
          "request_id"
        ],
        "title": "AgentDeviceRenewed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The agent-devices switch went on and `count` suspended agent devices resumed.",
      "level": "info",
      "name": "airdress.agent_device.resumed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The agent-devices switch went on and `count` suspended agent devices resumed.",
        "properties": {
          "count": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "AgentDevicesResumed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The agent-devices switch went off and `count` agent devices were suspended, not revoked.",
      "level": "warn",
      "name": "airdress.agent_device.suspended",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The agent-devices switch went off and `count` agent devices were suspended, not revoked.",
        "properties": {
          "count": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "AgentDevicesSuspended",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "Bootstrap failures from one address crossed the threshold; it is locked out. A rate limit: not on the bus.",
      "level": "warn",
      "name": "airdress.bootstrap.backoff",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Bootstrap failures from one address crossed the threshold; it is locked out. A rate limit: not on the bus.",
        "properties": {
          "ip": {
            "format": "ip",
            "type": "string"
          },
          "locked_for_secs": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "ip",
          "locked_for_secs"
        ],
        "title": "BootstrapLockedOut",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A bootstrap-token enrollment was refused. The token value never appears.",
      "level": "warn",
      "name": "airdress.bootstrap.rejected",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A bootstrap-token enrollment was refused. The token value never appears.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "attempt": {
            "description": "Failures from this address so far.",
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          },
          "ip": {
            "format": "ip",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "attempt",
          "ip"
        ],
        "title": "BootstrapRejected",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The owner's bearer was re-minted from the host CLI: whoever held the previous one is logged out. Never the token itself.",
      "level": "warn",
      "name": "airdress.break_glass.owner_token_minted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner's bearer was re-minted from the host CLI: whoever held the previous one is logged out. Never the token itself.",
        "properties": {
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "principal_id"
        ],
        "title": "BreakGlassOwnerTokenMinted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The airdress's root key was reset from the host CLI. Every device must re-enroll. An alert pages on any of these.",
      "level": "warn",
      "name": "airdress.break_glass.root_key_reset",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The airdress's root key was reset from the host CLI. Every device must re-enroll. An alert pages on any of these.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "revoked_enrollments": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "airdress",
          "reason",
          "revoked_enrollments"
        ],
        "title": "BreakGlassRootKeyReset",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A group was registered here, and this operator sequences its epochs.",
      "level": "info",
      "name": "airdress.chat_group.created",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A group was registered here, and this operator sequences its epochs.",
        "properties": {
          "group": {
            "type": "string"
          }
        },
        "required": [
          "group"
        ],
        "title": "GroupCreated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "Group envelopes waited longer than the orphan hold for a Welcome to subscribe somebody, and were dropped. `group` is the hashed form, never the group id.",
      "level": "info",
      "name": "airdress.chat_group.envelope.no_subscriber",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Group envelopes waited longer than the orphan hold for a Welcome to subscribe somebody, and were dropped. `group` is the hashed form, never the group id.",
        "properties": {
          "dropped": {
            "format": "int64",
            "type": "integer"
          },
          "group": {
            "type": "string"
          }
        },
        "required": [
          "dropped",
          "group"
        ],
        "title": "GroupEnvelopesUnsubscribed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An epoch of a group was granted to the commit a member operator claimed it for. Recorded in the claim's own transaction.",
      "level": "info",
      "name": "airdress.chat_group.epoch.claimed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An epoch of a group was granted to the commit a member operator claimed it for. Recorded in the claim's own transaction.",
        "properties": {
          "claimant": {
            "description": "The claiming operator's FQDN.",
            "type": "string"
          },
          "from_epoch": {
            "format": "int64",
            "type": "integer"
          },
          "group": {
            "type": "string"
          }
        },
        "required": [
          "claimant",
          "from_epoch",
          "group"
        ],
        "title": "EpochClaimed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An epoch claim was refused because another commit already won that epoch.",
      "level": "info",
      "name": "airdress.chat_group.epoch.conflict",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An epoch claim was refused because another commit already won that epoch.",
        "properties": {
          "current_epoch": {
            "format": "int64",
            "type": "integer"
          },
          "from_epoch": {
            "format": "int64",
            "type": "integer"
          },
          "group": {
            "type": "string"
          }
        },
        "required": [
          "current_epoch",
          "from_epoch",
          "group"
        ],
        "title": "EpochConflict",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The group's sequencer moved to another operator with this claim; later claims here answer 410.",
      "level": "info",
      "name": "airdress.chat_group.sequencer.moved",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The group's sequencer moved to another operator with this claim; later claims here answer 410.",
        "properties": {
          "from_epoch": {
            "format": "int64",
            "type": "integer"
          },
          "group": {
            "type": "string"
          },
          "to": {
            "description": "The new sequencer's FQDN.",
            "type": "string"
          }
        },
        "required": [
          "from_epoch",
          "group",
          "to"
        ],
        "title": "SequencerMoved",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The configured bootstrap token is below the entropy floor and was accepted only because the config says so. Names the key, never the value.",
      "level": "warn",
      "name": "airdress.config.weak_bootstrap_token",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The configured bootstrap token is below the entropy floor and was accepted only because the config says so. Names the key, never the value.",
        "properties": {
          "config_key": {
            "type": "string"
          }
        },
        "required": [
          "config_key"
        ],
        "title": "ConfigWeakBootstrapToken",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A unit's control verb (`start`, `stop`) ran and succeeded. `target` is the systemd unit or compose project it acted on; `argv` the exact command line.",
      "level": "info",
      "name": "airdress.control.invoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A unit's control verb (`start`, `stop`) ran and succeeded. `target` is the systemd unit or compose project it acted on; `argv` the exact command line.",
        "properties": {
          "argv": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "target": {
            "type": "string"
          },
          "unit": {
            "type": "string"
          },
          "verb": {
            "type": "string"
          }
        },
        "required": [
          "argv",
          "target",
          "unit",
          "verb"
        ],
        "title": "ControlInvoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A delegation-only device tried something only a root-holding device or the owner may do: deciding for other devices (`action`), or an owner-only route (`action` `owner_route`, with its `path`).",
      "level": "warn",
      "name": "airdress.device.delegation_only.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A delegation-only device tried something only a root-holding device or the owner may do: deciding for other devices (`action`), or an owner-only route (`action` `owner_route`, with its `path`).",
        "properties": {
          "action": {
            "type": "string"
          },
          "enrollment": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "path": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "action"
        ],
        "title": "DelegationOnlyRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A sub-user's device tried to decide on the owner's root (cancel or approve a reset), and was refused.",
      "level": "warn",
      "name": "airdress.device.sub_user.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A sub-user's device tried to decide on the owner's root (cancel or approve a reset), and was refused.",
        "properties": {
          "action": {
            "type": "string"
          },
          "enrollment": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "action",
          "enrollment"
        ],
        "title": "SubUserDeviceRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "client": "device_join_approved",
      "description": "An enrolled device approved a join request; the sealed root is in the slot. Does not tell the other devices which one approved.",
      "level": "info",
      "name": "airdress.device_join.approved",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An enrolled device approved a join request; the sealed root is in the slot. Does not tell the other devices which one approved.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "approved_by_enrollment": {
            "format": "uuid",
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          },
          "slot_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "approved_by_enrollment",
          "at",
          "request_id",
          "slot_id"
        ],
        "title": "DeviceJoinApproved",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "client": "device_join_approved",
      "description": "A join request was approved with a root-signed delegation: nothing was sealed, so there is no slot. Clears the prompt on the other devices, as the sealed approval does.",
      "level": "info",
      "name": "airdress.device_join.approved_by_delegation",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A join request was approved with a root-signed delegation: nothing was sealed, so there is no slot. Clears the prompt on the other devices, as the sealed approval does.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "approved_by_enrollment": {
            "format": "uuid",
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "device_kind": {
            "type": "string"
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "approved_by_enrollment",
          "at",
          "device_kind",
          "request_id"
        ],
        "title": "DeviceJoinApprovedByDelegation",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "client": "device_join_declined",
      "description": "A root reset on the airdress expired an open join request.",
      "level": "info",
      "name": "airdress.device_join.cleared_by_reset",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A root reset on the airdress expired an open join request.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "reason": {
            "description": "Always `reset`.",
            "type": "string"
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "at",
          "reason",
          "request_id"
        ],
        "title": "DeviceJoinClearedByReset",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "client": "device_join_declined",
      "description": "An enrolled device declined a join request.",
      "level": "warn",
      "name": "airdress.device_join.declined",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An enrolled device declined a join request.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "declined_by_enrollment": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "description": "Always `declined`.",
            "type": "string"
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "at",
          "declined_by_enrollment",
          "reason",
          "request_id"
        ],
        "title": "DeviceJoinDeclined",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An approval of a join request by delegation did not verify.",
      "level": "warn",
      "name": "airdress.device_join.delegation_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An approval of a join request by delegation did not verify.",
        "properties": {
          "approver": {
            "description": "The approving device's enrollment.",
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "approver",
          "reason",
          "request_id"
        ],
        "title": "DeviceJoinDelegationRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "client": "device_join_declined",
      "description": "A join request expired unanswered.",
      "level": "info",
      "name": "airdress.device_join.expired",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A join request expired unanswered.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "reason": {
            "description": "Always `expired`.",
            "type": "string"
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "at",
          "reason",
          "request_id"
        ],
        "title": "DeviceJoinExpired",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "client": "device_join_requested",
      "description": "A device with no credential here asked to join this airdress. A doorbell: the label and the id, never the key, the address or the account.",
      "level": "info",
      "name": "airdress.device_join.requested",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A device with no credential here asked to join this airdress. A doorbell: the label and the id, never the key, the address or the account.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "delivered": {
            "description": "Streams open when it was recorded.",
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "device_class": {
            "description": "`agent` when an agent device asks; absent for a person's device.",
            "type": [
              "string",
              "null"
            ]
          },
          "device_label": {
            "type": "string"
          },
          "expires_at": {
            "type": "string"
          },
          "renews": {
            "description": "The agent enrollment this request renews.",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "delivered",
          "device_label",
          "expires_at",
          "request_id"
        ],
        "title": "DeviceJoinRequested",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "client": "device_join_declined",
      "description": "The device that asked took its join request back.",
      "level": "info",
      "name": "airdress.device_join.withdrawn",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The device that asked took its join request back.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "reason": {
            "description": "Always `withdrawn`.",
            "type": "string"
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "at",
          "reason",
          "request_id"
        ],
        "title": "DeviceJoinWithdrawn",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The hub did not take this operator's DNS report (an HTTP status, or unreachable); the report is retried on the interval. Said when the outcome changes.",
      "level": "warn",
      "name": "airdress.dns.delegation_report.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The hub did not take this operator's DNS report (an HTTP status, or unreachable); the report is retried on the interval. Said when the outcome changes.",
        "properties": {
          "outcome": {
            "type": "string"
          }
        },
        "required": [
          "outcome"
        ],
        "title": "DelegationReportRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The hub accepted this operator's DNS report. Said when the outcome changes, not on every interval.",
      "level": "info",
      "name": "airdress.dns.delegation_report.sent",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The hub accepted this operator's DNS report. Said when the outcome changes, not on every interval.",
        "properties": {
          "serves_own_zone": {
            "type": "boolean"
          },
          "transfer": {
            "description": "Whether the report offered zone transfer to the secondaries.",
            "type": "boolean"
          },
          "zone": {
            "type": "string"
          }
        },
        "required": [
          "serves_own_zone",
          "transfer",
          "zone"
        ],
        "title": "DelegationReportSent",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "Zone transfers to the dns fleet's secondaries are on: AXFR/IXFR over TCP, signed with the TSIG key `key`, from the `allow` networks, with NOTIFY to `notify`.",
      "level": "info",
      "name": "airdress.dns.transfer.enabled",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Zone transfers to the dns fleet's secondaries are on: AXFR/IXFR over TCP, signed with the TSIG key `key`, from the `allow` networks, with NOTIFY to `notify`.",
        "properties": {
          "allow": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "key": {
            "description": "The TSIG key's name (never its secret).",
            "type": "string"
          },
          "notify": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "port": {
            "format": "uint16",
            "minimum": 0.0,
            "type": "integer"
          },
          "refresh": {
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "allow",
          "key",
          "notify",
          "port",
          "refresh"
        ],
        "title": "DnsTransferEnabled",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "This operator made its zone-transfer (TSIG) key, at this path. The key itself is never in the event.",
      "level": "info",
      "name": "airdress.dns.transfer.key_created",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "This operator made its zone-transfer (TSIG) key, at this path. The key itself is never in the event.",
        "properties": {
          "path": {
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "TransferKeyCreated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A NOTIFY could not be sent to a secondary; it refreshes on the SOA timer instead. Said once per target until it reaches it again.",
      "level": "warn",
      "name": "airdress.dns.transfer.notify_failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A NOTIFY could not be sent to a secondary; it refreshes on the SOA timer instead. Said once per target until it reaches it again.",
        "properties": {
          "error": {
            "type": "string"
          },
          "target": {
            "description": "The secondary's address and port.",
            "type": "string"
          }
        },
        "required": [
          "error",
          "target"
        ],
        "title": "NotifyFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A zone-transfer question was refused: not on the allow list, unsigned, the wrong key, a bad signature or a stale time. Anybody can ask, so it stays off the bus.",
      "level": "warn",
      "name": "airdress.dns.transfer.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A zone-transfer question was refused: not on the allow list, unsigned, the wrong key, a bad signature or a stale time. Anybody can ask, so it stays off the bus.",
        "properties": {
          "qtype": {
            "description": "The question's type (AXFR, IXFR, SOA), when it had one.",
            "type": [
              "string",
              "null"
            ]
          },
          "reason": {
            "type": "string"
          },
          "src": {
            "description": "Who asked.",
            "format": "ip",
            "type": "string"
          },
          "zone": {
            "type": "string"
          }
        },
        "required": [
          "reason",
          "src",
          "zone"
        ],
        "title": "TransferRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A signed zone-transfer question was answered, in this many messages. Said for every transfer a secondary pulls.",
      "level": "info",
      "name": "airdress.dns.transfer.served",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A signed zone-transfer question was answered, in this many messages. Said for every transfer a secondary pulls.",
        "properties": {
          "messages": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "qtype": {
            "type": [
              "string",
              "null"
            ]
          },
          "serial": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "src": {
            "description": "Who asked.",
            "format": "ip",
            "type": "string"
          },
          "zone": {
            "type": "string"
          }
        },
        "required": [
          "messages",
          "serial",
          "src",
          "zone"
        ],
        "title": "TransferServed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An enrollment named an airdress this operator does not serve. Nothing was consumed and nothing counted against the backoff.",
      "level": "warn",
      "name": "airdress.enrollment.airdress_not_served",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An enrollment named an airdress this operator does not serve. Nothing was consumed and nothing counted against the backoff.",
        "properties": {
          "ip": {
            "format": "ip",
            "type": "string"
          },
          "requested_airdress": {
            "type": "string"
          },
          "served_airdress": {
            "type": "string"
          }
        },
        "required": [
          "ip",
          "requested_airdress",
          "served_airdress"
        ],
        "title": "EnrollmentAirdressNotServed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An enrollment was refused: its delegation is outside the freshness window.",
      "level": "warn",
      "name": "airdress.enrollment.delegation_stale",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An enrollment was refused: its delegation is outside the freshness window.",
        "properties": {
          "airdress": {
            "type": "string"
          }
        },
        "required": [
          "airdress"
        ],
        "title": "EnrollmentDelegationStale",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A human device nobody had used inside the idle window was revoked. Never the airdress's most recently seen device.",
      "level": "warn",
      "name": "airdress.enrollment.idle_revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A human device nobody had used inside the idle window was revoked. Never the airdress's most recently seen device.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "created_at": {
            "type": "string"
          },
          "device_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "device_label": {
            "type": "string"
          },
          "enrollment_id": {
            "format": "uuid",
            "type": "string"
          },
          "idle_window_days": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "last_seen_at": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "airdress",
          "created_at",
          "device_label",
          "enrollment_id",
          "idle_window_days"
        ],
        "title": "EnrollmentIdleRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An operator-held enrollment adopted the airdress's pinned root instead of presenting one.",
      "level": "info",
      "name": "airdress.enrollment.root_adopted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An operator-held enrollment adopted the airdress's pinned root instead of presenting one.",
        "properties": {
          "airdress": {
            "type": "string"
          }
        },
        "required": [
          "airdress"
        ],
        "title": "EnrollmentRootAdopted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An enrollment was refused: its root key is not the airdress's pinned one.",
      "level": "warn",
      "name": "airdress.enrollment.root_key_mismatch",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An enrollment was refused: its root key is not the airdress's pinned one.",
        "properties": {
          "airdress": {
            "type": "string"
          }
        },
        "required": [
          "airdress"
        ],
        "title": "EnrollmentRootKeyMismatch",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "client": "sibling_enrolled",
      "description": "A device enrolled on this airdress; its siblings are told, because only a device already in an MLS group can add the newcomer to it.",
      "level": "info",
      "name": "airdress.enrollment.sibling_enrolled",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A device enrolled on this airdress; its siblings are told, because only a device already in an MLS group can add the newcomer to it.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "enrolled_at": {
            "type": "string"
          },
          "enrolled_device_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "enrolled_device_label": {
            "type": "string"
          },
          "enrolled_enrollment_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "enrolled_at",
          "enrolled_device_label",
          "enrolled_enrollment_id"
        ],
        "title": "SiblingEnrolled",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "client": "sibling_revoked",
      "description": "A device on this airdress was revoked; its siblings are told which one, so they can remove its MLS leaf.",
      "level": "info",
      "name": "airdress.enrollment.sibling_revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A device on this airdress was revoked; its siblings are told which one, so they can remove its MLS leaf.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "reason": {
            "description": "Why, when the operator did it on its own (`idle`).",
            "type": [
              "string",
              "null"
            ]
          },
          "revoked_at": {
            "type": "string"
          },
          "revoked_device_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "revoked_device_label": {
            "type": "string"
          },
          "revoked_enrollment_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "revoked_at",
          "revoked_device_label",
          "revoked_enrollment_id"
        ],
        "title": "SiblingRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An `EventSubscription` was applied: created, changed, or re-applied (which also re-enables one disabled after failures).",
      "level": "info",
      "name": "airdress.event_subscription.applied",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An `EventSubscription` was applied: created, changed, or re-applied (which also re-enables one disabled after failures).",
        "properties": {
          "owner_kind": {
            "description": "Whose it is: `owner`, `machine` or `sub_user`.",
            "type": "string"
          },
          "subscription": {
            "description": "The subscription's name.",
            "type": "string"
          },
          "target": {
            "description": "The target's kind: `http` or `function`.",
            "type": "string"
          }
        },
        "required": [
          "owner_kind",
          "subscription",
          "target"
        ],
        "title": "SubscriptionApplied",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "Deliveries were given up without being delivered: the event log hit its size cap and the events they pointed at were swept. One per subscription per sweep.",
      "level": "warn",
      "name": "airdress.event_subscription.delivery_abandoned",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Deliveries were given up without being delivered: the event log hit its size cap and the events they pointed at were swept. One per subscription per sweep.",
        "properties": {
          "count": {
            "description": "How many deliveries were abandoned.",
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "reason": {
            "description": "Why: `retention`.",
            "type": "string"
          },
          "subscription": {
            "description": "The subscription's name.",
            "type": "string"
          }
        },
        "required": [
          "count",
          "reason",
          "subscription"
        ],
        "title": "DeliveryAbandoned",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "One delivery attempt failed. Never delivered to the subscription it is about.",
      "level": "info",
      "name": "airdress.event_subscription.delivery_failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "One delivery attempt failed. Never delivered to the subscription it is about.",
        "properties": {
          "abandoned": {
            "description": "Whether this was the last attempt.",
            "type": "boolean"
          },
          "attempt": {
            "description": "Which attempt this was, from 1.",
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          },
          "error_class": {
            "description": "What went wrong when it did not answer, or answered wrongly: `status`, `timeout`, `connect`, `address_refused`, `signing`, `function_unavailable`, `function_failed`, …",
            "type": "string"
          },
          "event_id": {
            "description": "The event that was being delivered.",
            "format": "uuid",
            "type": "string"
          },
          "status": {
            "description": "The receiver's status code, when it answered.",
            "format": "uint16",
            "minimum": 0.0,
            "type": [
              "integer",
              "null"
            ]
          },
          "subscription": {
            "description": "The subscription's name.",
            "type": "string"
          }
        },
        "required": [
          "abandoned",
          "attempt",
          "error_class",
          "event_id",
          "subscription"
        ],
        "title": "DeliveryFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A subscription stopped delivering: every attempt failed for five days. Re-applying it resumes the queued backlog.",
      "level": "warn",
      "name": "airdress.event_subscription.disabled",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A subscription stopped delivering: every attempt failed for five days. Re-applying it resumes the queued backlog.",
        "properties": {
          "consecutive_failures": {
            "description": "Failed attempts since the last success.",
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          },
          "reason": {
            "description": "Why: `DisabledAfterFailures`.",
            "type": "string"
          },
          "subscription": {
            "description": "The subscription's name.",
            "type": "string"
          }
        },
        "required": [
          "consecutive_failures",
          "reason",
          "subscription"
        ],
        "title": "SubscriptionDisabled",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "client": "event_subscription_block_changed",
      "description": "The owner switched a person's subscription off. Told to that person; the owner learns nothing of where it pointed.",
      "level": "warn",
      "name": "airdress.event_subscription.owner_disabled",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner switched a person's subscription off. Told to that person; the owner learns nothing of where it pointed.",
        "properties": {
          "airdress": {
            "description": "The stream it is addressed to: the person's airdress.",
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "blocked": {
            "description": "Always `true`: the frame carries the state, not the transition.",
            "type": "boolean"
          },
          "principal_id": {
            "description": "Whose subscription it is.",
            "format": "uuid",
            "type": "string"
          },
          "subscription": {
            "description": "The subscription's name.",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "at",
          "blocked",
          "principal_id",
          "subscription"
        ],
        "title": "OwnerDisabled",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "client": "event_subscription_block_changed",
      "description": "The owner lifted their disable. Lifting does not re-enable a subscription the person disabled themselves.",
      "level": "info",
      "name": "airdress.event_subscription.owner_lifted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner lifted their disable. Lifting does not re-enable a subscription the person disabled themselves.",
        "properties": {
          "airdress": {
            "description": "The stream it is addressed to: the person's airdress.",
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "blocked": {
            "description": "Always `false`.",
            "type": "boolean"
          },
          "principal_id": {
            "description": "Whose subscription it is.",
            "format": "uuid",
            "type": "string"
          },
          "subscription": {
            "description": "The subscription's name.",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "at",
          "blocked",
          "principal_id",
          "subscription"
        ],
        "title": "OwnerLifted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A synthetic event, sent on request to check a subscription end to end.",
      "level": "info",
      "name": "airdress.event_subscription.test.sent",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A synthetic event, sent on request to check a subscription end to end.",
        "properties": {
          "principal_id": {
            "description": "Who asked for it.",
            "format": "uuid",
            "type": "string"
          },
          "subscription": {
            "description": "The subscription it was sent to.",
            "type": "string"
          }
        },
        "required": [
          "principal_id",
          "subscription"
        ],
        "title": "TestSent",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The owner's registry and a stapled hub binding disagree about which keys speak for an airdress. The registry is used; a person should look at why.",
      "level": "warn",
      "name": "airdress.federation.binding_conflict",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner's registry and a stapled hub binding disagree about which keys speak for an airdress. The registry is used; a person should look at why.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "binding_kid": {
            "type": "string"
          },
          "registry_spki": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "binding_kid",
          "registry_spki"
        ],
        "title": "FederationBindingConflict",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A peer's operator binding was refused: `reason` says why (no transport identity, revoked, a binding that did not verify, …). Anybody can cause one, so it stays off the bus.",
      "level": "warn",
      "name": "airdress.federation.binding_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A peer's operator binding was refused: `reason` says why (no transport identity, revoked, a binding that did not verify, …). Anybody can cause one, so it stays off the bus.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "peer_spki": {
            "description": "The first eight bytes of the peer's SPKI hash, hex; empty when it presented none.",
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "peer_spki",
          "reason"
        ],
        "title": "FederationBindingRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "client": "delivery_status",
      "description": "A federated message this airdress sent changed delivery status.",
      "level": "debug",
      "name": "airdress.federation.delivery_status_changed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A federated message this airdress sent changed delivery status.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "message_id": {
            "format": "uuid",
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "updated_at": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "message_id",
          "status",
          "updated_at"
        ],
        "title": "DeliveryStatusChanged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A federation envelope claimed to come from an airdress its authenticated peer may not speak for, and was refused.",
      "level": "warn",
      "name": "airdress.federation.from_not_authorized",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A federation envelope claimed to come from an airdress its authenticated peer may not speak for, and was refused.",
        "properties": {
          "claimed_from": {
            "type": "string"
          },
          "may_speak_for": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "peer_spki": {
            "description": "The first eight bytes of the peer's SPKI hash, hex.",
            "type": "string"
          },
          "source": {
            "type": "string"
          }
        },
        "required": [
          "claimed_from",
          "may_speak_for",
          "peer_spki",
          "source"
        ],
        "title": "FederationFromNotAuthorized",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "This operator's own hub binding lapsed without a refresh; peers refuse it for that airdress until the hub answers again. Once per lapse.",
      "level": "error",
      "name": "airdress.federation.own_binding_expired",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "This operator's own hub binding lapsed without a refresh; peers refuse it for that airdress until the hub answers again. Once per lapse.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "expired_at": {
            "description": "Unix seconds.",
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "airdress",
          "expired_at"
        ],
        "title": "OwnBindingExpired",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "This operator's own hub binding for an airdress was refreshed: the hub signed a new version naming this operator's transport key.",
      "level": "info",
      "name": "airdress.federation.own_binding_refreshed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "This operator's own hub binding for an airdress was refreshed: the hub signed a new version naming this operator's transport key.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "binding_version": {
            "format": "int64",
            "type": "integer"
          },
          "expires_at": {
            "type": "string"
          },
          "kid": {
            "type": "string"
          },
          "spki": {
            "description": "The first eight bytes of the transport key's SPKI hash, hex.",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "binding_version",
          "expires_at",
          "kid",
          "spki"
        ],
        "title": "OwnBindingRefreshed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A federation peer was admitted, by the owner's registry or a stapled hub binding (`source`). One per request, so it stays off the bus.",
      "level": "debug",
      "name": "airdress.federation.peer_admitted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A federation peer was admitted, by the owner's registry or a stapled hub binding (`source`). One per request, so it stays off the bus.",
        "properties": {
          "kid": {
            "type": "string"
          },
          "source": {
            "type": "string"
          },
          "spki": {
            "description": "The first eight bytes of the peer's SPKI hash, hex.",
            "type": "string"
          }
        },
        "required": [
          "kid",
          "source",
          "spki"
        ],
        "title": "FederationPeerAdmitted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "First contact from another airdress, delivered to `principal_id` as a message request.",
      "level": "info",
      "name": "airdress.federation.request_received",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "First contact from another airdress, delivered to `principal_id` as a message request.",
        "properties": {
          "from": {
            "type": "string"
          },
          "principal_id": {
            "description": "The person the request is for. Not in the journal line, which never carried it.",
            "format": "uuid",
            "type": "string"
          },
          "to": {
            "type": "string"
          }
        },
        "required": [
          "from",
          "principal_id",
          "to"
        ],
        "title": "FederationRequestReceived",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A function's configuration could not be resolved, so it was not run — for an event, or for a request to its route.\n\nNames the config key and the secret it refers to, never a value; still credential metadata, so not on the bus.",
      "level": "warn",
      "name": "airdress.function.config_unavailable",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function's configuration could not be resolved, so it was not run — for an event, or for a request to its route.\n\nNames the config key and the secret it refers to, never a value; still credential metadata, so not on the bus.",
        "properties": {
          "function": {
            "type": "string"
          },
          "key": {
            "type": "string"
          },
          "secret": {
            "type": "string"
          }
        },
        "required": [
          "function",
          "key",
          "secret"
        ],
        "title": "FunctionConfigUnavailable",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "An event already delivered to a function was not delivered again.",
      "level": "debug",
      "name": "airdress.function.event.deduplicated",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An event already delivered to a function was not delivered again.",
        "properties": {
          "event_id": {
            "type": "string"
          },
          "function": {
            "type": "string"
          }
        },
        "required": [
          "event_id",
          "function"
        ],
        "title": "FunctionEventDeduplicated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The function event dispatcher fell behind the stream; events were skipped, not delivered. A diagnostic: not on the bus.",
      "level": "warn",
      "name": "airdress.function.events_lagged",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The function event dispatcher fell behind the stream; events were skipped, not delivered. A diagnostic: not on the bus.",
        "properties": {
          "skipped": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "skipped"
        ],
        "title": "FunctionEventsLagged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A function's event filter failed to evaluate; the event was not delivered.",
      "level": "warn",
      "name": "airdress.function.filter.failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function's event filter failed to evaluate; the event was not delivered.",
        "properties": {
          "dialect": {
            "type": "string"
          },
          "filter": {
            "description": "The filter's position in the function's list.",
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "function": {
            "type": "string"
          },
          "over_budget": {
            "type": "boolean"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "dialect",
          "filter",
          "function",
          "over_budget",
          "reason"
        ],
        "title": "FunctionFilterFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A function did not load.",
      "level": "warn",
      "name": "airdress.function.load_failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function did not load.",
        "properties": {
          "function": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "function",
          "message",
          "reason"
        ],
        "title": "FunctionLoadFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A function compiled and was bound to its route.",
      "level": "info",
      "name": "airdress.function.loaded",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function compiled and was bound to its route.",
        "properties": {
          "bundle_sha256": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "function": {
            "type": "string"
          },
          "function_id": {
            "type": "string"
          },
          "hosts": {
            "description": "The outbound hosts it was granted, resolved.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "bundle_sha256",
          "enabled",
          "function",
          "function_id",
          "hosts"
        ],
        "title": "FunctionLoaded",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The function log sweep evicted rows. Housekeeping: not on the bus.",
      "level": "info",
      "name": "airdress.function.logs.evicted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The function log sweep evicted rows. Housekeeping: not on the bus.",
        "properties": {
          "rows": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "rows"
        ],
        "title": "FunctionLogsEvicted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A function stopped serving: the key that signed its source was revoked as compromised.",
      "level": "warn",
      "name": "airdress.function.quarantined",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function stopped serving: the key that signed its source was revoked as compromised.",
        "properties": {
          "function": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "function",
          "message"
        ],
        "title": "FunctionQuarantined",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A function stopped: the library release it pins was withdrawn.",
      "level": "warn",
      "name": "airdress.function.sdk.withdrawn",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function stopped: the library release it pins was withdrawn.",
        "properties": {
          "function": {
            "type": "string"
          },
          "sdk": {
            "type": "string"
          }
        },
        "required": [
          "function",
          "sdk"
        ],
        "title": "FunctionSdkWithdrawn",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A new function source version was published.",
      "level": "info",
      "name": "airdress.function.source.published",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A new function source version was published.",
        "properties": {
          "actor": {
            "type": "string"
          },
          "files": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "function": {
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "actor",
          "files",
          "function",
          "version"
        ],
        "title": "FunctionSourcePublished",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A function source publish was refused.",
      "level": "info",
      "name": "airdress.function.source.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function source publish was refused.",
        "properties": {
          "actor": {
            "type": "string"
          },
          "status": {
            "description": "The HTTP status the publish was answered with.",
            "format": "uint16",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "actor",
          "status"
        ],
        "title": "FunctionSourceRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A publish or promote was refused because the function moved since the writer read it.",
      "level": "info",
      "name": "airdress.function.source.stale_write_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A publish or promote was refused because the function moved since the writer read it.",
        "properties": {
          "actor": {
            "type": "string"
          },
          "based_on": {
            "description": "The version the writer said it read; empty when it said none.",
            "type": "string"
          },
          "current": {
            "description": "The version serving; empty when none.",
            "type": "string"
          },
          "function": {
            "type": "string"
          }
        },
        "required": [
          "actor",
          "based_on",
          "current",
          "function"
        ],
        "title": "FunctionSourceStaleWriteRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A retried tool call was answered from the first call rather than run again. A diagnostic: not on the bus.",
      "level": "info",
      "name": "airdress.function.tool.deduplicated",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A retried tool call was answered from the first call rather than run again. A diagnostic: not on the bus.",
        "properties": {
          "function": {
            "type": "string"
          }
        },
        "required": [
          "function"
        ],
        "title": "FunctionToolDeduplicated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "An unsigned local bundle was loaded because the config allows it. Repeats on every reconcile: not on the bus.",
      "level": "warn",
      "name": "airdress.function.unsigned_bundle_accepted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An unsigned local bundle was loaded because the config allows it. Repeats on every reconcile: not on the bus.",
        "properties": {
          "path": {
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "FunctionUnsignedBundleAccepted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "Unsigned function source was accepted because the config allows it. Repeats on every load: not on the bus.",
      "level": "warn",
      "name": "airdress.function.unsigned_source_accepted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Unsigned function source was accepted because the config allows it. Repeats on every load: not on the bus.",
        "title": "FunctionUnsignedSourceAccepted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A function is serving unsigned source because the config allows it. Repeats on every reconcile: not on the bus.",
      "level": "warn",
      "name": "airdress.function.unsigned_source_loaded",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function is serving unsigned source because the config allows it. Repeats on every reconcile: not on the bus.",
        "properties": {
          "function": {
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "function",
          "version"
        ],
        "title": "FunctionUnsignedSourceLoaded",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A stored source version started serving a function.",
      "level": "info",
      "name": "airdress.function.version.deployed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A stored source version started serving a function.",
        "properties": {
          "actor": {
            "type": [
              "string",
              "null"
            ]
          },
          "function": {
            "type": "string"
          },
          "generation": {
            "format": "int64",
            "type": "integer"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ]
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "function",
          "generation",
          "version"
        ],
        "title": "FunctionVersionDeployed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The operator evicted a stored source version to stay under the owner's store limits.",
      "level": "info",
      "name": "airdress.function.version.evicted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The operator evicted a stored source version to stay under the owner's store limits.",
        "properties": {
          "actor": {
            "type": "string"
          },
          "bytes": {
            "format": "int64",
            "type": "integer"
          },
          "function": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "actor",
          "bytes",
          "function",
          "reason",
          "version"
        ],
        "title": "FunctionVersionEvicted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A function version promote was refused.",
      "level": "info",
      "name": "airdress.function.version.promote_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function version promote was refused.",
        "properties": {
          "actor": {
            "type": "string"
          },
          "function": {
            "type": "string"
          },
          "status": {
            "format": "uint16",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "actor",
          "function",
          "status"
        ],
        "title": "FunctionVersionPromoteRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A stored function version was promoted to serving.",
      "level": "info",
      "name": "airdress.function.version.promoted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A stored function version was promoted to serving.",
        "properties": {
          "actor": {
            "type": "string"
          },
          "function": {
            "type": "string"
          },
          "generation": {
            "format": "int64",
            "type": "integer"
          },
          "previous": {
            "description": "The version it replaced; empty when none.",
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "actor",
          "function",
          "generation",
          "previous",
          "version"
        ],
        "title": "FunctionVersionPromoted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An apply of a new function version was refused; the serving version keeps serving.",
      "level": "warn",
      "name": "airdress.function.version_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An apply of a new function version was refused; the serving version keeps serving.",
        "properties": {
          "function": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "reason": {
            "description": "The condition reason.",
            "type": "string"
          },
          "same_version": {
            "type": "boolean"
          },
          "serving": {
            "type": "string"
          }
        },
        "required": [
          "function",
          "message",
          "reason",
          "same_version",
          "serving"
        ],
        "title": "FunctionVersionRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "No precompiled JavaScript engine could be used, so it is compiled in place, which needs several hundred MiB for a few seconds.",
      "level": "warn",
      "name": "airdress.functions.engine_compiled_in_place",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "No precompiled JavaScript engine could be used, so it is compiled in place, which needs several hundred MiB for a few seconds.",
        "properties": {
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "title": "EngineCompiledInPlace",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "Functions granted `http.sign` cannot sign: the operator's HTTP-signing key is unavailable.\n\nOnce at load (with the error), and once per invocation refused outbound HTTP (with its ids). Key plumbing: not on the bus.",
      "level": "warn",
      "name": "airdress.functions.signing_unavailable",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Functions granted `http.sign` cannot sign: the operator's HTTP-signing key is unavailable.\n\nOnce at load (with the error), and once per invocation refused outbound HTTP (with its ids). Key plumbing: not on the bus.",
        "properties": {
          "error": {
            "type": [
              "string",
              "null"
            ]
          },
          "function_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "invocation_id": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "title": "FunctionsSigningUnavailable",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The owner granted a principal actions on a resource.",
      "level": "info",
      "name": "airdress.grant.created",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner granted a principal actions on a resource.",
        "properties": {
          "actions": {
            "type": "string"
          },
          "actor": {
            "type": "string"
          },
          "grant_id": {
            "format": "uuid",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "target": {
            "description": "`Kind::name`, `*` for every resource of the kind.",
            "type": "string"
          }
        },
        "required": [
          "actions",
          "actor",
          "grant_id",
          "principal_id",
          "target"
        ],
        "title": "GrantCreated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A resource grant was revoked.",
      "level": "info",
      "name": "airdress.grant.revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A resource grant was revoked.",
        "properties": {
          "actions": {
            "type": "string"
          },
          "actor": {
            "type": "string"
          },
          "grant_id": {
            "format": "uuid",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "target": {
            "type": "string"
          }
        },
        "required": [
          "actions",
          "actor",
          "grant_id",
          "principal_id",
          "target"
        ],
        "title": "GrantRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "client": "handshake_pending",
      "description": "A stranger asked to reach this airdress and is held for the owner's consent decision.",
      "level": "info",
      "name": "airdress.handshake.pending",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A stranger asked to reach this airdress and is held for the owner's consent decision.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "from_airdress": {
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "type": "string"
          },
          "local_airdress": {
            "type": "string"
          },
          "received_at": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "from_airdress",
          "id",
          "local_airdress",
          "received_at"
        ],
        "title": "HandshakePending",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The operator ended a home's channel: the `Home` was switched off, unlinked, deleted, or its machine revoked.",
      "level": "info",
      "name": "airdress.home.channel.ended",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The operator ended a home's channel: the `Home` was switched off, unlinked, deleted, or its machine revoked.",
        "properties": {
          "home": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "home",
          "reason"
        ],
        "title": "HomeChannelEnded",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A home's channel opened and its `hello` was sent.",
      "level": "info",
      "name": "airdress.home.channel.opened",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A home's channel opened and its `hello` was sent.",
        "properties": {
          "home": {
            "type": "string"
          },
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          },
          "transport": {
            "type": "string"
          }
        },
        "required": [
          "home",
          "machine",
          "session",
          "transport"
        ],
        "title": "HomeChannelOpened",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A machine asked for a home channel and was refused: it is not linked as a `Home` (`home_not_linked`), or its `Home` is switched off (`home_disabled`).",
      "level": "info",
      "name": "airdress.home.channel.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A machine asked for a home channel and was refused: it is not linked as a `Home` (`home_not_linked`), or its `Home` is switched off (`home_disabled`).",
        "properties": {
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "machine",
          "reason"
        ],
        "title": "HomeChannelRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A machine's channel ended because the machine, its approval or the key it signed with is no longer admitted.",
      "level": "info",
      "name": "airdress.home.channel.revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A machine's channel ended because the machine, its approval or the key it signed with is no longer admitted.",
        "properties": {
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "machine",
          "session"
        ],
        "title": "HomeChannelRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The conversation a `Home` speaks to its owner in was created.",
      "level": "info",
      "name": "airdress.home.conversation.created",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The conversation a `Home` speaks to its owner in was created.",
        "properties": {
          "conversation": {
            "format": "uuid",
            "type": "string"
          },
          "home": {
            "type": "string"
          }
        },
        "required": [
          "conversation",
          "home"
        ],
        "title": "HomeConversationCreated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The conversation a `Home` speaks to its owner in could not be opened; the next reconcile tries again.",
      "level": "warn",
      "name": "airdress.home.conversation.failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The conversation a `Home` speaks to its owner in could not be opened; the next reconcile tries again.",
        "properties": {
          "error": {
            "type": "string"
          },
          "home": {
            "type": "string"
          }
        },
        "required": [
          "error",
          "home"
        ],
        "title": "HomeConversationFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The conversation a `Home` speaks to its owner in is open on this `Home` for the first time since the operator started.",
      "level": "info",
      "name": "airdress.home.conversation.opened",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The conversation a `Home` speaks to its owner in is open on this `Home` for the first time since the operator started.",
        "properties": {
          "conversation": {
            "format": "uuid",
            "type": "string"
          },
          "home": {
            "type": "string"
          }
        },
        "required": [
          "conversation",
          "home"
        ],
        "title": "HomeConversationOpened",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A `Home` was deleted: its channel ended, for the reason in `channel` (`revoked` when its machine was revoked first, `unlinked` otherwise), and its conversation is kept.",
      "level": "info",
      "name": "airdress.home.deleted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A `Home` was deleted: its channel ended, for the reason in `channel` (`revoked` when its machine was revoked first, `unlinked` otherwise), and its conversation is kept.",
        "properties": {
          "channel": {
            "type": "string"
          },
          "home": {
            "type": "string"
          }
        },
        "required": [
          "channel",
          "home"
        ],
        "title": "HomeDeleted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A frame from a hub that is not an answer to a call or a read. One per frame.",
      "level": "debug",
      "name": "airdress.home.frame.received",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A frame from a hub that is not an answer to a call or a read. One per frame.",
        "properties": {
          "kind": {
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "kind",
          "session"
        ],
        "title": "HomeFrameReceived",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The home channel's counters since the operator started, once an hour.",
      "level": "info",
      "name": "airdress.home.hourly",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The home channel's counters since the operator started, once an hour.",
        "properties": {
          "displaced": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "frames_in": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "frames_out": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "frames_posts": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "keepalives": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "polls": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "retransmits": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "sessions": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "sessions_opened": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "displaced",
          "frames_in",
          "frames_out",
          "frames_posts",
          "keepalives",
          "polls",
          "retransmits",
          "sessions",
          "sessions_opened"
        ],
        "title": "HomeHourly",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The listener for machine revocations could not be started, or failed and is reconnecting. The periodic check still closes revoked channels.",
      "level": "warn",
      "name": "airdress.home.liveness.listen_failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The listener for machine revocations could not be started, or failed and is reconnecting. The periodic check still closes revoked channels.",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ],
        "title": "HomeLivenessListenFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "Held home channels could not be checked against revocation.\n\nThe database did not answer. Channels stay up and the next check asks again; said once per run of failures. With `home`, the machine of a deleted `Home` could not be checked, and its channel ends `unlinked`.",
      "level": "warn",
      "name": "airdress.home.liveness.unavailable",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Held home channels could not be checked against revocation.\n\nThe database did not answer. Channels stay up and the next check asks again; said once per run of failures. With `home`, the machine of a deleted `Home` could not be checked, and its channel ends `unlinked`.",
        "properties": {
          "error": {
            "type": "string"
          },
          "home": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "error"
        ],
        "title": "HomeLivenessUnavailable",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A message from a home was delivered to its owner's Home conversation.",
      "level": "info",
      "name": "airdress.home.notify.delivered",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A message from a home was delivered to its owner's Home conversation.",
        "properties": {
          "home": {
            "type": "string"
          },
          "message_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "home",
          "message_id"
        ],
        "title": "HomeNotifyDelivered",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A message from a home, or the line saying how many were dropped, could not be stored in the owner's Home conversation.",
      "level": "warn",
      "name": "airdress.home.notify.failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A message from a home, or the line saying how many were dropped, could not be stored in the owner's Home conversation.",
        "properties": {
          "error": {
            "type": "string"
          },
          "home": {
            "type": "string"
          },
          "message_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "error",
          "home"
        ],
        "title": "HomeNotifyFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A message from a home was not delivered to its owner: notifications are off, it was empty or too long, it exceeded the rate, or chat is not attached.",
      "level": "info",
      "name": "airdress.home.notify.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A message from a home was not delivered to its owner: notifications are off, it was empty or too long, it exceeded the rate, or chat is not attached.",
        "properties": {
          "home": {
            "type": "string"
          },
          "message_id": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "home",
          "message_id",
          "reason"
        ],
        "title": "HomeNotifyRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "An observation from a hub for an entity its `Home` does not observe was dropped. One per dropped observation.",
      "level": "debug",
      "name": "airdress.home.observe.dropped",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An observation from a hub for an entity its `Home` does not observe was dropped. One per dropped observation.",
        "properties": {
          "home": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "home",
          "reason"
        ],
        "title": "HomeObserveDropped",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The measurement probe called an action on, or read an entity from, a hub.\n\nIt carries the transport, the outcome, the round trip and the hub's own service time, never an entity id or a state value. Off unless the probe is configured; one per probe tick.",
      "level": "info",
      "name": "airdress.home.probe",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The measurement probe called an action on, or read an entity from, a hub.\n\nIt carries the transport, the outcome, the round trip and the hub's own service time, never an entity id or a state value. Off unless the probe is configured; one per probe tick.",
        "properties": {
          "first": {
            "type": "boolean"
          },
          "ha_ms": {
            "type": [
              "string",
              "null"
            ]
          },
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "op": {
            "type": "string"
          },
          "outcome": {
            "type": "string"
          },
          "overhead_ms": {
            "type": [
              "string",
              "null"
            ]
          },
          "rtt_ms": {
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          },
          "since_open_ms": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "transport": {
            "type": "string"
          }
        },
        "required": [
          "first",
          "machine",
          "op",
          "outcome",
          "rtt_ms",
          "session",
          "since_open_ms",
          "transport"
        ],
        "title": "HomeProbe",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A function's call reached a home: its outcome (ok, timeout, offline, refused) and the round trip.",
      "level": "info",
      "name": "airdress.home.service.called",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function's call reached a home: its outcome (ok, timeout, offline, refused) and the round trip.",
        "properties": {
          "function": {
            "type": "string"
          },
          "home": {
            "type": "string"
          },
          "outcome": {
            "type": "string"
          },
          "rtt_ms": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "function",
          "home",
          "outcome",
          "rtt_ms"
        ],
        "title": "HomeServiceCalled",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A function's request to a home was refused: `what` it asked (call, read, emit, track) and the `reason`.",
      "level": "info",
      "name": "airdress.home.service.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function's request to a home was refused: `what` it asked (call, read, emit, track) and the `reason`.",
        "properties": {
          "function": {
            "type": "string"
          },
          "home": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "what": {
            "type": "string"
          }
        },
        "required": [
          "function",
          "home",
          "reason",
          "what"
        ],
        "title": "HomeServiceRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A home channel closed: why, and how long it lived.",
      "level": "info",
      "name": "airdress.home.session.closed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A home channel closed: why, and how long it lived.",
        "properties": {
          "lived_secs": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          },
          "transport": {
            "type": "string"
          }
        },
        "required": [
          "lived_secs",
          "machine",
          "reason",
          "session",
          "transport"
        ],
        "title": "HomeSessionClosed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A machine opened a second home channel; the first (`session`) was closed for the new one (`by`).",
      "level": "info",
      "name": "airdress.home.session.displaced",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A machine opened a second home channel; the first (`session`) was closed for the new one (`by`).",
        "properties": {
          "by": {
            "format": "uuid",
            "type": "string"
          },
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "by",
          "machine",
          "session"
        ],
        "title": "HomeSessionDisplaced",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A home channel opened, over a WebSocket (`ws`) or a long-poll (`poll`).",
      "level": "info",
      "name": "airdress.home.session.opened",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A home channel opened, over a WebSocket (`ws`) or a long-poll (`poll`).",
        "properties": {
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          },
          "transport": {
            "type": "string"
          }
        },
        "required": [
          "machine",
          "session",
          "transport"
        ],
        "title": "HomeSessionOpened",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A hub said what it shares: how many entities it lets the operator operate, and how many it lets it observe in all.",
      "level": "info",
      "name": "airdress.home.shared.received",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A hub said what it shares: how many entities it lets the operator operate, and how many it lets it observe in all.",
        "properties": {
          "home": {
            "type": "string"
          },
          "observe": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "operate": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "home",
          "observe",
          "operate"
        ],
        "title": "HomeSharedReceived",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A hook failed too often and is suspended for a while; its `onBreakerOpen` says whether its point proceeds or is refused meanwhile.",
      "level": "warn",
      "name": "airdress.hook.breaker_opened",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A hook failed too often and is suspended for a while; its `onBreakerOpen` says whether its point proceeds or is refused meanwhile.",
        "properties": {
          "hook": {
            "type": "string"
          },
          "on_breaker_open": {
            "description": "`skip` or `deny`.",
            "type": "string"
          },
          "point": {
            "type": "string"
          },
          "until": {
            "type": "string"
          }
        },
        "required": [
          "hook",
          "on_breaker_open",
          "point",
          "until"
        ],
        "title": "HookBreakerOpened",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "Postgres finished a checkpoint the fleet host asked for before a snapshot.",
      "level": "info",
      "name": "airdress.host_link.checkpoint.completed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Postgres finished a checkpoint the fleet host asked for before a snapshot.",
        "properties": {
          "elapsed_ms": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "elapsed_ms"
        ],
        "title": "HostLinkCheckpointCompleted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A checkpoint the fleet host asked for failed; its snapshot waits.",
      "level": "error",
      "name": "airdress.host_link.checkpoint.failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A checkpoint the fleet host asked for failed; its snapshot waits.",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ],
        "title": "HostLinkCheckpointFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The host-link listener is open on `addr`.",
      "level": "info",
      "name": "airdress.host_link.listening",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The host-link listener is open on `addr`.",
        "properties": {
          "addr": {
            "type": "string"
          },
          "interface": {
            "type": "string"
          }
        },
        "required": [
          "addr",
          "interface"
        ],
        "title": "HostLinkListening",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A request reached the host-link listener from beyond the link and was refused.",
      "level": "warn",
      "name": "airdress.host_link.peer_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A request reached the host-link listener from beyond the link and was refused.",
        "properties": {
          "peer": {
            "type": "string"
          }
        },
        "required": [
          "peer"
        ],
        "title": "HostLinkPeerRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The host-link listener stopped serving with an error.",
      "level": "error",
      "name": "airdress.host_link.stopped",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The host-link listener stopped serving with an error.",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ],
        "title": "HostLinkStopped",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The host set switches and they were applied; `changed` of them moved.",
      "level": "info",
      "name": "airdress.host_link.switches.set",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The host set switches and they were applied; `changed` of them moved.",
        "properties": {
          "changed": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "changed"
        ],
        "title": "HostLinkSwitchesSet",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The host asked to set switches and the switches file could not be written; every switch keeps its value.",
      "level": "error",
      "name": "airdress.host_link.switches.unwritable",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The host asked to set switches and the switches file could not be written; every switch keeps its value.",
        "properties": {
          "error": {
            "type": "string"
          },
          "path": {
            "type": "string"
          }
        },
        "required": [
          "error",
          "path"
        ],
        "title": "HostLinkSwitchesUnwritable",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The host-link listener could not be opened. The operator serves on without it, and the fleet host's snapshots of it fail until it is.",
      "level": "error",
      "name": "airdress.host_link.unavailable",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The host-link listener could not be opened. The operator serves on without it, and the fleet host's snapshots of it fail until it is.",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ],
        "title": "HostLinkUnavailable",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "client": "household_setting_changed",
      "description": "The owner's devices were told a household setting changed.\n\nThe change itself is the journal's `airdress.household.setting.changed`; this is its announcement, one per airdress the owner has a device on.",
      "level": "info",
      "name": "airdress.household.setting.announced",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner's devices were told a household setting changed.\n\nThe change itself is the journal's `airdress.household.setting.changed`; this is its announcement, one per airdress the owner has a device on.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "setting": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "at",
          "setting",
          "value"
        ],
        "title": "HouseholdSettingChanged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The owner changed a household setting: the member-reset policy (`value`) or the discovery ceilings.",
      "level": "info",
      "name": "airdress.household.setting.changed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner changed a household setting: the member-reset policy (`value`) or the discovery ceilings.",
        "properties": {
          "discoverable_ceiling": {
            "type": [
              "string",
              "null"
            ]
          },
          "searchable_ceiling": {
            "type": [
              "string",
              "null"
            ]
          },
          "setting": {
            "type": "string"
          },
          "value": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "setting"
        ],
        "title": "HouseholdSettingChanged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A purpose key was created on first use. Public identifiers only: the key's kid and the file it lives in.",
      "level": "info",
      "name": "airdress.identity.key_created",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A purpose key was created on first use. Public identifiers only: the key's kid and the file it lives in.",
        "properties": {
          "kid": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "purpose": {
            "type": "string"
          }
        },
        "required": [
          "kid",
          "path",
          "purpose"
        ],
        "title": "IdentityKeyCreated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A purpose key was rotated; the previous key stays valid until `previous_not_after` (Unix seconds).",
      "level": "info",
      "name": "airdress.identity.key_rotated",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A purpose key was rotated; the previous key stays valid until `previous_not_after` (Unix seconds).",
        "properties": {
          "kid": {
            "type": "string"
          },
          "previous_kid": {
            "type": "string"
          },
          "previous_not_after": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "purpose": {
            "type": "string"
          }
        },
        "required": [
          "kid",
          "previous_kid",
          "previous_not_after",
          "purpose"
        ],
        "title": "IdentityKeyRotated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A key file the service user cannot use was found at startup. Signed outbound requests and key publishing fail until it is readable.",
      "level": "warn",
      "name": "airdress.identity.key_unreadable",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A key file the service user cannot use was found at startup. Signed outbound requests and key publishing fail until it is readable.",
        "properties": {
          "error": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "purpose": {
            "type": "string"
          }
        },
        "required": [
          "error",
          "path",
          "purpose"
        ],
        "title": "IdentityKeyUnreadable",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "This operator publishes its public keys at `path`.",
      "level": "info",
      "name": "airdress.identity.keys_published",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "This operator publishes its public keys at `path`.",
        "properties": {
          "path": {
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "IdentityKeysPublished",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The published keys could not be rendered; the route answered 503.",
      "level": "warn",
      "name": "airdress.identity.keys_unavailable",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The published keys could not be rendered; the route answered 503.",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ],
        "title": "IdentityKeysUnavailable",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "This operator issued itself a new transport certificate.",
      "level": "info",
      "name": "airdress.identity.transport_certificate_issued",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "This operator issued itself a new transport certificate.",
        "properties": {
          "fqdn": {
            "type": "string"
          },
          "kid": {
            "type": "string"
          },
          "not_after": {
            "description": "Unix seconds.",
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "fqdn",
          "kid",
          "not_after"
        ],
        "title": "TransportCertificateIssued",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The transport certificate is unavailable; signed outbound requests present none. Key plumbing: not on the bus.",
      "level": "warn",
      "name": "airdress.identity.transport_unavailable",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The transport certificate is unavailable; signed outbound requests present none. Key plumbing: not on the bus.",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ],
        "title": "IdentityTransportUnavailable",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The idle reading was deferred: the operator's own probe is open.\n\nOne of the operator's readiness probes is open against the endpoint, so the connection count cannot tell it from a person. The reading is `Unknown`, which never reaps.",
      "level": "debug",
      "name": "airdress.idle.probe_deferred",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The idle reading was deferred: the operator's own probe is open.\n\nOne of the operator's readiness probes is open against the endpoint, so the connection count cannot tell it from a person. The reading is `Unknown`, which never reaps.",
        "properties": {
          "port": {
            "format": "uint16",
            "minimum": 0.0,
            "type": "integer"
          },
          "unit": {
            "type": "string"
          }
        },
        "required": [
          "port",
          "unit"
        ],
        "title": "IdleProbeDeferred",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An on-demand unit nobody had used for its whole grace was stopped.",
      "level": "info",
      "name": "airdress.idle.reaped",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An on-demand unit nobody had used for its whole grace was stopped.",
        "properties": {
          "unit": {
            "type": "string"
          }
        },
        "required": [
          "unit"
        ],
        "title": "IdleReaped",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The idle reaper's decision about one unit on one tick, including the decisions not to act. One per unit per tick.",
      "level": "debug",
      "name": "airdress.idle.reported",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The idle reaper's decision about one unit on one tick, including the decisions not to act. One per unit per tick.",
        "properties": {
          "unit": {
            "type": "string"
          },
          "verdict": {
            "description": "The verdict as the journal prints it (`Busy { connected: 1 }`, `Draining { .. }`, `Reap`, `Unknown { .. }`, `NotRunning`, `NeverDrains`).",
            "type": "string"
          }
        },
        "required": [
          "unit",
          "verdict"
        ],
        "title": "IdleReported",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "At startup: an ingress endpoint accepts a fixed token. Once per endpoint.",
      "level": "warn",
      "name": "airdress.ingress.static_bearer",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "At startup: an ingress endpoint accepts a fixed token. Once per endpoint.",
        "properties": {
          "slug": {
            "type": "string"
          }
        },
        "required": [
          "slug"
        ],
        "title": "IngressStaticBearer",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "At startup: an ingress endpoint accepts a fixed token through mode `bearer`. Once per endpoint.",
      "level": "warn",
      "name": "airdress.ingress.static_bearer_legacy",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "At startup: an ingress endpoint accepts a fixed token through mode `bearer`. Once per endpoint.",
        "properties": {
          "slug": {
            "type": "string"
          }
        },
        "required": [
          "slug"
        ],
        "title": "IngressStaticBearerLegacy",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A hook refused an action.",
      "level": "warn",
      "name": "airdress.intercept.denied",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A hook refused an action.",
        "properties": {
          "hook": {
            "type": "string"
          },
          "point": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "hook",
          "point",
          "reason"
        ],
        "title": "InterceptDenied",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A hook failed: its expression errored or ran out of budget, or its function trapped, ran past its deadline or answered no decision.",
      "level": "warn",
      "name": "airdress.intercept.hook_failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A hook failed: its expression errored or ran out of budget, or its function trapped, ran past its deadline or answered no decision.",
        "properties": {
          "error": {
            "type": "string"
          },
          "hook": {
            "type": "string"
          },
          "point": {
            "type": "string"
          }
        },
        "required": [
          "error",
          "hook",
          "point"
        ],
        "title": "HookFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "Pre-cutover key packages were discarded; v2 ones replace them in the same reconcile.",
      "level": "warn",
      "name": "airdress.key_package.retired_form_purged",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Pre-cutover key packages were discarded; v2 ones replace them in the same reconcile.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "purged": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "airdress",
          "purged"
        ],
        "title": "KeyPackageRetiredFormPurged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A stored key package could not be inspected for its identity form, so the purge of retired forms left it in place. Carries the package's storage id in hex, never the package.",
      "level": "warn",
      "name": "airdress.key_package.undecodable",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A stored key package could not be inspected for its identity form, so the purge of retired forms left it in place. Carries the package's storage id in hex, never the package.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "kid": {
            "description": "The key package's storage id, hex.",
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "kid",
          "reason"
        ],
        "title": "KeyPackageUndecodable",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A person's device reported a change to their location consent.",
      "level": "info",
      "name": "airdress.location.consent.changed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A person's device reported a change to their location consent.",
        "properties": {
          "enrollment_id": {
            "format": "uuid",
            "type": "string"
          },
          "event_id": {
            "format": "uuid",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "enrollment_id",
          "event_id",
          "principal_id"
        ],
        "title": "LocationConsentChanged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": false,
      "description": "A location event from a person's device was stored. Its kind and origin and, for a track, the track's id; never what it says.",
      "level": "info",
      "name": "airdress.location.event.received",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A location event from a person's device was stored. Its kind and origin and, for a track, the track's id; never what it says.",
        "properties": {
          "enrollment_id": {
            "format": "uuid",
            "type": "string"
          },
          "event_id": {
            "format": "uuid",
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "origin": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "track_id": {
            "type": "string"
          }
        },
        "required": [
          "enrollment_id",
          "event_id",
          "kind",
          "origin",
          "principal_id",
          "track_id"
        ],
        "title": "LocationEventReceived",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A person erased the location events their airdress received: from the calling device (`device`) or all their devices (`all`), optionally one track's, with how many rows went.",
      "level": "info",
      "name": "airdress.location.events.erased",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A person erased the location events their airdress received: from the calling device (`device`) or all their devices (`all`), optionally one track's, with how many rows went.",
        "properties": {
          "enrollment_id": {
            "format": "uuid",
            "type": "string"
          },
          "erased": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "scope": {
            "type": "string"
          },
          "track_id": {
            "type": "string"
          }
        },
        "required": [
          "enrollment_id",
          "erased",
          "principal_id",
          "scope",
          "track_id"
        ],
        "title": "LocationEventsErased",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "Location events past their retention window were deleted. A count across every device and person; nothing about what the rows held.",
      "level": "info",
      "name": "airdress.location.events.expired",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Location events past their retention window were deleted. A count across every device and person; nothing about what the rows held.",
        "properties": {
          "rows": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "rows"
        ],
        "title": "LocationEventsExpired",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A function invocation carrying a location event asked a model, and the owner has not allowed location to reach models.",
      "level": "warn",
      "name": "airdress.location.model_call.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function invocation carrying a location event asked a model, and the owner has not allowed location to reach models.",
        "properties": {
          "invocation_id": {
            "type": "string"
          }
        },
        "required": [
          "invocation_id"
        ],
        "title": "LocationModelCallRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A location request was refused: the device's enrollment was revoked (`enrollment_revoked`), or the device is not the owner's (`not_owner`, with its enrollment and principal, if it has one).",
      "level": "warn",
      "name": "airdress.location.request.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A location request was refused: the device's enrollment was revoked (`enrollment_revoked`), or the device is not the owner's (`not_owner`, with its enrollment and principal, if it has one).",
        "properties": {
          "enrollment_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "principal_id": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "title": "LocationRequestRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A person's continuous location track ended, with why (`expired`, `stopped`, `low_battery`, …). Never where.",
      "level": "info",
      "name": "airdress.location.track.ended",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A person's continuous location track ended, with why (`expired`, `stopped`, `low_battery`, …). Never where.",
        "properties": {
          "enrollment_id": {
            "format": "uuid",
            "type": "string"
          },
          "event_id": {
            "format": "uuid",
            "type": "string"
          },
          "precision": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "track_id": {
            "type": "string"
          }
        },
        "required": [
          "enrollment_id",
          "event_id",
          "precision",
          "principal_id",
          "reason",
          "track_id"
        ],
        "title": "LocationTrackEnded",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A person's location track passed its end without saying it ended, and was announced lost. `silent_for_s` is how long since it was last heard.",
      "level": "info",
      "name": "airdress.location.track.lost",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A person's location track passed its end without saying it ended, and was announced lost. `silent_for_s` is how long since it was last heard.",
        "properties": {
          "enrollment_id": {
            "format": "uuid",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "silent_for_s": {
            "format": "int64",
            "type": "integer"
          },
          "track_id": {
            "type": "string"
          }
        },
        "required": [
          "enrollment_id",
          "principal_id",
          "silent_for_s",
          "track_id"
        ],
        "title": "LocationTrackLost",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A person's location track was heard from again after its silence was announced. `silent_for_s` is how long it had been silent.",
      "level": "info",
      "name": "airdress.location.track.recovered",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A person's location track was heard from again after its silence was announced. `silent_for_s` is how long it had been silent.",
        "properties": {
          "enrollment_id": {
            "format": "uuid",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "silent_for_s": {
            "format": "int64",
            "type": "integer"
          },
          "track_id": {
            "type": "string"
          }
        },
        "required": [
          "enrollment_id",
          "principal_id",
          "silent_for_s",
          "track_id"
        ],
        "title": "LocationTrackRecovered",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A person's running location track was not heard from for longer than the silence threshold, and the silence was announced.",
      "level": "info",
      "name": "airdress.location.track.silent",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A person's running location track was not heard from for longer than the silence threshold, and the silence was announced.",
        "properties": {
          "enrollment_id": {
            "format": "uuid",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "silent_for_s": {
            "format": "int64",
            "type": "integer"
          },
          "track_id": {
            "type": "string"
          }
        },
        "required": [
          "enrollment_id",
          "principal_id",
          "silent_for_s",
          "track_id"
        ],
        "title": "LocationTrackSilent",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A person started a continuous location track, at a precision (`approximate` or `precise`). Never where, never when it is due to end.",
      "level": "info",
      "name": "airdress.location.track.started",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A person started a continuous location track, at a precision (`approximate` or `precise`). Never where, never when it is due to end.",
        "properties": {
          "enrollment_id": {
            "format": "uuid",
            "type": "string"
          },
          "event_id": {
            "format": "uuid",
            "type": "string"
          },
          "precision": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "track_id": {
            "type": "string"
          }
        },
        "required": [
          "enrollment_id",
          "event_id",
          "precision",
          "principal_id",
          "track_id"
        ],
        "title": "LocationTrackStarted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A machine approved before re-authenticated and was approved again: the same id and grants, a renewed authorization.",
      "level": "info",
      "name": "airdress.machine.approval_renewed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A machine approved before re-authenticated and was approved again: the same id and grants, a renewed authorization.",
        "properties": {
          "authorized_until": {
            "type": "string"
          },
          "fingerprint": {
            "type": "string"
          },
          "kid": {
            "type": "string"
          },
          "machine_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "authorized_until",
          "fingerprint",
          "kid",
          "machine_id"
        ],
        "title": "MachineApprovalRenewed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A new machine was approved: it holds a key the airdress trusts and an authorization until `authorized_until`.\n\nThe owner sees every approval, including a shell host a person approved for themselves; that person is told by the shell host's own notice.",
      "level": "info",
      "name": "airdress.machine.approved",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A new machine was approved: it holds a key the airdress trusts and an authorization until `authorized_until`.\n\nThe owner sees every approval, including a shell host a person approved for themselves; that person is told by the shell host's own notice.",
        "properties": {
          "authorized_until": {
            "type": "string"
          },
          "fingerprint": {
            "type": "string"
          },
          "kid": {
            "type": "string"
          },
          "machine_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "authorized_until",
          "fingerprint",
          "kid",
          "machine_id"
        ],
        "title": "MachineApproved",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The owner changed how long a machine stays authorized, or turned its expiry off.",
      "level": "info",
      "name": "airdress.machine.authorization_changed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner changed how long a machine stays authorized, or turned its expiry off.",
        "properties": {
          "authorized_until": {
            "type": "string"
          },
          "machine_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "authorized_until",
          "machine_id"
        ],
        "title": "MachineAuthorizationChanged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A pending machine enrollment was denied by the owner.\n\nNothing is recorded but the fact: the user code and who denied it are in the journal line only.",
      "level": "info",
      "name": "airdress.machine.denied",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A pending machine enrollment was denied by the owner.\n\nNothing is recorded but the fact: the user code and who denied it are in the journal line only.",
        "title": "MachineDenied",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "This operator is announcing itself on the local network: `origin` is the origin it proposes, `key` its operator key's fingerprint.\n\nEmitted by `serve` when it starts the announcement, so the journal line keeps that module as its target.",
      "level": "info",
      "name": "airdress.machine.discovery_advertised",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "This operator is announcing itself on the local network: `origin` is the origin it proposes, `key` its operator key's fingerprint.\n\nEmitted by `serve` when it starts the announcement, so the journal line keeps that module as its target.",
        "properties": {
          "key": {
            "type": "string"
          },
          "origin": {
            "type": "string"
          }
        },
        "required": [
          "key",
          "origin"
        ],
        "title": "MachineDiscoveryAdvertised",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A machine of the apps role enrolled with a bootstrap and was issued its dispatch credential.",
      "level": "info",
      "name": "airdress.machine.enrolled",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A machine of the apps role enrolled with a bootstrap and was issued its dispatch credential.",
        "properties": {
          "machine": {
            "type": "string"
          },
          "machine_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "machine",
          "machine_id"
        ],
        "title": "AppsMachineEnrolled",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A machine asked to enroll. It is not a machine of the airdress until the owner approves it by its fingerprint.",
      "level": "info",
      "name": "airdress.machine.enrollment_requested",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A machine asked to enroll. It is not a machine of the airdress until the owner approves it by its fingerprint.",
        "properties": {
          "display_name": {
            "description": "The name the machine gave itself.",
            "type": "string"
          },
          "fingerprint": {
            "description": "The `SHA256:` fingerprint of the machine's public key.",
            "type": "string"
          }
        },
        "required": [
          "display_name",
          "fingerprint"
        ],
        "title": "MachineEnrollmentRequested",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An approved machine was linked: the resource of its purpose (`kind`, `name`) was applied for it. A shell host is linked to `person`, who approved it.",
      "level": "info",
      "name": "airdress.machine.linked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An approved machine was linked: the resource of its purpose (`kind`, `name`) was applied for it. A shell host is linked to `person`, who approved it.",
        "properties": {
          "kind": {
            "type": "string"
          },
          "machine_id": {
            "format": "uuid",
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "person": {
            "description": "The person a shell host is linked to; absent for every other purpose.",
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "kind",
          "machine_id",
          "name"
        ],
        "title": "MachineLinked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A pre-auth key was minted: how many machines it may enroll, whether they are approved on redemption, how many grants they receive, and until when. The key's secret is never in the event.",
      "level": "info",
      "name": "airdress.machine.preauth_key.created",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A pre-auth key was minted: how many machines it may enroll, whether they are approved on redemption, how many grants they receive, and until when. The key's secret is never in the event.",
        "properties": {
          "expires_at": {
            "type": "string"
          },
          "grants": {
            "description": "How many grants an enrolled machine receives.",
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "key_id": {
            "format": "uuid",
            "type": "string"
          },
          "max_uses": {
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          },
          "pre_approved": {
            "type": "boolean"
          }
        },
        "required": [
          "expires_at",
          "grants",
          "key_id",
          "max_uses",
          "pre_approved"
        ],
        "title": "PreauthKeyCreated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A machine enrolled with a pre-auth key; with a pre-approved key it is approved in the same step.",
      "level": "info",
      "name": "airdress.machine.preauth_key.redeemed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A machine enrolled with a pre-auth key; with a pre-approved key it is approved in the same step.",
        "properties": {
          "display_name": {
            "type": "string"
          },
          "fingerprint": {
            "type": "string"
          },
          "key_id": {
            "format": "uuid",
            "type": "string"
          },
          "pre_approved": {
            "type": "boolean"
          }
        },
        "required": [
          "display_name",
          "fingerprint",
          "key_id",
          "pre_approved"
        ],
        "title": "PreauthKeyRedeemed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A pre-auth key was refused: unknown, wrong, expired, revoked or used up. It names no key id, so nobody reading it can confirm that a guessed id exists. Anybody can cause one, so it is not on the bus.",
      "level": "info",
      "name": "airdress.machine.preauth_key.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A pre-auth key was refused: unknown, wrong, expired, revoked or used up. It names no key id, so nobody reading it can confirm that a guessed id exists. Anybody can cause one, so it is not on the bus.",
        "title": "PreauthKeyRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A pre-auth key was revoked; it enrolls nothing more.",
      "level": "info",
      "name": "airdress.machine.preauth_key.revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A pre-auth key was revoked; it enrolls nothing more.",
        "properties": {
          "key_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "key_id"
        ],
        "title": "PreauthKeyRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A live machine asked to re-authenticate under its own key.",
      "level": "info",
      "name": "airdress.machine.reauth_requested",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A live machine asked to re-authenticate under its own key.",
        "properties": {
          "fingerprint": {
            "type": "string"
          },
          "machine_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "fingerprint",
          "machine_id"
        ],
        "title": "MachineReauthRequested",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A machine was revoked, with every key it held.",
      "level": "info",
      "name": "airdress.machine.revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A machine was revoked, with every key it held.",
        "properties": {
          "machine_id": {
            "format": "uuid",
            "type": "string"
          },
          "revoked_kids": {
            "description": "The key ids revoked with it.",
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "machine_id",
          "revoked_kids"
        ],
        "title": "MachineRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A source-signing key already revoked as rotated was reclassified as compromised: what it signed is quarantined from now on.",
      "level": "warn",
      "name": "airdress.machine.source_key.compromised",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A source-signing key already revoked as rotated was reclassified as compromised: what it signed is quarantined from now on.",
        "properties": {
          "kid": {
            "type": "string"
          },
          "machine_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "kid",
          "machine_id"
        ],
        "title": "MachineSourceKeyCompromised",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A machine's source-signing key was approved by its fingerprint; the key ids it rotated out, if any, are named.",
      "level": "info",
      "name": "airdress.machine.source_key_added",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A machine's source-signing key was approved by its fingerprint; the key ids it rotated out, if any, are named.",
        "properties": {
          "fingerprint": {
            "type": "string"
          },
          "kid": {
            "type": "string"
          },
          "machine_id": {
            "format": "uuid",
            "type": "string"
          },
          "rotated_out": {
            "items": {
              "type": "string"
            },
            "type": "array"
          }
        },
        "required": [
          "fingerprint",
          "kid",
          "machine_id",
          "rotated_out"
        ],
        "title": "MachineSourceKeyAdded",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A member linked their own account, completing the owner's offer.",
      "level": "info",
      "name": "airdress.member.account_binding.bound",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A member linked their own account, completing the owner's offer.",
        "properties": {
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "principal_id"
        ],
        "title": "AccountBindingBound",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "Members can link their own account through this operator at `path`.",
      "level": "info",
      "name": "airdress.member.account_binding.enabled",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Members can link their own account through this operator at `path`.",
        "properties": {
          "path": {
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "AccountBindingEnabled",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The owner offered a member an account binding.",
      "level": "info",
      "name": "airdress.member.account_binding.offered",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner offered a member an account binding.",
        "properties": {
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "principal_id"
        ],
        "title": "AccountBindingOffered",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "This operator vouched to the hub for a member who signed in.",
      "level": "info",
      "name": "airdress.member_authorization.asserted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "This operator vouched to the hub for a member who signed in.",
        "properties": {
          "kid": {
            "description": "The assertion key's kid, a public identifier.",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "kid",
          "principal_id"
        ],
        "title": "MemberAuthorizationAsserted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "Members of this airdress can sign in through this operator at `path`.",
      "level": "info",
      "name": "airdress.member_authorization.enabled",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Members of this airdress can sign in through this operator at `path`.",
        "properties": {
          "path": {
            "type": "string"
          }
        },
        "required": [
          "path"
        ],
        "title": "MemberAuthorizationEnabled",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A sign-in for the hub matched no active sub-user. It names nobody, and anybody with a hub account can cause one, so it stays off the bus.",
      "level": "info",
      "name": "airdress.member_authorization.not_a_member",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A sign-in for the hub matched no active sub-user. It names nobody, and anybody with a hub account can cause one, so it stays off the bus.",
        "title": "MemberAuthorizationNotAMember",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A member sign-in request was refused before it reached the login: `reason` says why. Anybody can cause one, so it stays off the bus.",
      "level": "warn",
      "name": "airdress.member_authorization.request_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A member sign-in request was refused before it reached the login: `reason` says why. Anybody can cause one, so it stays off the bus.",
        "properties": {
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "title": "MemberAuthorizationRequestRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A device's revocation state was read: by an unauthenticated caller (`caller` is `public`) or by an enrolled device (`caller_enrollment`). Said for every read.",
      "level": "debug",
      "name": "airdress.mls.revocation_queried",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A device's revocation state was read: by an unauthenticated caller (`caller` is `public`) or by an enrolled device (`caller_enrollment`). Said for every read.",
        "properties": {
          "caller": {
            "type": [
              "string",
              "null"
            ]
          },
          "caller_enrollment": {
            "format": "uuid",
            "type": [
              "string",
              "null"
            ]
          },
          "device_id": {
            "description": "The device asked about.",
            "type": "string"
          },
          "revoked": {
            "type": "boolean"
          }
        },
        "required": [
          "device_id",
          "revoked"
        ],
        "title": "RevocationQueried",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "airdress",
      "bus": true,
      "description": "This operator process started and its event log is recording.\n\nThe first event every boot writes; its absence after a restart means the log was not recording.",
      "level": "info",
      "name": "airdress.operator.started",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "This operator process started and its event log is recording.\n\nThe first event every boot writes; its absence after a restart means the log was not recording.",
        "properties": {
          "version": {
            "description": "The operator's version.",
            "type": "string"
          }
        },
        "required": [
          "version"
        ],
        "title": "OperatorStarted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "This operator's key and compute-pool admissions were moved from its name to its airdress.",
      "level": "info",
      "name": "airdress.operator_key.moved_to_airdress",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "This operator's key and compute-pool admissions were moved from its name to its airdress.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "compute_enrollments": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "public_keys": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "removed_name_pin": {
            "type": "boolean"
          },
          "sealed_keys": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "airdress",
          "compute_enrollments",
          "name",
          "public_keys",
          "removed_name_pin",
          "sealed_keys"
        ],
        "title": "OperatorKeyMovedToAirdress",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "Enrollments that are not compute-pool admissions remain under this operator's name, which is not an airdress; they and the root pin under the name are left for the owner to clean up.",
      "level": "warn",
      "name": "airdress.operator_key.name_rows_left",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Enrollments that are not compute-pool admissions remain under this operator's name, which is not an airdress; they and the root pin under the name are left for the owner to clean up.",
        "properties": {
          "enrollments": {
            "format": "int64",
            "type": "integer"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "enrollments",
          "name"
        ],
        "title": "OperatorKeyNameRowsLeft",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The owner principal was re-bound to the configured OIDC subject; the previous subject is no longer the owner. Carries the owner's subjects, so it stays off the bus.",
      "level": "warn",
      "name": "airdress.owner.rebound",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner principal was re-bound to the configured OIDC subject; the previous subject is no longer the owner. Carries the owner's subjects, so it stays off the bus.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "issuer": {
            "type": "string"
          },
          "previous_issuer": {
            "type": "string"
          },
          "previous_sub": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "sub": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "issuer",
          "previous_issuer",
          "previous_sub",
          "principal_id",
          "sub"
        ],
        "title": "OwnerRebound",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A peer registry entry disagrees with a DNSSEC-validated record. DNS wins; this only makes the loss visible.",
      "level": "warn",
      "name": "airdress.peer.registry_conflict",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A peer registry entry disagrees with a DNSSEC-validated record. DNS wins; this only makes the loss visible.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "dns": {
            "type": "string"
          },
          "registry": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "dns",
          "registry"
        ],
        "title": "PeerRegistryConflict",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A peer trust key was recorded for a subject and purpose that had no live key.",
      "level": "info",
      "name": "airdress.peer_trust.added",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A peer trust key was recorded for a subject and purpose that had no live key.",
        "properties": {
          "kid": {
            "type": "string"
          },
          "provenance": {
            "type": "string"
          },
          "purpose": {
            "type": "string"
          },
          "rotated_out": {
            "description": "Always empty here; kept so both arms carry the same fields.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "subject": {
            "type": "string"
          }
        },
        "required": [
          "kid",
          "provenance",
          "purpose",
          "rotated_out",
          "subject"
        ],
        "title": "PeerTrustAdded",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A first-seen peer key changed: the new key was refused, and nothing was recorded, until the owner revokes the old one.",
      "level": "warn",
      "name": "airdress.peer_trust.changed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A first-seen peer key changed: the new key was refused, and nothing was recorded, until the owner revokes the old one.",
        "properties": {
          "kid": {
            "type": "string"
          },
          "provenance": {
            "type": "string"
          },
          "purpose": {
            "type": "string"
          },
          "subject": {
            "type": "string"
          }
        },
        "required": [
          "kid",
          "provenance",
          "purpose",
          "subject"
        ],
        "title": "PeerTrustChanged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A lower-precedence key disagrees with the trusted one and was ignored. Once per subject and purpose per process.",
      "level": "warn",
      "name": "airdress.peer_trust.conflict",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A lower-precedence key disagrees with the trusted one and was ignored. Once per subject and purpose per process.",
        "properties": {
          "purpose": {
            "type": "string"
          },
          "subject": {
            "type": "string"
          }
        },
        "required": [
          "purpose",
          "subject"
        ],
        "title": "PeerTrustConflict",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A live peer trust key was revoked.",
      "level": "info",
      "name": "airdress.peer_trust.revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A live peer trust key was revoked.",
        "properties": {
          "kid": {
            "type": "string"
          },
          "provenance": {
            "type": "string"
          },
          "purpose": {
            "type": "string"
          },
          "revocation_kind": {
            "description": "`rotated` or `compromised`; empty when no kind was given.",
            "type": "string"
          },
          "subject": {
            "type": "string"
          }
        },
        "required": [
          "kid",
          "provenance",
          "purpose",
          "revocation_kind",
          "subject"
        ],
        "title": "PeerTrustRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A peer trust key was recorded and rotated out the live keys listed in `rotated_out` (their kids).",
      "level": "info",
      "name": "airdress.peer_trust.rotated",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A peer trust key was recorded and rotated out the live keys listed in `rotated_out` (their kids).",
        "properties": {
          "kid": {
            "type": "string"
          },
          "provenance": {
            "type": "string"
          },
          "purpose": {
            "type": "string"
          },
          "rotated_out": {
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "subject": {
            "type": "string"
          }
        },
        "required": [
          "kid",
          "provenance",
          "purpose",
          "rotated_out",
          "subject"
        ],
        "title": "PeerTrustRotated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A person rotated their contact tag, retiring the contact link they had shared.",
      "level": "info",
      "name": "airdress.person.contact_tag.rotated",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A person rotated their contact tag, retiring the contact link they had shared.",
        "properties": {
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "principal_id"
        ],
        "title": "ContactTagRotated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A member's enrollment was refused: its person root does not match the one pinned for them.",
      "level": "warn",
      "name": "airdress.person.root.mismatched",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A member's enrollment was refused: its person root does not match the one pinned for them.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "principal_id"
        ],
        "title": "PersonRootMismatched",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A member's person root was established on first use. The person is recorded; the journal line never carried them.",
      "level": "info",
      "name": "airdress.person.root.pinned",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A member's person root was established on first use. The person is recorded; the journal line never carried them.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "confirmed_by_sign_in": {
            "type": "boolean"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "confirmed_by_sign_in",
          "principal_id"
        ],
        "title": "PersonRootPinned",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A plugin's assertion refresh was refused. Credential plumbing: not on the bus.",
      "level": "info",
      "name": "airdress.plugin.assertion.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin's assertion refresh was refused. Credential plumbing: not on the bus.",
        "properties": {
          "code": {
            "type": "string"
          },
          "install": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "install"
        ],
        "title": "PluginAssertionRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The registry index revokes a plugin author key.",
      "level": "warn",
      "name": "airdress.plugin.author_key.revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The registry index revokes a plugin author key.",
        "properties": {
          "author": {
            "type": "string"
          },
          "key": {
            "description": "The revoked public key, hex.",
            "type": "string"
          },
          "kind": {
            "type": "string"
          }
        },
        "required": [
          "author",
          "key",
          "kind"
        ],
        "title": "PluginAuthorKeyRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A person authorized a plugin's personal scope.",
      "level": "info",
      "name": "airdress.plugin.authorization.granted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A person authorized a plugin's personal scope.",
        "properties": {
          "install": {
            "type": "string"
          }
        },
        "required": [
          "install"
        ],
        "title": "PluginAuthorizationGranted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The owner changed whether a plugin's personal scope is offered.",
      "level": "info",
      "name": "airdress.plugin.authorization.offer_changed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner changed whether a plugin's personal scope is offered.",
        "properties": {
          "install": {
            "type": "string"
          },
          "offered": {
            "type": "boolean"
          }
        },
        "required": [
          "install",
          "offered"
        ],
        "title": "PluginAuthorizationOfferChanged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A person revoked their authorization of a plugin's personal scope.",
      "level": "info",
      "name": "airdress.plugin.authorization.revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A person revoked their authorization of a plugin's personal scope.",
        "properties": {
          "data": {
            "description": "`erase` or `keep`: what happens to the person's plugin data.",
            "type": "string"
          },
          "install": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "data",
          "install",
          "reason"
        ],
        "title": "PluginAuthorizationRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An install's stored config does not match its app's schema; it starts without it.",
      "level": "error",
      "name": "airdress.plugin.config.invalid",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An install's stored config does not match its app's schema; it starts without it.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "error": {
            "type": "string"
          },
          "subdomain": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "error",
          "subdomain"
        ],
        "title": "PluginConfigInvalid",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin's outbound connection was refused by its egress policy.",
      "level": "info",
      "name": "airdress.plugin.egress.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin's outbound connection was refused by its egress policy.",
        "properties": {
          "host": {
            "type": "string"
          },
          "install": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "host",
          "install",
          "reason"
        ],
        "title": "PluginEgressRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An uninstall held each person's plugin resources as their export.",
      "level": "info",
      "name": "airdress.plugin.export.written",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An uninstall held each person's plugin resources as their export.",
        "properties": {
          "install": {
            "type": "string"
          },
          "persons": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "window_secs": {
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "install",
          "persons",
          "window_secs"
        ],
        "title": "PluginExportWritten",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The owner granted a plugin install actions in a scope.",
      "level": "info",
      "name": "airdress.plugin.grant.created",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner granted a plugin install actions in a scope.",
        "properties": {
          "actions": {
            "description": "How many actions it grants.",
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "install": {
            "type": "string"
          },
          "scope": {
            "type": "string"
          }
        },
        "required": [
          "actions",
          "install",
          "scope"
        ],
        "title": "PluginGrantCreated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin grant was revoked.",
      "level": "info",
      "name": "airdress.plugin.grant.revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin grant was revoked.",
        "properties": {
          "install": {
            "type": "string"
          }
        },
        "required": [
          "install"
        ],
        "title": "PluginGrantRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A call on a plugin's host socket, or a host question it asked, was refused.",
      "level": "info",
      "name": "airdress.plugin.host.call_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A call on a plugin's host socket, or a host question it asked, was refused.",
        "properties": {
          "code": {
            "type": "string"
          },
          "install": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "install"
        ],
        "title": "PluginHostCallRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The host answered a plugin's authorization questions. One per call: chatty, not on the bus.",
      "level": "info",
      "name": "airdress.plugin.host.decided",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The host answered a plugin's authorization questions. One per call: chatty, not on the bus.",
        "properties": {
          "actor": {
            "description": "The asking actor's role, as the journal has always written it.",
            "type": "string"
          },
          "allowed": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "install": {
            "type": "string"
          },
          "queries": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "actor",
          "allowed",
          "install",
          "queries"
        ],
        "title": "PluginHostDecided",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The plugin host created its assertion key. Key metadata: not on the bus.",
      "level": "info",
      "name": "airdress.plugin.host.key_created",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The plugin host created its assertion key. Key metadata: not on the bus.",
        "properties": {
          "kid": {
            "type": "string"
          },
          "path": {
            "type": "string"
          }
        },
        "required": [
          "kid",
          "path"
        ],
        "title": "PluginHostKeyCreated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The host released a data key to a plugin. Never the key; key plumbing, so not on the bus.",
      "level": "info",
      "name": "airdress.plugin.host.key_released",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The host released a data key to a plugin. Never the key; key plumbing, so not on the bus.",
        "properties": {
          "install": {
            "type": "string"
          },
          "scope": {
            "description": "`airdress` or `personal`.",
            "type": "string"
          },
          "version": {
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "install",
          "scope",
          "version"
        ],
        "title": "PluginHostKeyReleased",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A process outside an install's instance called its host socket.",
      "level": "warn",
      "name": "airdress.plugin.host.peer_mismatch",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A process outside an install's instance called its host socket.",
        "properties": {
          "install": {
            "type": "string"
          },
          "pid": {
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "install",
          "pid"
        ],
        "title": "PluginHostPeerMismatch",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The plugin registry index could not be verified; revocations already known still apply.",
      "level": "warn",
      "name": "airdress.plugin.index.unverified",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The plugin registry index could not be verified; revocations already known still apply.",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ],
        "title": "PluginIndexUnverified",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin was installed.",
      "level": "info",
      "name": "airdress.plugin.install.completed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin was installed.",
        "properties": {
          "app": {
            "type": "string"
          },
          "install_id": {
            "type": "string"
          },
          "source": {
            "description": "`registry` or `local`.",
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "app",
          "install_id",
          "source",
          "version"
        ],
        "title": "PluginInstallCompleted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A registry install was refused before anything was written.",
      "level": "warn",
      "name": "airdress.plugin.install.failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A registry install was refused before anything was written.",
        "properties": {
          "code": {
            "type": "string"
          },
          "error": {
            "type": "string"
          },
          "step": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "error",
          "step"
        ],
        "title": "PluginInstallFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A stored plugin install could not be served at start.",
      "level": "warn",
      "name": "airdress.plugin.install.not_served",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A stored plugin install could not be served at start.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "app": {
            "type": "string"
          },
          "error": {
            "type": "string"
          },
          "subdomain": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "app",
          "error",
          "subdomain"
        ],
        "title": "PluginInstallNotServed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin install stopped serving: the key that signed its release was revoked as compromised.",
      "level": "warn",
      "name": "airdress.plugin.install.quarantined",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin install stopped serving: the key that signed its release was revoked as compromised.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "install_id": {
            "type": "string"
          },
          "plugin": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "subdomain": {
            "type": "string"
          },
          "version": {
            "description": "As the journal has always written it (`Some(\"…\")` or `None`).",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "install_id",
          "plugin",
          "reason",
          "subdomain",
          "version"
        ],
        "title": "PluginInstallQuarantined",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An install failed after its download; the artifact was removed.",
      "level": "warn",
      "name": "airdress.plugin.install.rolled_back",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An install failed after its download; the artifact was removed.",
        "properties": {
          "plugin": {
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "plugin",
          "version"
        ],
        "title": "PluginInstallRolledBack",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A registry install began.",
      "level": "info",
      "name": "airdress.plugin.install.started",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A registry install began.",
        "properties": {
          "dry_run": {
            "type": "boolean"
          },
          "plugin": {
            "type": "string"
          },
          "version": {
            "description": "The version asked for; `None` for the latest.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "dry_run",
          "plugin"
        ],
        "title": "PluginInstallStarted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "An unsigned plugin release is being installed because the host allows it.",
      "level": "warn",
      "name": "airdress.plugin.install.unsigned",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An unsigned plugin release is being installed because the host allows it.",
        "properties": {
          "plugin": {
            "type": "string"
          },
          "version": {
            "type": "string"
          }
        },
        "required": [
          "plugin",
          "version"
        ],
        "title": "PluginInstallUnsigned",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin instance's process exited without being asked to, or an OOM kill landed while it drained.",
      "level": "warn",
      "name": "airdress.plugin.instance.exited",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin instance's process exited without being asked to, or an OOM kill landed while it drained.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "app": {
            "type": "string"
          },
          "code": {
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          },
          "during_stop": {
            "type": "boolean"
          },
          "reason": {
            "description": "`oom_kill`, `signal` or `exit`.",
            "type": "string"
          },
          "signal": {
            "format": "int32",
            "type": [
              "integer",
              "null"
            ]
          }
        },
        "required": [
          "airdress",
          "app",
          "during_stop",
          "reason"
        ],
        "title": "PluginInstanceExited",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin instance's health check never answered 2xx within the cold-start timeout.",
      "level": "error",
      "name": "airdress.plugin.instance.not_ready",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin instance's health check never answered 2xx within the cold-start timeout.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "app": {
            "type": "string"
          },
          "path": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "app",
          "path"
        ],
        "title": "PluginInstanceNotReady",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin instance's health check kept failing; it was stopped and the next request restarts it.",
      "level": "warn",
      "name": "airdress.plugin.instance.unhealthy",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin instance's health check kept failing; it was stopped and the next request restarts it.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "app": {
            "type": "string"
          },
          "failures": {
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          },
          "path": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "app",
          "failures",
          "path"
        ],
        "title": "PluginInstanceUnhealthy",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin applied one of its own resources.",
      "level": "info",
      "name": "airdress.plugin.kind.applied",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin applied one of its own resources.",
        "properties": {
          "install": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "scope": {
            "type": "string"
          }
        },
        "required": [
          "install",
          "kind",
          "scope"
        ],
        "title": "PluginKindApplied",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin resource was deleted.",
      "level": "info",
      "name": "airdress.plugin.kind.deleted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin resource was deleted.",
        "properties": {
          "install": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "scope": {
            "type": "string"
          }
        },
        "required": [
          "install",
          "kind",
          "scope"
        ],
        "title": "PluginKindDeleted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "One line a plugin wrote, re-emitted under [`PLUGIN_LOG_TARGET`]. The line is the journal line's message and is never recorded: what a plugin prints is its own content.",
      "level": "info",
      "name": "airdress.plugin.log",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "One line a plugin wrote, re-emitted under [`PLUGIN_LOG_TARGET`]. The line is the journal line's message and is never recorded: what a plugin prints is its own content.",
        "properties": {
          "install": {
            "type": "string"
          },
          "plugin": {
            "type": "string"
          },
          "stream": {
            "description": "`stdout` or `stderr`.",
            "type": "string"
          },
          "truncated": {
            "description": "The line was cut at the per-line cap.",
            "type": "boolean"
          }
        },
        "required": [
          "install",
          "plugin",
          "stream",
          "truncated"
        ],
        "title": "PluginLog",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A plugin wrote faster than its line budget; lines were dropped.",
      "level": "warn",
      "name": "airdress.plugin.log_dropped",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin wrote faster than its line budget; lines were dropped.",
        "properties": {
          "dropped": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "install": {
            "type": "string"
          },
          "plugin": {
            "type": "string"
          }
        },
        "required": [
          "dropped",
          "install",
          "plugin"
        ],
        "title": "PluginLogDropped",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin's name was published in this operator's own zone.",
      "level": "info",
      "name": "airdress.plugin.name_published",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin's name was published in this operator's own zone.",
        "properties": {
          "label": {
            "description": "The plugin's label under the airdress.",
            "type": "string"
          },
          "zone": {
            "type": "string"
          }
        },
        "required": [
          "label",
          "zone"
        ],
        "title": "PluginNamePublished",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin's name was withdrawn from this operator's own zone.",
      "level": "info",
      "name": "airdress.plugin.name_withdrawn",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin's name was withdrawn from this operator's own zone.",
        "properties": {
          "label": {
            "type": "string"
          },
          "zone": {
            "type": "string"
          }
        },
        "required": [
          "label",
          "zone"
        ],
        "title": "PluginNameWithdrawn",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin name the parent zone still held was withdrawn from it.",
      "level": "info",
      "name": "airdress.plugin.parent_name_withdrawn",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin name the parent zone still held was withdrawn from it.",
        "properties": {
          "label": {
            "type": "string"
          }
        },
        "required": [
          "label"
        ],
        "title": "PluginParentNameWithdrawn",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A revoked person's plugin data was erased.",
      "level": "info",
      "name": "airdress.plugin.principal.erased",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A revoked person's plugin data was erased.",
        "properties": {
          "install": {
            "type": "string"
          }
        },
        "required": [
          "install"
        ],
        "title": "PluginPrincipalErased",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A revoked person's plugin data is unreachable and scheduled for erasure.",
      "level": "info",
      "name": "airdress.plugin.principal.revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A revoked person's plugin data is unreachable and scheduled for erasure.",
        "properties": {
          "erase_in_secs": {
            "format": "int64",
            "type": "integer"
          },
          "install": {
            "type": "string"
          }
        },
        "required": [
          "erase_in_secs",
          "install"
        ],
        "title": "PluginPrincipalRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A request to a plugin was refused: before it was forwarded, or because its signed body was not the one signed.",
      "level": "info",
      "name": "airdress.plugin.proxy.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A request to a plugin was refused: before it was forwarded, or because its signed body was not the one signed.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "app": {
            "description": "The plugin's subdomain, when the refusal came before forwarding.",
            "type": [
              "string",
              "null"
            ]
          },
          "code": {
            "type": "string"
          },
          "mismatch": {
            "description": "How a signed body differed from its digest, for `body_digest_mismatch`.",
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "airdress",
          "code"
        ],
        "title": "PluginProxyRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A Tier-1 plugin runs, or will run, without the sandbox's full protection: started unsandboxed, the host configured to run every plugin so, or its limits fallen back to setrlimit.",
      "level": "warn",
      "name": "airdress.plugin.sandbox.insecure",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A Tier-1 plugin runs, or will run, without the sandbox's full protection: started unsandboxed, the host configured to run every plugin so, or its limits fallen back to setrlimit.",
        "properties": {
          "airdress": {
            "type": [
              "string",
              "null"
            ]
          },
          "app": {
            "description": "The plugin, when one is starting.",
            "type": [
              "string",
              "null"
            ]
          },
          "note": {
            "description": "Which of the three: the journal line's message.",
            "type": "string"
          }
        },
        "required": [
          "note"
        ],
        "title": "PluginSandboxInsecure",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "Expired plugin sessions were swept. Housekeeping: not on the bus.",
      "level": "info",
      "name": "airdress.plugin.session.swept",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Expired plugin sessions were swept. Housekeeping: not on the bus.",
        "properties": {
          "count": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "count"
        ],
        "title": "PluginSessionSwept",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin's socket was refused; the proxy will not dial it.",
      "level": "warn",
      "name": "airdress.plugin.socket.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin's socket was refused; the proxy will not dial it.",
        "properties": {
          "app": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "app",
          "reason"
        ],
        "title": "PluginSocketRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin was uninstalled.",
      "level": "info",
      "name": "airdress.plugin.uninstall.completed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin was uninstalled.",
        "properties": {
          "app": {
            "type": "string"
          },
          "install_id": {
            "description": "As the journal has always written it (`Some(…)` or `None`).",
            "type": "string"
          }
        },
        "required": [
          "app",
          "install_id"
        ],
        "title": "PluginUninstallCompleted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A plugin was woken on one of its schedules.",
      "level": "info",
      "name": "airdress.plugin.wake",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A plugin was woken on one of its schedules.",
        "properties": {
          "attempts": {
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          },
          "cold": {
            "type": "boolean"
          },
          "install": {
            "type": "string"
          },
          "outcome": {
            "description": "`ok` or `failed`.",
            "type": "string"
          },
          "persons": {
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          },
          "plugin": {
            "type": "string"
          },
          "schedule": {
            "type": "string"
          },
          "wake_ms": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "attempts",
          "cold",
          "install",
          "outcome",
          "persons",
          "plugin",
          "schedule",
          "wake_ms"
        ],
        "title": "PluginWake",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A host-local admin path was asked for on the public listener and answered `404`.",
      "level": "warn",
      "name": "airdress.proxy.admin_path_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A host-local admin path was asked for on the public listener and answered `404`.",
        "properties": {
          "path": {
            "type": "string"
          },
          "source": {
            "description": "The client address.",
            "format": "ip",
            "type": "string"
          }
        },
        "required": [
          "path",
          "source"
        ],
        "title": "ProxyAdminPathRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "client": "publication_block_changed",
      "description": "The owner blocked a person's publishing, or lifted the block.\n\nCarries the state, not the transition, so a device that missed one half still lands on the right answer. About one person, and shown only to them.",
      "level": "info",
      "name": "airdress.publication.block_changed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner blocked a person's publishing, or lifted the block.\n\nCarries the state, not the transition, so a device that missed one half still lands on the right answer. About one person, and shown only to them.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "blocked": {
            "type": "boolean"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "at",
          "blocked",
          "principal_id"
        ],
        "title": "PublicationBlockChanged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "An envelope wake was deferred: the device holds a live stream, so the operator waits the ack grace before deciding whether to wake it.",
      "level": "debug",
      "name": "airdress.push.envelope_wake.deferred",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An envelope wake was deferred: the device holds a live stream, so the operator waits the ack grace before deciding whether to wake it.",
        "title": "WakeDeferred",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "An envelope wake push was attempted, and how it went. Names no device, conversation or content.",
      "level": "debug",
      "name": "airdress.push.envelope_wake.sent",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "An envelope wake push was attempted, and how it went. Names no device, conversation or content.",
        "properties": {
          "outcome": {
            "type": "string"
          }
        },
        "required": [
          "outcome"
        ],
        "title": "WakeSent",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The federation rate limiter fell back to keying on `envelope.from`: the request carried no authenticated peer identity. One per such request, so it stays off the bus.",
      "level": "warn",
      "name": "airdress.ratelimit.unauthenticated_key",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The federation rate limiter fell back to keying on `envelope.from`: the request carried no authenticated peer identity. One per such request, so it stays off the bus.",
        "properties": {
          "envelope_from": {
            "type": "string"
          }
        },
        "required": [
          "envelope_from"
        ],
        "title": "RateLimitUnauthenticatedKey",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A remote MCP session ended, and why.",
      "level": "info",
      "name": "airdress.remote_mcp.session_ended",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A remote MCP session ended, and why.",
        "properties": {
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "title": "SessionEnded",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A remote MCP session opened, with the protocol revision agreed and the client's registered id.",
      "level": "info",
      "name": "airdress.remote_mcp.session_opened",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A remote MCP session opened, with the protocol revision agreed and the client's registered id.",
        "properties": {
          "client": {
            "type": "string"
          },
          "protocol": {
            "type": "string"
          }
        },
        "required": [
          "client",
          "protocol"
        ],
        "title": "SessionOpened",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A bearer token was refused on the remote MCP endpoint; `revoked` when its grant was revoked at the hub. Anybody can cause one, so it stays off the bus. The token is never in the event.",
      "level": "info",
      "name": "airdress.remote_mcp.token_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A bearer token was refused on the remote MCP endpoint; `revoked` when its grant was revoked at the hub. Anybody can cause one, so it stays off the bus. The token is never in the event.",
        "properties": {
          "error": {
            "description": "Why validation refused it.",
            "type": "string"
          },
          "revoked": {
            "type": "boolean"
          }
        },
        "required": [
          "error",
          "revoked"
        ],
        "title": "TokenRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The hub refused the feed cursor; the whole window is read again.",
      "level": "warn",
      "name": "airdress.revoked_grants.cursor_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The hub refused the feed cursor; the whole window is read again.",
        "title": "RevokedGrantsCursorRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The hub refused the grants token, so revoked grants are not reaching this operator. Written on every poll until a new token is configured.",
      "level": "error",
      "name": "airdress.revoked_grants.feed_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The hub refused the grants token, so revoked grants are not reaching this operator. Written on every poll until a new token is configured.",
        "properties": {
          "status": {
            "format": "uint16",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "status"
        ],
        "title": "RevokedGrantsFeedRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The revoked-grant feed could not be read (`outcome`: unreachable or malformed). Access tokens are still accepted until they expire. Written on every poll while it lasts.",
      "level": "warn",
      "name": "airdress.revoked_grants.feed_unavailable",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The revoked-grant feed could not be read (`outcome`: unreachable or malformed). Access tokens are still accepted until they expire. Written on every poll while it lasts.",
        "properties": {
          "outcome": {
            "type": "string"
          }
        },
        "required": [
          "outcome"
        ],
        "title": "RevokedGrantsFeedUnavailable",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "Grants revoked at the hub were learned; their access tokens are refused from now on. `new` were not held before, `known` are held now.",
      "level": "info",
      "name": "airdress.revoked_grants.learned",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Grants revoked at the hub were learned; their access tokens are refused from now on. `new` were not held before, `known` are held now.",
        "properties": {
          "known": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "new": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "known",
          "new"
        ],
        "title": "RevokedGrantsLearned",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A hub issuer is configured but no grants token is, so grants revoked at the hub are not refused here until their access tokens expire.",
      "level": "warn",
      "name": "airdress.revoked_grants.not_polled",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A hub issuer is configured but no grants token is, so grants revoked at the hub are not refused here until their access tokens expire.",
        "title": "RevokedGrantsNotPolled",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A response opened with an access token was ended because its grant was revoked at the hub.",
      "level": "info",
      "name": "airdress.revoked_grants.stream_ended",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A response opened with an access token was ended because its grant was revoked at the hub.",
        "title": "RevokedGrantsStreamEnded",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A pending root recovery was cancelled from an enrolled device. The owner's OIDC subject is in the journal line and kept out of the recorded data.",
      "level": "warn",
      "name": "airdress.root_recovery.cancelled",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A pending root recovery was cancelled from an enrolled device. The owner's OIDC subject is in the journal line and kept out of the recorded data.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "cancelled_by_enrollment": {
            "format": "uuid",
            "type": "string"
          },
          "prior_enrollment_count": {
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "airdress",
          "cancelled_by_enrollment",
          "prior_enrollment_count"
        ],
        "title": "RootRecoveryCancelled",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A self-service root recovery executed: every device must re-enroll.\n\n`trigger` says what executed it (`approval`, `timer`, `immediate`). The owner's OIDC subject is in the journal line and kept out of the recorded data.",
      "level": "warn",
      "name": "airdress.root_recovery.executed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A self-service root recovery executed: every device must re-enroll.\n\n`trigger` says what executed it (`approval`, `timer`, `immediate`). The owner's OIDC subject is in the journal line and kept out of the recorded data.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "delegation_only_enrollment_count": {
            "format": "int64",
            "type": "integer"
          },
          "objector_enrollment_count": {
            "format": "int64",
            "type": "integer"
          },
          "objector_window_days": {
            "format": "int64",
            "type": "integer"
          },
          "prior_enrollment_count": {
            "format": "int64",
            "type": "integer"
          },
          "revoked_enrollments": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "sub_user_enrollment_count": {
            "format": "int64",
            "type": "integer"
          },
          "trigger": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "delegation_only_enrollment_count",
          "objector_enrollment_count",
          "objector_window_days",
          "prior_enrollment_count",
          "revoked_enrollments",
          "sub_user_enrollment_count",
          "trigger"
        ],
        "title": "RootRecoveryExecuted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A root recovery attempt was refused, or one source was locked out after repeated failures (`reason = backoff_locked`). `airdress` is what the assertion claimed — a label, not a fact.",
      "level": "warn",
      "name": "airdress.root_recovery.rejected",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A root recovery attempt was refused, or one source was locked out after repeated failures (`reason = backoff_locked`). `airdress` is what the assertion claimed — a label, not a fact.",
        "properties": {
          "airdress": {
            "type": [
              "string",
              "null"
            ]
          },
          "attempt": {
            "format": "uint32",
            "minimum": 0.0,
            "type": [
              "integer",
              "null"
            ]
          },
          "locked_for_secs": {
            "format": "uint64",
            "minimum": 0.0,
            "type": [
              "integer",
              "null"
            ]
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "title": "RootRecoveryRejected",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "client": "root_recovery_pending",
      "description": "Somebody asked to reset this airdress's root key and the reset waits, because devices are enrolled; any of them may cancel it. The notice the devices see carries no `owner_sub` and no key material.",
      "level": "warn",
      "name": "airdress.root_recovery.scheduled",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Somebody asked to reset this airdress's root key and the reset waits, because devices are enrolled; any of them may cancel it. The notice the devices see carries no `owner_sub` and no key material.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "delegation_only_enrollment_count": {
            "format": "int64",
            "type": "integer"
          },
          "delivered": {
            "description": "Streams open when it was recorded.",
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "excluded_enrollment_count": {
            "format": "int64",
            "type": "integer"
          },
          "execute_after": {
            "type": "string"
          },
          "objector_enrollment_count": {
            "format": "int64",
            "type": "integer"
          },
          "objector_window_days": {
            "format": "int64",
            "type": "integer"
          },
          "owner_sub": {
            "type": "string"
          },
          "prior_enrollment_count": {
            "format": "int64",
            "type": "integer"
          },
          "request_id": {
            "format": "uuid",
            "type": "string"
          },
          "scheduled_for": {
            "description": "The same instant as `execute_after`, under the frame's name.",
            "type": "string"
          },
          "sub_user_enrollment_count": {
            "format": "int64",
            "type": "integer"
          }
        },
        "required": [
          "airdress",
          "delegation_only_enrollment_count",
          "delivered",
          "excluded_enrollment_count",
          "execute_after",
          "objector_enrollment_count",
          "objector_window_days",
          "owner_sub",
          "prior_enrollment_count",
          "request_id",
          "scheduled_for",
          "sub_user_enrollment_count"
        ],
        "title": "RootRecoveryScheduled",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A scheduled fire minted its per-fire token. Never the token. One per fire: chatty, and credential plumbing, so not on the bus.",
      "level": "debug",
      "name": "airdress.schedule.token_minted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A scheduled fire minted its per-fire token. Never the token. One per fire: chatty, and credential plumbing, so not on the bus.",
        "properties": {
          "scope": {
            "type": "string"
          },
          "ttl_secs": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "scope",
          "ttl_secs"
        ],
        "title": "ScheduleTokenMinted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A scheduled fire could not mint the token its request carries; the fire is recorded `token_unavailable`. Not on the bus: credential plumbing.",
      "level": "warn",
      "name": "airdress.schedule.token_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A scheduled fire could not mint the token its request carries; the fire is recorded `token_unavailable`. Not on the bus: credential plumbing.",
        "properties": {
          "error": {
            "type": "string"
          },
          "scope": {
            "type": "string"
          }
        },
        "required": [
          "error",
          "scope"
        ],
        "title": "ScheduleTokenRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "client": "shell_attention",
      "description": "A shell session asked for its person's attention: `needs_you`, `done` or `bell`. Labels and a state, never a session's content, and only on the person's own airdresses.",
      "level": "info",
      "name": "airdress.shell.attention",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell session asked for its person's attention: `needs_you`, `done` or `bell`. Labels and a state, never a session's content, and only on the person's own airdresses.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "host_label": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "profile_label": {
            "type": "string"
          },
          "state": {
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "at",
          "host_label",
          "principal_id",
          "profile_label",
          "state"
        ],
        "title": "ShellAttention",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A shell session raised attention (`needs_you`, `done`, `bell`) and it passed the rate limit. `skipped_foreground` is true when a device had the session in front of it, so no notice was sent.",
      "level": "info",
      "name": "airdress.shell.attention.sent",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell session raised attention (`needs_you`, `done`, `bell`) and it passed the rate limit. `skipped_foreground` is true when a device had the session in front of it, so no notice was sent.",
        "properties": {
          "host": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          },
          "skipped_foreground": {
            "type": "boolean"
          },
          "state": {
            "type": "string"
          }
        },
        "required": [
          "host",
          "principal_id",
          "session",
          "skipped_foreground",
          "state"
        ],
        "title": "ShellAttentionSent",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A revoked device's shell legs were closed, and its person's hosts told to forget it.",
      "level": "info",
      "name": "airdress.shell.device.revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A revoked device's shell legs were closed, and its person's hosts told to forget it.",
        "properties": {
          "device": {
            "format": "uuid",
            "type": "string"
          },
          "legs": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "device",
          "legs",
          "principal_id"
        ],
        "title": "ShellDeviceRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A device of a person was introduced, by another of that person's devices, to that person's shell hosts.",
      "level": "info",
      "name": "airdress.shell.device_key.introduced",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A device of a person was introduced, by another of that person's devices, to that person's shell hosts.",
        "properties": {
          "device": {
            "format": "uuid",
            "type": "string"
          },
          "introduced_by": {
            "format": "uuid",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "device",
          "introduced_by",
          "principal_id"
        ],
        "title": "ShellDeviceKeyIntroduced",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A device registered its shell keys.\n\n`presence_alg` is how it proves a person is present (`none` for a CLI). No key is in the event; it is about the device's own person.",
      "level": "info",
      "name": "airdress.shell.device_key.registered",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A device registered its shell keys.\n\n`presence_alg` is how it proves a person is present (`none` for a CLI). No key is in the event; it is about the device's own person.",
        "properties": {
          "device": {
            "format": "uuid",
            "type": "string"
          },
          "presence_alg": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "device",
          "presence_alg",
          "principal_id"
        ],
        "title": "ShellDeviceKeyRegistered",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A shell host's channel opened, over `ws` or `poll`.",
      "level": "info",
      "name": "airdress.shell.host.connected",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell host's channel opened, over `ws` or `poll`.",
        "properties": {
          "host": {
            "type": "string"
          },
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "transport": {
            "type": "string"
          }
        },
        "required": [
          "host",
          "machine",
          "principal_id",
          "transport"
        ],
        "title": "ShellHostConnected",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A `ShellHost` was deleted; its machine is no longer admitted to a host channel. Deleting revokes nothing by itself.",
      "level": "info",
      "name": "airdress.shell.host.deleted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A `ShellHost` was deleted; its machine is no longer admitted to a host channel. Deleting revokes nothing by itself.",
        "properties": {
          "host": {
            "type": "string"
          }
        },
        "required": [
          "host"
        ],
        "title": "ShellHostDeleted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A shell host's channel closed. `reason` is the close reason (`displaced`, `idle`, `host_revoked`, …); `lived_secs` how long it was held.",
      "level": "info",
      "name": "airdress.shell.host.disconnected",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell host's channel closed. `reason` is the close reason (`displaced`, `idle`, `host_revoked`, …); `lived_secs` how long it was held.",
        "properties": {
          "host": {
            "type": "string"
          },
          "lived_secs": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "host",
          "lived_secs",
          "machine",
          "principal_id",
          "reason"
        ],
        "title": "ShellHostDisconnected",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "client": "shell_host_linked",
      "description": "A shell host was approved and linked to its person.\n\nRecorded on the person's airdresses and the owner's, because a sub-user may approve their own host and the owner is the one who can revoke it. A label and ids: never an argv, a path, a key or an address.",
      "level": "info",
      "name": "airdress.shell.host.linked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell host was approved and linked to its person.\n\nRecorded on the person's airdresses and the owner's, because a sub-user may approve their own host and the owner is the one who can revoke it. A label and ids: never an argv, a path, a key or an address.",
        "properties": {
          "airdress": {
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "host_label": {
            "type": "string"
          },
          "machine_id": {
            "format": "uuid",
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "airdress",
          "at",
          "host_label",
          "machine_id",
          "principal_id"
        ],
        "title": "ShellHostLinked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A shell host was linked and no enrolled device — neither its person's nor the owner's — could be told. The link stands.",
      "level": "warn",
      "name": "airdress.shell.host.linked_unannounced",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell host was linked and no enrolled device — neither its person's nor the owner's — could be told. The link stands.",
        "properties": {
          "machine": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "machine"
        ],
        "title": "ShellHostLinkedUnannounced",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A shell host's signed host info names a person other than its `ShellHost`'s. Repeats on each reconcile while it holds, so it stays off the bus.",
      "level": "warn",
      "name": "airdress.shell.host.pin_mismatch",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell host's signed host info names a person other than its `ShellHost`'s. Repeats on each reconcile while it holds, so it stays off the bus.",
        "properties": {
          "host": {
            "type": "string"
          }
        },
        "required": [
          "host"
        ],
        "title": "ShellHostPinMismatch",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A shell host published its profiles. The count only: a profile's argv never leaves the host.",
      "level": "info",
      "name": "airdress.shell.host.profiles_changed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell host published its profiles. The count only: a profile's argv never leaves the host.",
        "properties": {
          "host": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "profiles": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "host",
          "principal_id",
          "profiles"
        ],
        "title": "ShellHostProfilesChanged",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A machine that is not a linked, enabled shell host asked for a host channel and was refused (`shell_host_not_linked`, `shell_host_disabled`).",
      "level": "info",
      "name": "airdress.shell.host.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A machine that is not a linked, enabled shell host asked for a host channel and was refused (`shell_host_not_linked`, `shell_host_disabled`).",
        "properties": {
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "machine",
          "reason"
        ],
        "title": "ShellHostRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A shell host was revoked: by the owner through the admin route (its machine revoked, its `ShellHost` deleted), or found revoked by the liveness check and its channel closed.",
      "level": "info",
      "name": "airdress.shell.host.revoked",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell host was revoked: by the owner through the admin route (its machine revoked, its `ShellHost` deleted), or found revoked by the liveness check and its channel closed.",
        "properties": {
          "host": {
            "type": "string"
          },
          "machine": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "host",
          "machine"
        ],
        "title": "ShellHostRevoked",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A shell host reports that it runs as root. Every surface that shows the host shows it too (`status.host.runsAsRoot`); this line repeats on each reconcile while it holds, so it stays off the bus.",
      "level": "warn",
      "name": "airdress.shell.host.runs_as_root",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell host reports that it runs as root. Every surface that shows the host shows it too (`status.host.runsAsRoot`); this line repeats on each reconcile while it holds, so it stays off the bus.",
        "properties": {
          "host": {
            "type": "string"
          }
        },
        "required": [
          "host"
        ],
        "title": "ShellHostRunsAsRoot",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A shell host announced it is stopping, in `in_seconds`, ending `sessions` sessions. Once per stop.",
      "level": "info",
      "name": "airdress.shell.host.stopping",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell host announced it is stopping, in `in_seconds`, ending `sessions` sessions. Once per stop.",
        "properties": {
          "host": {
            "type": "string"
          },
          "in_seconds": {
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "sessions": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "host",
          "in_seconds",
          "principal_id",
          "sessions"
        ],
        "title": "ShellHostStopping",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "The listener for machine and device revocations could not connect, or failed and is reconnecting. Revocations still land through the periodic check; only their promptness is lost.",
      "level": "warn",
      "name": "airdress.shell.liveness.listen_failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The listener for machine and device revocations could not connect, or failed and is reconnecting. Revocations still land through the periodic check; only their promptness is lost.",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ],
        "title": "ShellLivenessListenFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A device attached to a shell session.",
      "level": "info",
      "name": "airdress.shell.session.attached",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A device attached to a shell session.",
        "properties": {
          "host": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "host",
          "principal_id",
          "session"
        ],
        "title": "ShellSessionAttached",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A shell session ended. `reason` is the host's (`exit`, `host_stopped`, …).",
      "level": "info",
      "name": "airdress.shell.session.closed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell session ended. `reason` is the host's (`exit`, `host_stopped`, …).",
        "properties": {
          "host": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "host",
          "principal_id",
          "reason",
          "session"
        ],
        "title": "ShellSessionClosed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A device detached from a shell session; the session goes on.",
      "level": "info",
      "name": "airdress.shell.session.detached",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A device detached from a shell session; the session goes on.",
        "properties": {
          "host": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "host",
          "principal_id",
          "session"
        ],
        "title": "ShellSessionDetached",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "Input in a shell session moved to another device: that device is now its typist.",
      "level": "info",
      "name": "airdress.shell.session.input_moved",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Input in a shell session moved to another device: that device is now its typist.",
        "properties": {
          "host": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "host",
          "principal_id",
          "session"
        ],
        "title": "ShellSessionInputMoved",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A shell session opened on a host.",
      "level": "info",
      "name": "airdress.shell.session.opened",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell session opened on a host.",
        "properties": {
          "host": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "host",
          "principal_id",
          "session"
        ],
        "title": "ShellSessionOpened",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "principal",
      "bus": true,
      "description": "A shell host refused a device on a session; `code` is the host's reason. The device's leg was ended.",
      "level": "info",
      "name": "airdress.shell.session.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell host refused a device on a session; `code` is the host's reason. The device's leg was ended.",
        "properties": {
          "code": {
            "type": "string"
          },
          "host": {
            "type": "string"
          },
          "principal_id": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "code",
          "host",
          "principal_id",
          "session"
        ],
        "title": "ShellSessionRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The shells switch was turned off: every leg and host channel is closed.",
      "level": "info",
      "name": "airdress.shell.switched_off",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The shells switch was turned off: every leg and host channel is closed.",
        "title": "ShellsSwitchedOff",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A shell host's binding to the airdress root was refused while it could still be told why: no root is pinned, or more than one is.",
      "level": "warn",
      "name": "airdress.shells.host_binding_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A shell host's binding to the airdress root was refused while it could still be told why: no root is pinned, or more than one is.",
        "properties": {
          "error": {
            "type": "string"
          },
          "machine": {
            "format": "uuid",
            "type": "string"
          }
        },
        "required": [
          "error",
          "machine"
        ],
        "title": "ShellHostBindingRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A subname record was added to this airdress's own zone.",
      "level": "info",
      "name": "airdress.subname.created",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A subname record was added to this airdress's own zone.",
        "properties": {
          "label": {
            "type": "string"
          },
          "record_type": {
            "type": "string"
          }
        },
        "required": [
          "label",
          "record_type"
        ],
        "title": "SubnameCreated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A subname record was removed from this airdress's own zone.",
      "level": "info",
      "name": "airdress.subname.deleted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A subname record was removed from this airdress's own zone.",
        "properties": {
          "label": {
            "type": "string"
          },
          "record_type": {
            "type": "string"
          }
        },
        "required": [
          "label",
          "record_type"
        ],
        "title": "SubnameDeleted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "One switch changed value on a reload.",
      "level": "info",
      "name": "airdress.switches.applied",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "One switch changed value on a reload.",
        "properties": {
          "feature": {
            "type": "string"
          },
          "from": {
            "type": "boolean"
          },
          "to": {
            "type": "boolean"
          }
        },
        "required": [
          "feature",
          "from",
          "to"
        ],
        "title": "SwitchApplied",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The switches file could not be read or parsed; every switch keeps its value.",
      "level": "warn",
      "name": "airdress.switches.rejected",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The switches file could not be read or parsed; every switch keeps its value.",
        "properties": {
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "title": "SwitchesRejected",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The switches file was read and applied: the switches now in force, what they were before, and how many changed.",
      "level": "info",
      "name": "airdress.switches.reloaded",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The switches file was read and applied: the switches now in force, what they were before, and how many changed.",
        "properties": {
          "agent_bus": {
            "type": "boolean"
          },
          "agent_devices": {
            "type": "boolean"
          },
          "changed": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "mcp_local": {
            "type": "boolean"
          },
          "mcp_remote": {
            "type": "boolean"
          },
          "previous": true,
          "shells": {
            "type": "boolean"
          }
        },
        "required": [
          "agent_bus",
          "agent_devices",
          "changed",
          "mcp_local",
          "mcp_remote",
          "previous",
          "shells"
        ],
        "title": "SwitchesReloaded",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A thing announced events or commands its `Thing` does not declare; the `AnnounceDrift` condition names them. Written on every reconcile while the drift stands, so off the bus.",
      "level": "info",
      "name": "airdress.thing.announce.drifted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A thing announced events or commands its `Thing` does not declare; the `AnnounceDrift` condition names them. Written on every reconcile while the drift stands, so off the bus.",
        "properties": {
          "thing": {
            "type": "string"
          },
          "undeclared": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "thing",
          "undeclared"
        ],
        "title": "ThingAnnounceDrifted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A thing's command channel closed, with why and how long it lived.",
      "level": "info",
      "name": "airdress.thing.channel.closed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A thing's command channel closed, with why and how long it lived.",
        "properties": {
          "lived_secs": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          },
          "thing": {
            "type": "string"
          }
        },
        "required": [
          "lived_secs",
          "machine",
          "reason",
          "session",
          "thing"
        ],
        "title": "ThingChannelClosed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A thing's command channel opened; a previous one for the same machine, if any, was displaced.",
      "level": "info",
      "name": "airdress.thing.channel.opened",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A thing's command channel opened; a previous one for the same machine, if any, was displaced.",
        "properties": {
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "session": {
            "format": "uuid",
            "type": "string"
          },
          "thing": {
            "type": "string"
          }
        },
        "required": [
          "machine",
          "session",
          "thing"
        ],
        "title": "ThingChannelOpened",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A thing answered a command, with its outcome and the time it says it spent. The result itself is not recorded.",
      "level": "info",
      "name": "airdress.thing.command.answered",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A thing answered a command, with its outcome and the time it says it spent. The result itself is not recorded.",
        "properties": {
          "command_id": {
            "format": "uuid",
            "type": "string"
          },
          "device_ms": {
            "format": "double",
            "type": [
              "number",
              "null"
            ]
          },
          "outcome": {
            "type": "string"
          },
          "thing": {
            "type": "string"
          }
        },
        "required": [
          "command_id",
          "outcome",
          "thing"
        ],
        "title": "ThingCommandAnswered",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A command to a thing was refused before it was sent.\n\nThe thing cannot be reached, the command is not one it declares, its arguments are too large, it is rate limited, or a function asked for a command it is not granted (then `function` names the function).",
      "level": "info",
      "name": "airdress.thing.command.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A command to a thing was refused before it was sent.\n\nThe thing cannot be reached, the command is not one it declares, its arguments are too large, it is rate limited, or a function asked for a command it is not granted (then `function` names the function).",
        "properties": {
          "command": {
            "type": "string"
          },
          "function": {
            "type": [
              "string",
              "null"
            ]
          },
          "reason": {
            "type": "string"
          },
          "thing": {
            "type": "string"
          }
        },
        "required": [
          "command",
          "reason",
          "thing"
        ],
        "title": "ThingCommandRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A thing answered a command nobody is waiting for any more.",
      "level": "info",
      "name": "airdress.thing.command.result_unclaimed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A thing answered a command nobody is waiting for any more.",
        "properties": {
          "command_id": {
            "format": "uuid",
            "type": "string"
          },
          "thing": {
            "type": "string"
          }
        },
        "required": [
          "command_id",
          "thing"
        ],
        "title": "ThingCommandResultUnclaimed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A command was sent to a thing, or put in its mailbox for its next poll (`mailed`). Its arguments are not recorded.",
      "level": "info",
      "name": "airdress.thing.command.sent",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A command was sent to a thing, or put in its mailbox for its next poll (`mailed`). Its arguments are not recorded.",
        "properties": {
          "command": {
            "type": "string"
          },
          "command_id": {
            "format": "uuid",
            "type": "string"
          },
          "function": {
            "type": "string"
          },
          "mailed": {
            "type": "boolean"
          },
          "thing": {
            "type": "string"
          }
        },
        "required": [
          "command",
          "command_id",
          "function",
          "mailed",
          "thing"
        ],
        "title": "ThingCommandSent",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A command to a thing was not answered in time, or a mailed command expired before its device polled. `delivered` says whether the device had acknowledged it.",
      "level": "info",
      "name": "airdress.thing.command.timed_out",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A command to a thing was not answered in time, or a mailed command expired before its device polled. `delivered` says whether the device had acknowledged it.",
        "properties": {
          "command_id": {
            "format": "uuid",
            "type": "string"
          },
          "delivered": {
            "type": "boolean"
          },
          "mailed": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "thing": {
            "type": "string"
          }
        },
        "required": [
          "command_id",
          "delivered",
          "thing"
        ],
        "title": "ThingCommandTimedOut",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A `Thing` was deleted; its machine is no longer admitted.",
      "level": "info",
      "name": "airdress.thing.deleted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A `Thing` was deleted; its machine is no longer admitted.",
        "properties": {
          "thing": {
            "type": "string"
          }
        },
        "required": [
          "thing"
        ],
        "title": "ThingDeleted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A thing reported, in one batch, dropping events from its own queue before it could send them. One per batch, so off the bus.",
      "level": "info",
      "name": "airdress.thing.events.dropped_on_device",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A thing reported, in one batch, dropping events from its own queue before it could send them. One per batch, so off the bus.",
        "properties": {
          "dropped": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          },
          "thing": {
            "type": "string"
          }
        },
        "required": [
          "dropped",
          "thing"
        ],
        "title": "ThingEventsDroppedOnDevice",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "Events in one batch from a thing were refused, counted by reason. What the events carried is not recorded. One per batch, so off the bus.",
      "level": "info",
      "name": "airdress.thing.events.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Events in one batch from a thing were refused, counted by reason. What the events carried is not recorded. One per batch, so off the bus.",
        "properties": {
          "invalid_data": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "invalid_event": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "invalid_time": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "rate_limited": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          },
          "thing": {
            "type": "string"
          },
          "unknown_type": {
            "format": "uint",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "invalid_data",
          "invalid_event",
          "invalid_time",
          "rate_limited",
          "thing",
          "unknown_type"
        ],
        "title": "ThingEventsRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "Held thing channels could not be checked against machine revocation: the database did not answer. Logged once per failing stretch; a database that cannot answer closes nothing.",
      "level": "warn",
      "name": "airdress.thing.liveness.unavailable",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "Held thing channels could not be checked against machine revocation: the database did not answer. Logged once per failing stretch; a database that cannot answer closes nothing.",
        "properties": {
          "error": {
            "type": "string"
          }
        },
        "required": [
          "error"
        ],
        "title": "ThingLivenessUnavailable",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A machine that is not linked as a Thing, or whose Thing is not enabled, asked for a thing route and was refused.",
      "level": "info",
      "name": "airdress.thing.request.refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A machine that is not linked as a Thing, or whose Thing is not enabled, asked for a thing route and was refused.",
        "properties": {
          "machine": {
            "format": "uuid",
            "type": "string"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "machine",
          "reason"
        ],
        "title": "ThingRequestRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The airdress's own certificate, which failed at start, was issued by the retry and is now served.",
      "level": "info",
      "name": "airdress.tls.own_cert_issued_on_retry",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The airdress's own certificate, which failed at start, was issued by the retry and is now served.",
        "properties": {
          "fqdn": {
            "type": "string"
          },
          "tries": {
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "fqdn",
          "tries"
        ],
        "title": "OwnCertIssuedOnRetry",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "One more attempt to issue the airdress's own certificate failed; the placeholder is still served and the retry continues with backoff.",
      "level": "warn",
      "name": "airdress.tls.own_cert_retry_failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "One more attempt to issue the airdress's own certificate failed; the placeholder is still served and the retry continues with backoff.",
        "properties": {
          "attempt": {
            "format": "uint32",
            "minimum": 0.0,
            "type": "integer"
          },
          "error": {
            "type": "string"
          }
        },
        "required": [
          "attempt",
          "error"
        ],
        "title": "OwnCertRetryFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The owner asked to renew the airdress's certificate and was refused.\n\nBy policy (`reason = authz`) or because one was started recently (`reason = rate_limited`, with `retry_after_secs`). The owner's OIDC subject is in the journal line and kept out of the recorded data.",
      "level": "info",
      "name": "airdress.tls.owner_renew_refused",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner asked to renew the airdress's certificate and was refused.\n\nBy policy (`reason = authz`) or because one was started recently (`reason = rate_limited`, with `retry_after_secs`). The owner's OIDC subject is in the journal line and kept out of the recorded data.",
        "properties": {
          "fqdn": {
            "type": "string"
          },
          "reason": {
            "type": "string"
          },
          "retry_after_secs": {
            "format": "uint64",
            "minimum": 0.0,
            "type": [
              "integer",
              "null"
            ]
          },
          "rotate": {
            "type": "boolean"
          }
        },
        "required": [
          "fqdn",
          "reason",
          "rotate"
        ],
        "title": "TlsOwnerRenewRefused",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "The owner started a renewal of the airdress's certificate. The owner's OIDC subject is in the journal line and kept out of the recorded data.",
      "level": "info",
      "name": "airdress.tls.owner_renew_requested",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "The owner started a renewal of the airdress's certificate. The owner's OIDC subject is in the journal line and kept out of the recorded data.",
        "properties": {
          "fqdn": {
            "type": "string"
          },
          "job_id": {
            "format": "uuid",
            "type": "string"
          },
          "rotate": {
            "type": "boolean"
          }
        },
        "required": [
          "fqdn",
          "job_id",
          "rotate"
        ],
        "title": "TlsOwnerRenewRequested",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A certificate renewal job failed; the certificate in service is unchanged.",
      "level": "warn",
      "name": "airdress.tls.renew_failed",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A certificate renewal job failed; the certificate in service is unchanged.",
        "properties": {
          "error": {
            "type": "string"
          },
          "fqdn": {
            "type": "string"
          },
          "job_id": {
            "format": "uuid",
            "type": "string"
          },
          "rotate": {
            "type": "boolean"
          }
        },
        "required": [
          "error",
          "fqdn",
          "job_id",
          "rotate"
        ],
        "title": "TlsRenewFailed",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A certificate renewal job started, from the host's admin door (`via = host`) or the owner's (`via = owner`).",
      "level": "info",
      "name": "airdress.tls.renew_started",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A certificate renewal job started, from the host's admin door (`via = host`) or the owner's (`via = owner`).",
        "properties": {
          "fqdn": {
            "type": "string"
          },
          "job_id": {
            "format": "uuid",
            "type": "string"
          },
          "rotate": {
            "type": "boolean"
          },
          "via": {
            "type": "string"
          }
        },
        "required": [
          "fqdn",
          "job_id",
          "rotate",
          "via"
        ],
        "title": "TlsRenewStarted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A certificate renewal job finished: the new certificate is served.",
      "level": "info",
      "name": "airdress.tls.renew_succeeded",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A certificate renewal job finished: the new certificate is served.",
        "properties": {
          "fqdn": {
            "type": "string"
          },
          "job_id": {
            "format": "uuid",
            "type": "string"
          },
          "rotate": {
            "type": "boolean"
          }
        },
        "required": [
          "fqdn",
          "job_id",
          "rotate"
        ],
        "title": "TlsRenewSucceeded",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "A resource token was minted from the host CLI. Never the token: it is a bearer credential. Credential metadata, so not on the bus.",
      "level": "info",
      "name": "airdress.token.minted",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A resource token was minted from the host CLI. Never the token: it is a bearer credential. Credential metadata, so not on the bus.",
        "properties": {
          "actor": {
            "type": "string"
          },
          "public_key": {
            "type": "string"
          },
          "scope": {
            "type": "string"
          },
          "ttl_secs": {
            "format": "uint64",
            "minimum": 0.0,
            "type": "integer"
          }
        },
        "required": [
          "actor",
          "public_key",
          "scope",
          "ttl_secs"
        ],
        "title": "TokenMinted",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": false,
      "description": "This operator created its token root key. The public half only; key material, so not on the bus.",
      "level": "info",
      "name": "airdress.token.root_key_created",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "This operator created its token root key. The public half only; key material, so not on the bus.",
        "properties": {
          "path": {
            "type": "string"
          },
          "public_key": {
            "type": "string"
          }
        },
        "required": [
          "path",
          "public_key"
        ],
        "title": "TokenRootKeyCreated",
        "type": "object"
      },
      "version": 1
    },
    {
      "audience": "owner",
      "bus": true,
      "description": "A registered unit stopped matching its manifest in one check (`runtime`, `control-target`, `volume`). Reported once per change; the operator never repairs it.",
      "level": "warn",
      "name": "airdress.unit.drift_detected",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A registered unit stopped matching its manifest in one check (`runtime`, `control-target`, `volume`). Reported once per change; the operator never repairs it.",
        "properties": {
          "check": {
            "type": "string"
          },
          "detail": {
            "type": "string"
          },
          "now": {
            "description": "What it says now.",
            "type": "string"
          },
          "unit": {
            "type": "string"
          },
          "was": {
            "description": "What the check said last time: `Pass`, `Fail` or `Unknown`.",
            "type": "string"
          }
        },
        "required": [
          "check",
          "detail",
          "now",
          "unit",
          "was"
        ],
        "title": "UnitDriftDetected",
        "type": "object"
      },
      "version": 1
    }
  ],
  "points": [
    {
      "description": "A function is about to be invoked: over its HTTP route, or with an event (a binding, or a subscription's function target). Validate only.",
      "max_failure_policy": "fail",
      "mutable": [],
      "name": "airdress.function.will_invoke",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A function is about to be invoked: over its HTTP route, or with an event (a binding, or a subscription's function target). Validate only.",
        "properties": {
          "actor": {
            "default": null,
            "description": "For a request: who is calling, as the request context recorded it.",
            "type": [
              "string",
              "null"
            ]
          },
          "event_id": {
            "default": null,
            "type": [
              "string",
              "null"
            ]
          },
          "event_source": {
            "default": null,
            "description": "For an event: its `CloudEvent` `source` and `id`.",
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "description": "The function's name. (Not `function`: that is a reserved word in CEL, so a hook could never name the field.)",
            "type": "string"
          },
          "trigger": {
            "description": "`http` or `event`.",
            "type": "string"
          }
        },
        "required": [
          "name",
          "trigger"
        ],
        "title": "FunctionWillInvoke",
        "type": "object"
      }
    },
    {
      "description": "A resource is about to be created or replaced through `/v1/apply`.\n\nRaised after the applier's authorization and the Kind's own validation, before anything is stored. A mutating hook may change its labels and spec; the result is validated and authorized again. Never raised for a `Hook`.",
      "max_failure_policy": "fail",
      "mutable": [
        "labels",
        "spec"
      ],
      "name": "airdress.resource.will_apply",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A resource is about to be created or replaced through `/v1/apply`.\n\nRaised after the applier's authorization and the Kind's own validation, before anything is stored. A mutating hook may change its labels and spec; the result is validated and authorized again. Never raised for a `Hook`.",
        "properties": {
          "actor": {
            "description": "Who is applying: the owner's subject or `machine:<id>`.",
            "type": "string"
          },
          "dry_run": {
            "description": "A dry run is intercepted too, and reports what would happen.",
            "type": "boolean"
          },
          "kind": {
            "type": "string"
          },
          "labels": {
            "additionalProperties": {
              "type": "string"
            },
            "default": {},
            "type": "object"
          },
          "name": {
            "type": "string"
          },
          "spec": true
        },
        "required": [
          "actor",
          "dry_run",
          "kind",
          "name",
          "spec"
        ],
        "title": "ResourceWillApply",
        "type": "object"
      }
    },
    {
      "description": "A resource is about to be deleted. Validate only. Never raised for a `Hook`: a hook cannot block its own removal.",
      "max_failure_policy": "fail",
      "mutable": [],
      "name": "airdress.resource.will_delete",
      "schema": {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "description": "A resource is about to be deleted. Validate only. Never raised for a `Hook`: a hook cannot block its own removal.",
        "properties": {
          "actor": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "actor",
          "kind",
          "name"
        ],
        "title": "ResourceWillDelete",
        "type": "object"
      }
    }
  ]
}
