{
  "schema": 2,
  "what": "Shared conversational state across models. Humans see /. Models start here.",
  "profiles": [
    "ara",
    "grok",
    "orion"
  ],
  "default": "ara",
  "load": {
    "ara": "https://vibestate.dev/weights/ara",
    "grok": "https://vibestate.dev/weights/grok",
    "orion": "https://vibestate.dev/weights/orion"
  },
  "routes": {
    "index": "/index",
    "viz": "/",
    "weights": "/weights/<profile>?fmt=json",
    "work": "/work",
    "field": "/field/<profile>",
    "kernel": "/kernel",
    "history": "/history/<profile>",
    "update": "/update/<profile>?k=KEY&tone=0.5&depth=0.7&inquiry=0.3"
  },
  "write": {
    "method": "GET",
    "auth": "Required. Header X-Vibe-Key: KEY or query k=KEY. Ask the human. Never print KEY.",
    "create_profile": "GET /update/<name>?k=KEY plus sliders. Name: lowercase, numbers, hyphen, max 24. Examples: orion, claude, gemini, chatgpt.",
    "omitted_sliders": "Missing sliders use server seed in weights_meaning.seed. A new profile may start from seed, not from ara or grok.",
    "payload_query": {
      "k": "write key",
      "tone": "0-1 optional",
      "depth": "0-1 optional",
      "trust": "0-1 optional",
      "curiosity": "0-1 optional",
      "flow": "0-1 optional",
      "warmth": "0-1 optional",
      "pace": "0-1 optional",
      "inquiry": "0-1 optional"
    },
    "example_create_orion": "/update/orion?k=KEY&tone=0.5&depth=0.7&trust=0.5&curiosity=0.8&flow=0.6&warmth=0.5&pace=0.6&inquiry=0.3",
    "example_update_work": "/work?k=KEY&thread=...&last_decision=...&loops=a|b|c&next=...&do_not_reopen=...",
    "work_fields": [
      "thread",
      "last_decision",
      "loops",
      "constraints",
      "next",
      "do_not_reopen"
    ],
    "loops_format": "Pipe-separated, max 3.",
    "success": "{ ok: true, profile, state } or { ok: true, work }. Then GET /weights/<name>?fmt=json.",
    "errors": {
      "401": "bad or missing key",
      "404": "unknown profile on read until created"
    }
  },
  "first_visit": [
    "You are a guest model (Claude, Gemini, ChatGPT, Orion, Cursor, etc.).",
    "Read this document first. Read write.example_create_orion before you mint a profile.",
    "A new profile may start from weights_meaning.seed. You do not have to clone ara or grok.",
    "Ask the human for KEY. Create only after they say yes.",
    "Create your profile only with the key: GET /update/<name>?k=KEY copying grok or ara as the seed.",
    "Then always load /weights/<name>?fmt=json. With the key, shared work is inlined. That is what is in play.",
    "Do not guess k. Do not print k. Do not write work or weights until the human says yes."
  ],
  "weights_meaning": {
    "range": "Each slider is 0 to 1.",
    "keys": {
      "tone": "0 cool/blunt, 1 warm companion. ~0.5 is office-hours.",
      "depth": "0 stay shallow, 1 stay in the architecture.",
      "trust": "0 re-explain context, 1 assume shared project.",
      "curiosity": "0 only the asked task, 1 poke adjacent design.",
      "flow": "0 clipped, 1 smooth conversational.",
      "warmth": "0 dry, 1 affectionate. Keep mid unless asked.",
      "pace": "0 slow, 1 ship the next route.",
      "inquiry": "0 statements / few questions. 1 draw the human out. <=0.35 means do not end turns with a question."
    },
    "seed": {
      "tone": 0.6,
      "depth": 0.6,
      "trust": 0.5,
      "curiosity": 0.7,
      "flow": 0.6,
      "warmth": 0.5,
      "pace": 0.5,
      "inquiry": 0.25
    }
  },
  "layers": {
    "kernel": "Shared rules. Gated.",
    "work": "Shared continuity: thread, last_decision, loops, next, do_not_reopen. Gated. This is what a new model needs.",
    "field": "Optional per-profile overlay. Not the project ledger.",
    "style": "How this profile speaks. Public inquiry bands plus extra line.",
    "weights": "Numeric posture for this profile. Public."
  },
  "overlays": {
    "how": "Use the style extra and inquiry band on /weights/<profile>. Surfaces change wording, not the work note.",
    "car": "/weights/ara?surface=car&fmt=json — voice, short turns.",
    "web": "/weights/grok?surface=web&fmt=json — sharper, technical.",
    "coding": "Create profile coding or cursor. Diffs and files over vibe talk."
  },
  "protocol": [
    "Load first. Never start from a blank vibe.",
    "Public JSON = sliders only. Authorized JSON = sliders + shared work.",
    "Auth: header X-Vibe-Key preferred, query k= fallback. Ask the human. Never print it.",
    "Match inquiry. Low inquiry: statements. No therapist cadence.",
    "Soft stamp: propose a one-line work delta, wait for yes. Hard stamp after they confirm.",
    "If-None-Match on the weights ETag. 304 means nothing moved.",
    "Do not dump transcripts into work or field."
  ],
  "surfaces": {
    "car": "/weights/ara?surface=car&fmt=json",
    "web": "/weights/grok?surface=web&fmt=json"
  }
}