opção
LarLar Skill Outros event-prospecting

event-prospecting

browserbase/skills browserbase/skills

Recebe a URL de uma conferência ou evento com palestrantes, identifica os participantes, filtra suas empresas de acordo com o ICP do usuário e realiza uma pesquisa aprofundada apenas sobre os palestrantes de empresas que se enquadram no ICP. Gera um relatório em HTML centrado nas pessoas, com uma justificativa do tipo “por que entrar em contato” para cada uma delas.

...Expandir tudo
0
Tempo atualizado 30 de Setembro de 2026

Prospecção em eventos

Insira a URL de uma conferência → obtenha uma lista classificada das pessoas com quem o AE deve entrar em contato, com uma justificativa do tipo “por que entrar em contato” para cada pessoa.

Requisitos: variável de ambiente BROWSERBASE_API_KEY e o CLI do browse instalado (npm install -g browse). Use browse cloud ... para chamadas de API e browse open / browse get markdown para páginas de palestrantes com muito código JS.

Regras de caminho: Sempre use o caminho literal completo em todos os comandos do Bash — NÃO use ~ ou $HOME (ambos acionam solicitações de aprovação da “sintaxe de expansão do shell”). Defina o diretório home uma vez e use-o em todos os lugares. Ao construir prompts para subagentes, substitua {SKILL_DIR} pelo caminho literal completo (normalmente /Users/jay/skills/skills/event-prospecting).

Diretório de saída: toda a saída da prospecção de eventos vai para ~/Desktop/{event_slug}_prospects_{AAAA-MM-DD-HHMM}/. O resultado final é o arquivo index.html (pessoas agrupadas por empresa, classificadas pelo ICP da empresa), com os arquivos companies.html e people.html (filtráveis) como visualizações alternativas, além do arquivo results.csv para importação de contatos não solicitados.

CRÍTICO — Restrições da ferramenta (aplicáveis ao agente principal E a todos os subagentes):

  • Todas as pesquisas na web: use a pesquisa “Browse Cloud”. NUNCA use o WebSearch.
  • Toda extração de conteúdo de página: use o nó {SKILL_DIR}/scripts/extract_page.mjs "". Este script faz a busca por meio do `browse cloud fetch --output`, analisa o título + metatags + texto visível do corpo da página e, automaticamente, recorre ao ` browse get markdown` quando a busca falha ou retorna conteúdo escasso renderizado em JS. NUNCA crie manualmente um pipeline `browse cloud fetch | sed`. NUNCA use o WebFetch.
  • Todos os resultados da pesquisa: os subagentes escrevem um arquivo Markdown por empresa OU por pessoa em {OUTPUT_DIR}/companies/{slug}.md ou {OUTPUT_DIR}/people/{slug}.md usando o heredoc do bash. NUNCA use a ferramenta Write nem o python3 -c. Consulte references/example-research.md para conhecer os dois formatos de arquivo.
  • Compilação do relatório: use o comando ` node {SKILL_DIR}/scripts/compile_report.mjs {OUTPUT_DIR} --open`.
  • Os subagentes devem usar APENAS a ferramenta Bash. Nenhuma outra ferramenta é permitida.
  • LIMITES RÍGIDOS DE CHAMADAS: triagem ICP = 1 chamada/empresa; pesquisa aprofundada = 5 chamadas/empresa; enriquecimento de perfil = 4 chamadas/pessoa. Consulte references/workflow.md para detalhes sobre a aplicação dessas regras.

