diff --git a/.agents/skills/relatorio-cidade/SKILL.md b/.agents/skills/relatorio-cidade/SKILL.md
index 1ebb43b0..cb302ccf 100644
--- a/.agents/skills/relatorio-cidade/SKILL.md
+++ b/.agents/skills/relatorio-cidade/SKILL.md
@@ -189,6 +189,11 @@ cacheado em `data/relatorios-cidade/.emendas.json` para replay.
limites`.
- **Links clicáveis:** todo URL no PDF é um link (``): células de
tabela, fontes por linha e a seção de fontes.
+- **Tabela da seção 11 (notícias) com larguras fixas:** `Data 9 · Veículo 14 ·
+ Título 49 · Link 28` (%). As larguras explícitas tornam a tabela `table-fixed`
+ (a URL longa/crua quebra em vez de inflar a coluna) e dão ao **Título** — o
+ texto mais longo — a maior fatia. Sem largura, a URL sem espaços domina o
+ layout automático e espreme/estoura a tabela.
## Guardrails de produto (não negociáveis)
diff --git a/docs/changelog/2026-09-15-c163-largura-titulo-secao-11.md b/docs/changelog/2026-09-15-c163-largura-titulo-secao-11.md
new file mode 100644
index 00000000..a6a9e5b5
--- /dev/null
+++ b/docs/changelog/2026-09-15-c163-largura-titulo-secao-11.md
@@ -0,0 +1 @@
+**C163 — Relatório de cidade: coluna Título da seção 11 com largura fixa e maior fatia (2026-09-15):** a tabela "Notícias internas e imprensa local" era renderizada sem larguras, então o layout automático do navegador dava à coluna **Link** a maior parte da largura — a URL crua, sem espaços, virava um token gigante e a tabela estourava a página (medido: tabela de **2.261 px** e coluna Link de **2.052 px**, com o **Título** espremido a 64 px). Agora as colunas têm larguras explícitas (`Data 9 · Veículo 14 · Título 49 · Link 28` %), o que torna a tabela `table-fixed` e habilita o `overflow-wrap: anywhere` do CSS: a URL quebra dentro da célula e o **Título** — o texto mais longo — recebe a maior fatia. Decisão persistida no script (`buildNewsSection`) e na skill (`relatorio-cidade`), com o mesmo racional. Sem mudança de contrato de dados nem de conteúdo: só layout, verificável reconstruindo o HTML e medindo as colunas.
diff --git a/scripts/lib/cityReportBlocks.mjs b/scripts/lib/cityReportBlocks.mjs
index cb4dae5e..49580974 100644
--- a/scripts/lib/cityReportBlocks.mjs
+++ b/scripts/lib/cityReportBlocks.mjs
@@ -971,11 +971,14 @@ const buildNewsSection = ({ research }) => {
blocks.push({
kind: 'table',
title: 'Notícias internas e imprensa local',
+ // Título é o texto mais longo: larguras explícitas tornam a tabela
+ // `table-fixed` (URL quebra em vez de empurrar a coluna) e dão a ela a
+ // maior fatia — sem largura, a URL sem espaços infla a coluna Link.
columns: [
- { key: 'date', label: 'Data' },
- { key: 'outlet', label: 'Veículo' },
- { key: 'title', label: 'Título' },
- { key: 'link', label: 'Link' },
+ { key: 'date', label: 'Data', width: 9 },
+ { key: 'outlet', label: 'Veículo', width: 14 },
+ { key: 'title', label: 'Título', width: 49 },
+ { key: 'link', label: 'Link', width: 28 },
],
rows: research.news.map((item) => ({
date: formatDateBr(item.publishedAt),