This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Este projeto eh consumer + analise. A captura, parse e merge canonicos moram no projeto irmao em
~/Desktop/multi-ai-session-data-extractor/(filho). Aqui:
data/processed/edata/unified/chegam viadvc importdo filho (read-only,frozen: true). Atualizar comdvc update. NUNCA rodardvc addnesses paths.data/curated/eh trabalho deste projeto (topics, enriched_*, entity_hierarchy, generated_titles). DVC tracked separado.data/raw/NAO atravessa a fronteira do filho por design. Filho versiona raw inteiro (4.8GB, #28 shipped 2026-05-04), pai consome so canonicos. Excecoes pontuais viadvc importde subpath quando uma analise precisa do bruto (ex:data/raw/Claude Code/_images/).- Notebooks
.qmdemnotebooks/consomem unified + curated via DuckDB.Memory:
project_two_projects_split.md(decisao arquitetural),project_dvc_backup.md(estado DVC). DVC:docs/dvc-runbook.md.
Estudo longitudinal N=1 de interacao humano-AI (~294k mensagens, dez/2022-mai/2026). 12 fontes (Claude.ai, ChatGPT, Qwen, DeepSeek, Perplexity, Gemini, NotebookLM, Grok, Kimi, Claude Code, Codex, Gemini CLI) padronizadas em parquet e consultadas via DuckDB. Analises em Quarto (.qmd) no Positron. Fundamentacao teorica em Conversation Analysis, Human-AI Interaction e autoethnografia.
# Setup
python3 -m venv .venv && source .venv/bin/activate && pip install -e ".[dev]"
# Tests (17 testes — DuckDBManager + episode_id)
pytest # todos
pytest tests/test_db.py -v # DuckDB
pytest tests/features/ -v # episode_id
# Atualizar dados canonicos do filho
dvc update data/processed.dvc data/unified.dvc # puxa nova versao via gdrive
python scripts/smoke_test_unified.py # valida schema + nao-encolhimento (rodar APOS dvc update)
# Versionar dados curados (deste projeto)
dvc add data/curated && git add data/curated.dvc && dvc push
# Render notebooks
./scripts/render.sh notebooks/eda # pasta inteira
./scripts/render.sh notebooks/eda/08-eda-unified.qmd # arquivo unico
# Enrichment local (episode_id em data/unified/)
python scripts/run_enrichment.py # default offset 0
python scripts/run_enrichment.py --offset 3
python scripts/validate_episode_window.py # valida janela 0-6h
# USP/MBA provas workflow
python scripts/generate_usp_provas_md.py # processa chats claude_ai pra mds no vault externoFilho (~/Desktop/multi-ai-session-data-extractor/) ─DVC import (frozen)─→ data/processed/
─→ data/unified/
data/curated/ (deste projeto, DVC tracked)
│
↓
DuckDB (src/db.py) ←─ data/unified/ + data/curated/
│
↓
Notebooks Quarto (.qmd)
- DuckDB:
src/db.py(DuckDBManager) registra parquets como views, queries retornam DataFrames. - Config visual:
src/notebook_config.py— COLORS, LABELS, TYPES compartilhados pelos notebooks. - Enrichment:
src/features/episode_id.py— clusteriza mensagens em "episodios" (mesmo prompt em multiplas plataformas). - Curated: parquets gerados por notebooks de enrichment em
notebooks/enrichment/. Detalhe abaixo na secao "Parquets curados".
12 fontes, ~294k msgs, dez/2022-mai/2026. Detalhes (excecoes, mapeamentos, ZIPs, recortes) em docs/research/inventario-fontes.md.
| Fase | Fontes | Tipo |
|---|---|---|
| 1 | Claude.ai, ChatGPT, Qwen, DeepSeek, Perplexity, Gemini, NotebookLM, Grok, Kimi | web (chat + RAG) |
| 2 | Claude Code, Codex, Gemini CLI | CLI |
| 3 | Manual saves (clippings Obsidian, copypaste-web, terminal CC) | filesystem |
Subagents Claude Code: interaction_type=ai_ai e parent_session_id apontando pro parent. Filtrar com WHERE interaction_type = 'human_ai' pra analises sem distorcao.
Stubs orfas Claude Code: 352 sessoes (13/jan-28/fev/2026) tiveram JSONL raiz perdido upstream. Reconstruidos como stubs identificados por title LIKE '[orphan parent — % msgs originais, JSONL perdido]'. Filtrar em analises de conteudo.
Gemini CLI orphans: Conversas presentes em logs.json mas sem chats/session-*.json correspondente viram Conversations com is_preserved_missing=True, mode='cli', e Messages role=user (sem respostas do agente — logs.json so tem prompts). Filtrar com WHERE NOT (source = 'gemini_cli' AND is_preserved_missing) quando analise exigir resposta do agente.
agent_memories (tabela auxiliar nova, 2026-05-07): memorias geradas/lidas pelo agente entre sessoes (Claude Code per-project, Codex global). Conceito separado de messages — sao artefatos persistentes que o agente mantem como contexto, NAO mensagens de conversa. ~250 rows tipico (Claude Code), 0 hoje (Codex). Schema completo em docs/unified-schema.md. Joina com conversations.project = agent_memories.project_path (Claude Code per-project) ou trata como ambient memory por source (Codex global, project_path IS NULL). NAO incluir em queries de mensagens — kind ∈ {user, feedback, project, reference, index, other} reflete tipo de memoria, nao role de conversa.
- Backlog:
docs/backlog.md— o que esta feito, o que falta. Consultar antes de iniciar trabalho novo. Tabela "Mapa de ataque" no topo eh ponto de entrada unico. - Schema contract:
docs/unified-schema.md— colunas esperadas das 4 tabelas canonicas (validadas pelo smoke) + auxiliares (agent_memories etc, fora do smoke) + dtypes + null policy. Mudanca de schema no filho deve virar PR aqui antes da quebra silenciosa em notebook. Smoke test:scripts/smoke_test_unified.py. - DVC runbook:
docs/dvc-runbook.md— comandos, credenciais, troubleshooting OAuth. - DVC setup manual:
docs/dvc-setup-manual.md— passo-a-passo pra montar DVC+Drive em outra maquina. - USP/MBA provas workflow:
docs/usp-mba-provas-workflow.md— pipeline de chats claude_ai pra mds no vault externo (~/Desktop/Data Science & Analytics/). - Inventario fontes:
docs/research/inventario-fontes.md— detalhes por fonte, excecoes. - Filesystem chat-inputs registry:
docs/research/filesystem-chat-inputs-registry.md— registro continuo de arquivos do filesystem que sao conversas AI ou inputs. Atualizar ao achar novo. - Fundamentacao teorica:
docs/research/fundamentacao-teorica.md - Framework analitico:
docs/research/framework-analitico.md— Cattell × tecnicas × espelho/janela. - Serie canonica como dado:
docs/research/serie-canonica-como-dado.md - Metodologia categorizacao:
docs/research/metodologia-categorizacao-granularidade-assimetrica.md - Data profiling:
docs/research/data-profiling-enrichment.md - Project enrichment:
docs/research/project-enrichment-process.md - Timezone fix historico:
docs/research/timezone-fix-historico.md - Specs:
docs/superpowers/specs/— design docs, gitignored. - Plan archive:
docs/superpowers/archive/— planos concluidos + runbooks historicos.
Notebooks que substituem progressivamente docs estaticos. Narrativa autoetnografica em 1a pessoa, validada frase a frase pelo Marlon. Ponto atual (14/abr/2026): 5 storylines completos.
- 00-genese-storyline.md — gestacao conceitual + viabilidade da coleta (26-31/mar).
- 01-padronizacao-storyline.md — schema base, refinamentos, fixes 2/10/13 abr.
- 02-categorizacao-storyline.md — project_group, topic, granularidade assimetrica. 3.268 human_ai 100% categorizadas.
- 03-metodologia-storyline.md — fundamentacao teorica + Mixed Analysis + matriz epistemologica.
- 04-analise-storyline.md — framework Cattell × tecnicas × espelho/janela. 5 notebooks executores em
notebooks/analysis/main-04/(P/Q/R-mode, Sequential, Platform Signatures).
Drafts em _backup-* sao IA-gerados e NAO sao autoridade. Usar dados, nao vocabulario deles.
Proximo: 05-analise (opcional, aprofundamentos), nao iniciado.
| # | Notebook | Conteudo |
|---|---|---|
| 08 | eda-unified | EDA cross-plataforma: streamgraph, temporal, 863 pares comparative prompting |
| 09 | eda-patterns | 10 padroes analiticos |
| 14 | overview-streamgraph | Streamgraph 12 fontes, human_ai vs ai_ai |
| 15 | projetos-cross-plataforma | Cross-plataforma project_group |
| 16 | agent-memories | EDA exploratorio das memorias persistentes do agente (claude_code, 253 rows, 19 projetos, 6 kinds) |
| # | Notebook | Conteudo |
|---|---|---|
| 10 | arqueologia-tematica | 14 temas intelectuais, genealogia 24/mai-3/jun |
| 11 | grafo-genealogico | Grafo de evolucao conceitual |
| 12 | timeline-entities | Timeline por entity |
| 14 | timeline-narrativa-2025 | Narrativa 2025 |
20 notebooks com template padronizado (_template.qmd, 15 secoes). Tipos: web-chat, web-rag (NotebookLM), cli. Modulo compartilhado: src/notebook_config.py.
| # | Notebook | Conteudo |
|---|---|---|
| 00 | consolidado-geral | Profiling — todas as 12 fontes |
| 01 | consolidado-web-chat | Profiling — 8 fontes web-chat |
| 02 | consolidado-web-rag | Profiling — NotebookLM (3 contas) |
| 03 | consolidado-cli | Profiling — 3 fontes CLI |
| 04-15 | por ferramenta | Profiling individual + subcontas (Gemini 2, NotebookLM 3, Grok, Kimi) |
Geram parquets em data/curated/. Notebooks chave:
01-title-generation.qmd— generated_titles05-project-enrichment-v2.qmd— enriched_projects + topics_vocabulary + conversation_topics15-estrategia-orfas.qmd— entity_hierarchy16-consolidacao-single-pg.qmd— entity_hierarchy_consolidated17-chatgpt-voice-candidates.qmd— chatgpt_voice_candidates
Aplicacao do framework analitico (storyline 04). Subpasta main-04/ tem 5 executores: P-mode, Q-mode, R-mode, Sequential, Platform Signatures.
Notebooks originais que liam JSON raw. Substituidos pelo data-profile. Preservados pra referencia.
data/curated/ eh o trabalho ativo deste projeto. NUNCA deve ser deletado ou sobrescrito por nada. dvc update em processed/unified nao toca em curated (paths separados), mas atencao a scripts que processem unified e cuspam output em curated — sempre LER de unified, MERGEAR no que ja existe em curated.
Arquivos/pastas que entraram no working tree mas ainda nao foram triados. Estao no .gitignore pra manter o repo limpo. Nao deletar. Quando der tempo, decidir destino (committar, mover pra outro lugar, ou descartar).
| Item | Tipo | Observacao |
|---|---|---|
Claude files & resources/ |
pasta | 5 subpastas: Claude Errors, Claude Insights, Claude Skills, IA user-profile (Me), yt-nblm-skill |
plans/ |
pasta | 61 arquivos .md (planos antigos jan-fev/2026), pode ser scratch ou material util |
README_public.md |
arquivo | 19KB, criado 25/abr/2026 — versao publica do README? |
docs/research/Screen Recording 2026-04-27 at 22.36.55.mov |
arquivo | 7.6MB, gravacao de tela 27/abr — provavelmente relacionada a algum achado de pesquisa |
scripts/generate_usp_provas_md.py |
modified | +25/-1 linhas nao commitadas — revisar diff antes de decidir |
- Commits: conventional commits em portugues via
~/.claude/scripts/commit.sh. - Idioma do codigo: ingles. Comentarios e docs em portugues.
- Quando o usuario pedir algo, fazer. Nao perguntar "quer que eu faca?". Nao propor alternativas quando a instrucao eh clara. Entregar no formato util (links clicaveis, nao terminal output).
- Timestamps em BRT naive (
America/Sao_Paulo) — parquets em unified vem normalizados pelo filho. Historico do fix:docs/research/timezone-fix-historico.md. - Codigo Python colapsado por default em notebooks. Regra global em
notebooks/_quarto.yml(code-fold: true+code-tools: true). Leitor ve narrativa+tabelas+plots; codigo abre sob demanda bloco a bloco ou via "Show All Code" no topo. Front matter individual sobrescreve se precisar. - Dados em notebooks SEMPRE viram tabela Styler. Proibido
print(df),df.to_string(),for row in df.iterrows(): print(...),df.to_markdown(), ou Markdown tables com pipes. Para preview de texto longo dentro de celula, usar<pre style="white-space:pre-wrap; max-width:560px; ...">...</pre>na coluna e renderizar com.style.format({...}, escape=None). Detalhe e exemplos na memoryfeedback_notebook_tables.md. - Render quirk: o python da
.venvaponta propython3.14do homebrew sem isolamento.quarto renderprecisa da venv ativada (source .venv/bin/activate && quarto render ...) —QUARTO_PYTHON=.venv/bin/pythonsozinho NAO carrega os pacotes da venv.
| Gatilho | Atualizar | O que muda |
|---|---|---|
| Completou item do backlog | docs/backlog.md |
Marcar [x], atualizar numeros |
| Achado novo de pesquisa | docs/research/<doc-relevante> |
Adicionar secao |
| Descobriu lacuna | docs/backlog.md |
Adicionar em "Lacunas" ou "Fios soltos" |
| Decisao arquitetural | MEMORY (tipo project) | Registrar principio + por que |
| Feedback do usuario | MEMORY (tipo feedback) | Como trabalhar melhor |
| Mudanca em fonte upstream | docs/research/inventario-fontes.md |
Secao da fonte |
O que NAO duplicar: MEMORY nao repete o backlog. Backlog = estado/tarefas. MEMORY = contexto/decisoes/perfil.
Notebook: notebooks/enrichment/15-estrategia-orfas.qmd. Estado: 938/938 classificadas (100%) + GT Lixo com 182 convs inaproveitaveis + 5 recuperadas do lixo. Fechado em 2026-04-09. Doc do metodo: docs/research/metodologia-categorizacao-granularidade-assimetrica.md. Historico + aprendizados em memory: project_nb15_state.md.
Regras criticas (aprendidas ao longo do nb 15, aplicaveis a trabalhos futuros de categorizacao):
- SEMPRE render+open apos QUALQUER edicao no .qmd — sem perguntar, sem acumular.
- NUNCA aplicar cluster sem ler conteudo real (titulos mentem — varios casos "Plotly Positron" era TQSA, "Obsidian plugin" era DataLab, etc).
- NUNCA chutar conversation_ids truncados — sempre re-querar do DB (bug recorrente).
- NUNCA adicionar em
conv_topic_overridesem adicionar emconv_pg_override— conversa fica invisivel. - SEMPRE que adicionar um topic value novo em
conv_topic_override, registrar emtopic_promote(2-tuple) outopic_promote_subsub(3-tuple). Bug historico: 37+ convs caiam em "Empty" silenciosamente. - NUNCA adicionar no meio dos dicts — sempre no FINAL.
- Mostrar dados antes de decidir — o ritmo "investigar → mostrar → decidir → aplicar → renderizar" eh inegociavel.
- topic_promote = 2-tuple (entity, sub) / topic_promote_subsub = 3-tuple (entity, sub, sub_sub) — NAO confundir.
- Voice mode chatgpt — colar conteudo no arquivo manual
data/curated/chatgpt_voice_manual_content.md. - Sub_sub = episodio/artefato tematico do projeto, nao conceito metodologico.
- Empty-title ≠ lixo automatico — sempre contar user msgs com LENGTH > 30 antes de descartar.
- Ao finalizar sessao: atualizar docs (metodologia, backlog), memory, e committar.
Como consultar dados:
- SEMPRE usar
from src.db import DuckDBManager+db = DuckDBManager('data/unified')— registra todos os parquets como views automaticamente. - O parquet de enrichment esta em
data/curated/enriched_projects.parquet— ler compd.read_parquet(), NAO via DuckDB. - NUNCA usar
duckdb.connect()direto ouread_parquet()no SQL — as views do DuckDBManager ja existem. - Fechar com
db.close()no final.
Schema das views DuckDB (nomes exatos das colunas):
conversations: conversation_id, source, title, created_at, updated_at, message_count, model, account, mode, project, url, interaction_type, parent_session_idmessages: message_id, conversation_id, source, sequence, role, content, model, created_at, account, token_count, word_count, attachment_names, content_types, thinking, tool_resultsconversation_projects: conversation_id, project_tag, tagged_by, confidence (NAO tem project_name — usar project_tag)events: event_id, conversation_id, message_id, source, event_type, tool_name, file_path, command, duration_ms, success, metadata_json
Parquets curados em data/curated/ (pd.read_parquet, NAO via DuckDB):
| Parquet | Colunas | Descricao |
|---|---|---|
enriched_projects.parquet |
conversation_id, project_group, method | Rodada 1 — 2.011 convs, 39 groups |
topics_vocabulary.parquet |
topic, topic_type | Rodada 2 — 152 topics, 16 topic_types |
conversation_topics.parquet |
conversation_id, topic, role | Rodada 2 — 3.535 registros (primary + secondary) |
entity_hierarchy.parquet |
conversation_id, source, project_group, entity, sub_entity, sub_sub_entity | Hierarquia 4 niveis — 3.292 rows, 3.067 convs, 16 entities, 123 subs, 187 sub_subs. Multi-membership preservado (convs transversais aparecem 2x) |
entity_hierarchy_consolidated.parquet |
idem | Versao single-PG do entity_hierarchy (1 row por conv). Gerado pelo nb 16. Usar pra contagens matematicas (Sankeys, P/Q/R-mode). Usar o original pra leitura etnografica |
chatgpt_voice_candidates.parquet |
conversation_id, title, created_at, url, msg_count, placeholders, voice_score, classification, has_manual | Classificacao de convs ChatGPT suspeitas de voice mode. 4 niveis (full_voice/mostly_voice/mixed/occasional). Gerado pelo nb 17 |
enriched_projects: project_group eh valor exato (ex: "DataLab GAS, Estapar, Eduzz NPS", nao "multi-membership"). Multi-memberships usam virgula no nome — filtrar com==exato, naoLIKE.conversation_topics: role eh "primary" ou "secondary". Para ver TUDO de um topic:topics[topics['topic'] == 'MCA'](sem filtrar role). Topics e secondaries usam o mesmo vocabulario controlado.topics_vocabulary: vocabulario unificado. Todo valor em conversation_topics.topic existe aqui.entity_hierarchy: hierarquia derivada do nb 15. sub_sub_entity e sub_entity podem ser None (atomicos puros pulam niveis). Multi-membership gera multiplas rows por conversation_id. PG eh scaffolding visual, entity/sub/sub_sub sao a classificacao real.entity_hierarchy_consolidated: camada complementar gerada pelo nb 16. Mesma estrutura mas 1 row por conversation_id (multi-membership colapsado). Usar pra contagem honesta (Sankeys, P/Q/R-mode, correlacoes). Pra leitura etnografica (quais convs transversais entre projetos?), usar o original.
Dicas DuckDB (evitar erros comuns):
contentpode ser NULL — usarCOALESCE(content, '')antes de funcoes de string.- Truncar texto:
content[:300](slice Python-style) ouLEFT(COALESCE(content, ''), 300). - Strings: aspas simples
'texto', nao aspas duplas.