S SocialSelling
main verde · 150+ testes v0.17.x PoC local · database-less feedback learning · ADR-007

Busca de clientes mais eficiente e automática com IA.

O SocialSelling responde a uma única pergunta — "Quem devo abordar primeiro?" — produzindo um ranking explicável de prospects que aprende com o feedback da operadora. Este documento é o overview do projeto e, ao mesmo tempo, um modelo das boas práticas de desenvolvimento e implementação adotadas até aqui.

8
ADRs (decisões)
150+
testes determinísticos
57
lições registradas
0
custo de infra (só tokens)

1 Visão & escopo

O produto torna a prospecção eficiente e automática: dado um ICP (Ideal Customer Profile), o sistema descobre candidatos, infere dados estruturados, pontua o fit/intent/confiança, entrega Lead Cards ranqueados com justificativa (XAI) e aprende com os votos 👍/👎 da operadora.

No escopo

  • Ranking explicável de prospects (fit · intent · confiança)
  • Descoberta + enriquecimento incremental de leads
  • Justificativa estruturada (drivers +/− e sinais ausentes)
  • Aprendizado por feedback like/dislike (ADR-007)
  • Cockpit web local (visualização, edição de pesos, votos)

Fora do escopo (guardrails)

  • CRM, automação de outreach/mensageria, cadências
  • Banco de dados, Redis, Celery, Docker, AWS/Terraform
  • Scraping de Instagram/LinkedIn
  • Geração automática de mensagens de outreach

2 Arquitetura do PoC

Um único processo Python 3.11+, sem servidor obrigatório, sem banco, sem fila. Persistência em JSON atômico (write-temp + os.replace). O único custo variável são os tokens de duas APIs de cognição/busca.

Pipeline determinístico (módulos, não agentes de runtime)

M1 · Busca
Tavily + Apollo
M2 · Extração
Gemini (lotes)
M3 · Score
linear · puro
M4 · Ranking
tie-break estável
M5 · XAI
explicação

M3 e M4 são funções puras: mesma entrada → saída byte-idêntica. O orquestrador injeta clientes, cache, relógio e config.

Módulos de suporte

learning/ Regressão logística (Python puro) que reajusta w_fit/w_intent a partir de votos 👍/👎 (ADR-007).
corpus/ Persistência acumulativa de leads entre runs (upsert idempotente por entity_id) (ADR-006).
apollo/ Escada de enriquecimento incremental B2B: descoberta → firmografia → reveal de contato (ADR-004).
web/ Cockpit FastAPI local com tabela de leads, drawer de detalhes e botões de feedback.

Sensores externos

Tavily

Busca aberta (M1). Snippets sociais e sinais de intenção.

Gemini (gemini-2.5-flash / flash-lite)

Cognição (M2). Extrai entidades estruturadas + persona/intenção em lotes.

Apollo.io ADR-004

Firmografia B2B. Escada incremental; API master exige plano pago (Free bloqueia p/ entitlement).

3 Camadas semânticas & regras invioláveis

A correção do sistema repousa sobre quatro invariantes. Elas valem para todo código novo — inclusive os sensores, a camada de volume e o módulo de aprendizado.

Observed Evidence
camada 1 · o que foi visto
Inferences
camada 2 · o que foi deduzido
Evaluated Hypotheses
camada 3 · score & XAI

① Isolamento de camadas

Uma inferência jamais é tratada como evidência. Sem referências mutáveis compartilhadas. Apollo vira ObservedEvidence, nunca inferência. O feedback (ADR-007) opera apenas na camada de apresentação — nunca toca Evidence ou Inferences.

② Determinismo byte-idêntico

Mesma memória → mesma saída. Relógio e RNG injetados; IDs por hash estável; tie-break estável. O modelo de feedback usa gradiente full-batch sem aleatoriedade — mesmo log ⇒ mesmos pesos, bit a bit.

③ Open-World

