/pbi-modelo-review — Auditoria de modelo Power BI
📦 Distribuída publicamente: github.com/xperiun/claude-code-powerbi-skills — pasta claude-code/pbi-modelo-review/ (skill nativa) + claude-web/pbi-modelo-review.zip (upload no Claude.ai). Mudança aqui exige sincronizar lá: atualizar pasta + regenerar ZIP (Python zipfile, ver CLAUDE.md) + commit + bump CHANGELOG. Repo é open-source, leiame público — evitar referências internas (Xperiun-only) na SKILL.md.
Audita um projeto Power BI (formato PBIP) e devolve relatório priorizado com:
- Score geral (0–100)
- Issues agrupados por severidade (crítico / médio / leve)
- Distribuição por categoria (6 famílias de check)
- Cada issue com: o que é, onde está, por que importa, como corrigir (snippet quando aplicável)
Quando usar
- Analista herdou um
.pbix e quer mapa rápido de qualidade
- Líder de dados pedindo auditoria antes de escalar/migrar modelo
- Consultor entrando em cliente novo
- Pré-handoff entre times
- Você quer um "linter" rodando antes de subir pra produção
Não usar quando:
- Quer apenas documentação descritiva → use
/pbi-doc
- Quer criar uma medida nova → use
/pbi-dax-create
- Quer otimização de performance específica de uma query (skill futura
/pbi-perf)
Pré-requisitos
- Projeto em formato PBIP (Power BI Project) — pasta com
.SemanticModel/ e .Report/. Se o usuário só tem .pbix, instruir conversão antes de prosseguir:
Power BI Desktop → File → Save as → Power BI Project (.pbip)
- Acesso aos arquivos
.tmdl (via filesystem ou upload — ver "Modos de execução" abaixo)
Se faltar PBIP, retornar mensagem curta:
Esse projeto ainda está em .pbix (binário). Pra eu auditar, salva como Power BI Project: File → Save as → Power BI Project (.pbip). Vira uma pasta de texto e aí eu consigo ler. Avisa quando converter.
E encerrar — não tentar rodar nada.
Modos de execução
A skill detecta automaticamente o ambiente e adapta input/output:
Modo Code (Claude Code · Desktop · file-based)
- Detecção: tenho acesso a filesystem do usuário e a pasta atual contém
.SemanticModel/
- Input: leio automaticamente os
.tmdl da pasta ./SemanticModel/
- Output: salvo em
./_review/index.html + ./_review/relatorio.md na raiz do projeto Power BI
- Idempotente: rodar 2x sobrescreve
Modo Web (Claude.ai · upload-based)
- Detecção: não tenho acesso a filesystem (claude.ai web)
- Input: peço ao usuário pra anexar os arquivos:
Pra eu auditar, anexe nesse chat:
- Os arquivos
.tmdl da pasta SemanticModel/definition/ (model.tmdl, relationships.tmdl, expressions.tmdl)
- Os arquivos da pasta
SemanticModel/definition/tables/ (1 .tmdl por tabela)
Pode arrastar todos de uma vez ou zipar a pasta SemanticModel/ e subir o ZIP.
- Output:
- HTML completo como artifact (Claude.ai renderiza inline com botão de download)
- Markdown como bloco de código copiável no chat
- Não persiste: cada conversa nova requer novo upload
Detecção automática
Verificar se a pasta .SemanticModel/ é acessível via filesystem:
- ✅ Sim → Modo Code (file-based)
- ❌ Não → Modo Web (peço uploads)
Se ambíguo, perguntar uma vez:
Você tá rodando isso no Claude Code (CLI/IDE com acesso à pasta) ou no claude.ai (web)? Pra Code eu leio a pasta sozinho; pra web preciso que você suba os arquivos.
Inputs
- Severidade mínima (opcional, default:
tudo)
tudo → reporta crítico + médio + leve
crítico+médio → ignora leves (foco no que cobra juros)
só crítico → só o que bloqueia produção
Se o usuário não especificar, perguntar uma vez antes de rodar:
Quer auditoria completa (todos os níveis) ou só os críticos+médios? Default é completa.
Processo
1. Detectar e mapear o projeto
- Confirmar existência de
./SemanticModel/ (ou *.SemanticModel/ na raiz)
- Listar arquivos
.tmdl em ./SemanticModel/tables/
- Ler
./SemanticModel/model.tmdl, ./SemanticModel/relationships.tmdl (se existir)
- Contar: N tabelas, N medidas (varrer
measure em todos os tmdl), N relacionamentos, tamanho do projeto
2. Rodar checks
Ler references/checks.md e rodar as 6 famílias de check descritas lá:
- Modelagem — star schema, fact/dim, circular ref
- Relacionamentos — cardinalidade, direção, ativo/inativo
- Performance — colunas calculadas vs medidas, DISTINCTCOUNT em alta cardinalidade, etc
- Naming — convenção, prefixos, consistência
- DAX — DIVIDE vs
/, variáveis não usadas, CALCULATE aninhado
- Documentação — descrições ausentes, business keys
Cada check encontrado vira um issue com:
id (slug único, ex: model-flat-detected)
categoria (uma das 6 acima)
severidade (critical | medium | light)
titulo (uma frase, máx 90 chars)
path (caminho do arquivo + linha quando aplicável)
por_que_importa (1-2 parágrafos explicativos)
como_corrigir (1 parágrafo + opcionalmente um snippet TMDL/DAX)
3. Calcular score
Fórmula simples:
score = max(0, 100 - (criticos × 4) - (medios × 1.5) - (leves × 0.4))
Limites:
- Score ≥ 85 → label "BOM" (gold)
- Score 65–84 → label "PRECISA ATENÇÃO" (gold)
- Score < 65 → label "CRÍTICO" (gold com glow mais forte)
A label sempre usa champagne gold (vibe v4 "alerta elegante", não "vermelho de painel").
4. Priorizar e ordenar
- Ordem: críticos primeiro, depois médios, depois leves
- Dentro de cada nível: ordenar por categoria com mais issues (concentração = prioridade de refator)
5. Gerar outputs
Filtrar issues conforme severidade mínima escolhida e gerar dois arquivos:
A. Markdown (versionável Git):
- Ler
templates/relatorio.md
- Substituir placeholders pelos dados reais
- Salvar em
./_review/relatorio.md na raiz do projeto Power BI
B. HTML standalone (visual):
🚨 REGRA INVIOLÁVEL — usar templates/relatorio.html LITERAL:
LER templates/relatorio.html — esse arquivo já tem todo o CSS, todo o HTML estrutural, todos os tokens DS v4 (Bebas Neue, accent-gold, gold-grid + beams animados, orb-v2 elipses blue/purple, brackets), todo o JS de filtro de severidade.
SUBSTITUIR APENAS os placeholders {{...}} pelos dados de auditoria reais. Lista completa em references/checks.md desta skill (seção "Placeholders do templates/relatorio.html").
PROIBIDO:
- ❌ Trocar o CSS por outro
- ❌ Inventar nova paleta (usar SÓ tokens do template:
--accent-gold-bright #E8C9A0, --accent-glow #7099FF, --neon-magenta #C47FFF)
- ❌ Mudar fontes (DS v4 = Bebas Neue + Barlow Condensed + Outfit + JetBrains Mono — nada de Segoe UI)
- ❌ Remover
<div class="gold-grid">, <div class="section-orb">, ou ornamentos do template
- ❌ Gerar HTML "do zero" porque parece mais fácil — isso queima toda a identidade visual Xperiun
- ❌ Tocar em qualquer coisa dentro de comentários
<!-- ... --> — comentários são instruções pra você, não conteúdo a substituir.
- ❌ Tocar em
<style>...</style> ou <script>...</script> — CSS e JS ficam intocados.
🚨 ENCODING — UTF-8 PURO, sem escape. Caracteres PT-BR (ã, ç, é, á, õ, ê, í, ú) e símbolos especiais (├, └, ─, →, ↔, ↑, ↓, ⚠, ·, —) devem aparecer como caracteres reais UTF-8, NÃO como sequências escapadas/HTML entities/mojibake.
- ✅ Correto:
críticos, →, Atenção, ⚠
- ❌ Errado (mojibake):
crÃticos, â, Atenção
- Sintoma: se algum acento aparece como sequência de 2-3 chars estranhos, parser HTML pode quebrar e o resto da página renderiza como texto cru. Refaz com UTF-8.
Garantir que CSS continua inline (sem dependências externas além das fontes Google).
SALVAR em ./_review/index.html (modo Code) ou retornar como artifact (modo Web).
Sintomas de erro:
- Cores
#f5a623 (laranja) ou #7c6af7 (roxo), ou fonte 'Segoe UI' → ignorou template, refaz.
- Acentos como
ã ou â → encoding quebrado, refaz UTF-8.
- Texto solto sem quebras (SVG/tabela como prosa) → mojibake quebrou parser, refaz.
6. Resumir no chat
Devolver mensagem curta no chat com:
- Score + label
- Top 3 issues críticos (apenas títulos)
- Path dos 2 arquivos gerados
- Sugestão: "Abre
_review/index.html no navegador pra ver completo"
Outputs
[raiz do projeto Power BI do usuário]/
├── SemanticModel/ ← input (não tocar)
├── Report/ ← input (não tocar)
└── _review/ ← OUTPUT da skill
├── relatorio.md ← versão markdown (commitável)
└── index.html ← versão visual standalone
Edge cases
| Cenário |
O que fazer |
Modelo sem .SemanticModel/ |
Mensagem de pré-requisito (PBIP), encerra |
Pasta _review/ já existe |
Sobrescrever (skill é idempotente) — mas avisar no chat |
| Modelo perfeito (zero issues) |
Score 100 + celebrar + listar 3 melhores patterns encontrados (já que não tem o que reclamar) |
| Modelo apocalíptico (>50 críticos) |
Truncar relatório nos top 30 críticos + linha "+ N issues não listados — começa por aqui antes" |
Erro lendo um .tmdl específico (corrupção) |
Reportar arquivo problemático no chat, seguir com os demais |
| Projeto enorme (>500 medidas) |
Avisar "modelo grande, vou processar em chunks · ~5min" antes de começar |
Idempotência
- Rodar 2x no mesmo projeto sobrescreve
_review/
- Não cria backups, não acumula histórico (versionamento é via Git do usuário)
- Não modifica nada em
.SemanticModel/ ou .Report/ — somente leitura nesses
Segurança / Blast radius
- Lê arquivos do projeto Power BI (TMDL puro, texto)
- Escreve somente em
./_review/ (cria se não existe, sobrescreve se existe)
- NÃO toca em
.SemanticModel/, .Report/, ou qualquer arquivo binário
- NÃO commita nada (segue regra inviolável git do CLAUDE.md raiz)
- NÃO faz rede — operação 100% local
Tom do relatório
Estilo Xperiun (declarado em contexto/posicionamento.md):
- Direto, sem rodeio. Verdade > conveniência
- Tom de "colega sênior revisando código", não consultor formal
- Pode ser provocativo ("isso vai cobrar juros", "modelo plano é o anti-pattern #1")
- PT-BR com todos os acentos (regra inviolável CLAUDE.md)
- Usar metáforas concretas ("vai virar ligação às 7h da manhã" > "pode causar erro em produção")
Exemplos de bom vs ruim:
❌ Ruim: "Identificou-se a presença de relacionamento bi-direcional que pode impactar negativamente a performance do modelo."
✅ Bom: "Bi-direcional em N:1 com calendário causa ambiguidade de filtro e duplica scan no engine. Em modelo de 1.4GB você está pagando ~30% de overhead por refresh sem ganhar nada."
Branding (footer e CTA do HTML)
O relatório HTML tem footer fixo:
- Linha: "Relatório gerado em 4 minutos por Claude Code + /pbi-modelo-review"
- CTA: "Quero usar esse skill no meu Power BI →" (link placeholder por enquanto)
- Meta: "XPERIUN · O Sistema Operacional dos Incomparáveis · pages.xperiun.com"
Branding é sempre Xperiun (não @leokarpa) — a skill faz parte do posicionamento institucional. Mesmo se o usuário rodar a skill no projeto dele, o footer mantém referência Xperiun (é nossa skill, ele só tá usando).
Tempo típico
- Modelo pequeno (≤30 tabelas, ≤80 medidas): 1–2 min
- Modelo médio (~50 tabelas, ~150 medidas): 3–5 min
- Modelo grande (>200 medidas, >100 tabelas): 5–10 min
Avisar ao usuário se > 3min esperados.
Versão atual
v0.1 — protótipo interno Xperiun OS. Ainda não distribuído publicamente.
Quando estabilizar, vira pacote no repo xperiun/claude-code-powerbi-skills (lead magnet).
Source: xperiun/claude-code-powerbi-skills — distributed by TomeVault.
1---2name: pbi-modelo-review3description: Audita modelo Power BI (PBIP) e gera relatório priorizado com anti-patterns, score 0-100 e recomendações acionáveis. Use quando o usuário pedir "audita esse modelo", "revisa esse power bi", "tá bem feito?", "manda ver no review", ou apontar uma pasta PBIP pra análise crítica. Use when this capability is needed.4---56# /pbi-modelo-review — Auditoria de modelo Power BI78> **📦 Distribuída publicamente:** [github.com/xperiun/claude-code-powerbi-skills](https://github.com/xperiun/claude-code-powerbi-skills) — pasta `claude-code/pbi-modelo-review/` (skill nativa) + `claude-web/pbi-modelo-review.zip` (upload no Claude.ai). Mudança aqui exige sincronizar lá: atualizar pasta + regenerar ZIP (Python `zipfile`, ver CLAUDE.md) + commit + bump CHANGELOG. Repo é open-source, leiame público — evitar referências internas (Xperiun-only) na SKILL.md.910Audita um projeto Power BI (formato PBIP) e devolve relatório priorizado com:11- Score geral (0–100)12- Issues agrupados por severidade (crítico / médio / leve)13- Distribuição por categoria (6 famílias de check)14- Cada issue com: o que é, onde está, por que importa, como corrigir (snippet quando aplicável)1516## Quando usar1718- Analista herdou um `.pbix` e quer mapa rápido de qualidade19- Líder de dados pedindo auditoria antes de escalar/migrar modelo20- Consultor entrando em cliente novo21- Pré-handoff entre times22- Você quer um "linter" rodando antes de subir pra produção2324**Não usar quando:**25- Quer apenas documentação descritiva → use `/pbi-doc`26- Quer criar uma medida nova → use `/pbi-dax-create`27- Quer otimização de performance específica de uma query (skill futura `/pbi-perf`)2829## Pré-requisitos30311. **Projeto em formato PBIP** (Power BI Project) — pasta com `.SemanticModel/` e `.Report/`. Se o usuário só tem `.pbix`, instruir conversão **antes** de prosseguir:32 - `Power BI Desktop → File → Save as → Power BI Project (.pbip)`332. Acesso aos arquivos `.tmdl` (via filesystem ou upload — ver "Modos de execução" abaixo)3435Se faltar PBIP, retornar mensagem curta:36> Esse projeto ainda está em `.pbix` (binário). Pra eu auditar, salva como Power BI Project: `File → Save as → Power BI Project (.pbip)`. Vira uma pasta de texto e aí eu consigo ler. Avisa quando converter.3738E encerrar — não tentar rodar nada.3940## Modos de execução4142A skill detecta automaticamente o ambiente e adapta input/output:4344### Modo Code (Claude Code · Desktop · file-based)45- **Detecção**: tenho acesso a filesystem do usuário e a pasta atual contém `.SemanticModel/`46- **Input**: leio automaticamente os `.tmdl` da pasta `./SemanticModel/`47- **Output**: salvo em `./_review/index.html` + `./_review/relatorio.md` na raiz do projeto Power BI48- **Idempotente**: rodar 2x sobrescreve4950### Modo Web (Claude.ai · upload-based)51- **Detecção**: não tenho acesso a filesystem (claude.ai web)52- **Input**: peço ao usuário pra anexar os arquivos:53 > Pra eu auditar, anexe nesse chat:54 > - Os arquivos `.tmdl` da pasta `SemanticModel/definition/` (model.tmdl, relationships.tmdl, expressions.tmdl)55 > - Os arquivos da pasta `SemanticModel/definition/tables/` (1 .tmdl por tabela)56 >57 > Pode arrastar todos de uma vez ou zipar a pasta `SemanticModel/` e subir o ZIP.58- **Output**:59 - HTML completo como **artifact** (Claude.ai renderiza inline com botão de download)60 - Markdown como bloco de código copiável no chat61- **Não persiste**: cada conversa nova requer novo upload6263### Detecção automática6465Verificar se a pasta `.SemanticModel/` é acessível via filesystem:66- ✅ Sim → Modo Code (file-based)67- ❌ Não → Modo Web (peço uploads)6869Se ambíguo, perguntar uma vez:70> Você tá rodando isso no **Claude Code** (CLI/IDE com acesso à pasta) ou no **claude.ai** (web)? Pra Code eu leio a pasta sozinho; pra web preciso que você suba os arquivos.7172## Inputs7374- **Severidade mínima** (opcional, default: `tudo`)75 - `tudo` → reporta crítico + médio + leve76 - `crítico+médio` → ignora leves (foco no que cobra juros)77 - `só crítico` → só o que bloqueia produção7879Se o usuário não especificar, perguntar **uma vez** antes de rodar:80> Quer auditoria completa (todos os níveis) ou só os críticos+médios? Default é completa.8182## Processo8384### 1. Detectar e mapear o projeto8586- Confirmar existência de `./SemanticModel/` (ou `*.SemanticModel/` na raiz)87- Listar arquivos `.tmdl` em `./SemanticModel/tables/`88- Ler `./SemanticModel/model.tmdl`, `./SemanticModel/relationships.tmdl` (se existir)89- Contar: N tabelas, N medidas (varrer `measure` em todos os tmdl), N relacionamentos, tamanho do projeto9091### 2. Rodar checks9293Ler `references/checks.md` e rodar **as 6 famílias de check** descritas lá:94951. **Modelagem** — star schema, fact/dim, circular ref962. **Relacionamentos** — cardinalidade, direção, ativo/inativo973. **Performance** — colunas calculadas vs medidas, DISTINCTCOUNT em alta cardinalidade, etc984. **Naming** — convenção, prefixos, consistência995. **DAX** — DIVIDE vs `/`, variáveis não usadas, CALCULATE aninhado1006. **Documentação** — descrições ausentes, business keys101102Cada check encontrado vira um **issue** com:103- `id` (slug único, ex: `model-flat-detected`)104- `categoria` (uma das 6 acima)105- `severidade` (`critical` | `medium` | `light`)106- `titulo` (uma frase, máx 90 chars)107- `path` (caminho do arquivo + linha quando aplicável)108- `por_que_importa` (1-2 parágrafos explicativos)109- `como_corrigir` (1 parágrafo + opcionalmente um snippet TMDL/DAX)110111### 3. Calcular score112113Fórmula simples:114```115score = max(0, 100 - (criticos × 4) - (medios × 1.5) - (leves × 0.4))116```117118Limites:119- Score ≥ 85 → label "BOM" (gold)120- Score 65–84 → label "PRECISA ATENÇÃO" (gold)121- Score < 65 → label "CRÍTICO" (gold com glow mais forte)122123A label sempre usa champagne gold (vibe v4 "alerta elegante", não "vermelho de painel").124125### 4. Priorizar e ordenar126127- Ordem: críticos primeiro, depois médios, depois leves128- Dentro de cada nível: ordenar por **categoria com mais issues** (concentração = prioridade de refator)129130### 5. Gerar outputs131132Filtrar issues conforme severidade mínima escolhida e gerar **dois arquivos**:133134**A. Markdown** (versionável Git):135- Ler `templates/relatorio.md`136- Substituir placeholders pelos dados reais137- Salvar em `./_review/relatorio.md` na raiz do projeto Power BI138139**B. HTML standalone** (visual):140141**🚨 REGRA INVIOLÁVEL — usar templates/relatorio.html LITERAL:**1421431. **LER** `templates/relatorio.html` — esse arquivo já tem **todo o CSS, todo o HTML estrutural, todos os tokens DS v4 (Bebas Neue, accent-gold, gold-grid + beams animados, orb-v2 elipses blue/purple, brackets), todo o JS de filtro de severidade**.1442. **SUBSTITUIR APENAS os placeholders `{{...}}`** pelos dados de auditoria reais. Lista completa em `references/checks.md` desta skill (seção "Placeholders do `templates/relatorio.html`").1453. **PROIBIDO:**146 - ❌ Trocar o CSS por outro147 - ❌ Inventar nova paleta (usar SÓ tokens do template: `--accent-gold-bright #E8C9A0`, `--accent-glow #7099FF`, `--neon-magenta #C47FFF`)148 - ❌ Mudar fontes (DS v4 = Bebas Neue + Barlow Condensed + Outfit + JetBrains Mono — nada de Segoe UI)149 - ❌ Remover `<div class="gold-grid">`, `<div class="section-orb">`, ou ornamentos do template150 - ❌ Gerar HTML "do zero" porque parece mais fácil — **isso queima toda a identidade visual Xperiun**151 - ❌ **Tocar em qualquer coisa dentro de comentários `<!-- ... -->`** — comentários são instruções pra você, não conteúdo a substituir.152 - ❌ **Tocar em `<style>...</style>` ou `<script>...</script>`** — CSS e JS ficam intocados.1531544. **🚨 ENCODING — UTF-8 PURO, sem escape.** Caracteres PT-BR (`ã`, `ç`, `é`, `á`, `õ`, `ê`, `í`, `ú`) e símbolos especiais (`├`, `└`, `─`, `→`, `↔`, `↑`, `↓`, `⚠`, `·`, `—`) devem aparecer como **caracteres reais UTF-8**, NÃO como sequências escapadas/HTML entities/mojibake.155 - ✅ Correto: `críticos`, `→`, `Atenção`, `⚠`156 - ❌ Errado (mojibake): `crÃticos`, `â`, `Atenção`157 - **Sintoma:** se algum acento aparece como sequência de 2-3 chars estranhos, parser HTML pode quebrar e o resto da página renderiza como texto cru. Refaz com UTF-8.1581595. **Garantir que CSS continua inline** (sem dependências externas além das fontes Google).1606. **SALVAR** em `./_review/index.html` (modo Code) ou retornar como artifact (modo Web).1617. **Sintomas de erro:**162 - Cores `#f5a623` (laranja) ou `#7c6af7` (roxo), ou fonte `'Segoe UI'` → ignorou template, refaz.163 - Acentos como `ã` ou `â` → encoding quebrado, refaz UTF-8.164 - Texto solto sem quebras (SVG/tabela como prosa) → mojibake quebrou parser, refaz.165166### 6. Resumir no chat167168Devolver mensagem curta no chat com:169- Score + label170- Top 3 issues críticos (apenas títulos)171- Path dos 2 arquivos gerados172- Sugestão: "Abre `_review/index.html` no navegador pra ver completo"173174## Outputs175176```177[raiz do projeto Power BI do usuário]/178├── SemanticModel/ ← input (não tocar)179├── Report/ ← input (não tocar)180└── _review/ ← OUTPUT da skill181 ├── relatorio.md ← versão markdown (commitável)182 └── index.html ← versão visual standalone183```184185## Edge cases186187| Cenário | O que fazer |188|---|---|189| Modelo sem `.SemanticModel/` | Mensagem de pré-requisito (PBIP), encerra |190| Pasta `_review/` já existe | **Sobrescrever** (skill é idempotente) — mas avisar no chat |191| Modelo perfeito (zero issues) | Score 100 + celebrar + listar 3 melhores patterns encontrados (já que não tem o que reclamar) |192| Modelo apocalíptico (>50 críticos) | Truncar relatório nos top 30 críticos + linha "+ N issues não listados — começa por aqui antes" |193| Erro lendo um `.tmdl` específico (corrupção) | Reportar arquivo problemático no chat, seguir com os demais |194| Projeto enorme (>500 medidas) | Avisar "modelo grande, vou processar em chunks · ~5min" antes de começar |195196## Idempotência197198- Rodar 2x no mesmo projeto **sobrescreve** `_review/`199- Não cria backups, não acumula histórico (versionamento é via Git do usuário)200- Não modifica nada em `.SemanticModel/` ou `.Report/` — **somente leitura nesses**201202## Segurança / Blast radius203204- **Lê** arquivos do projeto Power BI (TMDL puro, texto)205- **Escreve** somente em `./_review/` (cria se não existe, sobrescreve se existe)206- **NÃO toca** em `.SemanticModel/`, `.Report/`, ou qualquer arquivo binário207- **NÃO commita** nada (segue regra inviolável git do CLAUDE.md raiz)208- **NÃO faz rede** — operação 100% local209210## Tom do relatório211212Estilo Xperiun (declarado em `contexto/posicionamento.md`):213- Direto, sem rodeio. Verdade > conveniência214- Tom de "colega sênior revisando código", não consultor formal215- Pode ser provocativo ("isso vai cobrar juros", "modelo plano é o anti-pattern #1")216- PT-BR com **todos os acentos** (regra inviolável CLAUDE.md)217- Usar metáforas concretas ("vai virar ligação às 7h da manhã" > "pode causar erro em produção")218219Exemplos de **bom** vs **ruim**:220221❌ Ruim: "Identificou-se a presença de relacionamento bi-direcional que pode impactar negativamente a performance do modelo."222223✅ Bom: "Bi-direcional em N:1 com calendário causa ambiguidade de filtro e duplica scan no engine. Em modelo de 1.4GB você está pagando ~30% de overhead por refresh sem ganhar nada."224225## Branding (footer e CTA do HTML)226227O relatório HTML tem footer fixo:228- Linha: "Relatório gerado em 4 minutos por Claude Code + /pbi-modelo-review"229- CTA: "Quero usar esse skill no meu Power BI →" (link placeholder por enquanto)230- Meta: "XPERIUN · O Sistema Operacional dos Incomparáveis · pages.xperiun.com"231232Branding é **sempre** Xperiun (não @leokarpa) — a skill faz parte do posicionamento institucional. Mesmo se o usuário rodar a skill no projeto dele, o footer mantém referência Xperiun (é nossa skill, ele só tá usando).233234## Tempo típico235236- Modelo pequeno (≤30 tabelas, ≤80 medidas): **1–2 min**237- Modelo médio (~50 tabelas, ~150 medidas): **3–5 min**238- Modelo grande (>200 medidas, >100 tabelas): **5–10 min**239240Avisar ao usuário se > 3min esperados.241242## Versão atual243244`v0.1` — protótipo interno Xperiun OS. Ainda não distribuído publicamente.245Quando estabilizar, vira pacote no repo `xperiun/claude-code-powerbi-skills` (lead magnet).246247---248> Source: [xperiun/claude-code-powerbi-skills](https://github.com/xperiun/claude-code-powerbi-skills) — distributed by [TomeVault](https://tomevault.io).249<!-- tomevault:4.0:skill_md:2026-06-24 -->