Lição 4 · Extração
O extrator: receipts, dedupe e abstenção honesta
8.820 linhas de sinal de 2.537 pacotes — cada uma com citação verbatim ligada a um span de bytes exato. 1.225 são aliases: duplicatas rastreadas para sempre, contadas uma vez.
Como é um sinal
{
"signal_id": "sig_…",
"kind": "pain | job | workaround | demand | willingness_to_pay | …",
"evidence_quote": "Ele quer o problema dele resolvido e ponto.",
"locator": { "file": "Transcripts/YouTube/items/…/source.md",
"line_start": 68, "byte_start": …, "byte_end": … },
"speaker_role": "narrator | author | quoted_third_party",
"truth_class": "SOURCE_CLAIM",
"dedupe_key": "…", "conflicts": []
}
Scaffold removido
Todo pacote carrega um contrato wiki gerado ("make contradictions or gaps explicit"). A extração mantém só o bloco de título e o corpo Full Cleaned Content|Transcript — boilerplate nunca vira sinal de mercado.
Uma evidência, um slot
A mesma frase em source.md E raw/transcript.txt é UMA evidência. Entre pacotes, a primeira ocorrência é canônica; o resto vira linha alias: com ponteiro alias_of.
Abstenção é honesta
476 pacotes são no_signal com razão nomeada (promoção pura, contexto de ruído, sem candidatos). 6 são blocked (fonte ausente) — nomeados, nunca silenciosos.
Guardas aprendidas do jeito difícil
| Guarda | Por que existe |
|---|---|
| Fronteiras de palavra | "whatever" não é hate, "Mythos" não é myth, "captions" não é cap, "marketer" não é market, "Conflict" não é NFL |
| Âncoras de falso-amigo | PT "isso demanda tempo" não é demanda de mercado; "já era melhor" não é claim de morte |
| Remoção de negação | "sem problema" e "no human bottlenecks" não são dor |
| Papel de autor | "they paid me $10,000" é autodeclaração — nunca WTP de cliente |
| Guarda de pergunta | "how do I use Claude?" é pergunta, não adoção |
| Guarda de idiom | "dead simple" não é morte; "work full time" não é falha de produto |