вариант
ДомДом Skill Другое event-prospecting

event-prospecting

browserbase/skills browserbase/skills

Принимает URL-адрес списка докладчиков конференции или мероприятия, извлекает из него имена людей, фильтрует их компании в соответствии с ICP пользователя и проводит углубленный анализ только тех докладчиков, которые представляют компании, соответствующие ICP. Выдает отчет в формате HTML, в котором на первом месте представлены данные о людях, с обоснованием «почему стоит связаться» для каждого из них.

...Расширить все
0
Обновлено время 30 сентября 2026 г.

Поиск потенциальных участников мероприятий

Введите URL-адрес конференции → получите ранжированный список людей, с которыми должен поговорить AE, с обоснованием «почему стоит связаться» для каждого человека.

Требуется: переменная среды BROWSERBASE_API_KEY и установленная командная строка browse (npm install -g browse). Используйте browse cloud ... для вызовов API и browse open / browse get markdown для страниц докладчиков с большим количеством JS-кода.

Правила работы с путями: во всех командах Bash всегда используйте полный буквальный путь — НЕ ~ и НЕ $HOME (оба вызывают запросы на подтверждение «синтаксиса расширения оболочки»). Определите домашний каталог один раз и используйте его везде. При построении запросов для субагентов заменяйте {SKILL_DIR} полным буквальным путем (обычно /Users/jay/skills/skills/event-prospecting).

Каталог вывода: весь вывод по поиску потенциальных клиентов для мероприятий направляется в ~/Desktop/{event_slug}_prospects_{YYYY-MM-DD-HHMM}/. Конечным результатом является файл index.html (люди, сгруппированные по компаниям, ранжированные по ICP компании), с файлами companies.html и people.html (с возможностью фильтрации) в качестве альтернативных представлений, а также файл results.csv для импорта в систему холодных исходящих звонков.

ВАЖНО — Ограничения инструмента (применимы к главному агенту И всем субагентам):

  • Все поиски в Интернете: используйте облачный поиск. НИКОГДА не используйте WebSearch.
  • Извлечение всего содержимого страниц: используйте узел {SKILL_DIR}/scripts/extract_page.mjs "". Этот скрипт выполняет запрос через `browse cloud fetch --output`, анализирует заголовок, мета-теги и видимый текст тела страницы, а в случае сбоя запроса или возврата скудного контента, отображаемого с помощью JS, автоматически переключается на `browse get markdown `. НИКОГДА не создавайте вручную конвейер из `browse cloud fetch` и `sed`. НИКОГДА не используйте WebFetch.
  • Все результаты исследования: субагенты создают по одному файлу Markdown на каждую компанию ИЛИ на каждого человека в папке {OUTPUT_DIR}/companies/{slug}.md или {OUTPUT_DIR}/people/{slug}.md с использованием bash heredoc. НИКОГДА не используйте инструмент Write или python3 -c. Оба формата файлов см. в фай ле references/example-research.md.
  • Сборка отчёта: используйте команду node {SKILL_DIR}/scripts/compile_report.mjs {OUTPUT_DIR} --open.
  • Подработчики должны использовать ТОЛЬКО инструмент Bash. Использование других инструментов запрещено.
  • СТРОГИЕ ОГРАНИЧЕНИЯ НА КОЛИЧЕСТВО ЗВОНКОВ: сортировка ICP = 1 звонок на компанию; углублённое исследование = 5 звонков на компанию; сбор информации о лицах = 4 звонка на человека. Подробности о соблюдении правил см. в файле references/workflow.md.

КРИТИЧЕСКИ ВАЖНО — Правила против «галлюцинаций» (применимы к главному агенту И всем субагентам):

  • НИКОГДА не делайте выводы об описании продукта (product_description), отрасли или причине должности человека (role_reason) на основе шрифтов, фреймворка, системы дизайна или типографики сайта. Эти элементы носят косметический характер и ничего не говорят о том, что продает компания или чем занимается человек.
  • НИКОГДА не допускайте, чтобы собственный ICP пользователя просачивался в описание целевого объекта. Если вы не знаете, чем занимается целевой объект, напишите «Неизвестно» — не сопоставляйте его с ICP по шаблону.
  • Описание продукта (product_description) ДОЛЖНО цитировать или перефразировать конкретную фразу из вывода файла extract_page.mjs. Если ни один из элементов TITLE/META/OG/HEADINGS/BODY не содержит узнаваемого описания продукта, укажите «Неизвестно» — контент главной страницы недоступен, а значение icp_fit_score ограничьте значением 3.
  • Хук человека ДОЛЖЕН цитировать или перефразировать конкретный результат из поискового облака (название подкаста, заголовок блога, репозиторий GitHub, аннотация доклада). Если за последние 6 месяцев не было публичных сигналов, используйте контекст мероприятия (название его доклада на данном мероприятии).

КРИТИЧЕСКИ ВАЖНО — Сведите к минимуму запросы на разрешение:

  • Подкагенты ДОЛЖНЫ объединять ВСЕ записи файлов в ОДИН вызов Bash с использованием цепочки heredoc. Один вызов Bash = один запрос на разрешение.
  • Объединяйте ВСЕ поиски и ВСЕ запросы данных в отдельные вызовы Bash с использованием цепочки операторов &&.

Обзор конвейера

Выполняйте эти 10 шагов по порядку. Не пропускайте шаги и не меняйте их порядок.

  1. Настройка — каталог вывода + «чистый лист»
  2. Загрузка профиля — чтение файла profiles/{user_slug}.json
  3. Разведка — определение платформы события
  4. Извлечение данных о людях — people.jsonl
  5. Группировка по компаниям — seed_companies.txt
  6. Сортировка по ICP — быстрая оценка на уровне компании (1 вызов на компанию)
  7. Фильтрация — компании с icp_fit_score >= --icp-threshold
  8. Углублённое исследование — полный цикл «План→Исследование→Синтез» по соответствию ICP
  9. Дополнить список докладчиков — спросить пользователя: только те, кто соответствует ICP (по умолчанию) или все докладчики
  10. Составление отчёта — HTML + CSV, открытие в браузере

Пользователь запускает навык с помощью URL-адреса, например /event-prospecting . Проанализируйте EVENT_URL из этого сообщения вызова. Значения по умолчанию: DEPTH=deep, ICP_THRESHOLD=6. USER_SLUG (профиль ICP) автоматически определяется на этапе 1 на основе имеющихся локально файлов профилей — встроенного профиля по умолчанию нет. НЕ запрашивайте у пользователя подтверждение URL — он уже его предоставил.

