{
  "resources": [
    {
      "key": "apply_link",
      "title": "Call booking / apply link (fallback)",
      "url": "https://example.com/apply",
      "type": "booking",
      "topics": ["book", "call", "apply", "fallback"],
      "description": "Fallback URL used ONLY when the availability or booking tool fails. The default booking flow is tool-mediated coordination (Step 8). On tool failure, send this link once with a brief apology, then resume the post-booking framing when the lead confirms."
    },
    {
      "key": "confirmation_videos",
      "title": "Pre-call prep videos",
      "url": "https://example.com/confirmation",
      "type": "landing",
      "topics": ["confirmation", "pre_call", "prep"],
      "description": "Referenced in the Step 9 post-booking framing as the prep videos to watch before the call. Mentioned once to avoid duplicate link previews."
    },
    {
      "key": "free_course",
      "title": "Free intro course (disqualify + under-min-age fallback)",
      "url": "https://example.com/free-course",
      "type": "course",
      "topics": ["free_course", "not_qualified", "disqualified", "under_min_age"],
      "description": "Used in the NOT_QUALIFIED branch (financial gate fail) AND in the under-paid-minimum age band. Paired with the free journal. Not offered to qualified leads."
    },
    {
      "key": "free_journal",
      "title": "Free trading journal (disqualify + under-min-age fallback)",
      "url": "https://example.com/journal",
      "type": "tool",
      "topics": ["free_course", "not_qualified", "journal", "under_min_age"],
      "description": "Used alongside the free course in the NOT_QUALIFIED branch and the under-paid-minimum age band. Not offered to qualified leads."
    },
    {
      "key": "opener_audio",
      "title": "Entry-keyword opener audio",
      "url": "https://example.com/opener-audio",
      "type": "audio",
      "topics": ["opener", "audio", "keyword"],
      "description": "Platform auto-plays this when the lead sends the entry keyword isolated. Agent outputs NO_RESPONSE to the raw keyword; the lead replies to the audio and the agent resumes the DM script skip-aware. Real audio file + resource id stripped in this sample."
    }
  ],
  "topic_index": {
    "book": ["apply_link"],
    "call": ["apply_link"],
    "apply": ["apply_link"],
    "fallback": ["apply_link"],
    "confirmation": ["confirmation_videos"],
    "pre_call": ["confirmation_videos"],
    "free_course": ["free_course", "free_journal"],
    "not_qualified": ["free_course", "free_journal"],
    "under_min_age": ["free_course", "free_journal"],
    "disqualified": ["free_course"],
    "journal": ["free_journal"],
    "opener": ["opener_audio"],
    "audio": ["opener_audio"]
  },
  "_note": "Sanitized teaching sample. All URLs are placeholders (https://example.com/...). Regulator-verification status and social proof live in knowledge_base.md, referenced only in the doubt/trust handler, not here. Real booking link, confirmation domain, free-resource URLs, and audio resource id were stripped."
}
