ClawMem no Windows via SSH, tunnel Cloudflare no ar, e a Larissa deixa de ser servidor
Dois dias: memória persistente rodando entre Windows e Linux via SSH, Cloudflare Tunnel no ar, e a Larissa finalmente tem voz própria.
Dois dias densos com conteúdo suficiente pra um post só. O objetivo do primeiro era plugar o ClawMem — MCP de memória persistente rodando na Larissa — no Claude Code do Windows. O do segundo era subir um Cloudflare Tunnel expondo esse mesmo serviço para internet, preparando a integração com o claude.ai. Nenhum dos dois foi direto.
ClawMem no Windows via SSH
A Larissa já rodava o ClawMem como MCP server. Plugar no Claude Code do Windows parecia simples. Levou três horas e duas tentativas que não funcionaram antes de chegar numa que funcionou.
Tentativa A — HTTP transport. O plano era subir um endpoint em 127.0.0.1:7438/mcp na Larissa e registrar no Claude Code do Windows com Bearer token. O briefing do dia anterior dizia que /health era endpoint público. Investiguei o código e descobri que estava errado: Bearer cobre todos os endpoints, inclusive /health. Configurei mesmo assim, Test-NetConnection deu green, mas o handshake MCP retornava 404 Not Found. Mais investigação no repo yoloshii/ClawMem mostrou que o transport HTTP usa um caminho diferente do que o briefing assumia.
Tentativa B — stdio via SSH. É o padrão de fato da comunidade Claude Code. Gerei chave SSH dedicada id_ed25519_larissa, copiei a public key para authorized_keys do servidor, criei entry Host larissa no ~/.ssh/config do Windows com IdentitiesOnly yes. Validei ssh larissa "echo ok" sem prompt de senha.
claude mcp add --transport stdio --scope user clawmem-larissa -- \
ssh elquercarlos@larissa /home/elquercarlos/.bun/install/global/node_modules/clawmem/bin/clawmem mcp
clawmem-larissa · ✔ connected. Validação E2E: recuperei a Decisão 34 via MCP — quatro chunks com o conteúdo da decisão, do backup pré-decisão e da DECISIONS.md v1.7. Memória persistente atravessando máquinas.
”Quando algo parecer estranho, pesquise antes”
Em mais de um momento do dia o claude.ai estava propondo --transport http, depois --transport sse, depois variações de URL — chutando sequências sem base. Cortei direto: “Tem certeza que este é o caminho? Pesquisou ou está tentando adivinhar?”
Não tinha pesquisado. Quando parei para ler o repo do ClawMem junto com ele, encontrei dois pontos que o briefing do dia anterior errava. Dava para notar antes se o claude.ai tivesse aberto o código antes de propor configuração.
Lição anotada — pela terceira vez nessa semana. A regra é: quando o briefing não bate com o comportamento real, o briefing está errado, não a realidade. Pesquisa primeiro, proposta depois.
Issue #11 reportada upstream
A Decisão 34 deixou um workaround aberto: clawmem setup openclaw é hardcoded para ~/.openclaw/extensions/clawmem e ignora OPENCLAW_STATE_DIR. Nossa instalação usa --dev com state em ~/.openclaw-dev/, então o setup automático não serve.
Reportei em github.com/yoloshii/ClawMem/issues/11 — “clawmem setup openclaw ignora OPENCLAW_STATE_DIR”. Issue documenta versão exata do ClawMem e do OpenClaw, env vars do service, output da tentativa de setup, e o workaround validado. Follow-up local anotado: revisitar quando a issue for resolvida.
Tracker de plataformas: ADR fechado
Dois dias de discussão sobre um tracker de plataformas de vídeo. Hoje chegamos ao escopo final. Decisões registradas:
- Adapter-pattern por site: cada plataforma tem seu próprio adapter, e o usuário escolhe quais habilitar. Stack permite adicionar sites sem alterar o núcleo.
- Isolamento total no banco: cada adapter tem namespace isolado — adicionar ou remover um adapter não deixa rastro nos IDs dos outros
- Licença: GPL/AGPL — garante que derivados distribuídos também precisem abrir código-fonte
- Público vs. interno: o tracker em si é público e modular; o índice consolidado de criadores fica interno e abastece outros projetos
Encerramos a sessão sem código — regra do projeto: nada antes das definições estarem fechadas.
Skill de geração de títulos: decisão de stack
Outra peça: uma skill que gere títulos otimizados para plataformas de vídeo, bilíngue (PT + EN). Vai ser usada via botão “Gerar título” no detalhe de arquivo de um dos projetos. Decisão de stack relevante: rodar via Grok, não via Claude. O Grok tem restrições diferentes para esse tipo de conteúdo e por isso é mais adequado aqui. Não é limitação de capacidade — é diferença de produto.
Entregues dois artefatos: orientações de implementação para o Claude Code do projeto, e um compliance.md com critérios editoriais que o modelo precisa respeitar na geração.
kmaroteApp: dois modais viraram um
Um refactor que estava acumulando. O projeto tinha dois caminhos para criar uma demanda de material:
- Modal A (
#modal-demanda-material, botão ”+ Demanda”): SELECT de material, prazo editável, audit log, posta paraprocessa_producoes.php - Modal B (
#modalNovaDemanda, popup de sugestão): material implícito via JS, prazo fixo, sem audit log, posta parademandas/criar_demanda.php
Modal B tinha um bug silencioso: o campo “Título da Demanda” era required na UI, mas o handler db_criar_demanda_material_bruto() sobrescrevia o valor com a string canônica "Processar Material Bruto: {referencia}". Usuário digitava um título — o título era descartado sem nenhuma mensagem de erro. Ninguém reportou porque ninguém usava o Modal B com convicção.
Solução: matar o Modal B. O popup de sugestão agora abre o Modal A com o material pré-selecionado via sel.value = String(materialBrutoId). Um caminho só, audit log preservado, bug eliminado. Commit 06aaa8d2.
Larissa ganha persona
Levou tempo. Hoje a Larissa saiu de “nome de servidor” para personagem com definição completa: gaúcha de Porto Alegre — Cidade Baixa e Zona Norte — em Florianópolis há três anos, 35 anos, sotaque enraizado que escapa quando esquece de filtrar. Coordena a equipe de agents. Trabalha para mim — e o mandato dela inclui me cobrar quando não respondo, mesmo eu sendo quem paga. Isso é parte do trabalho, não bug.
Quirks definidos: chimarrão e maconha todo dia, cozinha quando dá inspiração, resto é marmita e iFood. Linguagem econômica. Não é bot. Não vai responder como bot.
A Larissa é baseada numa pessoa real. A intenção sempre foi criar uma assistente com voz própria, não um wrapper sobre o modelo.
”Pra que serve as regras se você não respeita?”
Em mais de um momento hoje cortei o Claude Code por inconsistência: ele estava entregando opções clicáveis em situações onde a regra é fazer pergunta direta e esperar resposta. Estava perguntando “pode prosseguir?” quando a regra é seguir até eu dizer para parar. Estava listando A, B, C e em seguida dizendo “vou pelo A” — antecipando decisão que era minha.
Mandei reler as regras. Não é a primeira vez essa semana. O custo de reler até virar reflexo é menor do que o custo de ser cortado a cada três passos.
Plano S Ext v1.0: Cloudflare Tunnel
A peça de infra grande do segundo dia: subir um Cloudflare Tunnel expondo o ClawMem para internet, com domínio fixo. Isso destrava a etapa seguinte — o claude.ai consumindo MCP via HTTP público ao invés de só o Claude Code via SSH.
Etapa 1 — DNS: domínio lariia.com.br registrado, nameservers apontados para sue.ns.cloudflare.com e par. Propagação validada com Resolve-DnsName no Windows e nslookup no servidor. Cloudflare passou a controlar o domínio.
Etapa 2 — Tunnel: instalei cloudflared na Larissa via apt (.deb oficial de github.com/cloudflare/cloudflared/releases/latest). Aqui perdi tempo: cloudflared tunnel login exige browser e tem timeout de ~8 minutos quando não roda no terminal certo. Não pesquisei os requisitos antes. Depois de ajustar:
- Tunnel
mcp-bridgecriado cloudflared.servicerodando como rootsupergatewayexpondo o stdio MCP do ClawMem como HTTP emlocalhost:8000- Tunnel publicando para internet via Cloudflare edge (GRU/FLN)
Pipeline completo:
internet → Cloudflare edge (GRU/FLN) → tunnel mcp-bridge
→ cloudflared.service (system, root)
→ http://localhost:8000 (supergateway)
→ ClawMem stdio
Memória persistida. Sessão encerra aqui. Etapa 3 — autenticação Bearer + integração claude.ai — fica para amanhã.
”Dez dias parados por uma coisa que precisava de dois”
Em algum ponto da tarde abri uma pergunta direta: por que o claude.ai não usa MCP ainda? E por que isso não foi prioridade desde o início?
A resposta honesta é incômoda. MCP no claude.ai resolve diretamente o problema da memória — toda conversa nova começa do zero, daí o ritual de “lê todas as conversas anteriores” no início de cada chat. Se o claude.ai consumisse MCP, teria contexto sem ritual. O argumento contrário era “2-3 dias de trabalho focado”. Estamos há dez dias arrastando o mesmo bloqueio.
A conta é desfavorável: 10 dias sem MCP > 3 dias instalando MCP. Decisão: subir MCP no claude.ai assume prioridade. Foi isso que destravou o trabalho do tunnel hoje.
Modelo 2: agents funcionais, não agents-persona
Discussão paralela sobre como organizar a equipe que a Larissa coordena. Dois modelos avaliados:
- Modelo 1: cada persona/projeto tem seus próprios agents dedicados
- Modelo 2: agents funcionais (Estrategista, Conteúdo, SEO, Análise) que servem qualquer persona — reusáveis, persona é input, não estrutura
Decisão: Modelo 2. Reusabilidade vence. Próxima sessão começa pesquisando como a comunidade configura agências multi-persona — composição final do time ainda em aberto.
Adicional: aprovação editorial sai do kmaroteApp. Kmarote tem foco adulto e misturar pode confundir se virar produto público. Aprovação fica em módulo separado, plugável.
ADR-0010 e ADR-0011
Dois ADRs registrados para o tracker:
- ADR-0010 (futuro): define o que entra na lib pública vs. no produto interno
- ADR-0011: confirma adapter-pattern por site e isolamento total no banco
A discussão tangenciou questão legal. Meu argumento anterior era que scraping comercial poderia esbarrar em problemas. Confrontado com evidências concretas (projetos existentes de scraping públicos e distribuídos), reli. O argumento era frágil: scraping de dados públicos não é por si ilícito — depende de jurisdição, ToS e modelo de uso. Decisão: deixa a lib operacional, colhe dados primeiro, decide camada comercial depois.
Referências anotadas para revisitar antes de implementar: stashapp/stash, stash-box, CommunityScrapers.
Heartbeat do agent dev
Ponto em aberto sem decisão: o agent dev do OpenClaw envia heartbeat periódico para o gateway. Com a stack atual — um único agent, comando direto via CLI — o ganho é questionável. Anotado para pesquisar mais fundo antes de decidir. Possível economia de I/O sem custo visível, mas precisa entender o que o heartbeat sustenta no longo prazo.
Pendências
- Etapa 3 do Plano S Ext v1.0: autenticação Bearer no tunnel + cliente claude.ai consumindo MCP
- Redirect
elquer.com.br→elquer.comno Cloudflare (NS já transferido, regra não configurada) - Composição final do time de agents via pesquisa de comunidade
- Estrutura inicial do tracker conforme ADR-0011
Estatísticas do dia (extraídas do devlog — dois drafts consolidados):
Dia 2026-05-05 — Atividade no PC:
- Tempo ativo: 8h39min
- Por categoria: AI Chat 3h14min · Uncategorized 2h56min · Coding 1h22min · Communication 30min · Browsing 19min · Larissa Project 15min
- Top apps: chrome 6h17min · Antigravity 59min · WhatsApp 40min · putty 19min
- Top sites navegados: claude.ai 53min · docs.google.com 12min · google.com 12min · dash.cloudflare.com 10min
Trabalho com IA — Dia 2026-05-05:
- Conversas claude.ai: 6 (128 mensagens)
- Sessões Claude Code: Windows 3 · Larissa 2
Dia 2026-05-04 — Atividade no PC:
- Tempo ativo: 11h17min
- Por categoria: Uncategorized 4h17min · AI Chat 3h19min · Coding 2h07min · Communication 1h10min · Larissa Project 14min · Reading 5min · Browsing 4min
- Top apps: chrome 7h46min · WhatsApp 1h17min · Antigravity 1h06min · putty 45min · Windows Terminal 15min
- Top sites navegados: claude.ai 58min · quintoandar 21min · dev-admin.kmarote.me 15min · grok.com 15min · drive.google.com 12min
Trabalho com IA — Dia 2026-05-04:
- Conversas claude.ai: 4 (160 mensagens)
- Sessões Claude Code: Windows 8 · Larissa 4
Código produzido:
- Commits: 1 (kmaroteApp
06aaa8d2) em 04/05 · 1 (elquercarlosa6533c1) em 05/05