refactor(repositories): honest reads in the eight files the ruler could not see (#1087 passo 4) - #1092
Merged
Merged
Conversation
…ld not see (#1087 passo 4) Os 30 erros que a regua corrigida (#1090) passou a acusar. Nenhum era novo — a varredura exigia a substring literal '$wpdb->' e nunca olhou os repositorios que ligam wpdb como propriedade. Lendo os 30, eles nao eram majoritariamente "shape de coluna faltando". Eram quatro origens, e a mais significativa nao tem nada a ver com o $wpdb: - CACHE DE OBJETOS, em seis metodos de cinco arquivos. wp_cache_get() devolve mixed, entao um cache HIT jogava o tipo fora enquanto a leitura do banco logo abaixo estava tipada. E literalmente o achado do #1072 — "a shape estava certa; o furo era o cache" — que nunca chegou a estes arquivos porque a regua nao os enxergava. A cegueira do passo 3 nao escondia so uma contagem: escondeu a aplicacao de uma correcao que o epico ja tinha feito em outro modulo. - PROJECOES AGREGADAS. 'SELECT user_id, COUNT(*)' nao e linha, e projecao — e COUNT()/SUM() voltam como string numerica, ou NULL em tabela vazia. - json_decode SOBRE COLUNA. Colunas JSON escritas pelo proprio plugin, mas lidas de um array<string, mixed>, entao chegando como mixed ao parser. - PROJECAO DE CINCO COLUNAS no writer, que virou @phpstan-type. A assercao de cache vai sempre na CHAVE, nunca no get_cache() do trait: o cache e heterogeneo por chave, e so o metodo sabe o que guardou sob a dele. Foi assim que o #1072 resolveu, e a razao continua valendo. O AbstractRepository e caso a parte e NAO ganha shape: e base de varias tabelas, entao nao existe uma forma so. Ali o honesto e dizer o que ele de fato sabe — que o $wpdb devolve chaves string — e ler o 'id' pelo ArrayValue em vez de castar mixed. Uma decisao registrada: NAO declarei um SubmissionRow completo. A consolidacao da #1091 agora permitiria, porque as 25 colunas viraram obrigatorias, mas isso e melhoria separada e nao e o que os 30 pedem. Uma correcao ao meu proprio processo: a primeira rodada cobriu 20 dos 30. Os 10 que sobraram incluiam justamente o furo de cache do url-shortener, que eu havia descrito como padrao aplicado sem ter aplicado ali. So a medicao disse isso. Refs #1087, #1072, #1090, #1091, #1060 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012XWx9qJdjZdAq8crxM9GCU
…so 4) O ultimo dos 30, mais a folga de volta a zero. O erro que restava era o mesmo furo de cache pela terceira vez: o ramo de cache hit do findByIds(), um metodo ao lado do findById() que eu ja tinha anotado no mesmo arquivo. Precisei de tres rodadas de medicao (30 -> 10 -> 1 -> 0), e o que sobrou nas duas primeiras foi sempre aquilo que eu ja afirmava ter tratado. Isso reforca o achado do passo 3 de um jeito que eu nao tinha percebido: a cegueira da regua nao escondia so uma contagem. Escondeu a aplicacao de uma correcao que o #1072 ja tinha feito em outro modulo — seis metodos em cinco arquivos ficaram com o mesmo defeito conhecido porque o gate que deveria acusa-los nunca os olhou. A folga volta a 0 por ENCOLHIMENTO, que era a unica forma que o proprio comentario admitia. O comentario foi reescrito para registrar por que ela subiu (denominador errado, nao divida nova), por quanto tempo ficou em 30, e que uma proxima subida precisa passar pela mesma barra. O @PARAM do hasConflictInForm() foi partido em @PARAM array<string, mixed> mais @phpstan-param IdentifierProjection: o WPCS exige que o type hint nativo case com o docblock, e um alias do phpstan nao existe para ele. E o idioma que outros 45 arquivos do repositorio ja usam. Refs #1087, #1072, #1090 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012XWx9qJdjZdAq8crxM9GCU
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012XWx9qJdjZdAq8crxM9GCU
Coverage Report for CI Build 34071209357Warning No base build found for commit Coverage: 89.967%Details
Uncovered ChangesNo uncovered changes found. Coverage RegressionsRequires a base build to compare against. How to fix this → Coverage Stats
💛 - Coveralls |
8 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Passo 4 da #1087: os 30 erros que a régua corrigida (#1090) passou a acusar, e a folga do gate de volta a 0.
Nenhum dos 30 era novo. A varredura exigia a substring literal
$wpdb->e nunca olhou os repositórios que ligam wpdb como propriedade — oito arquivos, oAbstractRepositoryentre eles.O que os 30 eram de verdade
Lendo-os, não eram majoritariamente "shape de coluna faltando". Eram quatro origens, e a dominante não tem nada a ver com o
$wpdb:wp_cache_get()devolvemixed, então um cache hit jogava o tipo fora enquanto a leitura do banco logo abaixo estava tipadaSELECT user_id, COUNT(*)não é linha; eCOUNT()/SUM()voltam como string numérica, ouNULLem tabela vaziajson_decodesobre colunaarray<string, mixed>SELECT id, user_id, email_hash, cpf_hash, rf_hashdo writer, agora um@phpstan-typeO caso do cache é o achado que importa. É literalmente o do #1072 — "a shape estava certa; o furo era o
wp_cache_get()" — e ele nunca chegou a estes arquivos porque a régua não os enxergava. A cegueira do passo 3 não escondia só uma contagem: escondeu a aplicação de uma correção que o épico já havia feito em outro módulo. Seis métodos ficaram com um defeito conhecido e documentado porque o gate que deveria acusá-los nunca os olhou.A asserção de cache vai sempre na chave, nunca no
get_cache()do trait — o cache é heterogêneo por chave, e só o método sabe o que guardou sob a dele. Foi assim que o #1072 resolveu, e a razão continua valendo.Duas decisões
AbstractRepositorynão ganha shape. É base de várias tabelas, então não existe uma forma só. Ali o honesto é declarar o que ele de fato sabe — que o$wpdbdevolve chaves string — e ler oidpeloArrayValueem vez de castarmixed. Inventar um@phpstan-typegenérico ali seria a shape desonesta que o #1060 alerta.Não declarei um
SubmissionRowcompleto. A consolidação da #1091 agora permitiria, porque as 25 colunas viraram obrigatórias — mas isso é melhoria separada, não é o que os 30 pedem, e oCLAUDE.mdmanda manter cada correção mínima. Fica registrado como possível, não feito.Três rodadas de medição, não uma
30 → 10 → 1 → 0. E o que sobrou nas duas primeiras foi sempre aquilo que eu já afirmava ter tratado: o furo de cache do
url-shortener(rodada 2) e o ramo de cache hit dofindByIds(), um método ao lado dofindById()que eu havia anotado no mesmo arquivo (rodada 3). Só a medição disse isso — a leitura não disse.A folga volta a 0, por encolhimento
Que era a única forma que o comentário do
ci.ymladmitia quando ela subiu. O comentário foi reescrito para registrar por que subiu (denominador errado, não dívida nova), por quanto tempo ficou em 30, e que uma próxima subida precisa passar pela mesma barra.Essa frase agora é verdadeira. Antes do passo 3 ela era impressa com 30 erros de pé.
Validação
phpcs-tests.xml.dist: limpos — o@paramdohasConflictInForm()foi partido em@param array<string, mixed>mais@phpstan-param IdentifierProjection, porque o WPCS exige que o type hint nativo case com o docblock e um alias do PHPStan não existe para ele. É o idioma que outros 45 arquivos do repositório já usam.Refs #1087, #1072, #1090, #1091, #1060
🤖 Generated with Claude Code
https://claude.ai/code/session_012XWx9qJdjZdAq8crxM9GCU
Generated by Claude Code