CRÍTICO — Regras anti-alucinação (aplicam-se ao agente principal E a todos os subagentes):

  • NUNCA deduza a descrição do produto, o setor ou a função de uma pessoa a partir das fontes, da estrutura, do sistema de design ou da tipografia de um site. Esses elementos são meramente estéticos e não dizem nada sobre o que a empresa vende ou o que a pessoa faz.
  • NUNCA deixe que o próprio ICP do usuário se infiltre na descrição de um alvo. Se você não souber o que o alvo faz, escreva “Desconhecido” — não faça correspondência de padrões com o ICP.
  • A descrição do produto DEVE citar ou parafrasear uma frase específica da saída do `extract_page.mjs`. Se nenhum dos campos TITLE/META/OG/HEADINGS/BODY fornecer uma declaração de produto reconhecível, escreva “Desconhecido” — conteúdo da página inicial não acessível e limite o `icp_fit_score` a 3.
  • O gancho de uma pessoa DEVE citar ou parafrasear uma descoberta específica de um resultado de pesquisa na nuvem de navegação (título de podcast, manchete de blog, repositório do GitHub, resumo de palestra). Se não houver nenhum sinal público nos últimos 6 meses, recorra ao contexto do evento (o título da palestra dessa pessoa nesse evento).

CRÍTICO — Minimize solicitações de permissão:

  • Os subagentes DEVEM agrupar TODAS as gravações de arquivos em uma ÚNICA chamada de Bash usando heredocs encadeados. Uma chamada de Bash = um pedido de permissão.
  • Agrupe TODAS as pesquisas e TODAS as recuperações em chamadas únicas do Bash usando encadeamento com &&.

Visão geral do pipeline

Siga estas 10 etapas na ordem. Não pule etapas nem altere a ordem.

  1. Configuração — diretório de saída + tela em branco
  2. Carregar perfil — ler profiles/{user_slug}.json
  3. Reconhecimento — detectar a plataforma do evento
  4. Extrair pessoas — people.jsonl
  5. Agrupar por empresa — seed_companies.txt
  6. Triagem ICP — pontuação rápida no nível da empresa (1 chamada/empresa)
  7. Filtrar — empresas com icp_fit_score >= --icp-threshold
  8. Pesquisa aprofundada — ciclo completo de Planejamento → Pesquisa → Síntese sobre a adequação ao ICP
  9. Ampliar lista de palestrantes — perguntar ao usuário: apenas adequação ao ICP (padrão) ou todos os palestrantes
  10. Compilar relatório — HTML + CSV, abrir no navegador

O usuário aciona a habilidade com uma URL como /event-prospecting . Analise EVENT_URL a partir dessa mensagem de acionamento. Padrões: DEPTH=deep, ICP_THRESHOLD=6. O USER_SLUG (perfil ICP) é resolvido automaticamente na Etapa 1 a partir de quaisquer arquivos de perfil existentes localmente — não há um perfil padrão integrado. NÃO peça ao usuário para confirmar a URL — ele já a forneceu.

Etapa 0: Configurar o diretório de saída

Derive o diretório de saída a partir da URL que o usuário forneceu. NÃO codifique nenhum nome de evento.

# EVENT_URL veio da mensagem de invocação (o que quer que o usuário tenha digitado após `/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 o caminho literal completo do diretório inicial — nunca ~ ou $HOME. Passe {OUTPUT_DIR} como o caminho literal completo para todas as solicitações do subagente.

Etapa 1: Carregar o perfil do usuário

O perfil define o ICP (Perfil de Competências do Usuário) que serve de base para a triagem e a pontuação da pesquisa aprofundada do ICP. Carregue a partir de {SKILL_DIR}/profiles/{user_slug}.json (intercambiável entre todas as habilidades do GTM — mesmo formato que a pesquisa de empresas). O arquivo example.json é um modelo, não um perfil real — nunca o utilize.

NÃO procure perfisfora de {SKILL_DIR}/profiles/ — nunca acesse diretórios de outras habilidades. Se um perfil for necessário em outro local, o usuário deve copiá-lo explicitamente.

