Skip to content

feat(connector): HubSpot/CRM — Fase 0 do caminho Madruga (trial-to-buy) #1229

Description

@FabioLeitao

Contexto

Origem: FOCUS_PATH_madruga_2026-07-05.md (vault, sessão de 05/07) — decisão do operador já tomada, nunca virou artefato rastreável no repo até hoje (13/07). Traduzindo fielmente o spec já escrito, sem inventar nada novo.

Objetivo de negócio: converter o trial do design-partner Madruga/MTIS em contrato assinado. HubSpot é o primeiro conector escolhido especificamente pra fechar esse trial — não é R&D genérico.

Regra de corte já definida: só entra no escopo o que responde SIM a "o trial do Madruga precisa disso?" ou "isso é o que faz ele assinar?". Google Workspace, Databricks, session-diff ficam explicitamente fora por enquanto (Fase 1, só se o trial pedir).

Tarefa — Fase 0 (mínimo vendável)

1. connectors/hubspot_connector.py

Seguir o padrão já existente (docs/ADDING_CONNECTORS.md) — extensão limpa, não reinvenção:

  • Classe HubSpotConnector
  • __init__(self, target_config, scanner, db_manager, sample_limit=5)
  • connect() — cliente REST HubSpot a partir do target_config (private app token injetado, nunca no config commitado)
  • run() — para cada object type (contacts/companies/deals): ler object properties, tratar cada propriedade como "coluna", amostrar valores → scanner.scan_column(prop_name, sample)db_manager.save_finding(...)
  • close() — encerra o cliente
  • Registrar via register("hubspot", HubSpotConnector, ["name","type"]) + ramo em connector_for_target() pra type: hubspot
  • API: REST /crm/v3/objects/{contacts|companies|deals} com properties=, paginação via after, rate limit respeitado
  • Least privilege: private app token, escopo read-only, zero write

2. Garantir que HubSpot alimenta o Excel/heatmap existente

Reuso do output já existente, não construir novo relatório.

3. Fixtures sintéticas do cenário HubSpot

Gerador sintético BR (CPF com dígito válido em custom field), simulando o cenário real — nunca dado real do Madruga em repo/issue/commit/fixture.

Disciplina de dado real (inegociável, do próprio spec)

  • Scan roda no ambiente do Madruga; só o manifesto (metadata) sai
  • Nenhum dado real dele em repo/issue/commit/fixture
  • Papéis LGPD: Madruga/MTIS = controlador; Data Boar = operador sob instrução

Cross-referência

#697 ([P2][Pro] PLAN_DPO_COMPLIANCE_SCORE_REPORT.md — compliance grade A+→F) é chamado de "o argumento de venda" no mesmo spec — versão mínima dele faz parte do mesmo caminho de fechamento, tratar como issue irmã, não parte desta.

Explicitamente fora de escopo aqui (Fase 1, só se o trial pedir)

Databricks connector, Google Workspace auditor, session diff/drift — não implementar agora.

Critério de aceite

  • connectors/hubspot_connector.py implementado seguindo o padrão de ADDING_CONNECTORS.md
  • Registrado no connector_registry
  • HubSpot alimentando o Excel/heatmap existente
  • Fixtures sintéticas (CPF válido em custom field), zero dado real
  • Least-privilege confirmado (token read-only, zero write)
  • PR referencia esta issue (Closes #<N>)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions