Estudo longitudinal N=1 da interação humano-AI ao longo de cerca de três anos e meio (dez/2022 — abr/2026), cobrindo 8 plataformas (Claude.ai, ChatGPT, Gemini, Qwen, DeepSeek, Perplexity, NotebookLM, Claude Code + Codex + Gemini CLI). ~5 mil conversas, ~170 mil mensagens, ~80 mil tool events, capturadas via extractors proprietários, padronizadas num schema único e analisadas com Mixed Analysis, perfis P/Q/R-mode e análise sequencial.
Há uma característica estrutural que define o projeto: o mesmo tipo de sistema que está sendo estudado é também o instrumento de estudo. Os parsers e extractors foram em grande parte construídos com Claude Code; a categorização de tópicos foi assistida por Claude.ai; os 471 insights gerados pela própria Anthropic sobre minhas conversas viraram uma camada do dado. Isso não é contornado como viés — é assumido como objeto. O design epistemológico (apoiado em von Foerster, Latour, Knorr-Cetina e Péladeau) trata a coincidência entre pesquisador, instrumento e fenômeno como informação a interpretar, não a neutralizar.
O repositório expõe duas frentes paralelas: a infraestrutura de captura e padronização (que tem valor técnico próprio — captura incremental via APIs internas em sete plataformas, reconcilers com preservação de histórico, schema cross-source) e o trabalho analítico em andamento sobre o corpus resultante.
| Plataforma | Tipo | Conversas | Mensagens | Período |
|---|---|---|---|---|
| Claude.ai | web-chat | 1.005 | 25.355 | nov/2024 — abr/2026 |
| ChatGPT | web-chat | 1.161 | 16.918 | dez/2022 — abr/2026 |
| Gemini | web-chat | 80 | 674 | out/2024 — mar/2026 |
| Qwen | web-chat | 108 | 1.426 | fev/2025 — mar/2026 |
| DeepSeek | web-chat | 78 | 516 | jan/2025 — mar/2026 |
| Perplexity | web-chat | 78 | 340 | ago/2024 — mar/2026 |
| NotebookLM | web-RAG | 149 | 114 | jun/2024 — mar/2026 |
| Claude Code | CLI | 2.241 | 121.489 | fev — abr/2026 |
| Codex | CLI | 104 | 2.407 | fev — abr/2026 |
| Gemini CLI | CLI | 11 | 182 | mar/2026 |
| Total | — | 5.015 | 169.421 | — |
Mais 80.697 tool events (chamadas a Read/Edit/Bash/Grep/etc dentro das CLIs), 130 projetos linkados (82 Claude.ai + 48 ChatGPT) e 29 arquivos de manual saves resgatados do filesystem.
Sete plataformas, captura via APIs internas (não scraping DOM). Cada extractor segue a mesma anatomia: auth + api_client + discovery + fetcher + asset_downloader + orchestrator, com saída em data/raw/<Source> Data <date>/. Todos com captura incremental por default — comparam update_time do servidor com o último raw local e fetcham só o que mudou (re-run em ~3 min vs ~30 min full).
| Plataforma | Método | O que captura |
|---|---|---|
| ChatGPT | /backend-api/conversations (REST) |
Convs, audio transcripts (voice mode), Canvas (29 textdocs + patches), Deep Research (54 reports), Files, DALL-E |
| Claude.ai | /api/organizations/.../chat_conversations (REST) |
Convs, 1.117 artifacts extraídos como arquivos individuais (code, markdown, React, SVG), 83 projects, 546 project docs (23M chars) |
| Gemini | batchexecute RPC (MaZiqc list + hNvQHb fetch) |
Convs, 226 imagens (uploads + geradas pelo modelo), Deep Research (35 reports) inline na árvore JSON, multi-conta via profiles |
| NotebookLM | batchexecute RPC (9 rpcids mapeados) |
9 tipos de outputs: audio overview, video overview, slide deck (PDF + PPTX), blog/report, flashcards, quiz, data table, infographic, mind map. Lite-fetch detecta unchanged em 3 RPCs/notebook antes de full fetch |
| Qwen | API interna | Convs |
| DeepSeek | API interna | Convs |
| Perplexity | API interna | Convs |
O que se ganha indo direto na API e não pelo export oficial:
- Granularidade — artifacts do Claude.ai, audio transcripts do ChatGPT, mind maps do NotebookLM. Coisas que o ZIP oficial não dá.
- Incrementalidade real — diff por timestamp do servidor, não rebuild a cada captura.
- Histórico preservado — conversas deletadas no servidor ficam marcadas como
preserved_missingno merge local em vez de sumirem do dataset. - Independência do calendário do fornecedor — o ChatGPT, por exemplo, levou 11 meses entre dois exports oficiais; com a API, qualquer dia.
Quatro entidades, expressas como dataclasses em src/schema/models.py:
Conversation → conversation_id, source, title, created_at, updated_at,
message_count, model, account, mode, project, url,
interaction_type (human_ai | ai_ai), parent_session_id
Message → message_id, conversation_id, sequence, role, content,
model, created_at, token_count, word_count,
attachment_names, content_types, thinking, tool_results
ToolEvent → event_id, conversation_id, message_id, source,
event_type, tool_name, file_path, command,
duration_ms, success, metadata_json
ConversationProject → conversation_id, project_tag, tagged_by, confidence
Treze parsers (sete web + três CLI + três manual saves) herdam de BaseParser e produzem parquets uniformes em data/processed/. O merge.py consolida em data/unified/ (fonte de verdade pra DuckDB e notebooks).
Timestamps em BRT naive (America/Sao_Paulo) — todos os parsers normalizam via BaseParser._ts, suportando ISO com/sem TZ e epoch. Subagents do Claude Code recebem interaction_type=ai_ai e parent_session_id apontando pro parent (filtrável em análises de conteúdo).
Para cada plataforma com captura recorrente existe um reconciler em src/reconcilers/. A função: dado o raw novo + o merged anterior, decidir conversa por conversa qual o estado preservado.
build_plan(raw_new, merged_prev) →
add (conv nova no servidor)
update (timestamp ou hash mudou)
copy_unchanged (idêntico ao anterior, copia direto)
preserved_missing (sumiu do servidor, mantém no histórico)
Idempotente por desenho (1ª run adiciona, 2ª run só copia). Suporta --full, --refetch-features <feat>, --previous-merged <path>. NotebookLM usa _eq_lenient (compara conteúdo ignorando timestamps voláteis, porque o update_time do servidor mente). FEATURES_VERSION força refetch quando rpcid novo é adicionado.
data/curated/ é a camada que nunca é sobrescrita pelo pipeline. Lá vivem categorizações, hierarquias temáticas e classificações qualitativas que demandaram leitura humana.
| Parquet | Conteúdo |
|---|---|
enriched_projects.parquet |
2.011 conversas → 39 project groups (rodada 1, algorítmica + curada) |
topics_vocabulary.parquet |
Vocabulário controlado de 152 topics em 16 tipos |
conversation_topics.parquet |
3.535 atribuições primárias e secundárias |
entity_hierarchy.parquet |
Hierarquia de 4 níveis (PG → entity → sub → sub_sub), 3.292 rows, multi-membership preservado |
entity_hierarchy_consolidated.parquet |
Versão single-PG (1 row por conversa), pra contagens matemáticas honestas |
chatgpt_voice_candidates.parquet |
Classificação de 4 níveis (full_voice / mostly_voice / mixed / occasional) com transcrições manuais para casos onde o parser perdeu o áudio |
A coexistência das duas versões da hierarquia (com e sem multi-membership) é deliberada: leitura etnográfica precisa de transversalidade; correlação numérica precisa de exclusividade. O dado não foi forçado num formato só — foi expandido em duas camadas complementares.
notebooks/main/ reúne a narrativa principal em cinco notebooks construídos em primeira pessoa, que documentam a gênese conceitual e metodológica do projeto à medida que a análise é executada:
| # | Notebook | Conteúdo |
|---|---|---|
| 00 | gênese | Faísca conceitual, viabilidade da coleta, plataforma por plataforma |
| 01 | padronização | 7 blocos cronológicos de evolução do schema (incluindo a virada de 1/abr) |
| 02 | categorização | 3 rodadas: project_group → topic/secondary → granularidade assimétrica |
| 03 | metodologia | Fundamentação teórica + costura conceitual com Mixed Analysis |
| 04 | análise | Aplicação empírica do framework (Cattell × técnicas × espelho/janela) |
Os cinco notebooks foram validados frase a frase. A coda do 02 admite explicitamente o que ainda não está conceitualmente redondo. Drafts gerados por AI durante o processo foram preservados em _backup-* mas explicitamente não tratados como autoridade — vocabulário e enquadramentos vieram dos dados, não dos drafts.
A análise empírica é organizada pelo data box de Cattell (1952), cruzado com técnicas de análise sequencial e o par espelho/janela (autoetnografia digital):
| Modo | Pergunta | Técnica |
|---|---|---|
| P-mode | Como uma plataforma evolui em função do tempo? | Séries temporais por fonte |
| Q-mode | Quais conversas se agrupam por similaridade de uso? | Clustering temático |
| R-mode | Quais variáveis (modelo, modo, hora, projeto) co-ocorrem? | Correlação cross-feature |
| Sequential R-mode | Que sequências de uso revelam genealogia? | Análise de transição |
Cinco notebooks executores em notebooks/analysis/main-04/ materializam cada modo. Achado metodológico relevante: coocorrência não captura genealogia — topics tendem a ser quase-exclusivos por chat, então a evolução conceitual entre conversas só aparece no Sequential R-mode.
A categorização adota granularidade assimétrica (3 modos: atômico, atômico+fases, balde) com 8 mecanismos de override documentados, em vez de forçar uma taxonomia simétrica em fenômenos de naturezas diferentes.
- Streamgraph 10 fontes (
notebooks/eda/14-overview-streamgraph.qmd) — volume mensal por plataforma, separando interações human_ai de ai_ai - Sankeys de hierarquia (
notebooks/enrichment/12*.qmd) — fluxo PG → entity → sub → sub_sub, com versões snap (multi-membership) e consolidated (exclusiva) - Grafo genealógico (
notebooks/qualitizing/11-grafo-genealogico.qmd) — evolução de conceitos cruzando plataformas e tempo - Arqueologia temática (
notebooks/qualitizing/10-arqueologia-tematica.qmd) — 14 temas intelectuais, genealogia 24/mai-3/jun como caso instrumental - Comparative prompting — 863 pares detectados via fuzzy match (rapidfuzz ≥ 70%), o mesmo prompt encaminhado a múltiplos modelos no mesmo dia
- 18 notebooks data-profile padronizados (
notebooks/data-profile/), 1 por fonte + agregadores cross-source
┌────────────────────────────────────┐
│ Captura (src/extractors/) │
│ 7 APIs internas + CLI live │
└──────────────┬─────────────────────┘
│
▼
┌────────────────────────────────────┐
│ Reconcile (src/reconcilers/) │
│ add | update | copy | preserved │
└──────────────┬─────────────────────┘
│
▼
┌────────────────────────────────────┐
│ Parse (src/parsers/) │
│ 13 parsers → schema unificado │
└──────────────┬─────────────────────┘
│
▼
┌────────────────────────────────────┐
│ Merge (src/merge.py) │
│ data/unified/ (fonte de verdade) │
└──────────────┬─────────────────────┘
│
▼
┌────────────────────────────────────┐
│ Curated (data/curated/) │
│ anotações humanas, nunca tocadas │
└──────────────┬─────────────────────┘
│
▼
┌────────────────────────────────────┐
│ DuckDB + Quarto notebooks │
└────────────────────────────────────┘
Backup e versionamento via DVC + Google Drive (docs/dvc-runbook.md): data/processed/, data/unified/ e data/curated/ versionados; data/raw/ ainda pendente. Push/pull automáticos chamados pelos scripts de ingestão.
- Python 3.12+ — ETL, parsers, extractors
- DuckDB — consultas SQL sobre parquets, registro automático de views via
DuckDBManager - pandas — transformações
- httpx + asyncio — extractors (substituindo Playwright em todas as plataformas via APIs internas)
- Quarto (.qmd) — notebooks de análise, renderização HTML/PDF
- Positron — IDE para .qmd
- DVC + Google Drive — backup e versionamento de artefatos
- Design — estudo longitudinal + transversal (mixed-design), N=1, autoetnografia
- Conversation Analysis — Sacks, Schegloff & Jefferson (1974)
- Human-AI Interaction — Morris (Google DeepMind), Liao (U. Michigan)
- Autoetnografia digital aplicada a AI — Wang (2025), Panke (2025)
- Mixed Analysis — von Foerster (cibernética de 2ª ordem), Latour (traçar associações), Knorr-Cetina (culturas epistêmicas), Péladeau (qualitização)
- Data Box — Cattell (1952), seis modos canônicos
Detalhes em docs/research/fundamentacao-teorica.md, docs/research/framework-analitico.md e docs/research/serie-canonica-como-dado.md.
data/raw/ → exports originais (gitignored)
data/processed/ → parquets por fonte no schema unificado
data/unified/ → parquets consolidados
data/curated/ → anotações humanas (nunca sobrescrito)
data/merged/ → outputs dos reconcilers, por data
src/extractors/ → 7 plataformas, captura via API
src/reconcilers/ → 7 reconcilers com preserved_missing
src/parsers/ → 13 parsers (BaseParser)
src/schema/models.py → dataclasses do schema
src/db.py → DuckDBManager
src/merge.py → consolidação de parquets
scripts/ → pipeline, ingestão incremental, captura por fonte
tests/ → 172 testes em 19 arquivos
notebooks/main/ → série canônica (00-04)
notebooks/data-profile/ → 18 notebooks padronizados
notebooks/eda/ → análise exploratória
notebooks/qualitizing/ → análise qualitativa/interpretativa
notebooks/enrichment/ → categorização e hierarquias
notebooks/analysis/ → P/Q/R-mode + Sequential
docs/research/ → fundamentação teórica, inventário de fontes
docs/backlog.md → mapa de ataque, lacunas conhecidas
Este é um estudo N=1 — os dados são pessoais e não estão no repositório público. O código, o schema e os notebooks estão aqui para inspeção, reuso (em particular o schema cross-source e os extractors) e referência metodológica.
Para outra máquina minha, o setup completo:
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
dvc pull # restaura processed/unified/curated do Drive
pytest # 172 testes
python scripts/ingest_cli.py # ingestão incremental CLI (uso diário)
python scripts/run_pipeline.py # rebuild completo (após fix de parser)Captura por plataforma:
PYTHONPATH=. python scripts/{source}-export.py # captura incremental
PYTHONPATH=. python scripts/{source}-reconcile.py # merge histórico
PYTHONPATH=. python scripts/{source}-download-assets.pyEntregue:
- 13 parsers cobrindo 8 plataformas + manual saves
- 7 extractors proprietários com captura incremental
- 7 reconcilers com preservação de histórico
- Pipeline orquestrado (parse + merge + DuckDB)
- 172 testes (19 arquivos)
- 5 notebooks da série canônica validados
- 18 notebooks data-profile padronizados
- Camada curada com hierarquia de 4 níveis (3.292 rows, 16 entities, 123 subs, 187 sub_subs)
- Análise empírica P/Q/R-mode + Sequential
- DVC backup operacional
- Fundamentação teórica costurada com Mixed Analysis
Em andamento:
- Integração do extractor proprietário do Claude.ai com o parser principal
- Reconciliação semântica para parsers de manual saves
- Aprofundamentos analíticos (notebook 05)
- Cruzamento temporal com Archaeologist (392 projetos, 21 anos de histórico técnico)
Lista completa em docs/backlog.md.
Marlon Lemes — Senior UX/CX Researcher e cientista de dados, São Paulo. Contato: hello.marlonlemes@gmail.com · GitHub: @mrlnlms
Este projeto é parte de uma trajetória mais longa de arqueologia digital pessoal (Archaeologist, Qualia Coding, Mirror Notes) e dialoga com pesquisa em métodos mistos, grounded theory e estudo etnográfico de interfaces.
"Turtles all the way down." Estudar AI usando AI que estuda como uso AI: a regressão é o método, não o problema.