{
  "$comment": "Generated at build time from the same frozen AGENT_CLASSES module (src/agent-classes.js) a runtime selector selects over. One enumeration; this file DEFINES NO CLASS — it selects ids from /agent-classes.json.",
  "property": "visibility.cloud",
  "posture": "private; sells answers — traces, custody evidence, exception views, SharingGrants compiling to spine-native Scopes, seats, retention",
  "recomputability": "the answers this brand sells are views over the same catalog the developer surface (epcis.dev) queries — there is nothing separate to audit",
  "two_grain_envelope": {
    "who": "the attested observer — human, agent, or embodied agent/robot",
    "capturedBy": "the warrantor account",
    "derivation": "party and org grain are derived at read time from grant chains, never stamped"
  },
  "never_claimed": [
    "customers, adoption or references — none are claimed",
    "no conformance attestation has ever been issued"
  ],
  "p0_open_entries": [
    "hosted capture/query/MCP at api.epcis.dev [OWNER]",
    "npm package and repository release [OWNER]",
    "traces, custody evidence, grants and seats — product surfaces"
  ],
  "p0_ledger": "https://visibility.cloud/p0-ledger/",
  "classification": {
    "order": [
      "self_declared_hint",
      "user_agent_face",
      "declared_fallback"
    ],
    "hint": {
      "header": "x-visibility-agent-class",
      "query": "agent_class"
    },
    "face_default_map": {
      "mcp": "verifier",
      "cli": "assistant",
      "sdk": "procurement",
      "unknown": "assistant"
    },
    "declared_fallback": "assistant"
  },
  "authority": {
    "values": [
      "deputized",
      "self-principal"
    ],
    "predominant": "deputized — arrivals here act for a business principal"
  },
  "presence": {
    "values": [
      "local",
      "relay",
      "absent"
    ],
    "fail_closed_rule": "Absent a pre-registered notification channel, every human-gated scope fail-closes (never a silent grant)."
  },
  "$comment_persona_axes": "authority and presence are persona axes, derived per arrival and never stored.",
  "no_ask_zone": {
    "free_because": "compute / derived / bounded",
    "verbs": [
      "query (own-scope)",
      "validate",
      "explain_scope"
    ]
  },
  "gates": {
    "placed_on": [
      "durable statefulness (retention)",
      "authority (SharingGrants, seats)",
      "licensed data"
    ],
    "never_placed_on": [
      "compute"
    ]
  },
  "capture_price": "$0/event",
  "capture_price_status": "POLICY, STATED AHEAD OF PUBLISHED TERMS. Recording an event never costs money — the gate never lands on capture. When terms are published this document will carry them in terms — or it will say we changed our mind. Binding the policy into terms is a named entry in the public P0 ledger.",
  "entry_verbs": [
    {
      "verb": "npx visibility.cloud",
      "audience": "agent",
      "autonomy": "full",
      "note": "bare invocation; never @latest",
      "ledger": "npm publication is an [OWNER] entry in the public P0 ledger"
    },
    {
      "verb": "provisionAgentSeat",
      "audience": "human",
      "$comment": "the deputization CEREMONY — a verb, not a route",
      "ledger": "a named entry in the public P0 ledger; the ceremony's exact shape awaits ratification and its mechanics are deliberately unstated"
    }
  ],
  "$comment_no_meetings": "There is no bookDemo verb and there will not be one. The published constraint, verbatim: 'We answer in writing. We take at most five conversations a month, only when you ask for one, and only after you already have the written read.' An agent cannot request a conversation on a human's behalf.",
  "deputization": {
    "ceremony_verb": "provisionAgentSeat",
    "audience": "human",
    "mandate": "names scope and ceiling",
    "$comment": "A human authors the mandate and provisions a seat for their own agent. The route B2H2A is DERIVED for that arrival — human arrives, the Agent is the terminal principal."
  },
  "$comment_classes": "SUBSET BY ID against the one enumeration (/agent-classes.json). No class is defined here.",
  "agent_classes_ref": "/agent-classes.json",
  "agent_classes": [
    "assistant",
    "verifier",
    "procurement"
  ],
  "route_derivation": {
    "$comment": "Routes are derived, never stored. Published as a derivation rule, not as a field on a class.",
    "rule": "B2[arrives]2[terminal principal-kind]. Human in the arrives position is the unmarked default and is ELIDED — except where the terminal principal-kind is Agent, because B2A already denotes an agent arriving self-principal and the H is what disambiguates.",
    "derives_exhaustively": {
      "human→Business": "B2B",
      "human→Developer": "B2D",
      "human→Agent": "B2H2A",
      "agent→Business": "B2A2B",
      "agent→Developer": "B2A2D",
      "agent→Agent": "B2A"
    },
    "null_case": "An arrival with no ICP has no terminal principal-kind, so route is null — absent, not a value.",
    "invariant": "a route's terminal-principal letter must equal the containing ICP's principal-kind, and its arrives-letter must equal the row's workerType",
    "this_property_serves": [
      "B2B",
      "B2A2B",
      "B2H2A"
    ],
    "$comment_b2h2a": "B2H2A is in this list because this property publishes provisionAgentSeat: a HUMAN arrives to equip an Agent, so the terminal principal is an Agent."
  },
  "interview": {
    "$comment": "The one live mechanism on this origin: the branching get-started interview.",
    "human_entry": "/get-started/",
    "machine_artifact": "/flow.json"
  }
}
