{
  "version": 3,
  "purpose": "Primary agent entry for Sportyland section codes. On-screen badges are HIDDEN — never infer sections from screenshots alone.",
  "url": "https://sportyland.jmautomated.com",
  "agent_method": {
    "mandatory_order": [
      "1. GET /portal-index.json (this file) — namespaces + dock legend",
      "2. GET /section-map.json — full per-view section catalog",
      "3. With browser/Playwright: after app.js loads, parse #portalAgentState (application/json, always in DOM)",
      "4. Map Jorge feedback to codes from step 3 — never guess MD/SD as landing § numbers"
    ],
    "no_browser_fallback": "Use demo URLs (/?demo=member, /?demo=staff) and tables below; cross-check role before editing M* vs S* files",
    "visual_debug": "Humans only: ?debug=sections shows pills; ?debug=off hides. Agents must not rely on visible pills."
  },
  "namespaces": {
    "landing": {
      "pattern": "0–7 (digits only, guest portada)",
      "jorge_says": "§N or 'section N' on the homepage — e.g. §3 = Deportes cards, §5 = Portal features",
      "never_confuse_with": "MD* or SD* (those are dock tabs inside the app)"
    },
    "view": {
      "pattern": "Letter prefix + number — M*, S*, C*, CL*, P*, T*, U*, SO*, ST*, K*, A*, L*",
      "jorge_says": "M3 = member home accesos grid; S1 = staff bandeja stats — always check role first",
      "never_confuse_with": "Landing §5 (portal cards) vs M1 (member saludo) vs MD1 (dock Inicio)"
    },
    "dock": {
      "pattern": "MD1–MD5 (member) or SD1–SD5 (staff) — bottom nav tabs only",
      "jorge_says": "'MD2' = member dock Canchas tab, not a page section block",
      "never_confuse_with": "Landing sections or in-view M2/S2 blocks"
    },
    "chrome": {
      "pattern": "0 = topbar, 7 = footer — on every guest view",
      "note": "Also present in portal views when landing/login chrome is hidden"
    }
  },
  "role_detection": {
    "primary": "#portalAgentState.role → guest | member | staff",
    "secondary": "body[data-portal-role], body[data-portal-view], body[data-portal-route]",
    "demo_urls": {
      "member": "/?demo=member",
      "staff": "/?demo=staff",
      "guest": "/"
    },
    "rule": "If role=member, only M*/C*/CL*/P*/T*/U*/MD* apply. If role=staff, only S*/SO*/ST*/K*/A*/SD* apply."
  },
  "code_legend": {
    "0": "Top bar (chrome)",
    "7": "Footer (chrome)",
    "1-6": "Landing body sections only (guest)",
    "L*": "Login view only",
    "M*": "Member home — never staff",
    "C*": "Member canchas",
    "CL*": "Member clases",
    "P*": "Member privada",
    "T*": "Member tiendita",
    "U*": "Member cuenta",
    "S*": "Staff bandeja home — never member",
    "SO*": "Staff canchas",
    "ST*": "Staff clases hoy",
    "K*": "Staff pedidos/cocina",
    "A*": "Staff avisos",
    "MD*": "Member dock tab — not a content section",
    "SD*": "Staff dock tab — not a content section"
  },
  "landing_sections": {
    "0": { "code": "0", "name": "Topbar", "namespace": "chrome" },
    "1": { "code": "1", "name": "Hero video", "namespace": "landing" },
    "2": { "code": "2", "name": "IG carousel", "namespace": "landing" },
    "3": { "code": "3", "name": "Deportes — 5 service cards", "namespace": "landing" },
    "4": { "code": "4", "name": "Coaches", "namespace": "landing" },
    "5": { "code": "5", "name": "Portal features — 6 cards", "namespace": "landing" },
    "6": { "code": "6", "name": "Demo CTA", "namespace": "landing" },
    "7": { "code": "7", "name": "Footer", "namespace": "chrome" }
  },
  "dock": {
    "member": {
      "prefix": "MD",
      "namespace": "dock",
      "tabs": [
        { "code": "MD1", "route": "home", "label": "Inicio", "view": "member-home", "opens_sections": "M1–M5" },
        { "code": "MD2", "route": "courts", "label": "Canchas", "view": "member-courts", "opens_sections": "C1–C4" },
        { "code": "MD3", "route": "classes", "label": "Clases", "view": "member-classes", "opens_sections": "CL1–CL4" },
        { "code": "MD4", "route": "snacks", "label": "Tiendita", "view": "member-snacks", "opens_sections": "T1–T4" },
        { "code": "MD5", "route": "account", "label": "Cuenta", "view": "member-account", "opens_sections": "U1–U3" }
      ]
    },
    "staff": {
      "prefix": "SD",
      "namespace": "dock",
      "tabs": [
        { "code": "SD1", "route": "home", "label": "Bandeja", "view": "staff-home", "opens_sections": "S1–S5" },
        { "code": "SD2", "route": "classes", "label": "Hoy", "view": "staff-classes", "opens_sections": "ST1–ST4" },
        { "code": "SD3", "route": "snacks", "label": "Pedidos", "view": "staff-kitchen", "opens_sections": "K1–K4" },
        { "code": "SD4", "route": "courts", "label": "Canchas", "view": "staff-courts", "opens_sections": "SO1–SO4" },
        { "code": "SD5", "route": "admin", "label": "Avisos", "view": "staff-avisos", "opens_sections": "A1–A3" }
      ]
    }
  },
  "feedback_examples": [
    { "jorge": "§5 cards need more padding", "means": "landing_sections.5 — Portal features, NOT MD1" },
    { "jorge": "MD3 clases list", "means": "member dock Clases tab → view member-classes → CL* sections" },
    { "jorge": "M1 membresías", "means": "WRONG — M1 is saludo; membresía stats are U2 on cuenta (MD5)" },
    { "jorge": "SD1 CTA button", "means": "WRONG — SD1 is dock Bandeja; demo CTA is landing §6" },
    { "jorge": "SD4 footer", "means": "WRONG — SD4 is dock Canchas; footer is §7 / code 7" }
  ],
  "common_agent_mistakes": {
    "visible_badges": "Blue pills are hidden in production — read #portalAgentState and this file",
    "md_vs_landing": "MD1 ≠ landing §1 or §5. MD* = bottom dock only when role=member",
    "sd_vs_landing": "SD* = bottom dock only when role=staff; SD1 ≠ §6 demo CTA",
    "member_vs_staff": "M* and S* never coexist on screen — check role first",
    "section_symbol": "When Jorge writes §N, N is always a landing digit 0–7, never MD/SD"
  }
}