/pbi-doc — Documentação automática de Power BI
📦 Parte do xperiun/skills-xperiun-free: pasta claude-code/pbi-doc/ (Claude Code) + claude-web/pbi-doc.zip (upload no Claude.ai).
Gera documentação completa de um projeto Power BI (formato PBIP) em duas formas:
- Markdown versionável Git (5 arquivos: overview, tabelas, medidas, relacionamentos, dependências)
- HTML standalone navegável (mini-site com sidebar fixa, busca, syntax highlight em DAX)
A doc descreve o que existe no modelo — tabelas, colunas tipadas, medidas com DAX explicadas em PT, relacionamentos com cardinalidade, grafo de dependências entre medidas. Não opina sobre qualidade (essa é função da /pbi-modelo-review).
Quando usar
- Analista herdou um
.pbix de N tabelas e M medidas e precisa entender rápido
- Líder pedindo handoff documentado pra outro time
- Pré-onboarding de novo membro no time de dados
- Precisa de "manual de uso" do modelo pra circular junto com o relatório
- Documentação contínua: rodar a cada release pra manter doc viva no Git
Não usar quando:
- Quer auditoria de qualidade / anti-patterns → use
/pbi-modelo-review
- Quer criar uma medida nova → use
/pbi-dax-create
- Quer só extrair lista de medidas em CSV (skill futura
/pbi-export-medidas)
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:
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 documentar, 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 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 e a pasta atual contém
.SemanticModel/
- Input: leio automaticamente os
.tmdl de ./SemanticModel/
- Output: salvo em
./_docs/index.html + 5 markdowns (00-overview.md a 04-dependencias.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 documentar, anexe nesse chat:
- Os arquivos
.tmdl da pasta SemanticModel/definition/ (model.tmdl, relationships.tmdl, expressions.tmdl se houver)
- Os arquivos da pasta
SemanticModel/definition/tables/ (1 .tmdl por tabela, excluindo as auto-date LocalDateTable_* e DateTableTemplate_*)
Pode arrastar individualmente ou zipar a pasta SemanticModel/ e subir 1 ZIP.
- Output:
- HTML completo (mini-site navegável) como artifact (Claude.ai renderiza inline + botão de download)
- Os 5 markdowns como blocos de código no chat (copiáveis um a um) OU 1 ZIP com todos
- 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.
Trade-offs por modo
| Aspecto |
Code |
Web |
| Setup |
1× (instala skill) |
0 (só sobe arquivo) |
| Por uso |
comando único |
anexar TMDL toda vez |
| Modelo grande (>200 medidas) |
OK |
pode estourar contexto Free |
| Persistência |
salva em disco |
só na conversa (baixar artifact) |
| Custo |
tokens Claude Code |
tokens claude.ai (Free incluído) |
Inputs
- Escopo (opcional, default:
tudo)
tudo → todos os 5 arquivos
só medidas → só 02-medidas.md (útil pra checar mudanças após refator)
só tabelas → só 01-tabelas.md
só relacionamentos → só 03-relacionamentos.md
tabela X → restringe descrição às tabelas específicas (separadas por vírgula)
Se não especificado, perguntar uma vez:
Documento o projeto inteiro (5 arquivos) ou prefere algo específico — só medidas, só relacionamentos, ou tabelas específicas?
Processo
1. Detectar e mapear
- Confirmar
.SemanticModel/
- Listar
.tmdl em ./SemanticModel/tables/ (excluir LocalDateTable_* e DateTableTemplate_* — são auto-geradas, não fazem parte da doc)
- Ler
model.tmdl, relationships.tmdl, expressions.tmdl (se existir)
- Ler todos os
.tmdl de tabelas
- Inventariar:
- Tabelas: nome, tipo (fato/dim/measures-only), descrição, granularidade inferida, lista de colunas, partição/source M
- Medidas: nome, expressão DAX, displayFolder (agrupa), formatString, descrição (se existir), referências a outras medidas
- Relacionamentos: from, to, cardinalidade, direção, ativo
- Dependências: medida X usa medida Y; medida Z usa coluna W
2. Gerar 5 arquivos markdown
Ler templates em templates/ e preencher com dados reais. Salvar em ./_docs/ na raiz do projeto Power BI:
| Arquivo |
Conteúdo |
_docs/00-overview.md |
Sumário (N tabelas, N medidas, N relacionamentos, fontes, propósito inferido) |
_docs/01-tabelas.md |
Cada tabela: descrição, granularidade, colunas tipadas, source M (resumo) |
_docs/02-medidas.md |
Agrupadas por displayFolder. Cada uma: nome, DAX, explicação PT linha-a-linha |
_docs/03-relacionamentos.md |
Lista detalhada + diagrama em ASCII art (matriz simples) |
_docs/04-dependencias.md |
Grafo: árvore "medida X → usa Y → usa Z" + lista reverse "Y é usada por: A, B, C" |
3. Gerar HTML standalone
🚨 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, riscas section+section::before, brackets), todo o JS de scroll spy/busca. CSS são ~600 linhas inline + HTML completo com gold-grid, sidebar, topbar, sections.
SUBSTITUIR APENAS os placeholders {{...}} pelos valores reais derivados dos .tmdl. Lista completa dos placeholders está em references/escopo.md desta skill (seção "Placeholders do templates/relatorio.html"). Todos os blocos {{...}}_HTML são gerados pelo Claude com base no inventário do modelo.
PROIBIDO:
- ❌ Trocar o CSS por outro
- ❌ Inventar nova paleta de cores (usar SÓ os tokens do template:
--accent-gold-bright #E8C9A0, --accent-glow #7099FF, --neon-magenta #C47FFF, etc.)
- ❌ Mudar fontes (DS v4 usa Bebas Neue + Barlow Condensed + Outfit + JetBrains Mono — nada de Segoe UI, Arial, system-ui)
- ❌ Remover o
<div class="gold-grid">, os <div class="section-orb">, ou qualquer ornamento decorativo 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. Mantém como tá.
- ❌ 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:
dependências, └─, →, Incomparáveis
- ❌ Errado (mojibake):
dependências, âââ, â, Incomparáveis
- ❌ Errado (entities desnecessárias):
dependências
- Sintoma de erro: se algum acento aparece como sequência de 2-3 chars estranhos (
ã, â, é), o parser HTML pode quebrar e o resto da página renderiza como texto cru. Refaz garantindo UTF-8.
SALVAR em ./_docs/index.html (modo Code) ou retornar como artifact (modo Web).
Como deve parecer: fundo #0D0C0E quase preto · gold-grid de papel pautado dourado animado caindo · orbs azul/roxo em cada seção · risca dourada entre seções · cards var(--gradient-surface) com border --border-faint · números em Bebas Neue gold · DAX com syntax highlight via spans .k .f .s .c. Estilo "editorial premium dark" — não dashboard genérico tipo Vercel/Stripe.
Sintomas de erro:
- Cores como
#f5a623 (laranja) ou #7c6af7 (roxo genérico), ou fonte 'Segoe UI' → ignorou o template, refaz.
- Acentos como
ã ou â → encoding quebrado, refaz com UTF-8 puro.
- Texto solto sem quebras (SVG/tabela aparecendo como prosa) → encoding mojibake quebrou o parser HTML, refaz.
4. Resumir no chat
Mensagem curta:
- Quantidade do que foi documentado (5 tabelas, 19 medidas, 4 relacionamentos)
- Path dos arquivos gerados
- Sugestão: "Abre
_docs/index.html pra ver navegável"
Outputs
[raiz do projeto Power BI do usuário]/
├── SemanticModel/ ← input (não tocar)
├── Report/ ← input (não tocar)
└── _docs/ ← OUTPUT da skill
├── 00-overview.md
├── 01-tabelas.md
├── 02-medidas.md
├── 03-relacionamentos.md
├── 04-dependencias.md
└── index.html ← versão visual standalone
Edge cases
| Cenário |
O que fazer |
Sem .SemanticModel/ |
Mensagem de pré-requisito (PBIP), encerra |
Pasta _docs/ já existe |
Sobrescrever (idempotente) — avisar no chat |
| Modelo gigante (>200 medidas) |
Avisar tempo + processar em chunks |
Tabelas auto-date (LocalDateTable_*, DateTableTemplate_*) |
Excluir da doc — são tabelas-fantasma, não fazem parte do modelo intencional |
| Medida com DAX muito complexo (>30 linhas) |
Mostrar DAX completo + explicar em blocos (se / agg / contexto) |
| Modelo sem nenhuma descrição declarada |
Inferir propósito a partir de naming + estrutura, mas sinalizar "descrição inferida (não há description: declarado)" |
Tom da documentação
Estilo Xperiun:
- PT-BR direto, não robótico. Em vez de "A tabela X possui Y colunas", escrever "Vendas — fato principal do modelo, 1 linha = 1 item de NFe, 12 colunas (5 chaves + 7 atributos)"
- Pode usar metáforas concretas pra explicar DAX complexo
- Manter tom de "colega sênior explicando o modelo pro novo membro do time"
- PT-BR com todos os acentos
Exemplos de bom vs ruim:
❌ Ruim: "A medida 'Faturamento' calcula o resultado da multiplicação entre QtdItens e PrecoUnitario."
✅ Bom: "Faturamento — multiplica quantidade × preço linha-a-linha em fVendas e soma o total. É a medida-mãe: várias outras (Margem Bruta, %YoY, etc) dependem dela."
Idempotência e segurança
- Rodar 2x sobrescreve
_docs/
- Não modifica nada em
.SemanticModel/ ou .Report/ — somente leitura
- Não commita nada
- Operação 100% local — zero rede, zero XMLA
Branding
HTML tem footer fixo:
- "Doc gerada por Claude Code + /pbi-doc · Xperiun"
- CTA: "Quero usar esse skill no meu Power BI →"
- Meta: "XPERIUN · O Sistema Operacional dos Incomparáveis · xperiun.com"
Branding sempre Xperiun.
Tempo típico
- Modelo pequeno (≤30 tabelas, ≤80 medidas): 2–4 min
- Modelo médio (~50 tabelas, ~150 medidas): 5–8 min
- Modelo grande (>200 medidas): 10–15 min
Avisar se >5min esperados.
Versão atual
Distribuída no repo público xperiun/skills-xperiun-free.
1---2name: pbi-doc3description: Documenta projeto Power BI (PBIP) inteiro em markdown estruturado + HTML navegável (mini-site de doc). Use quando o usuário pedir "documenta esse projeto", "gera doc do power bi", "explica esse modelo", "preciso entregar handoff", ou apontar uma pasta PBIP pra mapeamento descritivo (não auditoria).4---56# /pbi-doc — Documentação automática de Power BI78> **📦 Parte do [xperiun/skills-xperiun-free](https://github.com/xperiun/skills-xperiun-free):** pasta `claude-code/pbi-doc/` (Claude Code) + `claude-web/pbi-doc.zip` (upload no Claude.ai).910Gera documentação completa de um projeto Power BI (formato PBIP) em duas formas:11- **Markdown** versionável Git (5 arquivos: overview, tabelas, medidas, relacionamentos, dependências)12- **HTML standalone** navegável (mini-site com sidebar fixa, busca, syntax highlight em DAX)1314A doc descreve o que **existe** no modelo — tabelas, colunas tipadas, medidas com DAX explicadas em PT, relacionamentos com cardinalidade, grafo de dependências entre medidas. **Não opina sobre qualidade** (essa é função da `/pbi-modelo-review`).1516## Quando usar1718- Analista herdou um `.pbix` de N tabelas e M medidas e precisa entender rápido19- Líder pedindo handoff documentado pra outro time20- Pré-onboarding de novo membro no time de dados21- Precisa de "manual de uso" do modelo pra circular junto com o relatório22- Documentação contínua: rodar a cada release pra manter doc viva no Git2324**Não usar quando:**25- Quer auditoria de qualidade / anti-patterns → use `/pbi-modelo-review`26- Quer criar uma medida nova → use `/pbi-dax-create`27- Quer só extrair lista de medidas em CSV (skill futura `/pbi-export-medidas`)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**: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 documentar, 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 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 e a pasta atual contém `.SemanticModel/`46- **Input**: leio automaticamente os `.tmdl` de `./SemanticModel/`47- **Output**: salvo em `./_docs/index.html` + 5 markdowns (`00-overview.md` a `04-dependencias.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 documentar, anexe nesse chat:54 > - Os arquivos `.tmdl` da pasta `SemanticModel/definition/` (model.tmdl, relationships.tmdl, expressions.tmdl se houver)55 > - Os arquivos da pasta `SemanticModel/definition/tables/` (1 .tmdl por tabela, **excluindo** as auto-date `LocalDateTable_*` e `DateTableTemplate_*`)56 >57 > Pode arrastar individualmente ou zipar a pasta `SemanticModel/` e subir 1 ZIP.58- **Output**:59 - HTML completo (mini-site navegável) como **artifact** (Claude.ai renderiza inline + botão de download)60 - Os 5 markdowns como blocos de código no chat (copiáveis um a um) OU 1 ZIP com todos61- **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### Trade-offs por modo7374| Aspecto | Code | Web |75|---|---|---|76| Setup | 1× (instala skill) | 0 (só sobe arquivo) |77| Por uso | comando único | anexar TMDL toda vez |78| Modelo grande (>200 medidas) | OK | pode estourar contexto Free |79| Persistência | salva em disco | só na conversa (baixar artifact) |80| Custo | tokens Claude Code | tokens claude.ai (Free incluído) |8182## Inputs8384- **Escopo** (opcional, default: `tudo`)85 - `tudo` → todos os 5 arquivos86 - `só medidas` → só `02-medidas.md` (útil pra checar mudanças após refator)87 - `só tabelas` → só `01-tabelas.md`88 - `só relacionamentos` → só `03-relacionamentos.md`89 - `tabela X` → restringe descrição às tabelas específicas (separadas por vírgula)9091Se não especificado, perguntar **uma vez**:92> Documento o projeto inteiro (5 arquivos) ou prefere algo específico — só medidas, só relacionamentos, ou tabelas específicas?9394## Processo9596### 1. Detectar e mapear9798- Confirmar `.SemanticModel/`99- Listar `.tmdl` em `./SemanticModel/tables/` (excluir `LocalDateTable_*` e `DateTableTemplate_*` — são auto-geradas, não fazem parte da doc)100- Ler `model.tmdl`, `relationships.tmdl`, `expressions.tmdl` (se existir)101- Ler **todos** os `.tmdl` de tabelas102- Inventariar:103 - **Tabelas**: nome, tipo (fato/dim/measures-only), descrição, granularidade inferida, lista de colunas, partição/source M104 - **Medidas**: nome, expressão DAX, displayFolder (agrupa), formatString, descrição (se existir), referências a outras medidas105 - **Relacionamentos**: from, to, cardinalidade, direção, ativo106 - **Dependências**: medida X usa medida Y; medida Z usa coluna W107108### 2. Gerar 5 arquivos markdown109110Ler templates em `templates/` e preencher com dados reais. Salvar em `./_docs/` na raiz do projeto Power BI:111112| Arquivo | Conteúdo |113|---|---|114| `_docs/00-overview.md` | Sumário (N tabelas, N medidas, N relacionamentos, fontes, propósito inferido) |115| `_docs/01-tabelas.md` | Cada tabela: descrição, granularidade, colunas tipadas, source M (resumo) |116| `_docs/02-medidas.md` | Agrupadas por displayFolder. Cada uma: nome, DAX, explicação PT linha-a-linha |117| `_docs/03-relacionamentos.md` | Lista detalhada + diagrama em ASCII art (matriz simples) |118| `_docs/04-dependencias.md` | Grafo: árvore "medida X → usa Y → usa Z" + lista reverse "Y é usada por: A, B, C" |119120### 3. Gerar HTML standalone121122**🚨 REGRA INVIOLÁVEL — usar templates/relatorio.html LITERAL:**1231241. **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, riscas section+section::before, brackets), todo o JS de scroll spy/busca**. CSS são ~600 linhas inline + HTML completo com gold-grid, sidebar, topbar, sections.1251262. **SUBSTITUIR APENAS os placeholders `{{...}}`** pelos valores reais derivados dos `.tmdl`. Lista completa dos placeholders está em `references/escopo.md` desta skill (seção "Placeholders do `templates/relatorio.html`"). Todos os blocos `{{...}}_HTML` são gerados pelo Claude com base no inventário do modelo.1271283. **PROIBIDO:**129 - ❌ Trocar o CSS por outro130 - ❌ Inventar nova paleta de cores (usar SÓ os tokens do template: `--accent-gold-bright #E8C9A0`, `--accent-glow #7099FF`, `--neon-magenta #C47FFF`, etc.)131 - ❌ Mudar fontes (DS v4 usa Bebas Neue + Barlow Condensed + Outfit + JetBrains Mono — nada de Segoe UI, Arial, system-ui)132 - ❌ Remover o `<div class="gold-grid">`, os `<div class="section-orb">`, ou qualquer ornamento decorativo do template133 - ❌ Gerar HTML "do zero" porque parece mais fácil — **isso queima toda a identidade visual Xperiun**134 - ❌ **Tocar em qualquer coisa dentro de comentários `<!-- ... -->`** — comentários são instruções pra você, não conteúdo a substituir. Mantém como tá.135 - ❌ **Tocar em `<style>...</style>` ou `<script>...</script>`** — CSS e JS ficam intocados.1361374. **🚨 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.138 - ✅ Correto: `dependências`, `└─`, `→`, `Incomparáveis`139 - ❌ Errado (mojibake): `dependências`, `âââ`, `â`, `Incomparáveis`140 - ❌ Errado (entities desnecessárias): `dependências`141 - **Sintoma de erro:** se algum acento aparece como sequência de 2-3 chars estranhos (`ã`, `â`, `é`), o parser HTML pode quebrar e o resto da página renderiza como texto cru. Refaz garantindo UTF-8.1421435. **SALVAR** em `./_docs/index.html` (modo Code) ou retornar como artifact (modo Web).1441456. **Como deve parecer:** fundo `#0D0C0E` quase preto · gold-grid de papel pautado dourado animado caindo · orbs azul/roxo em cada seção · risca dourada entre seções · cards `var(--gradient-surface)` com border `--border-faint` · números em Bebas Neue gold · DAX com syntax highlight via spans `.k .f .s .c`. Estilo "editorial premium dark" — não dashboard genérico tipo Vercel/Stripe.1461477. **Sintomas de erro:**148 - Cores como `#f5a623` (laranja) ou `#7c6af7` (roxo genérico), ou fonte `'Segoe UI'` → ignorou o template, refaz.149 - Acentos como `ã` ou `â` → encoding quebrado, refaz com UTF-8 puro.150 - Texto solto sem quebras (SVG/tabela aparecendo como prosa) → encoding mojibake quebrou o parser HTML, refaz.151152### 4. Resumir no chat153154Mensagem curta:155- Quantidade do que foi documentado (5 tabelas, 19 medidas, 4 relacionamentos)156- Path dos arquivos gerados157- Sugestão: "Abre `_docs/index.html` pra ver navegável"158159## Outputs160161```162[raiz do projeto Power BI do usuário]/163├── SemanticModel/ ← input (não tocar)164├── Report/ ← input (não tocar)165└── _docs/ ← OUTPUT da skill166 ├── 00-overview.md167 ├── 01-tabelas.md168 ├── 02-medidas.md169 ├── 03-relacionamentos.md170 ├── 04-dependencias.md171 └── index.html ← versão visual standalone172```173174## Edge cases175176| Cenário | O que fazer |177|---|---|178| Sem `.SemanticModel/` | Mensagem de pré-requisito (PBIP), encerra |179| Pasta `_docs/` já existe | **Sobrescrever** (idempotente) — avisar no chat |180| Modelo gigante (>200 medidas) | Avisar tempo + processar em chunks |181| Tabelas auto-date (`LocalDateTable_*`, `DateTableTemplate_*`) | **Excluir da doc** — são tabelas-fantasma, não fazem parte do modelo intencional |182| Medida com DAX muito complexo (>30 linhas) | Mostrar DAX completo + explicar em **blocos** (se / agg / contexto) |183| Modelo sem nenhuma descrição declarada | Inferir propósito a partir de naming + estrutura, mas sinalizar "descrição inferida (não há `description:` declarado)" |184185## Tom da documentação186187Estilo Xperiun:188- **PT-BR direto, não robótico**. Em vez de "A tabela X possui Y colunas", escrever "Vendas — fato principal do modelo, 1 linha = 1 item de NFe, 12 colunas (5 chaves + 7 atributos)"189- Pode usar metáforas concretas pra explicar DAX complexo190- Manter tom de "colega sênior explicando o modelo pro novo membro do time"191- PT-BR com **todos os acentos**192193Exemplos de **bom** vs **ruim**:194195❌ Ruim: "A medida 'Faturamento' calcula o resultado da multiplicação entre QtdItens e PrecoUnitario."196197✅ Bom: "**Faturamento** — multiplica quantidade × preço linha-a-linha em fVendas e soma o total. É a medida-mãe: várias outras (Margem Bruta, %YoY, etc) dependem dela."198199## Idempotência e segurança200201- Rodar 2x **sobrescreve** `_docs/`202- Não modifica nada em `.SemanticModel/` ou `.Report/` — somente leitura203- Não commita nada204- Operação 100% local — zero rede, zero XMLA205206## Branding207208HTML tem footer fixo:209- "Doc gerada por Claude Code + /pbi-doc · Xperiun"210- CTA: "Quero usar esse skill no meu Power BI →"211- Meta: "XPERIUN · O Sistema Operacional dos Incomparáveis · xperiun.com"212213Branding sempre Xperiun.214215## Tempo típico216217- Modelo pequeno (≤30 tabelas, ≤80 medidas): **2–4 min**218- Modelo médio (~50 tabelas, ~150 medidas): **5–8 min**219- Modelo grande (>200 medidas): **10–15 min**220221Avisar se >5min esperados.222223## Versão atual224225Distribuída no repo público `xperiun/skills-xperiun-free`.