Ausência de sinal = incerteza (↑u), nunca falso. Missing Evidence é explícito; falhas degradam, não quebram. Dislike é sinal de treino — o lead permanece visível, com selo.

④ Persistência atômica

Toda escrita é write-temp + os.replace. Nunca um arquivo meio-escrito — vale para cache, corpus, ledgers e o store de feedback.

4 Decisões arquiteturais (ADRs)

Cada decisão consciente vira um ADR versionado e referenciável. A fonte da verdade é o ADR-000; os demais são emendas explícitas.

5 Especificações de desenvolvimento (SDDs)

Cada ADR não-trivial vem acompanhado de uma SDD (Spec-Driven Development): contratos, cenários, plano de testes e WUs. Spec-first — o documento precede o código.

6 Boas práticas de desenvolvimento

É aqui que o projeto pretende ser modelo: a complexidade vive no processo de construção, não no sistema. O PoC permanece enxuto; a disciplina é total.

SDD-to-Code Loop (obrigatório por módulo)

  1. 1Contrato Pydantic
  2. 2BDD + fixtures
  3. 3Implementação mínima
  4. 4Gate verde
  5. 5PR + auto-merge

Modo operacional: Dia vs. Noite (L-057)

☀️ Sessão de dia (interativa)

Especifica e gera cards — não desenvolve o produto. Autoria de ADRs, SDDs, docs, tooling e curadoria do board. Card só vai para Todo com DoR 100% (Gherkin, fixtures, sem ambiguidade).

🌙 Run noturno (autônomo)

Consome a coluna Todo via skill github-sdd-sync. Revalida DoR, implementa, exige DoD (gate verde, PR CI-verde, PROGRESS e lições atualizados).

Quality Gate inegociável

ruff + mypy --strict + pytest 100% verde e determinístico. Flakiness = falha.

Git: branch → PR → auto-merge

Nunca commit direto na main. CI obrigatório; merge só com gate verde. Squash + delete-branch.

Tags = pontos de restauração

Cada WU verde recebe uma tag anotada. Rollback público via git revert, nunca reset/force.

APIs sempre mockadas

Testes nunca tocam rede: fixtures gravadas + fakes. Tolerância numérica 1e-9. Erros de API surfaciados ao usuário (nunca silenciosos — L-057).

Opt-in = paridade

Toda feature nova entra desligada por padrão → o baseline permanece byte-idêntico (smoke E2E). [learning].enabled, [apollo].enabled, [corpus].enabled.

FinOps por ledger atômico

Orçamentos de crédito (mensal) e de requisições (diário) persistidos; try_spend/refund/reconciliação. Erros de billing (429) propagam a mensagem crua até o frontend.

Comando de gate (Windows)

.venv\Scripts\python.exe -m ruff check .   # lint
.venv\Scripts\python.exe -m mypy           # tipos (strict)
.venv\Scripts\python.exe -m pytest -q       # 150+ testes determinísticos
# Ou: .\scripts\gate.ps1  (roda os três em sequência)

7 Estratégia de volume (rodando local)

Objetivo: buscar muito mais leads sem sair do local/database-less. Aplicou-se Teoria das Restrições ao funil — ampliar descoberta sem elevar o teto cognitivo só faz bater no muro mais rápido. Daí os quatro pilares.

Pilar O que faz Estado
A · Teto cognitivo Extração em lotes + orçamento RPD + ondas resumíveis (ADR-005) ✅ core
B · Corpus acumulativo Runs acumulam; upsert idempotente; onda avança só com resultado (ADR-006) ✅ core
Apollo · Descoberta People Search + org-enrich + reveal (ADR-004) — API master exige plano pago ✅ implementado
C · Estado escalável JSON monolítico → NDJSON/shards (sem banco) ⏸ diferido
D · Entity resolution Domínio canônico + exclusão de vendors + dedup cross-provider ⏸ diferido

Tudo opt-in ([apollo].enabled · [corpus].enabled · [gemini].rpd_enabled). Diferidos com razão documentada — não há refino arriscado por completude.

8 Processo de auto-aprendizagem