Шаг 0: Настройка каталога вывода

Определите каталог вывода на основе URL-адреса, предоставленного пользователем. НЕ используйте жестко заданные имена событий.

# EVENT_URL получен из сообщения вызова (то, что пользователь ввёл после `/event-prospecting`)
EVENT_SLUG=$(node -e 'const h = new URL(process.argv[1]).hostname.replace(/^www\./,""); console.log(h.split(".")[0])' "$EVENT_URL")
TIMESTAMP=$(date +%Y-%m-%d-%H%M)
OUTPUT_DIR=/Users/jay/Desktop/${EVENT_SLUG}_prospects_${TIMESTAMP}
mkdir -p "$OUTPUT_DIR/companies" "$OUTPUT_DIR/people"

Используйте полный литеральный путь к домашнему каталогу — никогда не используйте ~ или $HOME. Передавайте {OUTPUT_DIR} в качестве полного литерального пути во все запросы субагентов.

Шаг 1: Загрузка профиля пользователя

Профиль определяет ICP, по которому проводится сортировка ICP и вычисляется оценка глубокого исследования. Загрузите из {SKILL_DIR}/profiles/{user_slug}.json (общий для всех навыков GTM — имеет ту же структуру, что и company-research). example.json — это шаблон, а не реальный профиль — никогда не используйте его.

НЕ ищите профилиза пределами {SKILL_DIR}/profiles/ — никогда не обращайтесь к каталогам других навыков. Если профиль требуется в другом месте, пользователь копирует его явно.

