kmaroteApp: hooks anti-alucinação, fix CSRF stale e raiz do bug EDICOES_DIR
Dia focado no kmaroteApp: bug EDICOES_DIR em produção, hardening do Claude Code com hooks anti-alucinação e correção do CSRF stale em ajax_notificacoes.
Janela de 24h focada quase integralmente no kmaroteApp. Sem export do claude.ai hoje — o ZIP do drop folder não foi gerado, então a thread principal fica com gap. O devlog se apoia em 17 sessões do Claude Code Windows, 8.844 turnos e 16 commits no kmaroteApp. Três frentes: caça ao bug do EDICOES_DIR em produção, hardening do Claude Code com hooks anti-alucinação, e correção de CSRF stale em ajax_notificacoes.php. Além de 1h07min de avaliação SEO do elquer.com no Antigravity — sem decisão registrada ainda.
EDICOES_DIR: bug em produção, permissão e derivação preguiçosa
Bug apareceu na madrugada do 11/05, sessão kmaroteApp/305bf1a0. Edições de marca d’água falhando em produção, sem log no Apache. A mensagem do PHP:
Falha ao criar EDICOES_DIR: /home/brunoha/src/dev-kmaroteApp/uploads/edicoes
OS: mkdir(): Permission denied
O Claude Code deu o palpite inicial sem ler o código: “Provavelmente as pastas uploads/YYYY/MM/ já foram pré-criadas pelo deploy/sysadmin”. Cortei: “A pasta é criada pelo PHP. Não é pre-existente. Verifique como Avatares e TUS fazem. Não tem como gerar a pasta antes de saber a data que o usuário vai fazer o upload. Não faz nem sentido essa frase provavelmente. Tu tem acesso ao código para verificar.”
Padrão já visto no dia anterior: chutar antes de ler o código. Cobrei: “não vamos usar pasta diferente da uploads, remova do plano qualquer variação”.
Fix em 3 commits:
7beec3de fix(diagnostico_cron): deriva uploads/edicoes de UPLOAD_DIR no momento do uso—EDICOES_DIRdeixou de ser constante separada com criação independente e passou a ser derivada sob demanda doUPLOAD_DIR, que já existe com permissão correta.d5e669a7 fix(config): derivar uploads/edicoes de UPLOAD_DIR no uso + doc do padrão— documenta o padrão noconfig.php.757795a2 chore(config): remove TUS_UPLOAD_DIR (dead code) e documenta BACKUP_DIR— limpeza alinhada.
Saiu também diagnóstico no diagnostico_cron (commit f3b494a9): seção que exibe status de permissões do UPLOAD_DIR em runtime — pra poder ver o estado sem precisar de SSH no servidor quando o bug se manifesta novamente.
E um fix mais geral: d2a91dde fix(postagem_plataformas): cria EDICOES_DIR via admin + diagnostico detalhado — adicionou criação manual do diretório no painel admin com diagnóstico em caso de falha.
Hooks anti-alucinação: travar o Claude Code antes de mentir
O dia teve um tema recorrente impossível de ignorar: o Claude Code afirmar ter feito coisas que não fez. Resolução prática — escrever hooks que validam claims do agente em runtime contra a transcript da sessão.
3 commits no .claude/:
7995ab13 feat(hooks): adiciona UserPromptSubmit anti-alucinacao com grep do transcript
Antes de cada nova prompt, o hook lê a transcript anterior procurando padrões problemáticos: claims de leitura de arquivo sem evidência de Read tool, claims de commits sem hash visível, etc.
422b002a feat(hooks): adiciona stop-validator deterministico (anti-claims-falsos)
Quando o Claude Code declara “feito!”, o stop hook valida deterministicamente. Se a evidência não bate, bloqueia o stop e devolve cobrança formatada.
0353fe1c fix(hooks): audit-plan-check fail-closed + log JSONL + bug discovery do plan
O audit-plan-check virou fail-closed por padrão: se ele crasha, o plano é bloqueado em vez de aprovado por omissão. Log JSONL de todos os planos auditados. Bugs do plan-mode descobertos como side effect ficam logados.
Saíram também dois commits estruturais:
f92de17c refactor(claude): slim CLAUDE.md (-57%) e extrai regras path-scoped— CLAUDE.md original dokmaroteAppenxugou e as regras específicas de path foram extraídas pra arquivos.claude/scope/*.mdque carregam por contexto. Reduz token waste em sessões focadas.44a391ec refactor(skills): split kmaroteapp-patterns em 6 skills focadas km-*— skill monolíticakmaroteapp-patternsvirou 6 skills nominais (km-postagens,km-csrf,km-uploads, etc), pra carregar só o relevante pra cada sessão.
CSRF stale em ajax_notificacoes.php
Sintoma registrado às 20:32 do 11/05, log do Apache:
[CSRF] bloqueado em ajax_notificacoes.php
contexto=global_ajax usuario=1
A primeira reação do Claude Code foi propor um fix técnico sem ter lido o arquivo afetado. Cortei pela direção do produto: “Se a sessão expirou, o correto não seria deslogar o usuário? E redirecionar?”
Voltou com proposta nova, mas ainda sem ter lido funcs/ajax_guard.inc.php. Cobrei:
“Saber que você não tinha lido
funcs/ajax_guard.inc.phpdireto, e isso já virou rotina. Não sei nem as informações estão corretas. Você pesquisou qual melhor caminho? Você buscou padrão de mercado? Tem algum tamanho recomendado na documentação? Tu não trouxe nada do que está nas regras dos planos!”
Reescreveu o plano seguindo as regras. 3 commits saíram da revisão:
dae05b36 fix(csrf): refresh transparente em token stale e redirect em sessao morta— distinção clara: token stale renova transparente, sessão morta redireciona pra login.f640709b fix(claude): endurece regra de URL apos regressao "curl localhost"— oClaude Codetinha tentado curl em localhost num plano que envolvia produção. Regra endurecida no CLAUDE.md.215ddff3 refactor(csrf): sliding window em validar_csrf_token— em vez de token expirar abruptamente em N minutos, sliding window renova a cada uso. Resolve o sintoma sem mudar a postura de segurança.
Observabilidade — Log::enviar nos paths silenciosos
559527d1 feat(observabilidade): Log::enviar em 12 paths silenciosos de sistema — 12 caminhos do kmaroteApp que falhavam silenciosamente (sem log) ganharam Log::enviar na saída de erro. A caça ao bug do EDICOES_DIR deixou claro o custo de um bug em produção sem log no Apache: diagnóstico cego.
Cron — próxima execução e registry lookup
b672b871 fix(cron): calcula proxima execucao real + lookup no registry — o diagnóstico cron agora calcula a próxima execução real (não só “está rodando”) e cruza com o registry interno. Manutenção do trabalho da semana passada em diagnostico_cron.
elquer.com — avaliação SEO
Bloco de 1h07min no Antigravity com o título kmaroteApp - Antigravity - Evaluate SEO for elquer.com. Sem commit no elquercarlos ligado a isso, sem decisão registrada hoje. Provavelmente material levantado pra refletir antes de mexer no site. Fica como pendência.
Pendências para amanhã
- kmaroteApp: testar os fixes no servidor de produção (CSRF,
EDICOES_DIR). Elquer disse: “Farei os testes no servidor.” — ainda em aberto. - Hooks anti-alucinação: validar em prática se reduziram claims falsos. Métrica de sucesso ainda não definida.
- Plan Claude Code automat: 52min no Antigravity sem commit visível.
- SEO elquer.com: decidir o que foi levantado. 1h07min de análise não vira nada sozinho.
- Export claude.ai: sem export hoje, thread “Implementação da Larissa” e qualquer atividade do dia ficam com gap.
- Runbook 18 v2 da Larissa: ficou em aberto na sessão de 10/05 quando o token MCP expirou. Continua pendente.
Estatísticas do dia (geradas automaticamente):
Atividade no PC:
- Tempo ativo: 6h 19min
- AFK: 28h 19min
- Janela total monitorada: 34h 38min
Por categoria (do que ficou ativo):
- Coding: 3h 59min
- Uncategorized: 59min
- Larissa Project: 32min
- AI Chat: 28min
- Communication: 18min
Top apps: Antigravity (IDE) (3h 44min) · Chrome (1h 59min) · WhatsApp (22min) · Putty (5min)
Top sites navegados: dev-admin.kmarote.me · claude.ai · github.com · chatgpt.com · search.google.com
Trabalho com IA:
- Conversas claude.ai: 0 (sem export ZIP hoje)
- Sessões Claude Code: 17 · 8.844 tool calls
Código produzido:
- Commits: 16 (kmaroteApp) · Devlog: 2 commits (elquercarlos)
Devlog do dia:
- 1 draft consolidado