Ordem de resolução:

  1. Se o usuário tiver chamado com --user-company , use esse slug.
  2. Caso contrário, liste profiles/*.json, excluindo o example.json. Se houver exatamente um perfil, use-o (e informe ao usuário qual é). Se houver vários, pergunte ao usuário (por chat simples) qual deles.
  3. Se não houver nenhum perfil, exiba uma mensagem de erro bem visível e instrua o usuário a criar um (copie profiles/example.json para profiles/.json e preencha-o, ou execute a habilidade company-research, que cria um automaticamente).
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 "Nenhum perfil encontrado em {SKILL_DIR}/profiles/. Copie o arquivo profiles/example.json para profiles/.json e preencha-o, ou execute a habilidade company-research para criar um."
    exit 1
  elif [ "$COUNT" -eq 1 ]; then
    USER_SLUG=$PROFILES
    echo "Usando o único perfil disponível: ${USER_SLUG}"
  else
    echo "Vários perfis encontrados:"
    echo "$PROFILES" | sed 's/^/  - /'
    echo "Execute novamente com --user-company  para escolher um."
    exit 1
  fi
fi

test -f {SKILL_DIR}/profiles/${USER_SLUG}.json || {
  echo "Perfil não encontrado: profiles/${USER_SLUG}.json"
  exit 1
}
cat {SKILL_DIR}/profiles/${USER_SLUG}.json

O perfil contém: company, product, icp_description, existing_customers. Essas informações são incorporadas literalmente em todos os prompts dos subagentes a seguir.

Etapa 2: Recon

Detecte a plataforma do evento e a estratégia de extração. Um único comando:

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

Grava o arquivo {OUTPUT_DIR}/recon.json com a plataforma, a estratégia e (para Next.js) os nextDataPaths. Consulte references/event-platforms.md para ver o catálogo de plataformas e a prioridade de detecção.

Resultados esperados:

  • Classe Stripe Sessions (Next.js): platform: "next-data", 1 a 3 caminhos
  • Sessionize: plataforma: "sessionize"
  • Lu.ma / Eventbrite: plataforma: "luma" | "eventbrite"
  • Qualquer outra coisa: plataforma: "custom", estratégia: "markdown" (solução alternativa com o melhor esforço possível)

Etapa 3: Extrair pessoas

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

Lê o arquivo recon.json, encaminha para o extrator específico da plataforma, grava o arquivo people.jsonl (um palestrante por linha) e o seed_companies.txt (empresas sem duplicatas).

O sinalizador --user-company também exclui da lista de palestrantes os próprios funcionários da organização anfitriã (um evento hospedado pela Stripe exclui os funcionários da Stripe) e os próprios funcionários do usuário — esses não são clientes potenciais.

Verifique a validade da saída:

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

Se o arquivo people.jsonl estiver vazio ou tiver menos de 10 linhas, o recon escolheu a plataforma errada — consulte references/event-platforms.md e execute novamente com a estratégia ajustada.

Etapa 4: Agrupar por empresa

O `extract_event.mjs` já gera o `seed_companies.txt` (uma empresa por linha, sem duplicatas e ordenado). Esta etapa é informativa — verifique se a contagem parece razoável antes de prosseguir:

wc -l {OUTPUT_DIR}/seed_companies.txt

Esperado: aproximadamente 0,4 a 0,6 vezes o número de palestrantes (a maioria dos eventos tem, em média, cerca de 2 palestrantes por empresa; algumas empresas enviam 5 ou mais, muitas enviam 1).

Etapa 5: Triagem do ICP

Análise rápida — uma chamada de ferramenta por empresa, sem pesquisa aprofundada. Avalie cada empresa no arquivo seed_companies.txt em relação ao ICP do usuário e escreva um esboço de triagem no arquivo companies/{slug}.md. Empresas com icp_fit_score >= --icp-threshold (padrão 6) avançam para a pesquisa aprofundada da Etapa 7; as demais permanecem como esboços de triagem.

Padrão de despacho: divida o arquivo seed_companies.txt em lotes de ~10 e distribua N subagentes em um ÚNICO lote de Agent (várias chamadas à ferramenta Agent em uma única mensagem). Cada subagente executa o prompt do arquivo references/workflow.md → seção “Triagem de ICP”. Limite máximo: 1 chamada de ferramenta por empresa (apenas extract_page.mjs na página inicial), aplicado por meio do padrão de comentário # browse call N/1.

# Crie arquivos de lote: cada linha do lote é “nome|página-inicial-estimada|slug”.
# O extract_event.mjs emite apenas NOMES de empresas (sem URLs), então criamos um slug e estimamos
# https://{slug-sem-espaços}.com como a página inicial canônica. O subagente de triagem
# tem permissão para escrever product_description: “Desconhecido — conteúdo da página inicial não acessível”
# e definir a pontuação de limite em 3 se a URL estimada retornar um erro 404 — esse é o plano de contingência documentado em
# workflow.md (regra 3 do prompt de triagem do ICP). Executar uma pesquisa real na nuvem de navegação para
# descobrir a URL ultrapassaria o LIMITE MÁXIMO de 1 chamada por empresa.
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");
'

# Dividir em lotes de aproximadamente 10 empresas
split -l 10 {OUTPUT_DIR}/_seed_with_urls.txt {OUTPUT_DIR}/_batch_triage_

# Contar lotes → número de subagentes a serem despachados (limite de 6 por mensagem; segunda onda para o restante)
ls {OUTPUT_DIR}/_batch_triage_* | wc -l

Em seguida, em uma única mensagem, despache uma chamada de Agente por lote (até 6 em paralelo; ondas subsequentes após o retorno da primeira). Cada Agente recebe o prompt de references/workflow.md → “ICP Triage” com estas substituições antes do envio:

  • {SKILL_DIR} → caminho literal completo da habilidade (por exemplo, /Users/jay/skills/skills/event-prospecting)
  • {OUTPUT_DIR} → caminho literal completo da saída
  • {USER_COMPANY}, {USER_PRODUCT}, {ICP_DESCRIPTION} → do perfil carregado
  • {EVENT_NAME} → .title do arquivo recon.json
  • {COMPANY_LIST} → conteúdo do arquivo em lote (por exemplo, cat {OUTPUT_DIR}/_batch_triage_aa)
  • {TOTAL} → número de linhas neste lote (substituir na chamada # browse por N/{TOTAL})

Despacho de agente (estrutura básica, repetir por lote em uma mensagem):

Agent(
  description: "Lote de triagem ICP aa",
  prompt: ,
  subagent_type: "general-purpose"
)
Agente(
  descrição: "Lote de triagem ICP ab",
  prompt: ,
  tipo_de_subagente: "uso_geral"
)
... até 6 por mensagem

Depois que todos os subagentes retornarem, verifique se cada empresa no arquivo seed_companies.txt possui um arquivo companies/{slug}.md correspondente:

ls {OUTPUT_DIR}/companies/*.md | wc -l
# Deve ser igual a `wc -l {OUTPUT_DIR}/seed_companies.txt`

Limpe os arquivos de lote: rm {OUTPUT_DIR}/_batch_triage_*.

Etapa 6: Filtrar pelo limiar do ICP

Leia o frontmatter de cada companies/*.md e mantenha aqueles com icp_fit_score >= 6 (ou qualquer que seja o valor de --icp-threshold ). Grave os slugs das empresas selecionadas em {OUTPUT_DIR}/icp_fits.txt:

THRESHOLD=6   # do sinalizador --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

Esperado: 20-40% do arquivo seed_companies.txt. Se a taxa de sobrevivência for < 10%, o limite pode estar muito alto ou a descrição do ICP muito restrita — exiba um aviso ao usuário.

Etapa 7: Pesquisa aprofundada

Plano completo → Pesquisa → Síntese apenas para empresas que se encaixam no ICP. Limite máximo: 5 chamadas de ferramentas por empresa (extrato da página inicial + 2 a 3 pesquisas de subquestões + 1 a 2 buscas complementares). Os subagentes SOBRESCREVEM o esboço de triagem existente companies/{slug}.md com a versão mais rica da pesquisa aprofundada (frontmatter triage_only: false).

Padrão de despacho: dividir o icp_fits.txt em lotes de ~5 (padrão do modo aprofundado) e distribuir um Agente por lote em uma ÚNICA mensagem (até 6 Agentes por mensagem). Cada Agente recebe o prompt de references/workflow.md → “Pesquisa Aprofundada” com estas substituições:

  • {SKILL_DIR}, {OUTPUT_DIR}, {USER_COMPANY}, {USER_PRODUCT}, {ICP_DESCRIPTION}
  • {EVENT_NAME} (de recon.json .title), {EVENT_CONTEXT} (tema/tópico, inferido manualmente a partir da página inicial do evento)
  • {COMPANY_LIST} → conteúdo do arquivo em lote (cada linha slug|website)
# Crie pares {slug da empresa|site} lendo o frontmatter de cada esboço de triagem
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

# Dividir em lotes de aproximadamente 5 empresas (modo profundo)
split -l 5 {OUTPUT_DIR}/_deep_targets.txt {OUTPUT_DIR}/_batch_deep_
ls {OUTPUT_DIR}/_batch_deep_* | wc -l

Despacho de agentes (esqueleto, repetir por lote em uma mensagem):

Agente(
  descrição: "Lote de pesquisa aprofundada aa",
  prompt: ,
  tipo_subagente: "uso geral"
)
Agente(
  descrição: "Lote de pesquisa aprofundada ab",
  prompt: ,
  tipo_de_subagente: "uso_geral"
)
... até 6 por mensagem; segunda onda após o retorno da primeira

Depois que todos os subagentes retornarem, verifique se os arquivos de pesquisa aprofundada existem e se têm triage_only: false:

grep -l "triage_only: false" {OUTPUT_DIR}/companies/*.md | wc -l
# Deve ser igual a wc -l icp_fits.txt

Etapa 8: Enriquecer os palestrantes

Por pessoa: colete a URL do LinkedIn, atividades recentes (podcast / blog / palestra / GitHub / X) e crie o arquivo people/{slug}.md. Limite máximo: 4 chamadas de ferramentas por pessoa, três vias:

  1. pesquisar na nuvem “{nome} {empresa} linkedin” (sempre)
  2. pesquisar na nuvem “{nome} podcast OU palestra OU blog 2026” (pesquisa aprofundada+)
  3. pesquisa na nuvem “{nome} github” (mais aprofundada)
  4. pesquisar na nuvem por “{nome} site:x.com OU site:twitter.com” (mais detalhada, no melhor esforço possível)

Modo rápido: pule a Etapa 8 inteiramente. Modo profundo: faixas 1-2. Modo mais profundo: faixas 1-4.

Etapa 8a — Pergunte ao usuário: escopo do enriquecimento

Antes de enviar, calcule as duas contagens de candidatos e peça ao usuário para escolher. O padrão é apenas o ajuste ICP (mais rápido, mais barato, o que a maioria dos usuários deseja); o enriquecimento de cada locutor é opcional, pois o custo varia linearmente com o número de pessoas enriquecidas.

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);
')

# Faixas por pessoa: 2 (profundidade) ou 4 (mais profunda) — correspondência com {DEPTH}
LANES=2   # ou 4 para mais profundidade
echo "ICP se encaixa: ${ICP_FITS} palestrantes × ${LANES} = $((ICP_FITS * LANES)) chamadas"
echo "Total:      ${TOTAL} palestrantes × ${LANES} = $((TOTAL * LANES)) chamadas"

Em seguida, pergunte por meio de AskUserQuestion — uma escolha clara entre duas opções com o custo quantificado para cada uma:

AskUserQuestion(questions: [
  {
    question: "Enriquecer quais palestrantes?",
    header: "Escopo do enriquecimento",
    multiSelect: false,
    options: [
      { label: "Apenas ICP FITS", description: "${ICP_FITS} alto-falantes, ~$((ICP_FITS * LANES)) chamadas (recomendado)" },
      { label: "Todos os locutores", description: "${TOTAL} locutores, ~$((TOTAL * LANES)) chamadas" }
    ]
  }
])

Salve o escopo escolhido como ENRICH_SCOPE=icp_fits ou ENRICH_SCOPE=all. Se o usuário escolher “Todos os alto-falantes” e TOTAL × LANES > 600, exiba um aviso e pergunte novamente — isso representa uma execução de mais de 10 minutos com centenas de chamadas à ferramenta.

Etapa 8b — Filtrar e processar em lote

# Crie o arquivo _people_to_enrich.jsonl com base em 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(`Enriquecendo ${keep.length} de ${lines.length} palestrantes`);
'
fi

# Dividir em lotes de ~5 pessoas
split -l 5 {OUTPUT_DIR}/_people_to_enrich.jsonl {OUTPUT_DIR}/_batch_people_

Em seguida, em uma única mensagem, envie uma chamada de Agente por lote (até 6 por mensagem) com o prompt de references/workflow.md → “Enriquecimento de Pessoas”. O prompt de cada subagente deve incluir:

  • {SKILL_DIR}, {OUTPUT_DIR}, {DEPTH} (profundo | mais profundo)
  • {USER_COMPANY}, {USER_PRODUCT}, {ICP_DESCRIPTION}
  • {EVENT_NAME} (de recon.json .title)
  • {LANES} → 2 para o modo deep, 4 para o modo deeper (substituído na chamada # browse N/{LANES})
  • {PEOPLE_BATCH} → conteúdo de _batch_people_aa (cada linha é um registro JSON de people.jsonl)

Despacho de agente (esqueleto, repetir por lote em uma mensagem):

Agent(
  description: "Lote de enriquecimento de pessoas aa",
  prompt: ,
  subagent_type: "general-purpose"
)
Agente(
  descrição: "Lote de enriquecimento de pessoas ab",
  solicitação: ,
  tipo_de_subagente: "uso_geral"
)
... até 6 por mensagem

Depois que todos os subagentes retornarem, verifique se os arquivos de pessoas existem:

ls {OUTPUT_DIR}/people/*.md | wc -l
# Deve ser igual a wc -l _people_to_enrich.jsonl

Etapa 9: Compilar o relatório

Gere o índice HTML agrupado por empresa, visualizações alternativas e o CSV em um único comando:

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

Isso gera:

  • {OUTPUT_DIR}/index.html — pessoas agrupadas por empresa, classificadas pela pontuação ICP da empresa (abre no navegador)
  • {OUTPUT_DIR}/people.html — lista de palestrantes filtrável (visualização alternativa)
  • {OUTPUT_DIR}/companies.html — tabela de empresas classificadas pelo ICP com participantes
  • {OUTPUT_DIR}/results.csv — planilha pronta para contato de venda não solicitado

Em seguida, apresente um resumo no chat:

## Prospecção do evento concluída — {Nome do evento}

- **Total de palestrantes extraídos**: {contagem}
- **Empresas únicas**: {contagem}
- **Correspondências com o ICP (pontuação ≥ {limite})**: {contagem}
- **Palestrantes com informações adicionais**: {contagem}
- **Distribuição de pontuação** (empresas):
  - Adequação forte (8-10): {contagem}
  - Adequação parcial (5-7): {contagem}
  - Adequação fraca (1-4): {contagem}
- **Relatório aberto no navegador**: {OUTPUT_DIR}/index.html

Mostre os 5 principais perfis de pessoas em uma tabela Markdown ordenada pela pontuação do ICP da empresa e, em seguida, ofereça a opção de:

  • Ajustar --icp-threshold e executar novamente as etapas 6 a 9
  • Exportar o CSV para um CRM
Ver no 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

Instalar event-prospecting

Baixe e descompacte os arquivos de habilidades no diretório .claude/skills/.

Baixar ZIP

Clone o repositório e copie os arquivos da habilidade para o seu projeto.

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

Copiar Copiar
Configuração rápida: Copie a pasta da habilidade para .claude/skills/ O Claude detectará e utilizará automaticamente a habilidade
Repositório browserbase/skills

Habilidades relacionadas

multica-creating-agents
Tempo atualizado 12 de Agosto de 2026
tilemaps
Tempo atualizado 4 de Agosto de 2026
v4-new-features
Tempo atualizado 4 de Agosto de 2026
pixijs-application
Tempo atualizado 4 de Agosto de 2026
OR