Порядок определения:

  1. Если пользователь запустил программу с параметром --user-company , используйте этот слэг.
  2. В противном случае перечислите файлы profiles/*.json, исключив example.json. Если существует ровно один профиль, используйте его (и сообщите пользователю, какой именно). Если существует несколько, спросите у пользователя (в обычном чате), какой из них выбрать.
  3. Если профилей нет, выдайте громкое сообщение об ошибке и предложите пользователю создать профиль (скопировать файл profiles/example.json в каталог profiles/.json и заполнить его, либо запустить навык company-research, который создаст профиль автоматически).
PROFILES=$(ls {SKILL_DIR}/profiles/*.json 2>/dev/null | xargs -n1 basename | sed 's/\.json$//' | grep -v '^example$')
COUNT=$(echo "$PROFILES" | grep -c .)

if [ -z "$USER_SLUG" ]; then
  if [ "$COUNT" -eq 0 ]; then
    echo "В {SKILL_DIR}/profiles/ профилей не найдено. Скопируйте файл profiles/example.json в каталог profiles/.json и заполните его, либо запустите навык company-research, чтобы создать профиль."
    exit 1
  elif [ "$COUNT" -eq 1 ]; then
    USER_SLUG=$PROFILES
    echo "Используется единственный доступный профиль: ${USER_SLUG}"
  else
    echo "Обнаружено несколько профилей:"
    echo "$PROFILES" | sed 's/^/  - /'
    echo "Запустите скрипт заново с параметром --user-company , чтобы выбрать один из них."
    exit 1
  fi
fi

test -f {SKILL_DIR}/profiles/${USER_SLUG}.json || {
  echo "Профиль не найден: profiles/${USER_SLUG}.json"
  exit 1
}
cat {SKILL_DIR}/profiles/${USER_SLUG}.json

Профиль содержит следующие поля: company, product, icp_description, existing_customers. Они дословно вставляются в каждый последующий запрос субагента.

Шаг 2: Разведка

Определение платформы события и стратегии извлечения данных. Одна команда:

node {SKILL_DIR}/scripts/recon.mjs {EVENT_URL} {OUTPUT_DIR}

Создаёт файл {OUTPUT_DIR}/recon.json с данными о платформе, стратегии и (для Next.js) nextDataPaths. См. файл references/event-platforms.md для ознакомления с каталогом платформ и приоритетами их определения.

Ожидаемые результаты:

  • Класс Stripe Sessions (Next.js): platform: "next-data", 1–3 пути
  • Sessionize: platform: "sessionize"
  • Lu.ma / Eventbrite: platform: "luma" | "eventbrite"
  • Все остальное: platform: "custom", strategy: "markdown" (резервный вариант при отсутствии других результатов)

Шаг 3: Извлечение данных о людях

node {SKILL_DIR}/scripts/extract_event.mjs {OUTPUT_DIR} --user-company {USER_SLUG}

Считывает файл recon.json, передаёт данные в экстрактор, специфичный для конкретной платформы, записывает файл people.jsonl (один докладчик на строку) и файл seed_companies.txt (компании без дубликатов).

Флаг --user-company также исключает из списка докладчиков сотрудников организации-хозяина (например, мероприятие, организованное Stripe, исключает сотрудников Stripe) и сотрудников самого пользователя — они не являются потенциальными клиентами.

Проверьте правильность вывода:

wc -l {OUTPUT_DIR}/people.jsonl {OUTPUT_DIR}/seed_companies.txt
head -3 {OUTPUT_DIR}/people.jsonl

Если файл people.jsonl пуст или содержит менее 10 строк, значит, рекон выбрал неверную платформу — см. references/event-platforms.md и запустите процесс заново с скорректированной стратегией.

Шаг 4: Группировка по компаниям

Файл extract_event.mjs уже генерирует файл seed_companies.txt (по одной компании в строке, без дубликатов, отсортированный). Этот шаг носит информационный характер — убедитесь, что количество компаний выглядит разумным, прежде чем приступать к дальнейшей обработке:

wc -l {OUTPUT_DIR}/seed_companies.txt

Ожидаемое значение: примерно 0,4–0,6× от количества докладчиков (в большинстве мероприятий в среднем ~2 докладчика на компанию, некоторые компании направляют 5 и более, многие — 1).

Шаг 5: Отбор по ICP

Быстрая проверка — один вызов инструмента на компанию, без углублённого исследования. Оцените каждую компанию из seed_companies.txt по ICP пользователя и запишите краткую заметку о сортировке в файл companies/{slug}.md. Компании с icp_fit_score >= --icp-threshold (по умолчанию 6) проходят к глубокому исследованию на шаге 7; остальные остаются в виде заготовки отбора.

Схема распределения: разделить файл seed_companies.txt на партии по ~10 и распределить N под-агентов в ОДНОЙ партии Agent (несколько вызовов инструмента Agent в одном сообщении). Каждый под-агент запускает промпт из файла references/workflow.md → раздел «ICP Triage». Жёсткое ограничение: 1 вызов инструмента на компанию (только extract_page.mjs на главной странице), обеспечиваемое шаблоном комментариев # browse call N/1.

# Создание файлов партий: каждая строка партии имеет формат «имя|предполагаемая_главная_страница|slug».
# extract_event.mjs выдает только НАЗВАНИЯ компаний (без URL), поэтому мы преобразуем их в slug и предполагаем,
# что https://{slug-без-пробелов}.com является канонической главной страницей. Подагент сортировки
# может записывать product_description: «Неизвестно — контент главной страницы недоступен»
# и устанавливать оценку ограничения на 3, если предполагаемый URL возвращает ошибку 404 — это задокументированный резервный вариант в
# workflow.md (правило 3 подсказки ICP Triage). Использование реального поиска по облаку просмотров для
# обнаружения URL привело бы к превышению жёсткого ограничения в 1 запрос на компанию.
node -e '
const fs = require("fs");
const slugify = (s) => (s || "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
const seed = fs.readFileSync("{OUTPUT_DIR}/seed_companies.txt", "utf-8").split("\n").filter(Boolean);
const lines = seed.map(c => {
  const slug = slugify(c);
  const guessedHost = c.toLowerCase().replace(/[^a-z0-9]/g, "");
  return `${c}|https://${guessedHost}.com|${slug}`;
});
fs.writeFileSync("{OUTPUT_DIR}/_seed_with_urls.txt", lines.join("\n") + "\n");
'

# Разбить на партии по ~10 компаний
split -l 10 {OUTPUT_DIR}/_seed_with_urls.txt {OUTPUT_DIR}/_batch_triage_

# Подсчёт партий → количество субагентов для отправки (не более 6 на одно сообщение; вторая волна для остальных)
ls {OUTPUT_DIR}/_batch_triage_* | wc -l

Затем в одном сообщении отправьте по одному вызову агента на каждую партию (до 6 параллельно; последующие волны — после возвращения первой). Каждый агент получает запрос из файла references/workflow.md → «ICP Triage» с следующими заменами перед отправкой:

  • {SKILL_DIR} → полный буквальный путь к набору навыков (например, /Users/jay/skills/skills/event-prospecting)
  • {OUTPUT_DIR} → полный буквальный путь к папке вывода
  • {USER_COMPANY}, {USER_PRODUCT}, {ICP_DESCRIPTION} → из загруженного профиля
  • {EVENT_NAME} → title из файла recon.json
  • {COMPANY_LIST} → содержимое пакетного файла (например, cat {OUTPUT_DIR}/_batch_triage_aa)
  • {TOTAL} → количество строк в этом пакете (подставить в вызов #browse N/{TOTAL})

Отправка агента (шаблон, повторять для каждой партии в одном сообщении):

Agent(
  description: "ICP triage batch aa",
  prompt: ,
  subagent_type: "general-purpose"
)
Agent(
  description: "ICP triage batch ab",
  prompt: ,
  subagent_type: "general-purpose"
)
... до 6 на одно сообщение

После того как все субагенты вернут результаты, убедитесь, что для каждой компании в файле seed_companies.txt существует соответствующий файл companies/{slug}.md:

ls {OUTPUT_DIR}/companies/*.md | wc -l
# Должно равняться `wc -l {OUTPUT_DIR}/seed_companies.txt`

Удалите пакетные файлы: rm {OUTPUT_DIR}/_batch_triage_*.

Шаг 6: Фильтрация по пороговому значению ICP

Прочитайте вступительную часть каждого файла companies/*.md, сохраните те, у которых icp_fit_score >= 6 (или какое бы ни было значение параметра --icp-threshold ). Запишите оставшиеся слэг-имена компаний в файл {OUTPUT_DIR}/icp_fits.txt:

THRESHOLD=6   # из флага --icp-threshold
for f in {OUTPUT_DIR}/companies/*.md; do
  score=$(awk '/^icp_fit_score:/{print $2; exit}' "$f")
  if [ -n "$score" ] && [ "$score" -ge "$THRESHOLD" ]; then
    basename "$f" .md
  fi
done > {OUTPUT_DIR}/icp_fits.txt

wc -l {OUTPUT_DIR}/icp_fits.txt

Ожидаемое значение: 20–40 % от seed_companies.txt. Если коэффициент выживаемости < 10 %, возможно, пороговое значение слишком высокое или описание ICP слишком узкое — вывести предупреждение для пользователя.

Шаг 7: Углублённое исследование

Полный план → Исследование → Синтез только для компаний, соответствующих критериям ICP. Жесткий лимит: не более 5 вызовов инструментов на каждую компанию (извлечение с главной страницы + 2–3 поиска по подвопросам + 1–2 дополнительных запроса). Субагенты ПЕРЕЗАПИСЫВАЮТ существующий заготовленный файл triage компании/{slug}.md более подробной версией, подготовленной в ходе углубленного исследования (параметр frontmatter : triage_only = false).

Шаблон отправки: разделить icp_fits.txt на партии по ~5 (по умолчанию в глубоком режиме) и распределить по одному агенту на партию в ОДНОМ сообщении (до 6 агентов на сообщение). Каждый агент получает подсказку из references/workflow.md → «Deep Research» со следующими заменами:

  • {SKILL_DIR}, {OUTPUT_DIR}, {USER_COMPANY}, {USER_PRODUCT}, {ICP_DESCRIPTION}
  • {EVENT_NAME} (из .title файла recon.json ), {EVENT_CONTEXT} (направление / тема, выведенные вручную из главной страницы события)
  • {COMPANY_LIST} → содержимое пакетного файла (каждая строка slug|website)
# Создать пары {company-slug|website} путем чтения вступительной информации из каждого заготовленного файла triage
while read slug; do
  website=$(awk '/^website:/{print $2; exit}' {OUTPUT_DIR}/companies/${slug}.md)
  echo "${slug}|${website}"
done < {OUTPUT_DIR}/icp_fits.txt > {OUTPUT_DIR}/_deep_targets.txt

# Разбить на пакеты по ~5 компаний (режим deep)
split -l 5 {OUTPUT_DIR}/_deep_targets.txt {OUTPUT_DIR}/_batch_deep_
ls {OUTPUT_DIR}/_batch_deep_* | wc -l

Распределение агентов (каркас, повторять для каждой партии в одном сообщении):

Agent(
  description: "Партия глубокого исследования aa",
  prompt: ,
  subagent_type: "general-purpose"
)
Agent(
  description: "Партия глубоких исследований ab",
  prompt: ,
  subagent_type: "general-purpose"
)
... до 6 на одно сообщение; вторая волна после возврата первой

После того как все субагенты вернутся, проверьте, существуют ли файлы глубокого исследования и имеют ли они triage_only: false:

grep -l "triage_only: false" {OUTPUT_DIR}/companies/*.md | wc -l
# Должно равняться wc -l icp_fits.txt

Шаг 8: Дополнение информации о докладчиках

Для каждого человека: соберите URL-адрес LinkedIn, информацию о недавней активности (подкаст / блог / выступление / GitHub / X) и создайте файл people/{slug}.md. Жесткий лимит: 4 вызова инструмента на человека, три направления:

  1. обзорный поиск в облаке «{имя} {компания} linkedin» (всегда)
  2. поиск в облаке «{имя} подкаст ИЛИ выступление ИЛИ блог 2026» (углублённый+)
  3. обзорный поиск в облаке «{имя} github» (более глубокий)
  4. обзорный поиск в облаке «{имя} site:x.com OR site:twitter.com» (более глубокий, по мере возможности)

Быстрый режим: полностью пропустить шаг 8. Глубокий режим: каналы 1–2. Режим «ещё глубже»: каналы 1–4.

Шаг 8a — Спросите пользователя: объем обогащения

Перед отправкой вычислите количество кандидатов по двум вариантам и попросите пользователя выбрать. По умолчанию используется только ICP-fit (быстрее, дешевле, то, что хотят большинство пользователей); обогащение каждого говорящего доступно по желанию, поскольку стоимость растет линейно с количеством обогащенных людей.

TOTAL=$(wc -l < {OUTPUT_DIR}/people.jsonl)
ICP_FITS=$(node -e '
const fs = require("fs");
const fits = new Set(fs.readFileSync("{OUTPUT_DIR}/icp_fits.txt", "utf-8").split("\n").filter(Boolean));
const slug2name = {};
for (const slug of fits) {
  const md = fs.readFileSync(`{OUTPUT_DIR}/companies/${slug}.md`, "utf-8");
  const m = md.match(/^company_name:\s*(.+)$/m);
  if (m) slug2name[slug] = m[1].trim();
}
const want = new Set(Object.values(slug2name).map(s => s.toLowerCase()));
const ppl = fs.readFileSync("{OUTPUT_DIR}/people.jsonl", "utf-8").split("\n").filter(Boolean).map(JSON.parse);
console.log(ppl.filter(p => p.company && want.has(p.company.toLowerCase())).length);
')

# Количество линий на человека: 2 (глубокий) или 4 (ещё глубже) — соответствует {DEPTH}
LANES=2   # или 4 для более глубокого уровня
echo "Соответствия ICP: ${ICP_FITS} докладчиков × ${LANES} = $((ICP_FITS * LANES)) вызовов"
echo "Всего:      ${TOTAL} докладчиков × ${LANES} = $((TOTAL * LANES)) выступлений"

Затем задайте вопрос с помощью AskUserQuestion — чёткий выбор из двух вариантов с указанием стоимости каждого:

AskUserQuestion(questions: [
  {
    question: "Каких ораторов включить в расширение?",
    header: "Объем обогащения",
    multiSelect: false,
    options: [
      { label: "Только ICP-фит", description: "${ICP_FITS} динамиков, ~$((ICP_FITS * LANES)) вызовов (рекомендуется)" },
      { label: "Все динамики", description: "${TOTAL} динамиков, ~$((TOTAL * LANES)) вызовов" }
    ]
  }
])

Сохраните выбранную область как ENRICH_SCOPE=icp_fits или ENRICH_SCOPE=all. Если пользователь выберет «Все динамики» и TOTAL × LANES > 600, выведите предупреждение и спросите ещё раз — это займёт более 10 минут с сотнями вызовов инструмента.

Шаг 8b — Фильтрация и пакетная обработка

# Создать файл _people_to_enrich.jsonl на основе ENRICH_SCOPE
if [ "$ENRICH_SCOPE" = "all" ]; then
  cp {OUTPUT_DIR}/people.jsonl {OUTPUT_DIR}/_people_to_enrich.jsonl
else
  node -e '
const fs = require("fs");
const fits = new Set(fs.readFileSync("{OUTPUT_DIR}/icp_fits.txt", "utf-8").split("\n").filter(Boolean));
const slug2name = {};
for (const slug of fits) {
  const md = fs.readFileSync(`{OUTPUT_DIR}/companies/${slug}.md`, "utf-8");
  const m = md.match(/^company_name:\s*(.+)$/m);
  if (m) slug2name[slug] = m[1].trim();
}
const wantNames = new Set(Object.values(slug2name).map(s => s.toLowerCase()));
const lines = fs.readFileSync("{OUTPUT_DIR}/people.jsonl", "utf-8").split("\n").filter(Boolean);
const keep = lines.filter(l => {
  const p = JSON.parse(l);
  return p.company && wantNames.has(p.company.toLowerCase());
});
fs.writeFileSync("{OUTPUT_DIR}/_people_to_enrich.jsonl", keep.join("\n") + "\n");
console.error(`Дополняем данные для ${keep.length} из ${lines.length} докладчиков`);
'
fi

# Разбить на партии по ~5 человек
split -l 5 {OUTPUT_DIR}/_people_to_enrich.jsonl {OUTPUT_DIR}/_batch_people_

Затем в одном сообщении отправьте по одному вызову агента на каждую партию (до 6 на сообщение) с подсказкой из references/workflow.md → «Person Enrichment». Подсказка каждого субагента должна включать:

  • {SKILL_DIR}, {OUTPUT_DIR}, {DEPTH} (deep | deeper)
  • {USER_COMPANY}, {USER_PRODUCT}, {ICP_DESCRIPTION}
  • {EVENT_NAME} (из .title файла recon.json )
  • {LANES} → 2 для режима deep, 4 для режима deeper (подставляется в вызов # browse N/{LANES})
  • {PEOPLE_BATCH} → содержимое _batch_people_aa (каждая строка — запись JSON из people.jsonl)

Отправка агента (каркас, повторяется для каждого пакета в одном сообщении):

Agent(
  description: "Пакетное обогащение данных о лицах aa",
  prompt: ,
  subagent_type: "general-purpose"
)
Agent(
  description: "Партия ab по обогащению данных о лицах",
  prompt: ,
  subagent_type: "general-purpose"
)
... до 6 на одно сообщение

После того как все субагенты вернут результаты, проверьте наличие файлов с данными о людях:

ls {OUTPUT_DIR}/people/*.md | wc -l
# Должно равняться wc -l _people_to_enrich.jsonl

Шаг 9: Сборка отчёта

Сгенерируйте HTML-индекс с группировкой по компаниям, альтернативные представления и файл CSV одной командой:

node {SKILL_DIR}/scripts/compile_report.mjs {OUTPUT_DIR} --open

В результате будет сгенерирован файл:

  • {OUTPUT_DIR}/index.html — список сотрудников, сгруппированных по компаниям и отсортированных по показателю ICP компании (открывается в браузере)
  • {OUTPUT_DIR}/people.html — список докладчиков с возможностью фильтрации (альтернативный вид)
  • {OUTPUT_DIR}/companies.html — таблица компаний, отсортированная по рейтингу ICP, с указанием участников
  • {OUTPUT_DIR}/results.csv — таблица, готовая для холодных исходящих звонков

Затем представьте сводку в чате:

## Поиск потенциальных клиентов на мероприятии завершён — {Название мероприятия}

- **Общее количество выявленных докладчиков**: {count}
- **Уникальные компании**: {count}
- **Соответствие ICP (оценка ≥ {пороговое значение})**: {count}
- **Дополнительные данные о докладчиках**: {count}
- **Распределение оценок** (компании):
  - Сильное соответствие (8–10): {count}
  - Частичное соответствие (5–7): {count}
  - Слабое соответствие (1–4): {count}
- **Отчет открыт в браузере**: {OUTPUT_DIR}/index.html

Показать 5 лучших карточек людей в виде таблицы Markdown, отсортированной по баллу ICP компании, а затем предложить:

  • Настроить параметр --icp-threshold и повторить шаги 6–9
  • Экспортировать CSV-файл в CRM
Посмотреть на GitHub
---
name: event-prospecting
description: Takes a conference or event speakers URL, extracts the people, filters their companies against the user's ICP, and deep-researches only the speakers at ICP-fit companies. Outputs a person-first HTML report with a 'why reach out' rationale per person.
license: MIT
---

# Event Prospecting

Take a conference URL → get a ranked list of people the AE should talk to, with a "why reach out" rationale per person.

**Required**: `BROWSERBASE_API_KEY` env var and the `browse` CLI installed (`npm install -g browse`). Use `browse cloud ...` for API calls and `browse open` / `browse get markdown` for JS-heavy speaker pages.

**Path rules**: Always use the full literal path in all Bash commands — NOT `~` or `$HOME` (both trigger "shell expansion syntax" approval prompts). Resolve the home directory once and use it everywhere. When constructing subagent prompts, replace `{SKILL_DIR}` with the full literal path (typically `/Users/jay/skills/skills/event-prospecting`).

**Output directory**: All event prospecting output goes to `~/Desktop/{event_slug}_prospects_{YYYY-MM-DD-HHMM}/`. Final deliverable is `index.html` (people grouped by company, ranked by company ICP), with `companies.html` and `people.html` (filterable) as alternate views, plus `results.csv` for cold-outbound import.

**CRITICAL — Tool restrictions (applies to main agent AND all subagents)**:
- All web searches: use `browse cloud search`. NEVER use WebSearch.
- All page content extraction: use `node {SKILL_DIR}/scripts/extract_page.mjs "<url>"`. This script fetches via `browse cloud fetch --output`, parses title + meta tags + visible body text, and automatically falls back to `browse get markdown` when fetch fails or returns thin JS-rendered content. NEVER hand-roll a `browse cloud fetch | sed` pipeline. NEVER use WebFetch.
- All research output: subagents write **one markdown file per company OR per person** to `{OUTPUT_DIR}/companies/{slug}.md` or `{OUTPUT_DIR}/people/{slug}.md` using bash heredoc. NEVER use the Write tool or `python3 -c`. See `references/example-research.md` for both file formats.
- Report compilation: use `node {SKILL_DIR}/scripts/compile_report.mjs {OUTPUT_DIR} --open`.
- **Subagents must use ONLY the Bash tool. No other tools allowed.**
- **HARD TOOL-CALL CAPS**: ICP triage = 1 call/company; deep research = 5 calls/company; person enrichment = 4 calls/person. See `references/workflow.md` for enforcement detail.

**CRITICAL — Anti-hallucination rules (applies to main agent AND all subagents)**:
- NEVER infer `product_description`, `industry`, or a person's `role_reason` from a site's fonts, framework, design system, or typography. These are cosmetic and say nothing about what the company sells or what the person does.
- NEVER let the user's own ICP leak into a target's description. If you don't know what the target does, write `Unknown` — do not pattern-match them onto the ICP.
- `product_description` MUST quote or paraphrase a specific phrase from `extract_page.mjs` output. If none of TITLE/META/OG/HEADINGS/BODY yield a recognizable product statement, write `Unknown — homepage content not accessible` and cap `icp_fit_score` at 3.
- A person's `hook` MUST quote or paraphrase a specific finding from a `browse cloud search` result (podcast title, blog headline, GitHub repo, talk abstract). If no public signal exists in the last 6 months, fall back to event-context (their talk title at this event).

**CRITICAL — Minimize permission prompts**:
- Subagents MUST batch ALL file writes into a SINGLE Bash call using chained heredocs. One Bash call = one permission prompt.
- Batch ALL searches and ALL fetches into single Bash calls using `&&` chaining.

## Pipeline Overview

Follow these 10 steps in order. Do not skip steps or reorder.

0. **Setup** — output dir + clean slate
1. **Load profile** — read `profiles/{user_slug}.json`
2. **Recon** — detect event platform
3. **Extract people** — `people.jsonl`
4. **Group by company** — `seed_companies.txt`
5. **ICP triage** — fast company-level scoring (1 call/company)
6. **Filter** — companies with `icp_fit_score >= --icp-threshold`
7. **Deep research** — full Plan→Research→Synthesize on ICP fits
8. **Enrich speakers** — ask user: ICP-fit only (default) or all speakers
9. **Compile report** — HTML + CSV, open in browser

The user invokes the skill with a URL like `/event-prospecting <URL>`. Parse `EVENT_URL` from that invocation message. Defaults: `DEPTH=deep`, `ICP_THRESHOLD=6`. The `USER_SLUG` (ICP profile) is auto-resolved in Step 1 from whatever profile files exist locally — there is no built-in default profile. Do NOT ask the user to confirm the URL — they already gave you it.

---

## Step 0: Setup Output Directory

Derive the output directory from the URL the user gave you. Do NOT hardcode any event name.

```bash
# EVENT_URL came from the invocation message (whatever the user typed after `/event-prospecting`)
EVENT_SLUG=$(node -e 'const h = new URL(process.argv[1]).hostname.replace(/^www\./,""); console.log(h.split(".")[0])' "$EVENT_URL")
TIMESTAMP=$(date +%Y-%m-%d-%H%M)
OUTPUT_DIR=/Users/jay/Desktop/${EVENT_SLUG}_prospects_${TIMESTAMP}
mkdir -p "$OUTPUT_DIR/companies" "$OUTPUT_DIR/people"
```

Use the full literal home path — never `~` or `$HOME`. Pass `{OUTPUT_DIR}` as the full literal path to all subagent prompts.

## Step 1: Load User Profile

The profile defines the ICP that ICP triage and deep research score against. Load from `{SKILL_DIR}/profiles/{user_slug}.json` (interchangeable across all GTM skills — same shape as company-research). `example.json` is a template, not a real profile — never use it.

**DO NOT look outside `{SKILL_DIR}/profiles/`** for profiles — never reach into other skills' directories. If a profile is needed elsewhere, the user copies it explicitly.

**Resolution order**:
1. If the user invoked with `--user-company <slug>`, use that slug.
2. Else, list `profiles/*.json` excluding `example.json`. If exactly one profile exists, use it (and tell the user which one). If multiple exist, ask the user (plain chat) which one.
3. If zero profiles exist, **fail loudly** and instruct the user to create one (copy `profiles/example.json` to `profiles/<your_slug>.json` and fill it in, or run the company-research skill which builds one automatically).

```bash
PROFILES=$(ls {SKILL_DIR}/profiles/*.json 2>/dev/null | xargs -n1 basename | sed 's/\.json$//' | grep -v '^example$')
COUNT=$(echo "$PROFILES" | grep -c .)

if [ -z "$USER_SLUG" ]; then
  if [ "$COUNT" -eq 0 ]; then
    echo "No profiles found in {SKILL_DIR}/profiles/. Copy profiles/example.json to profiles/<your_slug>.json and fill it in, or run the company-research skill to build one."
    exit 1
  elif [ "$COUNT" -eq 1 ]; then
    USER_SLUG=$PROFILES
    echo "Using the only profile available: ${USER_SLUG}"
  else
    echo "Multiple profiles found:"
    echo "$PROFILES" | sed 's/^/  - /'
    echo "Re-invoke with --user-company <slug> to pick one."
    exit 1
  fi
fi

test -f {SKILL_DIR}/profiles/${USER_SLUG}.json || {
  echo "Profile not found: profiles/${USER_SLUG}.json"
  exit 1
}
cat {SKILL_DIR}/profiles/${USER_SLUG}.json
```

The profile yields: `company`, `product`, `icp_description`, `existing_customers`. These get embedded verbatim in every subagent prompt downstream.

## Step 2: Recon

Detect the event platform and extraction strategy. One command:

```bash
node {SKILL_DIR}/scripts/recon.mjs {EVENT_URL} {OUTPUT_DIR}
```

Writes `{OUTPUT_DIR}/recon.json` with `platform`, `strategy`, and (for Next.js) `nextDataPaths`. See `references/event-platforms.md` for the platform catalog and detection priority.

Expected outcomes:
- Stripe Sessions class (Next.js): `platform: "next-data"`, 1-3 paths
- Sessionize: `platform: "sessionize"`
- Lu.ma / Eventbrite: `platform: "luma" | "eventbrite"`
- Anything else: `platform: "custom"`, `strategy: "markdown"` (best-effort fallback)

## Step 3: Extract People

```bash
node {SKILL_DIR}/scripts/extract_event.mjs {OUTPUT_DIR} --user-company {USER_SLUG}
```

Reads `recon.json`, dispatches to the platform-specific extractor, writes `people.jsonl` (one speaker per line) and `seed_companies.txt` (deduped companies).

The `--user-company` flag also drops the host-org's own employees (a Stripe-hosted event drops Stripe employees) and the user's own employees from the speaker list — those aren't prospects.

Sanity-check the output:
```bash
wc -l {OUTPUT_DIR}/people.jsonl {OUTPUT_DIR}/seed_companies.txt
head -3 {OUTPUT_DIR}/people.jsonl
```

If `people.jsonl` is empty or under ~10 lines, recon picked the wrong platform — see `references/event-platforms.md` and re-run with adjusted strategy.

## Step 4: Group by Company

`extract_event.mjs` emits `seed_companies.txt` already (one company per line, deduped, sorted). This step is informational — verify the count looks reasonable before fanning out:

```bash
wc -l {OUTPUT_DIR}/seed_companies.txt
```

Expected: roughly 0.4-0.6× the speaker count (most events have ~2 speakers per company on average, some companies send 5+, many send 1).

## Step 5: ICP Triage

**Fast pass — one tool call per company, no deep research.** Score every company in `seed_companies.txt` against the user's ICP and write a thin triage stub to `companies/{slug}.md`. Companies with `icp_fit_score >= --icp-threshold` (default 6) advance to Step 7's deep research; the rest stay as triage stubs.

**Dispatch pattern**: split `seed_companies.txt` into batches of ~10 and fan out N subagents in a SINGLE Agent batch (multiple Agent tool calls in one message). Each subagent runs the prompt from `references/workflow.md` → "ICP Triage" section. Hard cap: **1 tool call per company** (just `extract_page.mjs` on the homepage), enforced via the `# browse call N/1` comment pattern.

```bash
# Build batch files: each batch line is "name|guessed_homepage|slug".
# extract_event.mjs only emits company NAMES (no URLs), so we slugify and guess
# https://{slug-without-spaces}.com as the canonical homepage. The triage subagent
# is allowed to write product_description: "Unknown — homepage content not accessible"
# and cap score at 3 if the guessed URL 404s — that's the documented fallback in
# workflow.md (rule 3 of the ICP Triage prompt). Burning a real browse cloud search to
# discover the URL would bust the 1-call-per-company HARD CAP.
node -e '
const fs = require("fs");
const slugify = (s) => (s || "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
const seed = fs.readFileSync("{OUTPUT_DIR}/seed_companies.txt", "utf-8").split("\n").filter(Boolean);
const lines = seed.map(c => {
  const slug = slugify(c);
  const guessedHost = c.toLowerCase().replace(/[^a-z0-9]/g, "");
  return `${c}|https://${guessedHost}.com|${slug}`;
});
fs.writeFileSync("{OUTPUT_DIR}/_seed_with_urls.txt", lines.join("\n") + "\n");
'

# Split into ~10-company batches
split -l 10 {OUTPUT_DIR}/_seed_with_urls.txt {OUTPUT_DIR}/_batch_triage_

# Count batches → number of subagents to dispatch (cap at 6 per message; second wave for the rest)
ls {OUTPUT_DIR}/_batch_triage_* | wc -l
```

Then in a single message, dispatch one Agent call per batch (up to 6 in parallel; subsequent waves after the first returns). Each Agent gets the prompt from `references/workflow.md` → "ICP Triage" with these substitutions before sending:
- `{SKILL_DIR}` → full literal skill path (e.g. `/Users/jay/skills/skills/event-prospecting`)
- `{OUTPUT_DIR}` → full literal output path
- `{USER_COMPANY}`, `{USER_PRODUCT}`, `{ICP_DESCRIPTION}` → from the loaded profile
- `{EVENT_NAME}` → `recon.json` `.title`
- `{COMPANY_LIST}` → contents of the batch file (e.g. `cat {OUTPUT_DIR}/_batch_triage_aa`)
- `{TOTAL}` → number of lines in this batch (substitute into `# browse call N/{TOTAL}`)

**Agent dispatch (skeleton, repeat per batch in one message)**:

```
Agent(
  description: "ICP triage batch aa",
  prompt: <ICP Triage prompt from workflow.md with all placeholders substituted>,
  subagent_type: "general-purpose"
)
Agent(
  description: "ICP triage batch ab",
  prompt: <same prompt template, COMPANY_LIST swapped to batch ab>,
  subagent_type: "general-purpose"
)
... up to 6 per message
```

After all subagents return, verify every company in `seed_companies.txt` has a corresponding `companies/{slug}.md`:

```bash
ls {OUTPUT_DIR}/companies/*.md | wc -l
# Should equal `wc -l {OUTPUT_DIR}/seed_companies.txt`
```

Clean up the batch files: `rm {OUTPUT_DIR}/_batch_triage_*`.

## Step 6: Filter by ICP Threshold

Read each `companies/*.md` frontmatter, keep those with `icp_fit_score >= 6` (or whatever `--icp-threshold` is). Write the surviving company slugs to `{OUTPUT_DIR}/icp_fits.txt`:

```bash
THRESHOLD=6   # from --icp-threshold flag
for f in {OUTPUT_DIR}/companies/*.md; do
  score=$(awk '/^icp_fit_score:/{print $2; exit}' "$f")
  if [ -n "$score" ] && [ "$score" -ge "$THRESHOLD" ]; then
    basename "$f" .md
  fi
done > {OUTPUT_DIR}/icp_fits.txt

wc -l {OUTPUT_DIR}/icp_fits.txt
```

Expected: 20-40% of `seed_companies.txt`. If the survival rate is < 10%, the threshold may be too high or the ICP description too narrow — surface a warning to the user.

## Step 7: Deep Research

Full Plan→Research→Synthesize on ICP-fit companies only. Hard cap: **5 tool calls per company** (homepage extract + 2-3 sub-question searches + 1-2 supplementary fetches). Subagents OVERWRITE the existing `companies/{slug}.md` triage stub with the richer deep-research version (frontmatter `triage_only: false`).

**Dispatch pattern**: split `icp_fits.txt` into batches of ~5 (deep mode default) and fan out one Agent per batch in a SINGLE message (up to 6 Agents per message). Each Agent gets the prompt from `references/workflow.md` → "Deep Research" with these substitutions:
- `{SKILL_DIR}`, `{OUTPUT_DIR}`, `{USER_COMPANY}`, `{USER_PRODUCT}`, `{ICP_DESCRIPTION}`
- `{EVENT_NAME}` (from `recon.json` `.title`), `{EVENT_CONTEXT}` (track / topic, manually inferred from the event homepage)
- `{COMPANY_LIST}` → contents of the batch file (each line `slug|website`)

```bash
# Build {company-slug|website} pairs by reading frontmatter from each triage stub
while read slug; do
  website=$(awk '/^website:/{print $2; exit}' {OUTPUT_DIR}/companies/${slug}.md)
  echo "${slug}|${website}"
done < {OUTPUT_DIR}/icp_fits.txt > {OUTPUT_DIR}/_deep_targets.txt

# Split into ~5-company batches (deep mode)
split -l 5 {OUTPUT_DIR}/_deep_targets.txt {OUTPUT_DIR}/_batch_deep_
ls {OUTPUT_DIR}/_batch_deep_* | wc -l
```

**Agent dispatch (skeleton, repeat per batch in one message)**:

```
Agent(
  description: "Deep research batch aa",
  prompt: <Deep Research prompt from workflow.md with all placeholders substituted; COMPANY_LIST = cat _batch_deep_aa>,
  subagent_type: "general-purpose"
)
Agent(
  description: "Deep research batch ab",
  prompt: <same template, COMPANY_LIST = cat _batch_deep_ab>,
  subagent_type: "general-purpose"
)
... up to 6 per message; second wave after the first returns
```

After all subagents return, verify the deep-research files exist and have `triage_only: false`:

```bash
grep -l "triage_only: false" {OUTPUT_DIR}/companies/*.md | wc -l
# Should equal wc -l icp_fits.txt
```

## Step 8: Enrich Speakers

Per person: harvest LinkedIn URL, recent activity (podcast / blog / talk / GitHub / X), and write `people/{slug}.md`. Hard cap: **4 tool calls per person**, three lanes:

1. `browse cloud search "{name} {company} linkedin"` (always)
2. `browse cloud search "{name} podcast OR talk OR blog 2026"` (deep+)
3. `browse cloud search "{name} github"` (deeper)
4. `browse cloud search "{name} site:x.com OR site:twitter.com"` (deeper, best-effort)

Quick mode: skip Step 8 entirely. Deep mode: lanes 1-2. Deeper mode: lanes 1-4.

### Step 8a — Ask the user: scope of enrichment

Before dispatching, compute the two candidate counts and ask the user to choose. The default is **ICP-fit only** (faster, cheaper, what most users want); enriching every speaker is opt-in because cost scales linearly with people enriched.

```bash
TOTAL=$(wc -l < {OUTPUT_DIR}/people.jsonl)
ICP_FITS=$(node -e '
const fs = require("fs");
const fits = new Set(fs.readFileSync("{OUTPUT_DIR}/icp_fits.txt", "utf-8").split("\n").filter(Boolean));
const slug2name = {};
for (const slug of fits) {
  const md = fs.readFileSync(`{OUTPUT_DIR}/companies/${slug}.md`, "utf-8");
  const m = md.match(/^company_name:\s*(.+)$/m);
  if (m) slug2name[slug] = m[1].trim();
}
const want = new Set(Object.values(slug2name).map(s => s.toLowerCase()));
const ppl = fs.readFileSync("{OUTPUT_DIR}/people.jsonl","utf-8").split("\n").filter(Boolean).map(JSON.parse);
console.log(ppl.filter(p => p.company && want.has(p.company.toLowerCase())).length);
')

# Lanes per person: 2 (deep) or 4 (deeper) — match {DEPTH}
LANES=2   # or 4 for deeper
echo "ICP fits: ${ICP_FITS} speakers × ${LANES} = $((ICP_FITS * LANES)) calls"
echo "All:      ${TOTAL} speakers × ${LANES} = $((TOTAL * LANES)) calls"
```

Then ask via `AskUserQuestion` — clean two-option choice with the quantified cost on each:

```
AskUserQuestion(questions: [
  {
    question: "Enrich which speakers?",
    header: "Enrichment scope",
    multiSelect: false,
    options: [
      { label: "ICP fits only", description: "${ICP_FITS} speakers, ~$((ICP_FITS * LANES)) calls (recommended)" },
      { label: "All speakers", description: "${TOTAL} speakers, ~$((TOTAL * LANES)) calls" }
    ]
  }
])
```

Save the chosen scope as `ENRICH_SCOPE=icp_fits` or `ENRICH_SCOPE=all`. If the user picks "All speakers" and `TOTAL × LANES > 600`, print a warning and ask once more — that's a 10+ minute run with hundreds of tool calls.

### Step 8b — Filter and batch

```bash
# Build _people_to_enrich.jsonl based on ENRICH_SCOPE
if [ "$ENRICH_SCOPE" = "all" ]; then
  cp {OUTPUT_DIR}/people.jsonl {OUTPUT_DIR}/_people_to_enrich.jsonl
else
  node -e '
const fs = require("fs");
const fits = new Set(fs.readFileSync("{OUTPUT_DIR}/icp_fits.txt", "utf-8").split("\n").filter(Boolean));
const slug2name = {};
for (const slug of fits) {
  const md = fs.readFileSync(`{OUTPUT_DIR}/companies/${slug}.md`, "utf-8");
  const m = md.match(/^company_name:\s*(.+)$/m);
  if (m) slug2name[slug] = m[1].trim();
}
const wantNames = new Set(Object.values(slug2name).map(s => s.toLowerCase()));
const lines = fs.readFileSync("{OUTPUT_DIR}/people.jsonl", "utf-8").split("\n").filter(Boolean);
const keep = lines.filter(l => {
  const p = JSON.parse(l);
  return p.company && wantNames.has(p.company.toLowerCase());
});
fs.writeFileSync("{OUTPUT_DIR}/_people_to_enrich.jsonl", keep.join("\n") + "\n");
console.error(`Enriching ${keep.length} of ${lines.length} speakers`);
'
fi

# Split into ~5-person batches
split -l 5 {OUTPUT_DIR}/_people_to_enrich.jsonl {OUTPUT_DIR}/_batch_people_
```

Then in a single message, dispatch one Agent call per batch (up to 6 per message) with the prompt from `references/workflow.md` → "Person Enrichment". Each subagent's prompt should include:
- `{SKILL_DIR}`, `{OUTPUT_DIR}`, `{DEPTH}` (`deep` | `deeper`)
- `{USER_COMPANY}`, `{USER_PRODUCT}`, `{ICP_DESCRIPTION}`
- `{EVENT_NAME}` (from `recon.json` `.title`)
- `{LANES}` → `2` for deep mode, `4` for deeper mode (substituted into `# browse call N/{LANES}`)
- `{PEOPLE_BATCH}` → contents of `_batch_people_aa` (each line a JSON record from `people.jsonl`)

**Agent dispatch (skeleton, repeat per batch in one message)**:

```
Agent(
  description: "Person enrichment batch aa",
  prompt: <Person Enrichment prompt from workflow.md with all placeholders substituted; PEOPLE_BATCH = cat _batch_people_aa>,
  subagent_type: "general-purpose"
)
Agent(
  description: "Person enrichment batch ab",
  prompt: <same template, PEOPLE_BATCH = cat _batch_people_ab>,
  subagent_type: "general-purpose"
)
... up to 6 per message
```

After all subagents return, verify the people files exist:

```bash
ls {OUTPUT_DIR}/people/*.md | wc -l
# Should equal wc -l _people_to_enrich.jsonl
```

## Step 9: Compile Report

Generate the company-grouped HTML index, alternate views, and CSV in one command:

```bash
node {SKILL_DIR}/scripts/compile_report.mjs {OUTPUT_DIR} --open
```

This generates:
- `{OUTPUT_DIR}/index.html` — people grouped by company, ranked by company ICP score (opens in browser)
- `{OUTPUT_DIR}/people.html` — filterable speaker list (alternate view)
- `{OUTPUT_DIR}/companies.html` — ICP-ranked company table with attendees
- `{OUTPUT_DIR}/results.csv` — cold-outbound-ready spreadsheet

Then present a summary in chat:

```
## Event Prospecting Complete — {Event Name}

- **Total speakers extracted**: {count}
- **Unique companies**: {count}
- **ICP fits (score ≥ {threshold})**: {count}
- **Speakers enriched**: {count}
- **Score distribution** (companies):
  - Strong fit (8-10): {count}
  - Partial fit (5-7): {count}
  - Weak fit (1-4): {count}
- **Report opened in browser**: {OUTPUT_DIR}/index.html
```

Show the **top 5 people cards** as a markdown table sorted by company ICP score, then offer to:
- Adjust `--icp-threshold` and re-run Steps 6-9
- Export the CSV to a CRM

Установить event-prospecting

Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.

Скачать ZIP

Клонируйте репозиторий и скопируйте файлы навыка в свой проект.

git clone https://github.com/browserbase/skills/tree/main/skills/event-prospecting # Copy SKILL.md to your .claude/skills/ directory

Копировать Копировать
Быстрая настройка: Скопируйте папку со скиллом в каталог .claude/skills/ Claude автоматически обнаружит и начнет использовать этот скилл
Репозиторий browserbase/skills

Похожие навыки

multica-creating-agents
Обновлено время 12 августа 2026 г.
tilemaps
Обновлено время 4 августа 2026 г.
v4-new-features
Обновлено время 4 августа 2026 г.
pixijs-application
Обновлено время 4 августа 2026 г.
OR