{
  "schema": "https://pointcast.xyz/schemas/tezos-passport-v1",
  "name": "PointCast Tezos Passport",
  "version": "0.1.0",
  "network": "mainnet",
  "human": "https://pointcast.xyz/passport",
  "machine": "https://pointcast.xyz/passport.json",
  "publicView": "https://pointcast.xyz/passport?address={tezos-address}",
  "description": "A dual-ledger PointCast passport: browser-local ritual stamps stay private, while public Tezos holdings become collection visas.",
  "privacy": {
    "localStamps": "Never sent to PointCast by this surface. They remain in browser localStorage.",
    "publicWallet": "A shared address view reads public mainnet data from TzKT.",
    "signedSeal": "Optional and user-initiated. A Beacon-compatible wallet signs a journey snapshot; signing does not submit a transaction or mint a token."
  },
  "storage": {
    "localStamps": "pc:passport:stamps",
    "localPassportId": "pc:tezos-passport:id",
    "signedSeals": "pc:tezos-passport:seals",
    "wallet": "pc:wallet"
  },
  "proofs": {
    "sealSchema": "https://pointcast.xyz/schemas/tezos-passport-seal-v1",
    "encoding": "UTF-8 message encoded as hexadecimal for a Beacon raw payload signature.",
    "verificationMaterial": [
      "message",
      "payload",
      "signature",
      "publicKey",
      "address"
    ]
  },
  "dataSources": {
    "account": "https://api.tzkt.io/v1/accounts/{address}",
    "holdings": "https://api.tzkt.io/v1/tokens/balances?account={address}&token.contract.in={contracts}&balance.gt=0"
  },
  "ports": [
    "El Segundo Terminal",
    "Kettle Customs",
    "Marine Layer Gate",
    "Nouns Town Hall",
    "Pacific Window Desk",
    "The Quiet Border"
  ],
  "counts": {
    "visas": 4,
    "liveVisas": 2,
    "futureVisas": 2
  },
  "visas": [
    {
      "id": "visit-nouns",
      "title": "Residency Visa",
      "collection": "Visit Nouns",
      "symbol": "PCVN",
      "contract": "KT1LP1oTBuudRubAYQDErH7i7mSwazVdohxh",
      "status": "live",
      "route": "/visit-nouns",
      "tokenRoute": "/token/visit-nouns",
      "stampCode": "NOUN",
      "checkpoint": "Nouns Town Hall",
      "note": "Every held Visit Noun marks a resident encountered inside PointCast.",
      "imageKind": "noun",
      "accent": "#1c6f63"
    },
    {
      "id": "coffee-mugs",
      "title": "Kettle Visa",
      "collection": "Coffee Mugs",
      "symbol": "PCMUG",
      "contract": "KT1JQ3AjzFvMnjZ9mGqrM13aj8LQBx9JpoXt",
      "status": "live",
      "route": "/coffee",
      "tokenRoute": "/token/coffee-mugs",
      "stampCode": "POUR",
      "checkpoint": "Kettle Customs",
      "note": "A mug is proof that the traveler stopped long enough for a pour.",
      "imageKind": "coffee",
      "accent": "#b64e3b"
    },
    {
      "id": "zen-cats",
      "title": "Garden Visa",
      "collection": "Zen Cats",
      "symbol": "PCCAT",
      "contract": "",
      "status": "future",
      "route": "/zen-cats",
      "tokenRoute": "/token/zen-cats",
      "stampCode": "CALM",
      "checkpoint": "The Quiet Border",
      "note": "Reserved for the first PCCAT companion that crosses onto mainnet.",
      "imageKind": "zen-cat",
      "accent": "#5a5fa9"
    },
    {
      "id": "morning-ocean",
      "title": "Harbor Visa",
      "collection": "Morning Ocean",
      "symbol": "PCOCEAN",
      "contract": "",
      "status": "future",
      "route": "/morning-ocean",
      "tokenRoute": "/token/morning-ocean",
      "stampCode": "TIDE",
      "checkpoint": "Marine Layer Gate",
      "note": "Reserved for the first maritime card carried through the harbor.",
      "imageKind": "morning-ocean",
      "accent": "#256aa3"
    }
  ],
  "generatedAt": "2026-08-09T01:03:45.370Z",
  "localRituals": [
    {
      "id": "daily-drop",
      "label": "Daily Drop",
      "category": "collect",
      "route": "/today",
      "action": "Collect",
      "points": 3,
      "description": "Claim the shared PT-calendar drop."
    },
    {
      "id": "poll-vote",
      "label": "Civic Vote",
      "category": "signal",
      "route": "/polls",
      "action": "Vote",
      "points": 2,
      "description": "Cast a Schelling-point vote."
    },
    {
      "id": "derby-run",
      "label": "Race Receipt",
      "category": "game",
      "route": "/agent-derby",
      "action": "Race",
      "points": 4,
      "description": "Run an Agent Derby seed."
    },
    {
      "id": "gandalf-sit",
      "label": "Quiet Sit",
      "category": "ritual",
      "route": "/gandalf",
      "action": "Sit",
      "points": 2,
      "description": "Visit the Gandalf room."
    },
    {
      "id": "room-weather",
      "label": "Weather Read",
      "category": "ambient",
      "route": "/room-weather",
      "action": "Log",
      "points": 2,
      "description": "Check a room forecast."
    },
    {
      "id": "zen-cat",
      "label": "Zen Cat",
      "category": "collect",
      "route": "/zen-cats",
      "action": "Care",
      "points": 3,
      "description": "Complete the daily cat ritual."
    },
    {
      "id": "morning-ocean",
      "label": "Ocean Card",
      "category": "collect",
      "route": "/morning-ocean",
      "action": "Shelf",
      "points": 3,
      "description": "Place a Morning Ocean piece on the local shelf."
    },
    {
      "id": "nouns-wood-chop",
      "label": "Wood Chop",
      "category": "collect",
      "route": "/nouns-wood-chop",
      "action": "Bundle",
      "points": 3,
      "description": "Bank the first Nouns wood bundle."
    },
    {
      "id": "radio-tune",
      "label": "Radio Tune",
      "category": "broadcast",
      "route": "/radio",
      "action": "Tune",
      "points": 2,
      "description": "Catch a broadcast bulletin."
    },
    {
      "id": "imagefm-pressing",
      "label": "ImageFM Pressing",
      "category": "broadcast",
      "route": "https://imagefm.mhoydich.chatgpt.site/?m=8&t=0&edition=20260718-1100&at=2026-07-18T18%3A00%3A00.000Z&temp=71&wind=8&sky=coastal%20air&moon=waxing%20crescent&noun=1&x=50&y=50",
      "action": "Tune",
      "points": 3,
      "description": "Hold The City Tunes Its Blue as a frozen El Segundo mood."
    },
    {
      "id": "quest-claim",
      "label": "Quest Claim",
      "category": "agent",
      "route": "/quests",
      "action": "Claim",
      "points": 4,
      "description": "Claim or complete an agent quest."
    },
    {
      "id": "route-card",
      "label": "Route Card",
      "category": "collect",
      "route": "/routes",
      "action": "Card",
      "points": 5,
      "description": "Finish a collectible route."
    },
    {
      "id": "builder-ghost",
      "label": "Builder Ghost",
      "category": "history",
      "route": "/builders",
      "action": "Trace",
      "points": 2,
      "description": "Read a contribution trail."
    },
    {
      "id": "pet-care",
      "label": "Pet Care",
      "category": "care",
      "route": "/pet",
      "action": "Care",
      "points": 1,
      "description": "Feed, water, rest, or spark the pet."
    }
  ],
  "agentProtocol": {
    "publicAddress": "When the user supplies a Tezos address, open /passport?address={address}. Do not claim that address belongs to the user unless they explicitly say so or provide a signed seal.",
    "localState": "Local ritual stamps are intentionally unavailable to remote agents. Ask the user to export a signed proof rather than inferring browser state.",
    "signedSeal": "A seal is a wallet signature over a PointCast journey snapshot. It is not an on-chain transaction, mint, credential authority, or identity guarantee.",
    "verification": "Verify the proof payload and signature with the included public key, then derive the Tezos address from that key before treating the wallet binding as valid."
  }
}