Ao final de cada tarefa, os aprendizados são destilados em docs/licoes-aprendidas.md (formato L-NNN | Categoria | Lição | Como aplicar) e em memória persistente. Hoje são 57 lições que retroalimentam decisões futuras — o projeto fica mais inteligente a cada ciclo.

L-012 · Determinismo

Injetar relógio e derivar IDs por hash estável — nunca UUID aleatório nem datetime.now() interno. Garante reexecução byte-idêntica. Também vale para o modelo de feedback (full-batch sem random).

L-026 · Async resiliente

Fan-out com asyncio.gather(return_exceptions=True) + tratar exceção crua: um provedor não derruba o lote.

L-051 · CSS pointer-events

Container fixed inset-0 z-50 fechado precisa de pointer-events:none; sem isso uma camada invisível engole todos os cliques sem erro visível.

L-052 · ML determinístico

Regressão logística com gradiente full-batch, init em zeros, amostras ordenadas por company_id e sem random → mesmo feedback.json ⇒ mesmos pesos, bit a bit.

L-056 · Onda + resiliência

Avançar a onda só quando o ciclo produz leads. Avançar à toa "queima" queries cacheadas e escondia que a causa-raiz era billing do Gemini (corrigido na L-057).

L-057 · Billing vs. cota

429 do Gemini era prepayment credits depleted, não cota free-tier. GeminiClient agora surfacia o error.message cru; o endpoint retorna 502 com mensagem acionável (link de billing).

Ver as 57 lições completas →

9 Mapa de versões (pontos de restauração)

v0.1.1

Fundação CI-verde: toolchain, contratos, planejamento.

v0.7.0

PoC funcional: pipeline M1→M5 + smoke E2E byte-idêntico.

v0.8–0.12

Motor de intenção (hipóteses), Lead Card acionável, UI de operador, precisão de persona.

v0.13–0.14

Fundação de volume: schemas Apollo, ledgers de crédito/RPD, corpus; descoberta Apollo fim-a-fim.

v0.15.4

Specs de volume completas: escada Apollo (1/2/3), batch+RPD, corpus acumulativo. 120 testes verdes.

v0.16.x

Cockpit v2 (tabela densa + drawer), degradação de billing com mensagem acionável (L-057), busca incremental por ondas.

v0.17.x

Aprendizado por feedback (ADR-007): regressão logística determinística, store de votos atômico, auto-apply de pesos com 4 travas. 150+ testes verdes. Módulos: learning/ (model, tuner, feedback_store, schemas).

Como ligar o volume + aprendizado (run real)

# 1) runtime.toml
[apollo].enabled = true   [corpus].enabled = true
[gemini].rpd_enabled = true   [learning].enabled = true
# 2) gravar fixtures (supervisionado — Apollo master exige plano pago)
.venv\Scripts\python.exe scripts\record_apollo_fixtures.py
# 3) rodar o pipeline
.venv\Scripts\python.exe -m socialselling.orchestrator --icp config\icp_criteria.talita.json
# 4) cockpit web (marcar likes/dislikes → reajusta pesos automaticamente)
.venv\Scripts\python.exe -m socialselling.web  # → http://127.0.0.1:8000

10 Planejamento & operação do desenvolvimento

O projeto adota um modelo de governança que separa autoria de especificação (interativa, feita de dia) de execução de implementação (autônoma, feita à noite). Isso otimiza a cota do Claude Code Pro e mantém a integridade do repositório — o dono usa o dia para pensar e evoluir o sistema; o desenvolvimento roda no run agendado.

