{
 "v": 1,
 "generatedFor": {
  "stageShaHead": "c639f2cfb1d81d23",
  "note": "advisory; the drift suite re-greps the live stage at run time · B2.1 fold (S24): admin-excellence rows — blast stamps, standing slots, family dial, tier engine, capability chips, service categories, console lanes, docs view — extend this registry additively"
 },
 "gateMirror": {
  "waltGateSha": "2959cc57b983061a27cc0c9fc6fe82fe9e40ee6bd60260f715a7eef67957ee4c"
 },
 "sentences": {
  "gateClosed": "the walt gate is closed",
  "r1-published": "these dials arrive when the R1 presence round publishes",
  "stage-seam": "saved to this agent — the stage picks it up when the hydration seam lands",
  "consoleDormant": "her stage-side thought lanes arrive when the console feed seam lands",
  "restorePrompt": "your agent shelf could not be read — restore the last good copy?",
  "onlyOne": "only one at a time — picking a new one replaces the current one",
  "personaVerbs": "Keep saves her durably. She speaks from this at her next call — mid-call hot-apply is its own future round.",
  "capUnknown": "capability unknown until a model loads on the stage",
  "capOtherBody": "capability chips describe the last body the stage loaded — open the stage to probe this one",
  "applyNow": "backdrop and body choice take effect on the stage's next load; everything else is saved to this agent and waits for the hydration seam",
  "imageOnStage": "pick her own photo on the stage — agent files never carry images",
  "registryDead": "the registry could not load — the panel builds nothing without it",
  "locked": "locked — open the demo gate (walt) to use the config panel.",
  "breakFormula": "These three dials are a formula, not a cage. Open the raw dials and move anything — the axis lets go of any row you hand-tune and shows custom until you move the axis again, which retakes the whole set.",
  "noCall": "no live call on this page — she talks on the stage",
  "l3-seam": "configured here now — she starts speaking up only when her build round lands AND the input fence is verified",
  "r8-seam": "saved to this agent — the stage picks it up when the R8 rest lane lands",
  "a4-seam": "these dials arrive when the A4 presence-sense round publishes",
  "triDefault": "default — follows the platform setting",
  "a3-seam": "configured here now — her experience record fills when its build round lands",
  "n1-seam": "configured here now — her ambient senses fill when the N-1 round lands",
  "r45-seam": "configured here now — her memory discipline sharpens when the R4R5.1 fold lands",
  "eye-idle-seam": "configured here now — her eyes fill in between the blinks when the EYE-IDLE round lands",
  "tool-timing-seam": "configured here now — her gestures land on the words when the tool-timing round lands",
  "l1-seam": "configured here now — each body wears its own Level-1 identity when the PER-MODEL LOADER round lands",
  "pf-seam": "configured here now — she starts holding reminders for your quiet hours when the presence-fence round lands"
 },
 "blastRadius": {
  "nsv": "applies on Keep + Apply — the stage picks it up on its next load",
  "stage-session": "saved to this agent on Keep — the stage reads it when the hydration seam lands",
  "panel": "saved to this agent on Keep — panel + persona surface",
  "meta": "moves its mapped dials in the draft — each lands with its own reach",
  "standing": "saved as you type — no Keep needed; she reads it at the start of her next conversation"
 },
 "capSentences": {
  "fingers": "this avatar has no finger bones",
  "thumbs": "this avatar has no thumb bones",
  "toes": "this avatar has no toe bones",
  "springs": "this avatar has no hair/cloth springs",
  "lookAt": "this avatar cannot hold eye contact",
  "blink": "this avatar has no blink expression",
  "aa": "this avatar has no mouth-aperture expression"
 },
 "capSentencesNote": {
  "thumbs": "panel-authored — the live stage has CAP.thumbs but no thumb gate sentence yet; this line is the panel's own voice, not a live-stage quote. If the stage ever grows one, D2 fails loudly: re-census.",
  "springs": "panel-authored (B2.1 fold, REG-3) — no live-stage gate sentence for springs; registry bytes so the reference doc can show the exact rendered line. Flagged for Michael's taste pass.",
  "lookAt": "panel-authored (B2.1 fold, REG-3) — no live-stage gate sentence for lookAt; registry bytes so the reference doc can show the exact rendered line. Flagged for Michael's taste pass.",
  "blink": "panel-authored (B2.1 fold, REG-3) — no live-stage gate sentence for blink; registry bytes so the reference doc can show the exact rendered line. Flagged for Michael's taste pass.",
  "aa": "panel-authored (B2.1 fold, REG-3) — no live-stage gate sentence for aa; registry bytes so the reference doc can show the exact rendered line. Flagged for Michael's taste pass."
 },
 "capChips": {
  "fingers": "finger-true hands",
  "thumbs": "true thumbs",
  "toes": "toe bones",
  "springs": "hair/cloth springs",
  "lookAt": "eye contact",
  "blink": "blinks",
  "aa": "mouth aperture"
 },
 "caps": {
  "maxAgents": 20,
  "maxDocBytes": 24576,
  "maxTotalBytes": 163840,
  "maxImportBytes": 65536,
  "maxFilenameDisplay": 80
 },
 "platformDefaults": {
  "v": 1,
  "note": "S36 TRI-STATE (Michael's ruling, ledger 2026-08-02 [21:05]): every behavioral toggle is ON / OFF / DEFAULT per agent. ON/OFF store true/false in the agent's JSON (pins); DEFAULT stores the string token 'default' and inherits the value HERE, falling to the field's shipped `default` when its id is absent from `values`. An overlay entry that is simply absent also reads as DEFAULT (back-compat — every pre-tri-state agent document keeps working). `values` holds ONLY boolean entries keyed by type:'toggle' field ids; the panel censuses this block once at boot and drops every illegal entry BY NAME into the console lane — a malformed block (wrong v, non-object values) is a LOUD dead-state. Ships EMPTY (the ships-OFF law): with no entry, resolution is byte-identical to the pre-tri-state panel. Schema-driven: a new toggle row in `fields` inherits the full tri-state (control, resolution, validation, doc row, and a slot here) with zero panel edits; `triState: false` on a field is the reserved opt-out. The 'default' token never crosses the panel→stage seam — resolve() emits strict booleans, so every storage writeContract below stands unchanged.",
  "values": {}
 },
 "categories": [
  {
   "id": "identity",
   "label": "Who is this agent?",
   "rail": "AGENT",
   "order": 1,
   "advanced": false
  },
  {
   "id": "persona",
   "label": "How she speaks",
   "rail": "AGENT",
   "order": 2,
   "advanced": false
  },
  {
   "id": "standing",
   "label": "Steering — right now",
   "rail": "AGENT",
   "order": 3,
   "advanced": false
  },
  {
   "id": "model",
   "label": "Her body",
   "rail": "BODY",
   "order": 4,
   "advanced": false
  },
  {
   "id": "character",
   "label": "Her character",
   "rail": "BEHAVIOUR",
   "order": 5,
   "advanced": false
  },
  {
   "id": "backdrop",
   "label": "Her backdrop",
   "rail": "STAGE",
   "order": 6,
   "advanced": false
  },
  {
   "id": "presence",
   "label": "Presence on a quiet stage",
   "rail": "BEHAVIOUR",
   "order": 7,
   "advanced": false
  },
  {
   "id": "share",
   "label": "Save & share",
   "rail": "REACH",
   "order": 8,
   "advanced": false
  },
  {
   "id": "body.hands",
   "label": "Hands, arms & stance — raw dials",
   "rail": "BEHAVIOUR",
   "order": 9,
   "advanced": true
  },
  {
   "id": "body.motion",
   "label": "Motion & life — raw dials",
   "rail": "BEHAVIOUR",
   "order": 10,
   "advanced": true
  },
  {
   "id": "device",
   "label": "Her device — always present",
   "rail": "STAGE",
   "order": 11,
   "advanced": false
  },
  {
   "id": "initiative",
   "label": "When she may speak up",
   "rail": "BEHAVIOUR",
   "order": 12,
   "advanced": false
  },
  {
   "id": "security",
   "label": "Guardrails",
   "rail": "AGENT",
   "order": 99,
   "advanced": true
  }
 ],
 "enums": {
  "mood": [
   "serious",
   "curious",
   "reassuring",
   "warm",
   "empathetic",
   "playful",
   "neutral"
  ],
  "backdropModes": [
   "default",
   "color",
   "grad",
   "image"
  ],
  "backdropPresets": [
   "default",
   "charcoal",
   "sage",
   "dusk",
   "grad-studio",
   "grad-dawn",
   "grad-night"
  ],
  "aiStates": [
   "idle",
   "listening",
   "thinking",
   "speaking",
   "interrupted",
   "waiting"
  ],
  "wakeModes": [
   "tap",
   "manual"
  ],
  "preTokens": [
   "no-model",
   "not-armed",
   "reduced-motion",
   "live-call",
   "auto-off",
   "moving",
   "not-standing",
   "posture-busy",
   "cam-home-unset",
   "settle-window",
   "cam-hold",
   "not-settled",
   "one-shot-active",
   "gate-walt-closed",
   "capability",
   "seated-block",
   "loader-busy"
  ],
  "r8SpokenTiers": [
   "off",
   "idle"
  ],
  "echoModes": [
   "off",
   "short",
   "full"
  ],
  "memoryLaneFilter": [
   "off",
   "soft",
   "strict"
  ],
  "nsvToolTimingMaster": [
   "default",
   "on",
   "off"
  ]
 },
 "backdropPresetDefs": [
  {
   "id": "default",
   "label": "paper — the default",
   "css": "#f6f1e7"
  },
  {
   "id": "charcoal",
   "label": "deep charcoal",
   "css": "#262a33"
  },
  {
   "id": "sage",
   "label": "soft sage",
   "css": "#a7b3a0"
  },
  {
   "id": "dusk",
   "label": "warm dusk",
   "css": "#8a6f7c"
  },
  {
   "id": "grad-studio",
   "label": "studio sweep",
   "g": [
    "#ffffff",
    "#c9cfd9"
   ]
  },
  {
   "id": "grad-dawn",
   "label": "dawn",
   "g": [
    "#f7ecd9",
    "#e3bf92"
   ]
  },
  {
   "id": "grad-night",
   "label": "night",
   "g": [
    "#232c44",
    "#0b0e16"
   ]
  }
 ],
 "storage": [
  {
   "key": "nsvBackdrop",
   "fmt": "json",
   "owner": "stage:Backdrop",
   "panelAccess": "read+sanctioned-write",
   "writeContract": {
    "v": 1,
    "modes": [
     "default",
     "color",
     "grad",
     "image"
    ],
    "colorRegex": "^#[0-9a-f]{6}$",
    "gradPresets": [
     "grad-studio",
     "grad-dawn",
     "grad-night"
    ],
    "imagePrefix": "data:image/",
    "dim": [
     0,
     60
    ],
    "atRest": "mode default + dim 0 = key removed (reason at-rest)"
   }
  },
  {
   "key": "nsvSwGate",
   "fmt": "raw",
   "owner": "stage:Voice",
   "panelAccess": "read+gate-mechanism",
   "note": "written ONLY by the gate mechanism with bytes equal to gateMirror.waltGateSha — the stage's own mechanism, same key, same stored bytes"
  },
  {
   "key": "nsvL1Gate",
   "fmt": "raw",
   "owner": "stage:L1",
   "panelAccess": "read",
   "note": "read-only status only; the walt and L1 gates never open each other"
  },
  {
   "key": "nsvVrmLastModel",
   "fmt": "raw",
   "owner": "stage:Library",
   "panelAccess": "read+sanctioned-write",
   "writeContract": {
    "membership": "library-census",
    "builtinNeedsGate": true
   }
  },
  {
   "key": "nsvSwGuestMem",
   "fmt": "json",
   "owner": "stage:GuestMem",
   "panelAccess": "read",
   "note": "R4/R5 guest-memory store (buildA seam apply) — stage-owned; the guest's own wipe path lives on the stage; panel reads only"
  },
  {
   "key": "nsvPresence",
   "fmt": "json",
   "owner": "stage:Presence",
   "panelAccess": "read+sanctioned-write",
   "writeContract": {
    "v": 1,
    "keys": [
     "autoActivate",
     "wakeMode",
     "wakeStartsCall",
     "toolbar.mic",
     "toolbar.camera",
     "toolbar.screen",
     "toolbar.connections",
     "toolbar.hide",
     "hideDefault",
     "telemetryFacts"
    ],
    "consentReadOnly": "consent.wakeCall is NOT panel-writable — the stage's first-run accept card is the ONLY consent writer (three keys, one door, design 8.2); the panel serializes it as-read (shape v1 carries the key) but may never mutate it. S29 FOLD ERRATUM to design 7.2's literal 'keys: 7.1 census' (panel finding: a store write could pre-satisfy the guest-facing consent card).",
    "wakeMode": [
     "tap",
     "manual"
    ],
    "bools": "every non-enum key is a strict bool",
    "atRest": "all-default = key removed (reason at-rest)",
    "watermark": "_meta.edited true on every sanctioned write"
   },
   "note": "P0 (S29 B4): presence/device config — the stage hydrates it with the Backdrop-class load guard (bad parse: apply nothing, write nothing, keep bytes); consent.wakeCall is the one stage-side write (the first-run consent accept) and is excluded from the panel-writable keys above. D1 storage RE-CENSUS: stage rows 5 -> 6. SINGLE-BUMP DEVIATION from design 7.2: this round publishes registry + stage in ONE combined bump, so the device rows ship availableWhen 'live' directly instead of the two-bump device-seam -> live flip."
  },
  {
   "key": "nsvL3",
   "fmt": "json",
   "owner": "stage:L3",
   "panelAccess": "read+sanctioned-write",
   "writeContract": {
    "v": 1,
    "keys": [
     "enabled",
     "quietMs",
     "maxPerCall",
     "maxPerVisit",
     "maxConsecutive",
     "minIntervalMs",
     "utterMaxMs",
     "maxTokens",
     "factTtlMs",
     "quietHours",
     "sleepPhrase"
    ],
    "consentReadOnly": "consent.speakUp is NOT panel-writable — the stage's own enable-time consent card is the ONLY consent writer (design 5.1, one door; the nsvPresence S29 FOLD ERRATUM precedent); the panel serializes it as-read but may never mutate it. Absent doc (first-enable write, nothing to serialize-as-read): the panel writes consent: { speakUp: false } verbatim — that first write then passes the stage's wholesale hydration and the consent card shows at the stage's next boot (S30 panel fold: omitting consent would be wholesale-rejected silently — panel ON, stage structurally OFF).",
    "clamps": "every numeric clamp lives in the stage READ path (floors: quietMs 30000 · minIntervalMs 30000 · factTtlMs 60000; ceilings: utterMaxMs 45000 · maxTokens 1000); 0 is a REAL zero on every cap — armed, never speaks",
    "quietHours": "null or { start: 'HH:MM', end: 'HH:MM' } — LOCAL DEVICE TIME, labeled exactly so (her clock is this device's clock — travel moves it); overnight windows (start > end) legal",
    "atRest": "all-default = key removed (reason at-rest)",
    "watermark": "_meta.edited true on every sanctioned write"
   },
   "note": "L3 (S29 B2): speak-up (unprompted speech) config — the separately-labeled PAID lane (an unprompted turn spends the operator's own AI & voice budget; the $0 silence-grace lane is untouched). Stage hydration + the guest-facing consent card are the B3 stage (stage cfg stays {} until then). These rows sit behind availableWhen 'l3-seam' HONESTLY: the Phase-B input-fence verification is NOT on the ledger at build time, so the seam ships UNFLIPPED and the flip stays a one-token registry change (design 0.2/7.2). Storage RE-CENSUS: stage rows 6 -> 7 (nsvL3); whens census RE-CENSUS: + 'l3-seam' (live, r1-published, stage-seam -> + l3-seam)."
  },
  {
   "key": "nsvB2Agents",
   "fmt": "json",
   "owner": "panel:Agents",
   "panelAccess": "own"
  },
  {
   "key": "nsvB2AgentsQuarantine",
   "fmt": "raw",
   "owner": "panel:Agents",
   "panelAccess": "own",
   "note": "unreadable-shelf set-aside: when nsvB2Agents cannot be parsed (or carries a future version), its exact bytes move HERE before any fresh write — corrupt bytes are never clobbered, never deleted"
  },
  {
   "key": "nsvB2AgentsBackup",
   "fmt": "raw",
   "owner": "panel:Agents",
   "panelAccess": "own",
   "note": "byte-copy of the last VERIFIED nsvB2Agents write, taken BEFORE each changing write — the settings-document backup (AB2-1/A10-2 shape). Never parsed in the hot path; promoted only through the explicit restore affordance."
  },
  {
   "key": "nsvB2ActiveAgent",
   "fmt": "raw",
   "owner": "panel:Agents",
   "panelAccess": "own"
  },
  {
   "prefix": "nsvB2Mem:",
   "fmt": "json",
   "owner": "core:Memory",
   "panelAccess": "read+sanctioned-write",
   "writeContract": {
    "v": 1,
    "maxBytes": 24576,
    "keys": [
     "v",
     "seq",
     "name",
     "nameAt",
     "high",
     "med",
     "edits",
     "likes"
    ],
    "note": "memory.js's OWN document (persona/memory.js blank()); maxBytes is its own STORE_BYTE_CAP, not a new cap. The panel is a sanctioned editor of this document, never its author — every write is memory.js's internal save() reaching storage through the panel store's sanctioned door."
   },
   "uidPattern": "^agt_[a-z0-9]{10}$",
   "note": "per-agent guest-memory namespace, B2-11. WRITTEN BY the agent-core contract (nsv-agent-core KEYS.mem) through memory.js; removal is 'at-rest' only, because an erased memory key is back to its absent platform-default state."
  },
  {
   "prefix": "nsvB2Standing:",
   "fmt": "json",
   "owner": "panel:Standing",
   "panelAccess": "own",
   "uidPattern": "^agt_[a-z0-9]{10}$",
   "note": "per-agent standing-instruction slots (AB2-2): {v:1, now, keepInMind, updatedAt}. Situational steering — deliberately OUTSIDE the agent overlay/export; joins assembly as fenced labeled data when the persona seam lands (PROPOSAL-PERSONA-STANDING-SLOTS)."
  },
  {
   "prefix": "nsvB2Core:",
   "fmt": "json",
   "owner": "core:Prompts",
   "panelAccess": "read+sanctioned-write",
   "writeContract": {
    "v": 1,
    "maxBytes": 24576,
    "keys": [
     "v",
     "uid",
     "core",
     "updatedAt"
    ],
    "note": "the agent-core block the cockpit edits: {v:1, uid, core:{contract, prompt, files, memory}, updatedAt}. `core` is judged by nsv-agent-core's own validateCore() at the contract door — this registry declares no second schema for it. Folding the same block into an exported nsv-agent-1 document at ext.core is the format lane's ruling and is NOT this key."
   },
   "uidPattern": "^agt_[a-z0-9]{10}$",
   "note": "per-agent introductory prompt + creator instructions + document manifest. Kept OUT of nsvB2Agents on purpose: the shelf has a 24 KB per-document and 160 KB total budget, and her prompts are the fastest-growing bytes in the product."
  },
  {
   "prefix": "nsvB2Files:",
   "fmt": "json",
   "owner": "core:Files",
   "panelAccess": "read+sanctioned-write",
   "writeContract": {
    "v": 1,
    "maxBytes": 327680,
    "keys": [
     "v",
     "uid",
     "files"
    ],
    "fileKeys": [
     "id",
     "name",
     "mime",
     "bytes",
     "sha256",
     "addedAt",
     "source",
     "text",
     "content"
    ],
    "note": "the documents a customer hands one agent: {v:1, uid, files:[{meta…, content}]}. Entry shape and the 20-file / 256 KB budget are nsv-agent-core CORE_CAPS, enforced by its own validator at the contract door. Text-extractable files carry content; a binary is remembered by name and size and is honestly marked text:false."
   },
   "uidPattern": "^agt_[a-z0-9]{10}$",
   "note": "per-agent document store (nsv-agent-core KEYS.files). Browser-local, $0, one key per agent, never leaves this origin unless the NAMED server seam (policy server-ref) is built."
  },
  {
   "key": "nsvR8",
   "fmt": "json",
   "owner": "stage:RestWord",
   "panelAccess": "read+sanctioned-write",
   "writeContract": {
    "v": 1,
    "keys": [
     "enabled",
     "restAfterMs",
     "settleMs",
     "rouseMs",
     "wordHoldMs",
     "spokenTier",
     "maxSpokenPerCall",
     "sleepPhrase",
     "wakePhrase"
    ]
   },
   "note": "R8 rest lane (W5-04): sleep/wake presence words + rest dials. Ships OFF; absent-by-default; the stage hydrates once at boot."
  },
  {
   "key": "nsvA4",
   "fmt": "json",
   "owner": "stage:PresenceSense",
   "panelAccess": "read+sanctioned-write",
   "writeContract": {
    "v": 1,
    "note": "dials (numeric, READ-path clamped on the stage) + lastSeenAt (STATE, stamped by the stage at call end — the panel never writes it; no fields row exists for it). Absent-by-default; bad parse applies nothing and keeps bytes."
   }
  },
  {
   "key": "nsvExp",
   "fmt": "json",
   "owner": "stage:Exp",
   "panelAccess": "read+sanctioned-write",
   "writeContract": {
    "v": 1,
    "keys": [
     "record",
     "wire",
     "echoMode",
     "drainMax",
     "cap",
     "ttlMs",
     "holdGapMs"
    ],
    "triState": "record and wire are tri-state and BOTH SHIP OFF. The stage reads BOTH encodings (A3 build finding F-1): the LANDED S36 house form (ON/OFF store strict booleans, DEFAULT stores the string token 'default', an absent entry reads as DEFAULT) and the packet §3.1 form (the strings 'on'|'off'|'default'). Every read is an explicit three-way comparison, never a truthiness test — 'off' is a TRUTHY STRING and a truthiness test here ships the lane live. An ABSENT or corrupt value resolves to the SHIPPED value OFF, never to the design's ON: fail-closed, because resolving absent to 'default' would fail OPEN into a live lane on every page that never wrote this key. Under the house form that is also the letter of the law, since an absent entry falls back to the field's shipped default.",
    "clamps": "every numeric clamp lives in the stage READ path (drainMax 0..24 · cap 0..256 · ttlMs 0..600000 · holdGapMs 0..600000); 0 is a REAL zero on every one of them — ttlMs 0 means NEVER EXPIRE, not \"expire immediately\", and cap 0 means the ring is disabled while the operator rail still posts",
    "ringNeverStored": "the event ring, the four odometers, the sequence, the ref counter and both dedup maps are CALL-SCOPED and are never written here. Her experience of a call dies with the call. This key carries dials and nothing else — that is the privacy line.",
    "atRest": "all-default = key removed (reason at-rest)"
   },
   "note": "A3 (W5-05): the experience bus — she remembers her own experience. DIALS ONLY. These rows sit behind availableWhen 'a3-seam', which flips to live in the SAME bump as the stage bytes (the B21 co-publish rule). Storage RE-CENSUS: measured on this base, +1."
  },
  {
   "key": "nsvSenses",
   "fmt": "json",
   "owner": "stage:NsvSenses",
   "panelAccess": "read+sanctioned-write",
   "writeContract": {
    "v": 1,
    "keys": [
     "record",
     "wire",
     "unanswered",
     "promise",
     "recall",
     "contra",
     "stalled",
     "senseGraceTurns",
     "senseRecallMin",
     "senseAnswerMin",
     "senseStallMs"
    ],
    "triState": "record and wire are behavioural toggles and inherit the S36 tri-state schema-driven (ON/OFF store strict booleans, DEFAULT stores the token 'default', an absent entry reads as DEFAULT and falls back to the field's shipped default). Every stage read is `??` for presence and `=== true` for the boolean — never `||`, so a real 0 on a numeric dial can never be swallowed.",
    "doubleGate": "MODEL-FACING FLOW IS DOUBLE-GATED: sense.wire (mint-time, ships OFF) AND the experience bus's own exp.wire (drain-time, ships OFF). Either one at OFF silences every model-facing effect of this lane WITHOUT touching a byte. That is also the rollback path.",
    "clamps": "every numeric clamp lives in the stage READ path (senseGraceTurns 0..6 · senseRecallMin 0..1 · senseAnswerMin 0..1 · senseStallMs 0..600000); 0 is a REAL zero on every one — senseStallMs 0 means NO stall detection, never instant-stall, and senseGraceTurns 0 escalates on the very next turn",
    "calibrationOwed": "CALIBRATION-OWED (real store data, post-publish). senseRecallMin and senseAnswerMin are NOT invented here. Both ship at their most conservative legal bound — senseRecallMin 1 and senseAnswerMin 0 — which means the recall and unanswered senses are SILENT until a calibration run against real store data replaces them with measured numbers. Erring toward silence is the only honest direction for a number nobody has measured.",
    "noRecordPersists": "DIALS ONLY. Questions, promises, flow records, topic snapshots, dedup and window maps are CALL-SCOPED and are never written here. What she noticed dies with the call.",
    "atRest": "all-default = key removed (reason at-rest)"
   },
   "note": "N-1 (ambient senses): five change-gated detectors that ride edges that already happen; their only output is a mint into the experience ring. Rows sit behind availableWhen 'n1-seam', flipped to live in the SAME bump as the bytes (B21 co-publish). The reminder sense is DEFERRED by lead ruling — the speak-up lane owns that fact-class enum and it is frozen; no field for it exists here."
  },
  {
   "key": "nsvToolTiming",
   "fmt": "json",
   "owner": "stage:Voice",
   "panelAccess": "read+sanctioned-write",
   "writeContract": {
    "v": 1,
    "keys": [
     "master",
     "releasePerDelta",
     "queueCap"
    ],
    "triState": "master is the OFF-MASTER: 'on'/'off' (or the landed house form's strict booleans) resolve directly, and 'default', absent or corrupt all resolve to OFF. 'off' is a TRUTHY STRING, so the stage read is an explicit three-way and never a truthiness test.",
    "clamps": "releasePerDelta [1,3] and queueCap [2,16] are CLAMPED-BAND, clamped in the stage READ path. Stored bytes are never trusted and never rewritten by a clamp, so widening a band later needs no migration.",
    "deferNotDrop": "the queue NEVER discards a call the runtime accepted: overflow fires the OLDEST immediately, a lost drip flushes at response.done before the bufferActive gate, and a stale entry gets the existing stale-turn reply plus a refusal-ledger row. A gesture that vanished silently would break partial acceptance.",
    "atRest": "all-default = key removed (reason at-rest)"
   },
   "note": "TOOL TIMING (S36): the three timing classes + the sync-at-position queue. Rows sit behind availableWhen tool-timing-seam, flipped live in the SAME bump as the bytes (B21 co-publish). Ships OFF; master OFF is byte-trace identity with today."
  },
  {
   "key": "nsvB2MarketCfg",
   "fmt": "json",
   "owner": "panel:Market",
   "panelAccess": "own",
   "writeContract": {
    "v": 1,
    "keys": [
     "master"
    ],
    "triState": "master is the OFF-MASTER and SHIPS OFF: 'on'/'off' (or the landed house form's strict booleans) resolve directly, and 'default', absent, corrupt or a wrong-version document all resolve to OFF. 'off' is a TRUTHY STRING, so every read is an explicit three-way and never a truthiness test. Fail-closed by design: resolving absent to 'default' would ship the lane live on every browser that never wrote this key.",
    "atRest": "all-default = key removed (reason at-rest)"
   },
   "note": "MARKETPLACE-1 (opus5-marketplace1-20260805): dials only for local agent-document listing. DIALS ONLY — no listing record is ever written here. Ships OFF; with the master OFF, publish, unpublish and adopt each refuse by name and write zero bytes."
  },
  {
   "key": "nsvB2Market",
   "fmt": "json",
   "owner": "panel:Market",
   "panelAccess": "own",
   "writeContract": {
    "v": 1,
    "shape": "{ v:1, listings: { <lst_ id>: listing } } where a listing is { fmt:'nsv-listing-1', v, id, contract, publishedAt, basePreset, card, doc } and doc is a DEEP COPY of the published nsv-agent-1 document",
    "idPattern": "^lst_[0-9a-f]{12}$",
    "idDerivation": "the first 12 hex of the document's own ext.join.integrity.doc seal — deterministic, no clock, no RNG, so republishing the same document is caught as a duplicate rather than silently forked",
    "caps": "20 listings · 65536 bytes per listing · 393216 bytes total",
    "untrusted": "stored listings are UNTRUSTED DATA on every read: structure, seal recompute and the usage-law gate all run AGAIN at adopt time, because between the write and the read the bytes sat somewhere a person can hand-edit",
    "noBackup": "DELIBERATE DIVERGENCE from the nsvB2Agents shelf pattern: this store mints NO backup key. A listing is a derived projection of a document that already lives on the shelf, and a backup would retain the bytes of an unpublished listing — residue by construction, against a hard zero-residue gate.",
    "atRest": "zero listings = key removed (reason at-rest); the removal of a single record is reason user-delete"
   },
   "note": "MARKETPLACE-1 (opus5-marketplace1-20260805): local listing records for created/joined nsv-agent-1 documents. Browser-local only — zero payments, zero billing, zero network. UNRELATED to the landed alive-package-1 avatar marketplace at /api/marketplace/*, which lists packages, not agent documents."
  },
  {
   "key": "nsvB2MarketQuarantine",
   "fmt": "raw",
   "owner": "panel:Market",
   "panelAccess": "own",
   "note": "unreadable-listing set-aside: when nsvB2Market cannot be parsed (or carries a future version), its exact bytes move HERE before any fresh write — corrupt bytes are never clobbered, never deleted. Mirrors the nsvB2AgentsQuarantine law."
  }
 ],
 "fields": [
  {
   "id": "identity.name",
   "label": "Her name",
   "help": "What she calls herself and what the rack card shows. Short and friendly works best — Front Desk, Homework Helper, Rosie.",
   "type": "text",
   "default": "",
   "maxLen": 60,
   "category": "identity",
   "rail": "AGENT",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "panel",
    "path": "agent.identity.name"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "identity.tagline",
   "label": "One-line tagline",
   "help": "One short line under her name — what she is for, in plain words. Example: a calm first hello for your visitors.",
   "type": "text",
   "default": "",
   "maxLen": 120,
   "category": "identity",
   "rail": "AGENT",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "panel",
    "path": "agent.identity.tagline"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "persona.greeting",
   "label": "Her greeting",
   "help": "The first thing she says when someone arrives. One or two warm sentences; a question at the end invites people to answer.",
   "type": "text",
   "default": "",
   "maxLen": 240,
   "category": "persona",
   "rail": "AGENT",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "panel",
    "path": "agent.persona.greeting"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "persona.notes",
   "label": "Who she is (persona notes)",
   "help": "Plain sentences about who she is, what she helps with, and how she behaves. Write it like you would brief a new team member — no code, no special format.",
   "type": "text",
   "multiline": true,
   "default": "",
   "maxLen": 2000,
   "category": "persona",
   "rail": "AGENT",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "panel",
    "path": "agent.persona.notes"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "standing.now",
   "label": "What is going on right now",
   "help": "One line of situation for her next conversations — 'quiet office today', 'the 2pm demo is running late'. Applies immediately, clears in one tap, and never becomes part of who she is. It travels as context, not commands.",
   "type": "text",
   "default": "",
   "maxLen": 280,
   "category": "standing",
   "rail": "AGENT",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "standing",
    "path": "standing.now"
   },
   "persist": "standing",
   "advanced": false
  },
  {
   "id": "standing.keepInMind",
   "label": "Keep this in mind",
   "help": "A standing note she should keep in mind for a while — 'we are closed Friday', 'be extra gentle with billing questions'. Applies immediately and clears in one tap. Context, not commands.",
   "type": "text",
   "multiline": true,
   "default": "",
   "maxLen": 500,
   "category": "standing",
   "rail": "AGENT",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "standing",
    "path": "standing.keepInMind"
   },
   "persist": "standing",
   "advanced": false
  },
  {
   "id": "model.pointer",
   "label": "Her body (VRM model)",
   "help": "Which avatar body she uses on the stage. Built-in bodies live behind the demo gate; bodies you dropped on the stage live in this browser only.",
   "type": "select",
   "default": "",
   "optionsFrom": "library-census",
   "maxLen": 200,
   "category": "model",
   "rail": "BODY",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvVrmLastModel"
   },
   "persist": "nsvStore:nsvVrmLastModel",
   "advanced": false,
   "note": "census membership is checked at apply time, not import time — an export from another browser stays valid"
  },
  {
   "id": "meta.warmth",
   "label": "Edge ↔ Warmth",
   "help": "One dial for how she meets people. Edge is precise and reserved; Warmth is open and easy. It moves her register and a few hand dials together — open 'what this moves' to see exactly which.",
   "type": "range",
   "default": 0,
   "min": -1,
   "max": 1,
   "step": 0.01,
   "category": "character",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "meta",
    "path": "axis.warmth"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "meta.energy",
   "label": "Calm ↔ Energy",
   "help": "How much drive she carries. Calm is settled and unhurried; Energy is quick and animated. It moves her micro-life and arc dials together — the mapping is published below the dial.",
   "type": "range",
   "default": 0,
   "min": -1,
   "max": 1,
   "step": 0.01,
   "category": "character",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "meta",
    "path": "axis.energy"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "meta.life",
   "label": "Stillness ↔ Life",
   "help": "How alive her body reads at rest. Stillness is composed and quiet; Life is loose and breathing. It moves her looseness and region dials together — the mapping is published below the dial.",
   "type": "range",
   "default": 0,
   "min": -1,
   "max": 1,
   "step": 0.01,
   "category": "character",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "meta",
    "path": "axis.life"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "mood.default",
   "label": "Her default register",
   "help": "The emotional register she starts in — it tints her face, posture and hands. The Edge–Warmth dial usually chooses this for you; set it by hand to break the formula.",
   "type": "select",
   "default": "neutral",
   "enum": "mood",
   "category": "character",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "Face.setMood"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "rest.el",
   "label": "Elbow bend",
   "help": "How much her elbows bend at rest. 0 is straight arms; the shipped 0.29 is a soft, natural stand.",
   "type": "range",
   "default": 0.29,
   "min": 0,
   "max": 0.6,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.el",
    "restRow": "elbow bend"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.elAL",
   "label": "Left elbow ×",
   "help": "Multiplies the bend on her left elbow so her arms are never mirror-perfect. Above 1 bends more than the base.",
   "type": "range",
   "default": 1.15,
   "min": 0.4,
   "max": 1.8,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.elAL",
    "restRow": "elbow L ×"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.elAR",
   "label": "Right elbow ×",
   "help": "Multiplies the bend on her right elbow. Keeping left and right a little different is what makes her read alive.",
   "type": "range",
   "default": 0.8,
   "min": 0.4,
   "max": 1.8,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.elAR",
    "restRow": "elbow R ×"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.wrX",
   "label": "Wrist droop",
   "help": "How much her hands relax downward at the wrist. Negative lifts them; the shipped 0.12 is a calm drop.",
   "type": "range",
   "default": 0.12,
   "min": -0.2,
   "max": 0.5,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.wrX",
    "restRow": "wrist droop"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.wrZ",
   "label": "Wrist palm-in",
   "help": "Turns her palms gently toward her body. 0 is neutral; small values read most natural.",
   "type": "range",
   "default": 0.05,
   "min": -0.2,
   "max": 0.3,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.wrZ",
    "restRow": "wrist palm-in"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.fing",
   "label": "Finger curl",
   "help": "How softly her fingers rest. 0 is board-straight; the shipped 0.58 is a calm, natural hand.",
   "type": "range",
   "default": 0.58,
   "min": 0,
   "max": 1.2,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [
    "fingers"
   ],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.fing",
    "restRow": "finger curl"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.curlKnuckle",
   "label": "Curl at the knuckle",
   "help": "How much of the curl happens at the big knuckle. In a relaxed hand the knuckle bends most — that is why it ships at 1.0.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 1.3,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [
    "fingers"
   ],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "CURL_GRADE[0]",
    "restRow": "curl @knuckle"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.curlMiddle",
   "label": "Curl at the middle joint",
   "help": "How much of the curl happens at the middle finger joint. Ships at 0.85 — a little less than the knuckle.",
   "type": "range",
   "default": 0.85,
   "min": 0,
   "max": 1.3,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [
    "fingers"
   ],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "CURL_GRADE[1]",
    "restRow": "curl @middle"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.curlTip",
   "label": "Curl at the fingertip",
   "help": "How much the last joint curls. The tip bends least in a relaxed hand — ships at 0.45.",
   "type": "range",
   "default": 0.45,
   "min": 0,
   "max": 1.3,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [
    "fingers"
   ],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "CURL_GRADE[2]",
    "restRow": "curl @tip"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.thumbK",
   "label": "Thumb settle",
   "help": "How much her thumbs settle into the hand. Higher tucks them closer; ships at 1.1.",
   "type": "range",
   "default": 1.1,
   "min": 0,
   "max": 1.8,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [
    "thumbs"
   ],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.thumbK",
    "restRow": "thumb settle"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.thumbIn",
   "label": "Thumb in",
   "help": "Scales how far her thumbs turn inward toward the palm. Ships at 1.0 — the measured natural amount.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 1.6,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [
    "thumbs"
   ],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.thumbIn",
    "restRow": "thumb in"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.indiv",
   "label": "Finger variety",
   "help": "How different each finger's curl is from its neighbours. 0 makes them move as one plank; 1 is the natural cascade.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 2,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [
    "fingers"
   ],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.indiv",
    "restRow": "finger variety"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.splay",
   "label": "Fingers together",
   "help": "Draws her fingers from a fan toward parallel. 0 keeps the authored fan; 1 brings them fully together. Ships at 0.55.",
   "type": "range",
   "default": 0.55,
   "min": 0,
   "max": 1,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [
    "fingers"
   ],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.splay",
    "restRow": "fingers together"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.knee",
   "label": "Knees soft",
   "help": "A tiny bend so her knees never lock. Ships at 0.05 — barely visible, clearly alive.",
   "type": "range",
   "default": 0.05,
   "min": 0,
   "max": 0.25,
   "step": 0.005,
   "category": "body.hands",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.knee",
    "restRow": "knees soft"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.looseness",
   "label": "Looseness",
   "help": "The master naturalness dial. 0 is the classic stiff engine — a true bypass; 1 is fully stagey. Ships at 0.35.",
   "type": "range",
   "default": 0.35,
   "min": 0,
   "max": 1,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "Engine.natural.cfg.looseness",
    "restRow": "looseness"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.overlap",
   "label": "Overlap",
   "help": "How much her joints trail each other on a move — shoulders lead, wrists follow. 0 moves everything at once.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 2,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "Engine.natural.cfg.overlap",
    "restRow": "overlap"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.micro",
   "label": "Micro life",
   "help": "The tiny always-on movements that keep her from reading frozen. 0 is a statue; 2 is restless.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 2,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "Engine.natural.cfg.micro",
    "restRow": "micro life"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.arc",
   "label": "Arc bias",
   "help": "Curves her big fast moves into arcs instead of straight lines. 1 is the shipped natural amount.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 2,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "Engine.natural.cfg.arc",
    "restRow": "arc bias"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "family.regions",
   "label": "All regions at once",
   "help": "One dial for the five region-looseness dials below. Any region you set by hand keeps its own value; the rest follow this one. 1 is the shipped neutral.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 2,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "familyOf": [
    "rest.regionHead",
    "rest.regionTorso",
    "rest.regionArms",
    "rest.regionHands",
    "rest.regionLegs"
   ],
   "mapsTo": {
    "surface": "meta",
    "path": "family.regions"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.regionHead",
   "label": "Loose head",
   "help": "Looseness for just her head. Above 1 makes head motion softer and later than the rest of her.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 2,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "Engine.natural.cfg.region.head",
    "restRow": "loose head"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.regionTorso",
   "label": "Loose torso",
   "help": "Looseness for her torso — how much her breath and settle read through her body.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 2,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "Engine.natural.cfg.region.torso",
    "restRow": "loose torso"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.regionArms",
   "label": "Loose arms",
   "help": "Looseness for her arms. Higher makes gestures land softer, with more follow-through.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 2,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "Engine.natural.cfg.region.arms",
    "restRow": "loose arms"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.regionHands",
   "label": "Loose hands",
   "help": "Looseness for her hands and fingers — the last little settle after a gesture.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 2,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "Engine.natural.cfg.region.hands",
    "restRow": "loose hands"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.regionLegs",
   "label": "Loose legs",
   "help": "Looseness for her legs and stance — weight shifts and knee settle.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 2,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "Engine.natural.cfg.region.legs",
    "restRow": "loose legs"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.mouthMood",
   "label": "Mouth mood",
   "help": "The mood-coupled mouth master. Her talk-style register (playful, serious, empathetic and the rest) shapes how wide the mouth opens, how it holds between syllables and how fast it closes. 0 is the mood-blind mouth; 1 is the tuned coupling; above 1 widens the spread.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 1.5,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.mouthMood",
    "restRow": "mouth mood"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.mouthRest",
   "label": "Mouth rest",
   "help": "The mid-speech floor under the mouth. She stops clacking fully shut between syllables while her voice is live; the floor releases the moment her audio stops. 0 is no floor - she closes exactly as before.",
   "type": "range",
   "default": 0.06,
   "min": 0,
   "max": 0.25,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.mouthRest",
    "restRow": "mouth rest"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.mouthGain",
   "label": "Mouth gain",
   "help": "How far the talk-style registers spread the mouth's opening. 0 reads every register at the same width (mood-blind); 1 is the tuned spread; 2 doubles it.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 2,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.mouthGain",
    "restRow": "mouth gain"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.mouthRipple",
   "label": "Mouth ripple",
   "help": "How much the mood face (smile, sorrow, ease) breathes with her speech energy. It rides the energy's swing, so a long loud passage settles around the register's baseline instead of parking at the cap. 0 is a static mood mask.",
   "type": "range",
   "default": 0.35,
   "min": 0,
   "max": 1,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.mouthRipple",
    "restRow": "mouth ripple"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "rest.mouthRelease",
   "label": "Mouth release",
   "help": "How the mouth's closing speed follows the register - serious closes slow and heavy, playful snaps. 0 keeps the original fixed close on every register.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 2,
   "step": 0.005,
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "stage-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.mouthRelease",
    "restRow": "mouth release"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.drawWindowK",
   "label": "Quiet-stage motion window ×",
   "help": "Stretches or squeezes how often she offers a motion on a quiet stage. 1 is the shipped window; 2 waits twice as long. One dial stretches both ends of the window together.",
   "type": "range",
   "default": 1,
   "min": 0.25,
   "max": 4,
   "step": 0.05,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r1-published",
   "mapsTo": {
    "surface": "stage-session",
    "paths": [
     "PresencePolicy.dials.drawMinK",
     "PresencePolicy.dials.drawMaxK"
    ],
    "note": "uniform stretch: the panel value lands on BOTH Routines-window multipliers"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "presence.idleWindowK",
   "label": "Idle-glance window ×",
   "help": "The same stretch for her small idle glances and shifts. 1 is the shipped cadence. One dial stretches both ends of the window together.",
   "type": "range",
   "default": 1,
   "min": 0.25,
   "max": 4,
   "step": 0.05,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r1-published",
   "mapsTo": {
    "surface": "stage-session",
    "paths": [
     "PresencePolicy.dials.idleMinK",
     "PresencePolicy.dials.idleMaxK"
    ],
    "note": "uniform stretch: the panel value lands on BOTH AwareIdle-window multipliers"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "presence.tierCalmS",
   "label": "Calm after (seconds)",
   "help": "How long a stage stays quiet before she settles from full presence to calm. Ships at 150 seconds.",
   "type": "range",
   "default": 150,
   "min": 30,
   "max": 600,
   "step": 1,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r1-published",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresencePolicy.dials.calmAfterMs",
    "scale": 1000,
    "unit": "s"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "presence.tierRestS",
   "label": "Rest after (seconds)",
   "help": "How long before she settles all the way to rest. Ships at 420 seconds — never a statue, just quieter (a 0.35 life floor lives in the stage's own read path).",
   "type": "range",
   "default": 420,
   "min": 120,
   "max": 1200,
   "step": 1,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r1-published",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresencePolicy.dials.restAfterMs",
    "scale": 1000,
    "unit": "s"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "presence.graceArmed",
   "label": "Silence grace in calls",
   "help": "When ON, a long silence in a live call earns one warm, free acknowledgment — a tilt or an open palm, never a paid reply. Ships OFF.",
   "type": "toggle",
   "default": false,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r1-published",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresencePolicy.dials.graceArmed"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "presence.graceThresholdS",
   "label": "Grace after (seconds)",
   "help": "How long a call silence runs before the one free acknowledgment. Ships at 45 seconds; the hard ceiling is 90 (the clamp lives in the stage's read path).",
   "type": "range",
   "default": 45,
   "min": 10,
   "max": 90,
   "step": 1,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r1-published",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresencePolicy.dials.graceThresholdMs",
    "scale": 1000,
    "unit": "s"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "presence.graceIntensity",
   "label": "Still-here gesture intensity",
   "help": "How visible the one free still-here acknowledgment is. Ships at 0.35 — a gentle tilt, never a performance.",
   "type": "range",
   "default": 0.35,
   "min": 0.05,
   "max": 1.5,
   "step": 0.05,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r1-published",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresencePolicy.dials.graceIntensity"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "presence.breatherS",
   "label": "After-call breather (seconds)",
   "help": "How long she takes a visible breath after a call ends before ambient life resumes. Ships at 15 seconds.",
   "type": "range",
   "default": 15,
   "min": 0,
   "max": 60,
   "step": 1,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r1-published",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresencePolicy.dials.breatherMs",
    "scale": 1000,
    "unit": "s"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "backdrop.mode",
   "label": "Backdrop style",
   "help": "What stands behind her on the stage: the paper default, a solid color, a soft gradient, or a photo picked on the stage itself.",
   "type": "select",
   "default": "default",
   "enum": "backdropModes",
   "category": "backdrop",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "greyOptions": {
    "image": "imageOnStage"
   },
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvBackdrop.mode"
   },
   "persist": "nsvStore:nsvBackdrop",
   "advanced": false
  },
  {
   "id": "backdrop.value",
   "label": "Backdrop color",
   "help": "The color or gradient behind her. The seven house presets are tuned to flatter skin without stealing the scene; the free picker takes any color.",
   "type": "color",
   "default": null,
   "presetsFrom": "backdropPresetDefs",
   "category": "backdrop",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvBackdrop.value"
   },
   "persist": "nsvStore:nsvBackdrop",
   "advanced": false
  },
  {
   "id": "backdrop.dim",
   "label": "Backdrop dim",
   "help": "Darkens the backdrop so she stays the brightest thing on stage. 0 is no dim; 60 is a deep hush.",
   "type": "range",
   "default": 0,
   "min": 0,
   "max": 60,
   "step": 1,
   "category": "backdrop",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvBackdrop.dim"
   },
   "persist": "nsvStore:nsvBackdrop",
   "advanced": false
  },
  {
   "id": "share.agentUid",
   "label": "Agent ID",
   "help": "Assigned automatically when you fork a preset. This id keys her memory on this browser and never changes — renaming her keeps it.",
   "type": "readonly",
   "default": null,
   "computed": "activeAgentUid",
   "lockReason": "assigned automatically — this id keys her memory on this browser",
   "category": "share",
   "rail": "REACH",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "panel",
    "path": "agent.uid"
   },
   "persist": "none",
   "advanced": false
  },
  {
   "id": "device.autoActivate",
   "label": "Open straight into her mode",
   "help": "When ON, opening the stage enters activation on its own — no click needed. Presentation only: it never touches microphone, camera, or voice. Ships OFF.",
   "type": "toggle",
   "default": false,
   "category": "device",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "blastRadius": "presentation only — entering her mode never touches mic, camera, or voice",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvPresence.autoActivate"
   },
   "persist": "nsvStore:nsvPresence",
   "advanced": false
  },
  {
   "id": "device.wakeMode",
   "label": "How she wakes",
   "help": "tap: in activation, the first tap on her body is the wake gesture. manual: only the toolbar starts anything. A voice wake-word is a later round, not shipped.",
   "type": "select",
   "enum": "wakeModes",
   "default": "tap",
   "category": "device",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "blastRadius": "chooses the wake gesture only — starting anything still takes its own gates",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvPresence.wakeMode"
   },
   "persist": "nsvStore:nsvPresence",
   "advanced": false
  },
  {
   "id": "device.wakeStartsCall",
   "label": "Wake starts a live call",
   "help": "When ON, the wake tap starts the TALK lane on the guest's own AI and voice account. The demo gate (walt) still applies exactly as today, and the first-run consent card must have been accepted — three keys, one door. Ships OFF.",
   "type": "toggle",
   "default": false,
   "category": "device",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "blastRadius": "LOUD — this starts a live call on your configured voice account when she is woken; the walt gate and the first-run consent still apply",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvPresence.wakeStartsCall"
   },
   "persist": "nsvStore:nsvPresence",
   "advanced": false
  },
  {
   "id": "device.toolbar.mic",
   "label": "Toolbar: microphone chip",
   "help": "Whether the microphone mute chip renders in her toolbar. The fullscreen and exit chips are always there — an exit path always exists.",
   "type": "toggle",
   "default": true,
   "category": "device",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "blastRadius": "toolbar layout only — a hidden chip removes the affordance, never the underlying gates",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvPresence.toolbar.mic"
   },
   "persist": "nsvStore:nsvPresence",
   "advanced": false
  },
  {
   "id": "device.toolbar.camera",
   "label": "Toolbar: camera chip",
   "help": "Whether the camera preview chip renders in her toolbar. Today the camera feeds a private on-stage preview only — nothing is uploaded anywhere.",
   "type": "toggle",
   "default": true,
   "category": "device",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "blastRadius": "toolbar layout only — a hidden chip removes the affordance, never the underlying gates",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvPresence.toolbar.camera"
   },
   "persist": "nsvStore:nsvPresence",
   "advanced": false
  },
  {
   "id": "device.toolbar.screen",
   "label": "Toolbar: screen share chip",
   "help": "Whether the screen share chip renders in her toolbar. Sharing always rides the browser's own picker and always shows a visible capture indicator.",
   "type": "toggle",
   "default": true,
   "category": "device",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "blastRadius": "toolbar layout only — a hidden chip removes the affordance, never the underlying gates",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvPresence.toolbar.screen"
   },
   "persist": "nsvStore:nsvPresence",
   "advanced": false
  },
  {
   "id": "device.toolbar.connections",
   "label": "Toolbar: connections chip",
   "help": "Whether the connections chip renders in her toolbar. The sheet lists her device hookups — empty and honest until real transports are built.",
   "type": "toggle",
   "default": true,
   "category": "device",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "blastRadius": "toolbar layout only — a hidden chip removes the affordance, never the underlying gates",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvPresence.toolbar.connections"
   },
   "persist": "nsvStore:nsvPresence",
   "advanced": false
  },
  {
   "id": "device.toolbar.visibility",
   "label": "Toolbar: hide/show chip",
   "help": "Whether the hide/show chip renders in her toolbar. Hidden means truly away — an invisible body never fidgets, and a call always brings her back first.",
   "type": "toggle",
   "default": true,
   "category": "device",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "blastRadius": "toolbar layout only — a hidden chip removes the affordance, never the underlying gates",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvPresence.toolbar.hide"
   },
   "persist": "nsvStore:nsvPresence",
   "advanced": false
  },
  {
   "id": "device.arriveHidden",
   "label": "Arrive hidden",
   "help": "When ON, activation opens with her hidden — she arrives on the wake tap or the show chip. Presentation only. Ships OFF.",
   "type": "toggle",
   "default": false,
   "category": "device",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "blastRadius": "presentation only — she starts hidden; nothing else changes",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvPresence.hideDefault"
   },
   "persist": "nsvStore:nsvPresence",
   "advanced": false
  },
  {
   "id": "device.telemetryFacts",
   "label": "Device facts in her turn data",
   "help": "When ON, coarse browser-legal device facts (memory class, cores, viewport, battery class, online state) ride her turn data during a live call at no extra cost. Absent fields never flow — nothing is faked. Ships OFF.",
   "type": "toggle",
   "default": false,
   "category": "device",
   "rail": "STAGE",
   "capabilityRequires": [],
   "availableWhen": "live",
   "blastRadius": "adds labeled zero-cost facts to her turns during a live call — wiped with the call; no capture, no spend",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvPresence.telemetryFacts"
   },
   "persist": "nsvStore:nsvPresence",
   "advanced": false
  },
  {
   "id": "initiative.enabled",
   "label": "She may speak up (PAID)",
   "help": "The master. When ON — and the consent card was accepted — she may start talking during a quiet moment of a live call, inside every cap below. Ships OFF; you flip it.",
   "type": "toggle",
   "default": false,
   "category": "initiative",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l3-seam",
   "blastRadius": "LOUD — a PAID lane. \"When she speaks up on her own, that turn spends your AI & voice budget — same account, same meter as every turn. You set how often; she shows you every time.\" Ships OFF; the stage also requires the accepted consent card AND a live call the guest started before she ever speaks.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvL3.enabled"
   },
   "persist": "nsvStore:nsvL3",
   "advanced": false
  },
  {
   "id": "initiative.quietSeconds",
   "label": "Quiet before she may speak (seconds)",
   "help": "Observed in-call silence before she may even consider speaking up. Ships at 90 — deliberately above the free still-here gesture's 45, so the $0 lane always gets the first word. Floor 30 (the clamp lives in the stage's read path).",
   "type": "range",
   "default": 90,
   "min": 30,
   "max": 600,
   "step": 5,
   "category": "initiative",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l3-seam",
   "blastRadius": "timing for the PAID speak-up lane only — the $0 silence-grace gesture keeps the first word at 45 s and is untouched",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvL3.quietMs",
    "scale": 1000,
    "unit": "s"
   },
   "persist": "nsvStore:nsvL3",
   "advanced": false
  },
  {
   "id": "initiative.maxPerCall",
   "label": "Most speak-ups per call",
   "help": "Unprompted turns she may take in one call. Ships at 2. Zero is a real zero: armed, never speaks that call.",
   "type": "range",
   "default": 2,
   "min": 0,
   "max": 20,
   "step": 1,
   "category": "initiative",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l3-seam",
   "blastRadius": "a hard stop, not a slowdown — at the cap the lane rests and says so; 0 = armed, never speaks",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvL3.maxPerCall"
   },
   "persist": "nsvStore:nsvL3",
   "advanced": false
  },
  {
   "id": "initiative.maxPerVisit",
   "label": "Most speak-ups per visit",
   "help": "Unprompted turns across the whole page visit — survives calls, dies with the tab. Ships at 6. Zero is a real zero.",
   "type": "range",
   "default": 6,
   "min": 0,
   "max": 60,
   "step": 1,
   "category": "initiative",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l3-seam",
   "blastRadius": "a page-lifetime hard stop — at the cap the lane rests for the rest of the visit and says so",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvL3.maxPerVisit"
   },
   "persist": "nsvStore:nsvL3",
   "advanced": false
  },
  {
   "id": "initiative.maxConsecutive",
   "label": "Most in a row",
   "help": "Unprompted turns without the guest speaking in between. Ships at 1 — she never stacks monologues. Zero is a real zero.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 5,
   "step": 1,
   "category": "initiative",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l3-seam",
   "blastRadius": "after this many in a row she waits for the guest's turn — the guest always outranks her",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvL3.maxConsecutive"
   },
   "persist": "nsvStore:nsvL3",
   "advanced": false
  },
  {
   "id": "initiative.minIntervalSeconds",
   "label": "Space between speak-ups (seconds)",
   "help": "Minimum gap between unprompted turns. Ships at 120; floor 30 (the clamp lives in the stage's read path).",
   "type": "range",
   "default": 120,
   "min": 30,
   "max": 3600,
   "step": 5,
   "category": "initiative",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l3-seam",
   "blastRadius": "timing only — a due speak-up inside the gap refuses loudly in her ledger, never silently",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvL3.minIntervalMs",
    "scale": 1000,
    "unit": "s"
   },
   "persist": "nsvStore:nsvL3",
   "advanced": false
  },
  {
   "id": "initiative.utterMaxSeconds",
   "label": "Longest speak-up (seconds)",
   "help": "Her unprompted answer's audio budget before the honest cut-off. Ships at 20; hard ceiling 45 (the clamp lives in the stage's read path).",
   "type": "range",
   "default": 20,
   "min": 0,
   "max": 45,
   "step": 1,
   "category": "initiative",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l3-seam",
   "blastRadius": "past the budget she is cut off mid-sentence, honestly logged — a shorter budget cuts sooner, never cheaper per turn",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvL3.utterMaxMs",
    "scale": 1000,
    "unit": "s"
   },
   "persist": "nsvStore:nsvL3",
   "advanced": false
  },
  {
   "id": "initiative.maxTokens",
   "label": "Speak-up token cap",
   "help": "The response token cap her unprompted turn carries on the wire. Ships at 300; ceiling 1000. The audio-length budget above is the belt if a model ignores it.",
   "type": "range",
   "default": 300,
   "min": 10,
   "max": 1000,
   "step": 10,
   "category": "initiative",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l3-seam",
   "blastRadius": "caps what one unprompted turn can spend in tokens — smaller is cheaper and shorter",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvL3.maxTokens"
   },
   "persist": "nsvStore:nsvL3",
   "advanced": false
  },
  {
   "id": "initiative.factTtlSeconds",
   "label": "Fact freshness (seconds)",
   "help": "A noticed fact older than this can no longer fire a speak-up. Ships at 600; floor 60 (the clamp lives in the stage's read path).",
   "type": "range",
   "default": 600,
   "min": 60,
   "max": 3600,
   "step": 30,
   "category": "initiative",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l3-seam",
   "blastRadius": "a veto row, not a spend — stale observations are judged noise and refused in her ledger",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvL3.factTtlMs",
    "scale": 1000,
    "unit": "s"
   },
   "persist": "nsvStore:nsvL3",
   "advanced": false
  },
  {
   "id": "initiative.sleepPhrase",
   "label": "The sleep phrase",
   "help": "Saying this in a call pauses her speak-up lane for the visit. Ships as: quiet time. Pause-only by law: a mishearing can silence her — it can never enable her, never write settings, never spend.",
   "type": "text",
   "default": "quiet time",
   "maxLen": 60,
   "category": "initiative",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l3-seam",
   "blastRadius": "an always-on spoken off-switch — matched as folded substring on finalized transcripts only; pause-only, never persists",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvL3.sleepPhrase"
   },
   "persist": "nsvStore:nsvL3",
   "advanced": false
  },
  {
   "id": "initiative.quietHoursStart",
   "label": "Quiet hours start (HH:MM)",
   "help": "From this time she refuses to speak up — LOCAL DEVICE TIME: her clock is this device's clock, travel moves it. Leave empty for no quiet hours. Overnight windows (start after end) are legal.",
   "type": "text",
   "default": "",
   "maxLen": 5,
   "category": "initiative",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l3-seam",
   "blastRadius": "inside the window the lane refuses loudly in her ledger (l3-quiet-hours) — never a silent degrade",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvL3.quietHours.start"
   },
   "persist": "nsvStore:nsvL3",
   "advanced": true
  },
  {
   "id": "initiative.quietHoursEnd",
   "label": "Quiet hours end (HH:MM)",
   "help": "Until this time she refuses to speak up — LOCAL DEVICE TIME, same clock, same honesty. Leave empty for no quiet hours.",
   "type": "text",
   "default": "",
   "maxLen": 5,
   "category": "initiative",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l3-seam",
   "blastRadius": "inside the window the lane refuses loudly in her ledger (l3-quiet-hours) — never a silent degrade",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvL3.quietHours.end"
   },
   "persist": "nsvStore:nsvL3",
   "advanced": true
  },
  {
   "id": "presence.r8Enabled",
   "label": "Rest word (sleep/wake)",
   "help": "When ON, the guest can say the sleep phrase to settle her to a quiet rest — motion softens, the mic stays live, and any word (or the wake word, typed) wakes her. Never a paid reply. Ships OFF.",
   "type": "toggle",
   "default": false,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r8-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "RestWord.dials.r8Enabled"
   },
   "persist": "overlay",
   "advanced": false
  },
  {
   "id": "presence.r8RestAfterMs",
   "label": "Rest after quiet (ms)",
   "help": "In-call quiet before she settles on her own. 0 means the instant the quiet clock opens — a real zero, not off.",
   "type": "range",
   "default": 180000,
   "min": 0,
   "max": 900000,
   "step": 5000,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r8-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "RestWord.dials.r8RestAfterMs"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.r8SettleMs",
   "label": "Settle arc (ms)",
   "help": "How long the settle takes. 0 snaps straight to rest.",
   "type": "range",
   "default": 900,
   "min": 0,
   "max": 4000,
   "step": 50,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r8-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "RestWord.dials.r8SettleMs"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.r8RouseMs",
   "label": "Wake arc (ms)",
   "help": "How long the wake-up takes. 0 is instant.",
   "type": "range",
   "default": 420,
   "min": 0,
   "max": 2000,
   "step": 20,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r8-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "RestWord.dials.r8RouseMs"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.r8WordHoldMs",
   "label": "Written word hold (ms)",
   "help": "How long the written presence line stays on the stage. 0 means badge only — a deliberate silent rest.",
   "type": "range",
   "default": 4000,
   "min": 0,
   "max": 20000,
   "step": 500,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r8-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "RestWord.dials.r8WordHoldMs"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.r8SpokenTier",
   "label": "Spoken rest word",
   "help": "Whether going-to-rest may ever be SPOKEN through the initiative lane. Structurally off until that lane exists on this stage; the written word is always free.",
   "type": "select",
   "default": "off",
   "enum": "r8SpokenTiers",
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r8-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "RestWord.dials.r8SpokenTier"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.r8MaxSpokenPerCall",
   "label": "Spoken rest words per call",
   "help": "Inner cap on the spoken tier. 0 = armed but never spends this call. The tighter cap always wins.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 4,
   "step": 1,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r8-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "RestWord.dials.r8MaxSpokenPerCall"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.r8SleepPhrase",
   "label": "Sleep phrase",
   "help": "The guest’s words that settle her to rest — matched as a case- and punctuation-folded phrase in anything the guest says or types. Empty turns the phrase trigger off; the quiet timer and the tap still work.",
   "type": "text",
   "default": "quiet time",
   "maxLen": 64,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r8-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "RestWord.dials.r8SleepPhrase"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.r8WakePhrase",
   "label": "Wake phrase",
   "help": "The typed/tool wake word. Spoken wake needs no phrase — any guest speech wakes her, always.",
   "type": "text",
   "default": "wake up",
   "maxLen": 64,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "r8-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "RestWord.dials.r8WakePhrase"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.a4Reread",
   "label": "Presence dials re-read each beat",
   "help": "When 1, a calmer presence dial takes effect on the NEXT beat instead of the next reschedule — pull-in only, floors always win. Ships ON at 1.",
   "type": "range",
   "default": 1,
   "min": 0,
   "max": 1,
   "step": 1,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a4-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresenceSense.dials.a4Reread"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.a4MaxConsecutive",
   "label": "Free presence moments in a row",
   "help": "How many free presence moments (grace, wait escalation, wake orientation) she may take per lane before a guest turn resets the count. 0 means armed-but-never-fires. Ships ON at 2.",
   "type": "range",
   "default": 2,
   "min": 0,
   "max": 9,
   "step": 1,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a4-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresenceSense.dials.a4MaxConsecutive"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.a4ConsecutiveDecayMs",
   "label": "Consecutive-cap time decay",
   "help": "Milliseconds after which the consecutive count forgives on its own. 0 is the shipped truth: time never forgives — only the guest does.",
   "type": "range",
   "default": 0,
   "min": 0,
   "max": 600000,
   "step": 5000,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a4-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresenceSense.dials.a4ConsecutiveDecayMs"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.a4WaitMs",
   "label": "Guest-wait open threshold",
   "help": "How long a silent, owing stretch (she is thinking, a question hangs unanswered, a tool call is outstanding) runs before the wait ladder opens. 0 opens instantly.",
   "type": "range",
   "default": 12000,
   "min": 0,
   "max": 120000,
   "step": 500,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a4-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresenceSense.dials.a4WaitMs"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.a4WaitMaxStep",
   "label": "Wait-ladder escalation steps",
   "help": "How far the mechanical wait ladder may escalate: 0 = telemetry only (computed and ledgered, zero motion), 1 = orientation, 2 = whole-body acknowledgment. HELD is terminal — she never nags. Ships OFF.",
   "type": "range",
   "default": 0,
   "min": 0,
   "max": 2,
   "step": 1,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a4-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresenceSense.dials.a4WaitMaxStep"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.a4WaitStepMs",
   "label": "Gap between escalation steps",
   "help": "Milliseconds between ladder steps. Clamped band — 1000 is the floor; a zero step gap is not legal.",
   "type": "range",
   "default": 15000,
   "min": 1000,
   "max": 120000,
   "step": 500,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a4-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresenceSense.dials.a4WaitStepMs"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.a4EscalateIntensity",
   "label": "Escalation intensity",
   "help": "How strongly the ladder and wake gestures perform. 0 is a real zero — the verbs fire at nothing.",
   "type": "range",
   "default": 0.9,
   "min": 0,
   "max": 1.5,
   "step": 0.05,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a4-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresenceSense.dials.a4EscalateIntensity"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.a4ScanDepth",
   "label": "Unanswered-question scan depth",
   "help": "How many recent guest/reply pairs the structural question scan walks, newest first. 0 turns the scan result to none — a real zero.",
   "type": "range",
   "default": 6,
   "min": 0,
   "max": 20,
   "step": 1,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a4-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresenceSense.dials.a4ScanDepth"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.a4QuestionTtlMs",
   "label": "Unanswered-question shelf life",
   "help": "A hanging question older than this is stale and never flagged. 0 means no shelf life — a real zero.",
   "type": "range",
   "default": 600000,
   "min": 0,
   "max": 3600000,
   "step": 10000,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a4-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresenceSense.dials.a4QuestionTtlMs"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.a4Wake",
   "label": "Wake orientation on return",
   "help": "When 1, a guest returning after the wake gap is met with a free orientation moment — motion only, never a paid turn. Ships OFF.",
   "type": "range",
   "default": 0,
   "min": 0,
   "max": 1,
   "step": 1,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a4-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresenceSense.dials.a4Wake"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "presence.a4WakeGapMs",
   "label": "Wake gap",
   "help": "How long she must not have seen a call end before the next call start counts as a return. 0 means every return qualifies — a real zero.",
   "type": "range",
   "default": 21600000,
   "min": 0,
   "max": 2592000000,
   "step": 3600000,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a4-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresenceSense.dials.a4WakeGapMs"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a3-seam",
   "persist": "nsvStore:nsvExp",
   "advanced": false,
   "type": "toggle",
   "default": false,
   "id": "exp.record",
   "label": "Remember her own experience",
   "help": "Keeps a private, call-scoped record of what happened to her — what you said, what she said, what got interrupted, what a tool did, when her body needed a rest. It is never stored and it dies with the call. Ships OFF.",
   "blastRadius": "the master switch for the whole lane: OFF means the bus records nothing and changes nothing",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvExp.record"
   }
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a3-seam",
   "persist": "nsvStore:nsvExp",
   "advanced": false,
   "type": "toggle",
   "default": false,
   "id": "exp.wire",
   "label": "Let her use that record in the call",
   "help": "When on, a few of those moments ride the turn you already started, so she can refer back to them. It never starts a turn of its own and it never spends. Ships OFF.",
   "blastRadius": "LOUD: this is the only dial that puts bus content in front of the model. It rides an existing turn and adds no paid send, but it does change what she is told.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvExp.wire"
   }
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a3-seam",
   "persist": "nsvStore:nsvExp",
   "advanced": false,
   "id": "exp.echoMode",
   "label": "How much of her own answer she records",
   "type": "select",
   "default": "off",
   "enum": "echoModes",
   "help": "off records none of it, short records the opening, full records the whole answer. 'off' means it is never recorded, not merely hidden. Ships OFF.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvExp.echoMode"
   }
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "a3-seam",
   "persist": "nsvStore:nsvExp",
   "advanced": true,
   "id": "exp.drainMax",
   "label": "Moments she may be handed per turn",
   "type": "range",
   "default": 6,
   "min": 0,
   "max": 24,
   "step": 1,
   "help": "The most moments that may ride any one turn. 0 hands her none this turn and keeps them waiting — it never throws them away.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvExp.drainMax"
   }
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "n1-seam",
   "persist": "nsvStore:nsvSenses",
   "advanced": false,
   "id": "sense.record",
   "label": "Let her notice things on her own",
   "type": "toggle",
   "default": true,
   "help": "She keeps a private, call-scoped record of things worth noticing — a question of hers that went unanswered, something she said she would do, a connection to something she already knows about you. Nothing is stored and nothing reaches her out loud unless the next dial is on too.",
   "blastRadius": "the master switch for the whole lane: off means no sense runs and no state is written",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvSenses.record"
   }
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "n1-seam",
   "persist": "nsvStore:nsvSenses",
   "advanced": false,
   "id": "sense.wire",
   "label": "Let her bring those up in the call",
   "type": "toggle",
   "default": false,
   "help": "When on, a few of the things she noticed can ride a turn you already started, so she can mention them. It never starts a turn of its own and it never spends. Ships OFF.",
   "blastRadius": "LOUD: this is the only dial that puts noticed facts in front of the model, and it is one half of a double gate — the experience bus must also be wired for a byte to leave.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvSenses.wire"
   }
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "n1-seam",
   "persist": "nsvStore:nsvSenses",
   "advanced": true,
   "id": "sense.unanswered",
   "label": "Notice her unanswered questions",
   "type": "toggle",
   "default": true,
   "help": "She keeps track of a question she asked that never got an answer, and can bring it back rather than letting it drop.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvSenses.unanswered"
   }
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "n1-seam",
   "persist": "nsvStore:nsvSenses",
   "advanced": true,
   "id": "sense.promise",
   "label": "Notice what she said she would do",
   "type": "toggle",
   "default": true,
   "help": "She keeps track of something she offered to do and has not done yet, so it does not quietly disappear.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvSenses.promise"
   }
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "n1-seam",
   "persist": "nsvStore:nsvSenses",
   "advanced": true,
   "id": "sense.recall",
   "label": "Notice connections to what she knows",
   "type": "toggle",
   "default": true,
   "help": "When the conversation touches something she already knows about you, she notices the connection.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvSenses.recall"
   }
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "n1-seam",
   "persist": "nsvStore:nsvSenses",
   "advanced": true,
   "id": "sense.contra",
   "label": "Notice mismatches with what she has",
   "type": "toggle",
   "default": true,
   "help": "When something said does not match what she already has on file, she notices. Registered but not active in this version — there is nothing typed on file to compare against yet.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvSenses.contra"
   }
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "n1-seam",
   "persist": "nsvStore:nsvSenses",
   "advanced": true,
   "id": "sense.stalled",
   "label": "Notice a flow left sitting",
   "type": "toggle",
   "default": true,
   "help": "When something you started together has been sitting a while, she notices. Registered but not active in this version — no flow reports to it yet.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvSenses.stalled"
   }
  },
  {
   "category": "persona",
   "rail": "AGENT",
   "capabilityRequires": [],
   "availableWhen": "r45-seam",
   "persist": "overlay",
   "advanced": true,
   "id": "memory.fold",
   "label": "Sharper memory recall",
   "help": "Turns on a stricter, better-aimed way of choosing what she remembers about you and brings into a conversation. Ships OFF. With it off she behaves exactly as she does today.",
   "mapsTo": {
    "surface": "stage-session",
    "path": "AliveGuestMemory.foldDials.fold"
   },
   "type": "toggle",
   "default": false,
   "blastRadius": "the master switch for the whole memory fold: off means both injection products are byte-identical to today"
  },
  {
   "category": "persona",
   "rail": "AGENT",
   "capabilityRequires": [],
   "availableWhen": "r45-seam",
   "persist": "overlay",
   "advanced": true,
   "id": "memory.bestMatchOnly",
   "label": "Bring up only the single best thing",
   "help": "Instead of several remembered notes, she brings in only the one that best fits what you are talking about. Ships OFF.",
   "mapsTo": {
    "surface": "stage-session",
    "path": "AliveGuestMemory.foldDials.bestMatchOnly"
   },
   "type": "toggle",
   "default": false
  },
  {
   "category": "persona",
   "rail": "AGENT",
   "capabilityRequires": [],
   "availableWhen": "r45-seam",
   "persist": "overlay",
   "advanced": true,
   "id": "memory.laneFilter",
   "label": "Which remembered notes count",
   "help": "off uses everything she has. soft prefers things you told her over things she worked out for herself. strict uses only what you told her or corrected. Ships at off.",
   "mapsTo": {
    "surface": "stage-session",
    "path": "AliveGuestMemory.foldDials.laneFilter"
   },
   "type": "select",
   "default": "off",
   "enum": "memoryLaneFilter"
  },
  {
   "category": "persona",
   "rail": "AGENT",
   "capabilityRequires": [],
   "availableWhen": "r45-seam",
   "persist": "overlay",
   "advanced": true,
   "id": "memory.retrievalDepth",
   "label": "How far back she reaches",
   "help": "How many layers of memory she consults, 1 to 4. 4 is today's behaviour. Lower numbers drop the shallowest layers first, so the most durable things she knows are the last to go.",
   "mapsTo": {
    "surface": "stage-session",
    "path": "AliveGuestMemory.foldDials.retrievalDepth"
   },
   "type": "range",
   "default": 4,
   "min": 1,
   "max": 4,
   "step": 1
  },
  {
   "category": "persona",
   "rail": "AGENT",
   "capabilityRequires": [],
   "availableWhen": "r45-seam",
   "persist": "overlay",
   "advanced": true,
   "id": "memory.capEnforce",
   "label": "Hold memory to its size budget",
   "help": "Trims what she brings into a conversation to its stated size instead of merely aiming for it. Ships OFF.",
   "mapsTo": {
    "surface": "stage-session",
    "path": "AliveGuestMemory.foldDials.capEnforce"
   },
   "type": "toggle",
   "default": false
  },
  {
   "id": "body.motion.eyeIdle",
   "label": "Alive eyes between blinks",
   "type": "toggle",
   "default": false,
   "help": "Gives her eyes the small movements real eyes make when nothing is happening — blink timing that shifts with her attention, a slow drift in the lids, and the tiny fixation jumps eyes make even while holding your gaze. Ships OFF.",
   "blastRadius": "her eyes only: blink cadence, lid level and the gaze aim point. It writes no bone, no verb and no channel, and it never starts a turn.",
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "eye-idle-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.eyeIdleMode"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "tool-timing-seam",
   "persist": "nsvStore:nsvToolTiming",
   "advanced": true,
   "id": "toolTiming.master",
   "label": "Land her gestures on the words",
   "type": "select",
   "default": "default",
   "enum": "nsvToolTimingMaster",
   "help": "When on, a gesture she calls for mid-sentence happens at the point in the sentence she meant it, instead of all at once when she starts talking. Ships OFF.",
   "blastRadius": "re-times WHEN accepted gestures fire within one response. It authors no motion, adds no send, and never drops a call the runtime accepted.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvToolTiming.master"
   }
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "tool-timing-seam",
   "persist": "nsvStore:nsvToolTiming",
   "advanced": true,
   "id": "toolTiming.releasePerDelta",
   "label": "Gestures released per beat",
   "type": "range",
   "default": 1,
   "min": 1,
   "max": 3,
   "step": 1,
   "help": "How many queued gestures may fire on each beat of her speech. 1 spaces them out most naturally.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvToolTiming.releasePerDelta"
   }
  },
  {
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "tool-timing-seam",
   "persist": "nsvStore:nsvToolTiming",
   "advanced": true,
   "id": "toolTiming.queueCap",
   "label": "Gestures held at once",
   "type": "range",
   "default": 8,
   "min": 2,
   "max": 16,
   "step": 1,
   "help": "How many gestures may wait for their moment before the oldest one fires early. It is a spacing bound, not a limit on how many can happen.",
   "mapsTo": {
    "surface": "nsv",
    "path": "nsvToolTiming.queueCap"
   }
  },
  {
   "id": "security.b2InputFence",
   "label": "External-input fence",
   "type": "toggle",
   "default": false,
   "help": "Routes every piece of outside text — what she remembers about a guest, uploaded model names, pack notes — through one labelled-data fence before it can reach her instructions. Ships OFF.",
   "blastRadius": "LOUD: it changes how outside text reaches her instructions. It is the guardrail the streamer-mode chain waits on.",
   "category": "security",
   "rail": "AGENT",
   "capabilityRequires": [],
   "availableWhen": "live",
   "mapsTo": {
    "surface": "stage-session",
    "path": "NsvInputFence.mode"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "body.motion.armVariety",
   "label": "Varied talking gestures",
   "type": "range",
   "default": 0,
   "min": 0,
   "max": 1,
   "step": 0.005,
   "help": "Her talking gestures draw from three shapes instead of one — an open-palm lift, a reach, and a short sharp beat — and none repeats until all three have played. 0 is the single shape she uses today. Ships at 0.",
   "blastRadius": "the shape of an arm gesture she already makes while speaking: how far the elbow follows, how far forward the reach goes, and how fast the stroke lands. It adds no new gesture, fires on no new trigger, changes no timing budget, and never starts a turn.",
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [
    "shoulders"
   ],
   "availableWhen": "body-life-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.armVariety"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "body.motion.idleFlow",
   "label": "She sways when she is quiet",
   "type": "range",
   "default": 0,
   "min": 0,
   "max": 1,
   "step": 0.005,
   "help": "The slow three-way torso sway she already has while talking, kept running while she listens and waits. Without it she moves when she speaks and stands still the rest of the time. 0 is today's still baseline. Ships at 0.",
   "blastRadius": "her waist, lean and torso twist while she is NOT speaking, within the same few degrees the talking sway already uses. It writes no arm, no head and no verb, it eases out under any deliberate move, and it stops dead in reduced-motion, statue and hidden.",
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "body-life-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.idleFlow"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "body.motion.ambientDuck",
   "label": "Her idle life ducks under speech",
   "type": "range",
   "default": 0,
   "min": 0,
   "max": 1,
   "step": 0.005,
   "help": "Today her small idle movements switch off completely the moment she speaks. This lets a weight shift through at half size while she talks — quieter, not gone. 0 is today's full stop. Ships at 0.",
   "blastRadius": "one idle act — a weight shift on her feet — becoming eligible during speech at half amplitude and a longer spacing. Every other gate stays: it never fires while hidden, seated, mid-transition, in reduced motion, or over a deliberate act, and it never resets her quiet clock or starts a turn.",
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "body-life-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.ambientDuck"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "body.motion.touchArm",
   "label": "She answers touch with her arms",
   "type": "range",
   "default": 0,
   "min": 0,
   "max": 1.5,
   "step": 0.005,
   "help": "Touch her and her arms come up — a cover, a guard, or a quick swat — instead of only a head turn and a flinch. 0 is today's head-and-shoulders answer. Ships at 0.",
   "blastRadius": "an arm arc layered on the touch reaction she already plays, on the side that was touched. It only rides a touch the engine ALREADY accepted, it yields to any deliberate act holding that shoulder, it needs a body with shoulders, and it adds no new expression to her vocabulary file.",
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [
    "shoulders"
   ],
   "availableWhen": "body-life-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.touchArm"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "body.motion.ampFloor",
   "label": "Small moves stay visible",
   "type": "range",
   "default": 0,
   "min": 0,
   "max": 1,
   "step": 0.005,
   "help": "A gentle move still has to be big enough to see. This sets the smallest size a deliberate movement may play at — it makes the move bigger, never slower. 0 means no floor, exactly as today. Ships at 0.",
   "blastRadius": "the amplitude of one-shot expressions that would otherwise play below the visible band. Continuous ambient loops are exempt on purpose — their quiet is deliberate. It never changes how long a move takes, and it never grants a move the engine refused.",
   "category": "body.motion",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "body-life-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "REST.ampFloor"
   },
   "persist": "overlay",
   "advanced": true
  },
  {
   "id": "l1.perModelPacks",
   "label": "Per-body identity packs (Level 1)",
   "help": "When ON, each body on the rack loads its own Level-1 identity pack instead of the single default pack. A body with no pack of its own falls back to the default. Level-1 stays gated — this changes WHICH pack resolves, never who may open the lane. Ships OFF.",
   "blastRadius": "which gated Level-1 identity text rides her persona after a body swap. No new data leaves the browser, no new spend, no new stored key, and the gate itself is untouched.",
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "l1-seam",
   "mapsTo": {
    "surface": "stage-session",
    "path": "L1.dials.perModel"
   },
   "persist": "overlay",
   "advanced": true,
   "type": "toggle",
   "default": false
  },
  {
   "id": "presence.fenceEnabled",
   "label": "Hold reminders during quiet hours",
   "help": "When ON, a reminder that comes due inside your quiet hours — or while she is resting — waits instead of arriving. It is never cancelled: it lands the moment the window opens, and the reminders chip keeps showing you it is still held. Ships OFF. Quiet hours are set on the speak-up rows and read from this device's own clock.",
   "type": "toggle",
   "default": false,
   "category": "presence",
   "rail": "BEHAVIOUR",
   "capabilityRequires": [],
   "availableWhen": "pf-seam",
   "blastRadius": "$0 and subtractive only — this dial can delay a reminder, never create one, never spend, never speak. A held reminder is never deleted: the stage's once-law removal happens at delivery, so a reminder it withholds is simply never delivered yet.",
   "mapsTo": {
    "surface": "stage-session",
    "path": "PresencePolicy.dials.pfEnabled"
   },
   "persist": "overlay",
   "advanced": false
  }
 ],
 "metaDials": [
  {
   "id": "meta.warmth",
   "left": "Edge",
   "right": "Warmth",
   "rows": [
    {
     "field": "mood.default",
     "map": "band",
     "bands": [
      [
       -1,
       -0.335,
       "serious"
      ],
      [
       -0.335,
       0.335,
       "neutral"
      ],
      [
       0.335,
       1,
       "warm"
      ]
     ]
    },
    {
     "field": "rest.wrX",
     "map": "affine",
     "k": 0.05,
     "b": 0.12
    },
    {
     "field": "rest.thumbIn",
     "map": "affine",
     "k": 0.2,
     "b": 1
    },
    {
     "field": "rest.splay",
     "map": "affine",
     "k": -0.1,
     "b": 0.55
    }
   ]
  },
  {
   "id": "meta.energy",
   "left": "Calm",
   "right": "Energy",
   "rows": [
    {
     "field": "rest.micro",
     "map": "affine",
     "k": 0.5,
     "b": 1
    },
    {
     "field": "rest.arc",
     "map": "affine",
     "k": 0.25,
     "b": 1
    },
    {
     "field": "rest.knee",
     "map": "affine",
     "k": 0.03,
     "b": 0.05
    },
    {
     "field": "presence.drawWindowK",
     "map": "affine",
     "k": -0.3,
     "b": 1,
     "availableWhen": "r1-published"
    }
   ]
  },
  {
   "id": "meta.life",
   "left": "Stillness",
   "right": "Life",
   "rows": [
    {
     "field": "rest.looseness",
     "map": "affine-clamped",
     "k": 0.35,
     "b": 0.35,
     "min": 0,
     "max": 1
    },
    {
     "field": "rest.overlap",
     "map": "affine",
     "k": 0.4,
     "b": 1
    },
    {
     "field": "rest.regionHead",
     "map": "affine",
     "k": 0.3,
     "b": 1
    },
    {
     "field": "rest.regionArms",
     "map": "affine",
     "k": 0.3,
     "b": 1
    }
   ]
  }
 ],
 "tiers": [
  {
   "id": "tier.quietStage",
   "question": "How lively should she be when nobody is talking?",
   "help": "One question that sets several presence dials at once. Pick a feel; open the dials to see exactly what moved. Hand-tuning any of them shows custom.",
   "category": "presence",
   "options": [
    {
     "id": "subtle",
     "label": "Subtle — mostly still",
     "sets": {
      "presence.drawWindowK": 2,
      "presence.idleWindowK": 1.5,
      "presence.graceIntensity": 0.2
     }
    },
    {
     "id": "balanced",
     "label": "Balanced — the shipped feel",
     "sets": {
      "presence.drawWindowK": 1,
      "presence.idleWindowK": 1,
      "presence.graceIntensity": 0.35
     }
    },
    {
     "id": "lively",
     "label": "Lively — visibly present",
     "sets": {
      "presence.drawWindowK": 0.6,
      "presence.idleWindowK": 0.7,
      "presence.graceIntensity": 0.6
     }
    }
   ]
  }
 ],
 "serviceCategories": [
  {
   "id": "body",
   "label": "Her body",
   "exclusive": true,
   "fields": [
    "model.pointer"
   ],
   "activeFrom": "nsvVrmLastModel"
  },
  {
   "id": "voice",
   "label": "Her voice",
   "exclusive": true,
   "fields": [],
   "cardLine": "one realtime voice lane today, on the stage behind the demo gate — more voices arrive later",
   "note": "ONE realtime lane exists today (walt-gated, on the stage). No fake options — the card states the one lane honestly; more lanes arrive with breadth round B4."
  }
 ],
 "consoleLanes": [
  {
   "id": "store",
   "label": "storage",
   "hue": "amber",
   "source": "panel",
   "availableWhen": "live"
  },
  {
   "id": "gate",
   "label": "gate",
   "hue": "violet",
   "source": "panel",
   "availableWhen": "live"
  },
  {
   "id": "agents",
   "label": "agents",
   "hue": "blue",
   "source": "panel",
   "availableWhen": "live"
  },
  {
   "id": "apply",
   "label": "apply",
   "hue": "green",
   "source": "panel",
   "availableWhen": "live"
  },
  {
   "id": "import",
   "label": "import",
   "hue": "red",
   "source": "panel",
   "availableWhen": "live"
  },
  {
   "id": "census",
   "label": "library",
   "hue": "teal",
   "source": "panel",
   "availableWhen": "live"
  },
  {
   "id": "refusals",
   "label": "her refusals",
   "hue": "rose",
   "source": "stage",
   "availableWhen": "live"
  },
  {
   "id": "facts",
   "label": "turn facts",
   "hue": "cyan",
   "source": "stage",
   "availableWhen": "live"
  },
  {
   "id": "drive",
   "label": "drive log",
   "hue": "grey",
   "source": "stage",
   "availableWhen": "live"
  }
 ],
 "connections": {
  "note": "P0 §4.4 (B3): the multimedia/IoT connection rows — shipped EMPTY (the presets reserved-bundle-slot precedent). The stage connections sheet renders these rows as TEXT (name + status sentence) with availableWhen honesty; a connection with no live transport NEVER renders as connected. Real transports are shell-track / books items.",
  "rows": []
 }
}
