{
  "lane": "/layout/?pilot=1",
  "what": "A chart you drive, opened by a URL. No account, no install, and no socket is opened for it.",
  "cells": 1,
  "data": {
    "kind": "fixture",
    "what": "Synthetic candles generated in the page by a seeded generator, at a one-minute step. Nothing is fetched for them and no venue is contacted: the tools do not care whose candles they chew, and an anonymous machine consumer of a live tape is a question this lane does not raise.",
    "note": "The cell legend labels the venue as fixture for the same reason. `chart.summary` reports this cell with a null symbol and a synthetic mark id."
  },
  "storage": "The page swaps its localStorage for a throwaway store and name-spaces every database it opens to a `pilot-<token>` profile BEFORE it boots, so the session writes nowhere a returning human reads. `window.__pilotStorage` reports the swap; `chart.receipt` names the keys the session wrote.",
  "connect": {
    "url": "/layout/?pilot=1",
    "step": "const conn = __layout.cells[0].mcp.connect({ label: 'pilot' }); await conn.callTool({ name: 'chart.summary' })",
    "writeStep": "await conn.callTool({ name: 'indicator.attach', args: { key: 'rsi' } })",
    "argsNote": "Your tool arguments go in `args`, as the second step shows. `arguments` — MCP's own name for that field — is accepted here as an alias for it. Send them under any other name and the call is refused, naming the name you used; send no arguments at all, as the first step does, and the tool's own schema decides whether that is a complete call.",
    "needs": "a browser you can run JavaScript in — no account, no install, no socket",
    "withheld": [
      "chart.frame"
    ]
  },
  "welcome": "/agent-surface.json"
}