Fluxo do board (GitHub Project #1)

Backlog
rascunho da card
DoR 100% só humano move
Todo
aprovado p/ noite
run noturno
In Progress
skill executa
DoD 100%
Done
PR mergeado

Card bloqueada (DoR incompleto ou gate vermelho após 2 tentativas) → BLOCKED: no PROGRESS.md e devolve ao Backlog. Nunca adivinha — para e reporta.

☀️

Sessão de dia — autoria

  • 1.Entender o que o dono quer evoluir (e o porquê).
  • 2.Rascunhar cards usando o template de DoR/DoD.
  • 3.Cobrar o DoR — perguntar ao dono por cada item faltante (Gherkin, fixtures, contrato, escopo). Nunca empurrar card incompleta.
  • 4.Card com DoR 100% → mover para Todo (só humano faz isso).
  • 5.Evoluções grandes → quebrar em várias cards pequenas (1 WU cada).
Faço no dia: specs, ADRs, contratos, docs, tooling (scripts/CI/skills), governança e curadoria do board.
🌙

Run noturno — execução autônoma

  • S1.Ler .ai/state/PROGRESS.md + card em Todo de maior prioridade.
  • S2.Se bloqueio ≠ NENHUM → parar e reportar (não adivinha).
  • S3.Revalidar o DoR — se algum item estiver aberto, marca BLOCKED: e devolve ao Backlog.
  • S4.Executar 1–2 passos da WU (pacing). Rodar ./scripts/gate.ps1.
  • S5.Gate verde → commit na feature branch; se WU fechou: PR auto-merge + tag.
  • S6.Atualizar PROGRESS.md + lições. Parar num checkpoint seguro.
Vira card: implementação em src/socialselling/, tests/, fixtures — tudo que muda o comportamento do produto.

✅ Definition of Ready (DoR)

Card pode ir de Backlog → Todo?

  • ① Objetivo observável em 1 frase (porquê + resultado verificável)
  • ② Fatiada em 1 WU — cabe numa janela de execução
  • ③ Contrato Pydantic definido; ADR vinculada se cruza módulo
  • ④ Gherkin: caminho feliz + modo degradado + Open-World
  • ⑤ Fixtures identificadas; sem bloqueio de rede paga/entitlement
  • ⑥ Sem decisão de fronteira em aberto
  • ⑦ Dentro do escopo canônico (§3/§5/ADR-000)
  • ⑧ Determinismo viável (APIs mockadas, tolerância 1e-9)
  • ⑨ DoD específico declarado no corpo da card

🏁 Definition of Done (DoD)

Card pode ir de In Progress → Done?

  • ① Cenários BDD verdes e byte-idênticos (zero flakiness)
  • ② Fixtures commitadas; testes não tocam rede
  • ③ Gate completo: ruff + mypy --strict + pytest
  • ④ Invariantes semânticas respeitadas; persistência atômica
  • ⑤ Escopo preservado — implementado o mínimo da fatia
  • ⑥ PR com CI verde (gh pr merge --squash --auto)
  • PROGRESS.md + lições atualizados no mesmo PR
  • ⑧ Card em Done + tag vX.Y.Z se fechou um marco
  • ⑨ Fail-closed: gate vermelho após 2 tentativas → BLOCKED:

⛔ Guardrails de autonomia (inegociáveis)

  • Nunca commit/push direto na main — só via PR com CI verde
  • Nunca --force; rollback só via git revert em PR
  • Nunca inventar especificação — ambiguidade → BLOCKED: e para
  • Sem fixtures gravadas → não implementa módulos que tocam rede (M1/M2)
  • Parar sempre num checkpoint seguro; nunca terminar no meio de passo destrutivo

🔓 Exceções ao modo noturno

  • Pedido explícito do dono: "faça agora", "implemente isto" — o override sempre vence.
  • Hotfix crítico: main quebrada ou bug crítico — corrigir na hora via PR + gate verde, registrar depois.

Fora desses dois casos, implementação de produto = card/noite.

Âncora de estado & cadência

📌 .ai/state/PROGRESS.md

Fonte da verdade do "onde paramos". O run lê no início e atualiza no fim. Contém: marco atual, tag verde, WU em andamento, passo (S1–S6), branch, próxima ação, bloqueios e histórico de runs.

Estado nunca vive na sessão — vive no git + PROGRESS.md. Qualquer run novo reconstrói o contexto lendo esses dois.

📅 Cadência recomendada

Janela Madrugada BRT (~02:00) — sem contenção com uso interativo
Frequência 1 run/noite no início; ajustar pelo consumo semanal
Escopo/run 1–2 passos de uma WU (cabe na janela; termina em checkpoint)
Supervisão WUs com rede (M1/M2): gravar fixtures com o dono presente; WUs puras: mais seguras p/ rodar sós
Revisão Dono revisa merges/tags da noite pela manhã; CI é a rede de segurança

Referência técnica

11 Contratos & modelo de dados

Todo o pipeline opera sobre contratos Pydantic v2 declarados em src/socialselling/contracts.py — único ponto de verdade dos modelos de dados. Cada módulo M1–M5 produz e consome tipos bem definidos; jamais compartilham referências mutáveis entre camadas.

Fluxo de contratos pelo pipeline

IN
ICPCriteria — entrada universal do pipeline

Firmographics (indústrias, faixa de funcionários, geografias, modelos de negócio) · Technographics (tech mandatória/preferida/excluída) · PersonaMatrix (roles-alvo, senioridade mínima) · intent_triggers (sinais de hipótese)

M1
ObservedEvidence — camada 1 · o que foi visto

evidence_id (hash SHA-256 estável) · query, source_url, snippet, source_trust · missing_evidence: bool (Open-World explícito)

M2
Inference — camada 2 · o que foi deduzido

CompanyEntity (nome, domínio, indústria, tecnologias, contatos, redes sociais) · PersonEntity (nome, cargo, senioridade) · derived_from: list[evidence_id] (rastreabilidade obrigatória) · intent_signals, disqualifiers, persona · confidence

M3
ProspectScore — camada 3 · avaliação

fit, intent, confidence, persona_fit, p_score, hard_filter_passed

M5
XAIPayload — justificativa estruturada

positive_signals, negative_signals (lista de Driver com impact e texto) · missing_signals (Missing Evidence explícito) · degraded_mode

OUT
LeadCard — saída acionável do pipeline

display_name, company, role, sector, location · links (Instagram first, LinkedIn, website) · contact (email, phone) · score (ProspectScore completo) · why_now[] (razões imediatas) · gaps[] (sinais ausentes) · sources[]

Fórmula de score (M3)

P = (w_fit · Fit + w_intent · Intent)

    × Confiançaexp × persona_fit

w_fit = peso do fit estrutural0.60
w_intent = peso de intenção0.40
confidence_exponent0.5
persona_fit (fundadora)1.0
persona_fit (fundador)0.0

M3 e M4 são funções puras: mesma entrada → saída byte-idêntica (1e-9). Hard filter (disqualifier detectado) zera o lead. Pesos configuráveis em runtime.toml e reajustáveis pelo feedback 👍/👎.

Catálogo de hipóteses (Intent)

Intent = Σ prior das hipóteses ativadas pelos intent_signals detectados pelo M2. Config em config/hypotheses_catalog.json.

H_01prior 0.30

Fundadora presa na operação — crescimento travado

H_02prior 0.20

Contratação sênior recente / formação de time

H_03prior 0.18

Expansão anunciada — nova unidade ou serviço

H_04prior 0.17

Intenção de adotar IA sem processo organizado

H_05prior 0.10

Conclusão recente de curso / mentoria de gestão

12 Estrutura do código-fonte

Cada subdiretório de src/socialselling/ tem uma responsabilidade estritamente delimitada. Nenhum módulo importa de um módulo de nível acima no pipeline.

contracts.py ponto único de contratos

Todos os modelos Pydantic do pipeline (4 camadas): ICPCriteriaObservedEvidenceInference (+ CompanyEntity, PersonEntity) → ProspectScore / XAIPayload / RankedProspectLeadCard. Regra: nenhuma lógica de negócio aqui.

modules/

m1_busca.py — queries Tavily/Apollo, cache atômico 24h, ObservedEvidence[]
m2_extracao.py — lotes Gemini, parsing Pydantic, Inference[]
m3_score.py — fórmula linear pura, hard filter, ProspectScore[]
m4_ranking.py — sort estável por p_score, tie-break por company_id
m5_xai.py — gera XAIPayload por regras, sem IA

skills/ — clientes externos

tavily_client.py — HTTP + cache + degradação (429/timeout)
gemini_client.py — geração JSON, backoff exponencial, surfacia error.message cru
apollo_client.py — REST Apollo, 3 endpoints, ledger integrado

core/ — infraestrutura interna

atomic.py — write-temp + os.replace (primitiva de escrita atômica)
cache.py — cache frio em JSON, chave = hash SHA-256 do conteúdo
credit_ledger.py — orçamento mensal Apollo (try_spend/refund)
request_ledger.py — orçamento diário RPD Gemini

apollo/ · corpus/ · learning/

apollo/schemas.py — contratos REST Apollo; normalize.pyObservedEvidence
corpus/store.py — upsert idempotente por entity_id; waves.py — geração de queries por onda
learning/model.py — regressão logística pura; tuner.py — shrinkage + clamp; feedback_store.py — votos atômicos

orchestrator.py

Pipeline unificado síncrono M1→M5. Injeta clientes, cache e relógio; retorna list[LeadCard]. Exporta run_pipeline() (CLI e web) e accumulate_and_rank() (corpus+ondas).

web/

app.py — rotas FastAPI (run, feedback, pesos, status) · services.py — lógica de negócio da UI · static/ — cockpit HTML + JS · schemas.py — contratos da API web

config/

runtime.toml — todos os parâmetros ajustáveis (pesos, TTLs, limites, opt-ins)
hypotheses_catalog.json — hipóteses de intent com priors e surface_signals
icp_criteria.*.json — ICPs concretos (talita, example)

scripts/

gate.ps1 / gate.sh — ruff + mypy + pytest em sequência
bootstrap.ps1 / bootstrap.sh — setup do zero (venv + deps + .env)
record_*_fixtures.py — gravam respostas reais de Tavily/Gemini/Apollo
new_card.ps1 — cria card no GitHub Project com template DoR
setup_github_project.ps1 — sincroniza PROGRESS.md → board

13 Testes, BDD & observabilidade

A suíte de testes é a garantia de que o sistema é determinístico, byte-idêntico e jamais toca rede. Toda chamada externa é mockada com fixtures gravadas supervisionadas.

📄 Features Gherkin

tests/features/

m1_busca.feature · M2 · M3 · M4 · M5
pipeline_smoke.feature — E2E byte-idêntico
objetivo_ranking.feature — objetivo de negócio

Cada módulo exige 3 cenários: feliz (caminho normal) + degradado (429/timeout → degrada, não quebra) + Open-World (sinal ausente → incerteza ↑, nunca falso).

🗂️ Fixtures gravadas

tests/fixtures/

Respostas reais de API capturadas uma vez, com supervisão, via scripts dedicados:

record_tavily_fixtures.py
record_gemini_fixtures.py
record_apollo_fixtures.py (requer plano pago)

Depois de gravadas, os testes as usam via FakeTavilyClient / FakeGeminiClient — rede nunca é tocada em CI.

🔬 Garantias dos testes

  • Reexecução byte-idêntica (smoke executa 2×)
  • Tolerância numérica abs(a-b) ≤ 1e-9
  • IDs por hash SHA-256 estável (nunca UUID aleatório)
  • Relógio injetado como parâmetro (now: datetime)
  • Flakiness = falha (zero tolerância)
  • mypy --strict sem erros
  • StrEnum (não str, Enum) para Python 3.11+

Observabilidade & SLOs do PoC

📊 logs/cognitive_trace.jsonl

Log append-only com um evento por decisão relevante do pipeline. Cada linha: {ts, module, action, lead_id, inputs_hash, outputs_hash, tokens, degraded}. Permite auditar custo, reproduzir decisões e, no futuro, medir latência sem instrumentação extra. Rastreabilidade: Evidence → Inference → Score → Decision garantida via derived_from.

🎯 SLOs do PoC

SLI Alvo (SLO)
Testes verdes na main 100% (bloqueante)
Determinismo pipeline 100% byte-idêntico (bloqueante)
Cobertura de tipos mypy --strict sem erros
Custo por execução ≤ orçamento runtime.toml
Latência (N≤50 leads) p95 a calibrar via trace

Error budget zero para determinismo e testes. Latência/custo: alvo a calibrar — não bloqueia merge no PoC.

14 Configuração central (runtime.toml)

config/runtime.toml é o painel de controle do PoC. Nenhum segredo aqui (chaves de API ficam no .env). Todas as features opt-in são desligadas por padrão para preservar a paridade do smoke E2E.

[scoring] — fórmula do score

w_fit = peso fit estrutural0.60
w_intent = peso de intenção0.40
confidence_exponent0.5
w_fit_tech / w_fit_industry0.60 / 0.40
intent_evidence_norm5

[persona] — multiplicadores por tipo

fundadora1.0 ← alvo
indefinido0.5
empresa0.35
fundador0.0 ← hard filter

[finops] — controle de custo

tau_finops — limiar de poda0.60
kappa_degraded — penalidade em modo degradado0.80

[gemini] — cognição

modelgemini-2.5-flash-lite
batch_size50
timeout_seconds120
rpd_enabledfalse ← opt-in
rpd_cap req/dia1000

[cache] · [tavily] · [runtime]

cache.ttl_hours24h
tavily.max_queries3
tavily.persona_term"fundadora"
runtime.max_leads_per_cycle50

[apollo] — sensor firmográfico (opt-in)

enabledfalse ← opt-in
reveal_top_n20
org_enrich_ttl_hours720h (30d)
reveal_ttl_hours2160h (90d)
caps.data_credits_cap100/mês

[corpus] & [learning] — opt-ins ativos

corpus.enabledtrue ← ligado
corpus.pathdata/corpus/leads_corpus.json
corpus.waves_pathdata/corpus/waves.json
learning.enabledtrue ← ligado
learning.min_likes / min_dislikes3 / 3
learning.l20.1
learning.epochs500
learning.shrinkage_max0.5
Regra de paridade: qualquer feature com enabled = false deixa o pipeline byte-idêntico ao baseline. Ligar uma feature = alterar o caminho quente; desligar = zero impacto. O smoke E2E valida isso a cada PR.

Em síntese

O que é o SocialSelling

O SocialSelling torna a busca de clientes mais eficiente e automática com IA, construído com engenharia de verdade: decisões registradas em ADRs/SDDs, um SDD-to-Code Loop com gates determinísticos e aprendizado contínuo por feedback.

  • Prospecção automática com IA — encontra e qualifica clientes com menos esforço manual.
  • ADRs/SDDs — arquitetura e comportamento documentados como fonte da verdade.
  • SDD-to-Code Loop + gates — determinismo e Open-World no caminho crítico.
  • Aprendizado por feedback — o sistema melhora com o resultado real.

Perguntas frequentes

Perguntas frequentes

O que é o projeto SocialSelling?

É um sistema que torna a busca e a qualificação de clientes mais eficientes e automáticas com IA. Foi construído com engenharia disciplinada: decisões em ADRs/SDDs, um loop SDD-to-Code com gates determinísticos e aprendizado por feedback.

Como o determinismo e o Open-World aparecem aqui?

O caminho crítico resolve o que dá para resolver com regras (determinístico-primeiro) e trata ausência de dado como incerteza explícita (Open-World), não como "falso". Isso evita que a IA invente qualificações e mantém o resultado auditável.

O que é o SDD-to-Code Loop?

É o ciclo em que a especificação dirige a implementação e os gates validam cada passo antes de avançar: escreve-se a intenção, a IA implementa contra ela e os testes/gates provam a conformidade. O aprendizado por feedback realimenta a spec.