docs(C187,C188): planos + designs hi-fi (dossiê instituição; sem truncamento)

This commit is contained in:
Francisco Solla 2026-09-17 17:44:18 -03:00
parent 4364ca203a
commit 5272959465
4 changed files with 2555 additions and 0 deletions

View file

@ -0,0 +1,577 @@
<!doctype html>
<html lang="pt-BR">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
<title>Design — Boletim modelo do dossiê Solla por instituição</title>
<style type="text/tailwindcss">
@theme inline {
--font-sans: 'Fira Sans', 'DejaVu Sans', Arial, sans-serif;
--color-ink: #172033;
--color-ink-soft: #435264;
--color-paper: #ffffff;
--color-workspace: #d8dde1;
--color-line: #cbd5dc;
--color-wash: #f3f6f8;
--color-accent: #315c75;
--color-accent-soft: #e8f0f4;
--color-warning: #8a5a18;
--color-warning-soft: #fff7e8;
--radius-sm: 0.125rem;
--radius-md: 0.25rem;
}
:root {
--ink: #172033;
--ink-soft: #435264;
--paper: #ffffff;
--workspace: #d8dde1;
--line: #cbd5dc;
--wash: #f3f6f8;
--accent: #315c75;
--accent-soft: #e8f0f4;
--warning: #8a5a18;
--warning-soft: #fff7e8;
}
* {
box-sizing: border-box;
}
html {
color-scheme: light;
}
body {
margin: 0;
color: var(--ink);
background: var(--workspace);
font-family: 'Fira Sans', 'DejaVu Sans', Arial, sans-serif;
-webkit-font-smoothing: antialiased;
}
.sheet {
position: relative;
width: 210mm;
height: 297mm;
padding: 8mm 10mm 7mm 12mm;
overflow: hidden;
display: flex;
flex-direction: column;
background: var(--paper);
box-shadow: 0 18px 44px rgb(23 32 51 / 18%);
font-size: 10.25pt;
line-height: 1.26;
}
.sheet::before {
content: '';
position: absolute;
inset: 0 auto 0 0;
width: 3.5mm;
background: var(--accent);
}
.sheet p,
.sheet h1,
.sheet h2,
.sheet h3,
.sheet ul {
margin-top: 0;
}
.tabular {
font-variant-numeric: tabular-nums;
}
.model-label {
display: inline-flex;
align-items: center;
min-height: 6mm;
padding: 1mm 2.5mm;
border: 0.35mm solid var(--warning);
border-radius: 99px;
color: #68420f;
background: var(--warning-soft);
font-size: 7.3pt;
line-height: 1;
font-weight: 800;
letter-spacing: 0.08em;
text-transform: uppercase;
white-space: nowrap;
}
.defeso-band {
margin-inline: -10mm;
padding: 1.4mm 10mm 1.35mm;
display: flex;
align-items: center;
justify-content: space-between;
gap: 5mm;
color: #68420f;
background: var(--warning-soft);
border-block: 0.25mm solid #e7cc9d;
font-size: 7.15pt;
line-height: 1.2;
font-weight: 700;
}
.kicker,
.section-label {
color: var(--accent);
font-size: 7.4pt;
line-height: 1.1;
font-weight: 800;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.section-label {
margin-bottom: 1.2mm;
}
.identity-pill {
display: inline-flex;
align-items: center;
min-height: 5mm;
padding: 0.55mm 1.7mm;
border: 0.25mm solid var(--line);
border-radius: 99px;
color: var(--ink-soft);
background: var(--wash);
font-size: 6.9pt;
line-height: 1;
font-weight: 750;
text-transform: uppercase;
letter-spacing: 0.045em;
}
.asset-box {
border: 0.4mm dashed #748894;
color: #40535f;
background:
linear-gradient(135deg, transparent 49.6%, #cbd5dc 50%, transparent 50.4%),
linear-gradient(45deg, transparent 49.6%, #cbd5dc 50%, transparent 50.4%), #f7f9fa;
}
.highlight-card {
min-height: 30mm;
padding: 2.6mm 3mm 2.35mm;
border: 0.3mm solid var(--line);
border-top: 1.15mm solid var(--accent);
background: var(--paper);
}
.highlight-eyebrow {
margin-bottom: 1.4mm;
color: var(--ink-soft);
font-size: 6.65pt;
line-height: 1;
font-weight: 800;
letter-spacing: 0.075em;
text-transform: uppercase;
}
.highlight-number {
margin: 0;
color: var(--accent);
font-size: 18pt;
line-height: 0.96;
font-weight: 800;
letter-spacing: -0.035em;
}
.highlight-title {
margin: 1.4mm 0 0;
font-size: 10.5pt;
line-height: 1.08;
font-weight: 800;
letter-spacing: -0.01em;
}
.highlight-note {
margin: 1.2mm 0 0;
color: var(--ink-soft);
font-size: 7.9pt;
line-height: 1.2;
}
.timeline-step {
position: relative;
padding: 4.3mm 2.5mm 1.2mm;
border-top: 0.4mm solid #97aab6;
}
.timeline-step::before {
content: '';
position: absolute;
top: -1.6mm;
left: 2.5mm;
width: 3mm;
height: 3mm;
border: 0.65mm solid var(--accent-soft);
border-radius: 99px;
background: var(--accent);
box-shadow: 0 0 0 0.3mm var(--accent);
}
.more-item {
position: relative;
min-height: 10mm;
padding: 0 0 1.7mm 4.8mm;
border-bottom: 0.25mm solid var(--line);
font-size: 8.6pt;
line-height: 1.2;
}
.more-item::before {
content: '✓';
position: absolute;
left: 0;
top: 0;
color: var(--accent);
font-weight: 900;
}
.lacuna-panel {
border: 0.4mm dashed #b18549;
color: #684819;
background: var(--warning-soft);
}
@page {
size: A4;
margin: 0;
}
@media print {
body {
background: #fff;
}
.gate-header,
.scene-label {
display: none !important;
}
.pages {
display: block !important;
padding: 0 !important;
}
.scene {
width: 210mm;
height: 297mm;
margin: 0 !important;
break-after: page;
page-break-after: always;
}
.scene:last-child {
break-after: auto;
page-break-after: auto;
}
.sheet {
width: 210mm;
height: 297mm;
box-shadow: none;
}
}
</style>
</head>
<body>
<header class="gate-header mx-auto max-w-[1100px] px-6 pt-8 text-ink">
<p class="text-xs font-bold uppercase tracking-[0.14em] text-accent">
Gate visual · Impeccable C
</p>
<h1 class="mt-1 text-2xl font-semibold tracking-tight">
Boletim modelo por instituição — uma página A4
</h1>
<p class="mt-2 max-w-3xl text-sm leading-6 text-ink-soft">
Duas variações da mesma folha: composição completa e estado honesto com poucos fatos
documentados. Cada quadro abaixo é uma alternativa imprimível de uma página, não uma sequência.
</p>
<div class="mt-4 flex flex-wrap gap-2 text-xs">
<span class="rounded-full border border-line bg-white px-3 py-1">A4 · 210 × 297 mm</span>
<span class="rounded-full border border-line bg-white px-3 py-1">até 6 destaques</span>
<span class="rounded-full border border-line bg-white px-3 py-1">até 14 itens em “E mais”</span>
<span class="rounded-full border border-line bg-white px-3 py-1">sem fontes · sem CTA</span>
<span class="rounded-full border border-line bg-white px-3 py-1">fase por valor</span>
<span class="rounded-full border border-line bg-white px-3 py-1">setor/rede não somam</span>
<span class="rounded-full border border-line bg-white px-3 py-1">sem % estadual absoluto</span>
</div>
</header>
<main class="pages mx-auto flex max-w-[1100px] flex-col items-center gap-12 px-6 py-10">
<!-- CENA 01 · COMPOSIÇÃO COMPLETA -->
<section class="scene" aria-labelledby="bulletin-title">
<p class="scene-label mb-2 text-xs font-bold uppercase tracking-[0.12em] text-ink-soft">
Cena 01 · Boletim completo · densidade máxima permitida
</p>
<article class="sheet" aria-label="Modelo completo do boletim institucional de uma página">
<header class="flex items-center justify-between gap-[5mm] border-b-[0.55mm] border-ink pb-[2.4mm]">
<div>
<p class="kicker mb-[1mm]">Boletim informativo · atuação pública</p>
<p class="m-0 text-[11pt] font-extrabold">Instituição Exemplo</p>
<div class="mt-[1.3mm] flex flex-wrap gap-[1.2mm]">
<span class="identity-pill">Universidade</span>
<span class="identity-pill">Federal</span>
<span class="identity-pill">Abrangência BA</span>
</div>
</div>
<span class="model-label">Modelo — insumo interno</span>
</header>
<div class="defeso-band mt-[2.2mm]" role="note" aria-label="Nota de defeso eleitoral">
<span>DEFESO 2026 · material em preparação · não publicar sem revisão editorial e jurídica</span>
<span class="shrink-0 uppercase tracking-[.07em]">sem CTA · sem propaganda</span>
</div>
<section class="mt-[3mm] grid grid-cols-[1fr_45mm] gap-[5mm]" aria-label="Abertura do boletim">
<div>
<p class="section-label">Uma trajetória de trabalho junto à instituição</p>
<h1 id="bulletin-title" class="m-0 text-[22.5pt] font-semibold leading-[1] tracking-[-0.038em]">
O que Jorge Solla fez pela e na
<span class="text-accent">Instituição Exemplo</span>
</h1>
<p class="mb-0 mt-[2.3mm] max-w-[126mm] text-[10.2pt] leading-[1.3] text-ink-soft">
Ações, recursos e articulações explicados de forma direta — somente o que já foi
documentado no dossiê institucional.
</p>
</div>
<div class="asset-box flex min-h-[35mm] flex-col items-center justify-center rounded-sm p-[3mm] text-center">
<svg class="mb-[1.4mm] h-6 w-6 text-accent" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true">
<rect x="3" y="5" width="18" height="14" rx="2" />
<circle cx="8.5" cy="10" r="1.5" />
<path d="m21 15-5-5L5 19" />
</svg>
<p class="m-0 text-[7.4pt] font-extrabold uppercase tracking-[.08em]">NEEDS ASSET · foto real</p>
<p class="mb-0 mt-[1mm] text-[6.9pt] leading-[1.22]">Solla na instituição ou na ação citada<br />origem, autoria e licença</p>
</div>
</section>
<section class="mt-[3.3mm]" aria-labelledby="highlights-title">
<div class="flex items-end justify-between gap-4 border-b-[0.3mm] border-line pb-[1.3mm]">
<div>
<p class="section-label">Destaques</p>
<h2 id="highlights-title" class="m-0 text-[13.5pt] font-semibold leading-none tracking-[-0.015em]">Resultados em leitura rápida</h2>
</div>
<p class="m-0 text-right text-[6.7pt] font-bold uppercase tracking-[.065em] text-ink-soft">cada número mantém sua fase e seu alcance</p>
</div>
<div class="mt-[2.2mm] grid grid-cols-3 gap-[2mm]">
<article class="highlight-card rounded-sm">
<p class="highlight-eyebrow">Educação · instituição</p>
<p class="highlight-number tabular">R$ 0,0 mi</p>
<h3 class="highlight-title">para fortalecer a estrutura</h3>
<p class="highlight-note">Fase: empenhado. Não apresentar como valor pago.</p>
</article>
<article class="highlight-card rounded-sm">
<p class="highlight-eyebrow">Atuação · instituição</p>
<p class="highlight-number tabular">00 ações</p>
<h3 class="highlight-title">com resultado documentado</h3>
<p class="highlight-note">Substituir pela contagem e pelo resultado confirmados.</p>
</article>
<article class="highlight-card rounded-sm">
<p class="highlight-eyebrow">Formação · setor</p>
<p class="highlight-number tabular">00 pessoas</p>
<h3 class="highlight-title">alcançadas pela iniciativa</h3>
<p class="highlight-note">O setor aparece separado da instituição.</p>
</article>
<article class="highlight-card rounded-sm">
<p class="highlight-eyebrow">Direitos · rede</p>
<p class="highlight-number tabular">00 iniciativas</p>
<h3 class="highlight-title">em defesa da rede relacionada</h3>
<p class="highlight-note">Não atribuir o alcance compartilhado só à instituição.</p>
</article>
<article class="highlight-card rounded-sm">
<p class="highlight-eyebrow">Pesquisa · instituição</p>
<p class="highlight-number tabular">00 projetos</p>
<h3 class="highlight-title">apoiados com papel comprovado</h3>
<p class="highlight-note">Dizer o que foi feito, sem ampliar autoria ou efeito.</p>
</article>
<article class="highlight-card rounded-sm">
<p class="highlight-eyebrow">Reconhecimento · rede</p>
<p class="highlight-number tabular">AAAA</p>
<h3 class="highlight-title">registro de reconhecimento</h3>
<p class="highlight-note">Usar o ano e o nome oficial somente após conferência.</p>
</article>
</div>
</section>
<section class="mt-[3mm] rounded-sm bg-accent-soft px-[3mm] pb-[2.3mm] pt-[2.5mm]" aria-labelledby="timeline-title">
<div class="flex items-center justify-between gap-4">
<h2 id="timeline-title" class="m-0 text-[10.8pt] font-semibold">Uma trajetória de compromisso com o serviço público</h2>
<p class="m-0 text-[6.5pt] font-bold uppercase tracking-[.075em] text-accent">quatro momentos · linguagem direta</p>
</div>
<div class="mt-[2.7mm] grid grid-cols-4">
<div class="timeline-step">
<p class="mb-[.7mm] text-[7.1pt] font-extrabold text-accent">1999–2002</p>
<p class="m-0 text-[8.1pt] font-semibold leading-[1.16]">Gestão municipal da saúde</p>
</div>
<div class="timeline-step">
<p class="mb-[.7mm] text-[7.1pt] font-extrabold text-accent">2003–2005</p>
<p class="m-0 text-[8.1pt] font-semibold leading-[1.16]">Atenção à saúde no governo federal</p>
</div>
<div class="timeline-step">
<p class="mb-[.7mm] text-[7.1pt] font-extrabold text-accent">2007–2014</p>
<p class="m-0 text-[8.1pt] font-semibold leading-[1.16]">Secretaria da Saúde da Bahia</p>
</div>
<div class="timeline-step">
<p class="mb-[.7mm] text-[7.1pt] font-extrabold text-accent">2015–2027</p>
<p class="m-0 text-[8.1pt] font-semibold leading-[1.16]">Atuação na Câmara Federal</p>
</div>
</div>
</section>
<section class="mt-[3mm] grid grid-cols-[1fr_42mm] gap-[4mm]" aria-labelledby="more-title">
<div>
<div class="flex items-end justify-between gap-4 border-b-[0.3mm] border-line pb-[1.2mm]">
<div>
<p class="section-label">E mais</p>
<h2 id="more-title" class="m-0 text-[12pt] font-semibold leading-none">Outras ações confirmadas</h2>
</div>
<p class="m-0 text-[6.5pt] font-bold uppercase tracking-[.065em] text-ink-soft">até 14 · sem completar por inferência</p>
</div>
<div class="mt-[2mm] grid grid-cols-2 gap-x-[4mm] gap-y-[1.25mm]">
<p class="more-item mb-0"><strong>Estrutura:</strong> melhoria documentada na instituição.</p>
<p class="more-item mb-0"><strong>Ensino:</strong> apoio comprovado a uma atividade.</p>
<p class="more-item mb-0"><strong>Pesquisa:</strong> projeto e papel exercido.</p>
<p class="more-item mb-0"><strong>Extensão:</strong> público diretamente alcançado.</p>
<p class="more-item mb-0"><strong>Direitos:</strong> ação institucional registrada.</p>
<p class="more-item mb-0"><strong>Orçamento:</strong> valor com fase identificada.</p>
<p class="more-item mb-0"><strong>Audiência:</strong> pauta e encaminhamento concreto.</p>
<p class="more-item mb-0"><strong>Parceria:</strong> objeto e resultado da cooperação.</p>
<p class="more-item mb-0"><strong>Setor:</strong> alcance compartilhado, sem somar.</p>
<p class="more-item mb-0"><strong>Rede:</strong> entidades envolvidas e resultado.</p>
<p class="more-item mb-0"><strong>Proposição:</strong> papel parlamentar comprovado.</p>
<p class="more-item mb-0"><strong>Relatoria:</strong> etapa e efeito documentados.</p>
<p class="more-item mb-0"><strong>Homenagem:</strong> nome oficial e ano.</p>
<p class="more-item mb-0"><strong>Articulação:</strong> entrega distinta do anúncio.</p>
</div>
</div>
<aside class="grid grid-rows-2 gap-[2.2mm]" aria-label="Ativos visuais pendentes">
<div class="asset-box flex min-h-[24mm] items-center justify-center rounded-sm p-[2.5mm] text-center">
<p class="m-0 text-[6.9pt] leading-[1.22]"><strong class="uppercase tracking-[.06em]">NEEDS ASSET · selo</strong><br />marca autorizada da instituição<br />arquivo vetorial</p>
</div>
<div class="asset-box flex min-h-[24mm] items-center justify-center rounded-sm p-[2.5mm] text-center">
<p class="m-0 text-[6.9pt] leading-[1.22]"><strong class="uppercase tracking-[.06em]">NEEDS ASSET · clipping</strong><br />registro real da ação<br />origem e licença</p>
</div>
</aside>
</section>
<footer class="mt-auto border-t-[0.35mm] border-line pt-[2mm]">
<div class="flex items-end justify-between gap-[5mm]">
<div>
<p class="mb-[.7mm] text-[7pt] font-semibold leading-[1.22] text-accent">Conteúdo selecionado do dossiê institucional.</p>
<p class="m-0 max-w-[145mm] text-[7.1pt] leading-[1.25] text-ink-soft"><strong class="text-warning">Controle editorial:</strong> fase acompanha cada valor · instituição, setor e rede não são somados · sem percentual estadual absoluto.</p>
</div>
<p class="m-0 shrink-0 text-right text-[7pt] font-semibold leading-[1.28] text-ink-soft">MODELO · INSUMO INTERNO<br />A4 · página 1/1</p>
</div>
</footer>
</article>
</section>
<!-- CENA 02 · POUCOS FATOS -->
<section class="scene" aria-labelledby="sparse-title">
<p class="scene-label mb-2 text-xs font-bold uppercase tracking-[0.12em] text-ink-soft">
Cena 02 · Variação de lacuna · poucos fatos documentados
</p>
<article class="sheet" aria-label="Variação do boletim institucional com poucos fatos documentados">
<header class="flex items-center justify-between gap-[5mm] border-b-[0.55mm] border-ink pb-[2.4mm]">
<div>
<p class="kicker mb-[1mm]">Boletim informativo · atuação pública</p>
<p class="m-0 text-[11pt] font-extrabold">Instituição Exemplo</p>
<div class="mt-[1.3mm] flex flex-wrap gap-[1.2mm]">
<span class="identity-pill">Entidade de classe</span>
<span class="identity-pill">Não governamental</span>
<span class="identity-pill">Abrangência nacional</span>
</div>
</div>
<span class="model-label">Modelo — insumo interno</span>
</header>
<div class="defeso-band mt-[2.2mm]" role="note" aria-label="Nota de defeso eleitoral">
<span>DEFESO 2026 · material em preparação · não publicar sem revisão editorial e jurídica</span>
<span class="shrink-0 uppercase tracking-[.07em]">sem CTA · sem propaganda</span>
</div>
<section class="mt-[3.2mm] grid grid-cols-[1fr_55mm] gap-[5mm]" aria-label="Abertura da variação com lacunas">
<div>
<p class="section-label">Somente o que está documentado</p>
<h1 id="sparse-title" class="m-0 text-[23pt] font-semibold leading-[1] tracking-[-0.038em]">O que Jorge Solla fez pela e na <span class="text-accent">Instituição Exemplo</span></h1>
<p class="mb-0 mt-[2.5mm] text-[10.4pt] leading-[1.32] text-ink-soft">Esta versão tem poucos registros confirmados. Em vez de preencher espaço, mostra só os fatos que o dossiê sustenta.</p>
</div>
<div class="asset-box flex min-h-[39mm] flex-col items-center justify-center rounded-sm p-[3mm] text-center">
<svg class="mb-[1.5mm] h-6 w-6 text-accent" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true">
<rect x="3" y="5" width="18" height="14" rx="2" />
<circle cx="8.5" cy="10" r="1.5" />
<path d="m21 15-5-5L5 19" />
</svg>
<p class="m-0 text-[7.4pt] font-extrabold uppercase tracking-[.08em]">NEEDS ASSET · foto ou clipping</p>
<p class="mb-0 mt-[1mm] text-[6.9pt] leading-[1.22]">somente registro relacionado ao fato<br />origem, autoria e licença</p>
</div>
</section>
<section class="mt-[5mm]" aria-labelledby="sparse-highlights">
<div class="flex items-end justify-between gap-4 border-b-[0.3mm] border-line pb-[1.5mm]">
<div>
<p class="section-label">Destaques</p>
<h2 id="sparse-highlights" class="m-0 text-[14pt] font-semibold leading-none">Dois fatos, sem enchimento</h2>
</div>
<p class="m-0 text-right text-[6.8pt] font-bold uppercase tracking-[.07em] text-warning">não criar cards vazios para chegar a seis</p>
</div>
<div class="mt-[3mm] grid grid-cols-2 gap-[3mm]">
<article class="highlight-card min-h-[37mm] rounded-sm p-[4mm]">
<p class="highlight-eyebrow">Atuação · instituição</p>
<p class="highlight-number tabular">00 ações</p>
<h3 class="highlight-title text-[12pt]">com resultado documentado</h3>
<p class="highlight-note text-[8.4pt]">Substituir pela contagem confirmada e explicar o resultado em uma frase.</p>
</article>
<article class="highlight-card min-h-[37mm] rounded-sm p-[4mm]">
<p class="highlight-eyebrow">Direitos · setor</p>
<p class="highlight-number tabular">AAAA</p>
<h3 class="highlight-title text-[12pt]">ano de uma ação confirmada</h3>
<p class="highlight-note text-[8.4pt]">O alcance setorial permanece separado da instituição.</p>
</article>
</div>
</section>
<section class="mt-[4.5mm] rounded-sm bg-accent-soft px-[3.5mm] pb-[3mm] pt-[3.2mm]" aria-labelledby="sparse-timeline">
<div class="flex items-center justify-between gap-4">
<h2 id="sparse-timeline" class="m-0 text-[11.5pt] font-semibold">Uma trajetória de compromisso com o serviço público</h2>
<p class="m-0 text-[6.7pt] font-bold uppercase tracking-[.08em] text-accent">contexto de carreira · não substitui fato institucional</p>
</div>
<div class="mt-[3mm] grid grid-cols-4">
<div class="timeline-step"><p class="mb-[.7mm] text-[7.2pt] font-extrabold text-accent">1999–2002</p><p class="m-0 text-[8.4pt] font-semibold leading-[1.18]">Gestão municipal da saúde</p></div>
<div class="timeline-step"><p class="mb-[.7mm] text-[7.2pt] font-extrabold text-accent">2003–2005</p><p class="m-0 text-[8.4pt] font-semibold leading-[1.18]">Atenção à saúde no governo federal</p></div>
<div class="timeline-step"><p class="mb-[.7mm] text-[7.2pt] font-extrabold text-accent">2007–2014</p><p class="m-0 text-[8.4pt] font-semibold leading-[1.18]">Secretaria da Saúde da Bahia</p></div>
<div class="timeline-step"><p class="mb-[.7mm] text-[7.2pt] font-extrabold text-accent">2015–2027</p><p class="m-0 text-[8.4pt] font-semibold leading-[1.18]">Atuação na Câmara Federal</p></div>
</div>
</section>
<section class="mt-[4.5mm] grid grid-cols-[1.15fr_.85fr] gap-[4mm]" aria-labelledby="sparse-more">
<div>
<p class="section-label">E mais</p>
<h2 id="sparse-more" class="m-0 border-b-[0.3mm] border-line pb-[1.5mm] text-[13pt] font-semibold leading-none">Outros registros confirmados</h2>
<div class="mt-[3mm] grid grid-cols-2 gap-x-[5mm] gap-y-[2.8mm]">
<p class="more-item mb-0"><strong>Audiência:</strong> pauta e encaminhamento documentados.</p>
<p class="more-item mb-0"><strong>Articulação:</strong> participantes e resultado confirmado.</p>
<p class="more-item mb-0"><strong>Setor:</strong> alcance compartilhado, sem somar.</p>
<p class="more-item mb-0"><strong>Registro:</strong> nome oficial e ano conferidos.</p>
</div>
</div>
<aside class="lacuna-panel rounded-sm p-[4mm]" aria-label="Regra editorial para poucos fatos">
<div class="flex items-start gap-[2.5mm]">
<svg class="mt-[.4mm] h-5 w-5 shrink-0 text-warning" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
<path d="M10.3 2.9 1.8 17a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 2.9a2 2 0 0 0-3.4 0Z" />
<path d="M12 9v4M12 17h.01" />
</svg>
<div>
<p class="m-0 text-[10.5pt] font-extrabold">A página termina com espaço — de propósito.</p>
<p class="mb-0 mt-[2mm] text-[8.7pt] leading-[1.35]">Não repetir item, não ampliar efeito e não preencher com ação de setor ou rede como se fosse entrega exclusiva da instituição.</p>
</div>
</div>
<div class="mt-[4mm] border-t border-[#d8bb8d] pt-[3mm] text-[7.5pt] font-bold uppercase leading-[1.35] tracking-[.055em]">Poucos fatos com lastro &gt; página cheia sem lastro</div>
</aside>
</section>
<section class="mt-[6mm] grid grid-cols-[1fr_48mm] gap-[4mm]">
<div class="rounded-sm border border-line bg-wash p-[4mm]">
<p class="section-label">Nota de produção</p>
<p class="m-0 text-[9.2pt] leading-[1.38] text-ink-soft">Se novos fatos forem documentados, eles entram por relevância — até seis destaques e até quatorze itens. A ausência nunca vira número zero, percentual ou afirmação genérica.</p>
</div>
<div class="asset-box flex min-h-[28mm] items-center justify-center rounded-sm p-[3mm] text-center">
<p class="m-0 text-[7.1pt] leading-[1.3]"><strong class="uppercase tracking-[.06em]">NEEDS ASSET · selo</strong><br />marca autorizada da instituição<br />arquivo vetorial</p>
</div>
</section>
<footer class="mt-auto border-t-[0.35mm] border-line pt-[2.2mm]">
<div class="flex items-end justify-between gap-[5mm]">
<div>
<p class="mb-[.8mm] text-[7.2pt] font-semibold leading-[1.25] text-accent">Conteúdo selecionado do dossiê institucional.</p>
<p class="m-0 max-w-[144mm] text-[7.3pt] leading-[1.28] text-ink-soft"><strong class="text-warning">Controle editorial:</strong> fase acompanha cada valor · instituição, setor e rede não são somados · sem percentual estadual absoluto.</p>
</div>
<p class="m-0 shrink-0 text-right text-[7.2pt] font-semibold leading-[1.3] text-ink-soft">MODELO · INSUMO INTERNO<br />A4 · página 1/1</p>
</div>
</footer>
</article>
</section>
</main>
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,132 @@
# Dossiê Solla por instituição + Boletim modelo (skill → dossiê + boletim)
Status: rascunho
Atualizado em: 2026-09-17
Issue: #1135
Priority: P2
Impeccable: C — fluxo novo (dossiê institucional + Boletim modelo; mesma família visual do C186)
Design UI: docs/plans/dossie-solla-instituicao-ui-design.html + docs/plans/dossie-solla-instituicao-boletim-ui-design.html
Appetite: ~3–4 dias eng; um outcome verificável — rodar `/dossie-solla-instituicao UFBA` e obter PDF A4 + companion `.md` (seções por era, números com fonte, lacunas) **e** o PDF do Boletim modelo (1 página A4, público eleitor)
Responsável: —
## Intenção
A equipe de comunicação/mandato precisa preparar **agendas institucionais** (visita, audiência, homenagem, articulação) com lastro — e hoje só existe o recorte por município (`/dossie-solla-cidade`, C186). Para uma universidade, uma empresa pública, uma autarquia, um conselho/entidade de classe ou uma categoria profissional, não há de onde partir: a pessoa garimpa memória, WhatsApp e notícia solta. Este item cria uma skill **irmã** da C186 — mesmo pipeline, mesmo rigor de fonte — cujo recorte é a **instituição** em vez do município. Primeiro uso: **UFBA**; reutilizável para **Correios**, **Enfermagem** e demais instituições, em lote de 1 ou N. Além do dossiê, entrega o **Boletim Informativo modelo**: **1 página A4** com a síntese, em linguagem de **público eleitor**, do que Solla fez pela instituição — o pessoal de comunicação parte do dossiê + desse modelo para produzir a peça final. O `/relatorio-cidade` e o `/dossie-solla-cidade` inspiram o fluxo (skill + command + subagente, sub-agentes por era, extração read-only, build local de PDF), mas o conteúdo e o recorte são outros.
## Persona e fluxo
- **Persona / contexto:** equipe de comunicação/mandato de Solla, na mesa, preparando material para uma agenda institucional; sem tempo de garimpo e obrigada a não afirmar sem lastro.
- **Job principal:** numa invocação, obter (1) um **dossiê datado e com fonte** de tudo o que Solla fez por/na/com aquela instituição ao longo da carreira — com números sempre que existirem e lacunas explícitas — e (2) um **boletim modelo de 1 página**, em linguagem de eleitor, sintetizando essas entregas.
- **Fluxo desejado:** pede `/dossie-solla-instituicao UFBA` (ou lote) → o orquestrador resolve o token no catálogo de instituições, dispara pesquisadores (um por era da carreira) em paralelo, roda a extração read-only do acervo e monta os PDFs (+ `.md`) nos layouts desenhados pelo `designer` → a comunicação lê a linha do tempo, escolhe o que entra na fala/o que vira boletim, confere as fontes; lacunas ficam explícitas; falha de uma instituição não cancela o lote.
- **Anti-goals de produto:** virar recorte territorial (reintroduzir município); inventar fato/slug sem fonte; publicar/veicular peça pelo próprio pipeline (defeso 2026); tratar empenho como recurso entregue; persistir dado novo na base (segundo cadastro); segundo pipeline irmão em vez de estender o dono C186; somar setor/rede como se fosse a instituição; o boletim introduzir fato que o dossiê não tem com fonte.
### Esboço de fluxo (C)
```text
[pede: /dossie-solla-instituicao UFBA, Correios] → [orquestrador resolve o catálogo]
→ token desconhecido → fail-closed (alias/entrada ou --slug/--name one-off)
→ [1 researcher por era (A/B/C) por instituição, em paralelo] ─┐
→ [extração read-only do acervo (serializada, 1 instituição)] ─┼→ [build local: HTML do designer → PDF dossiê + .md]
→ [summary: ok|failed + recibo curto por instituição/era] ─────┘
→ [comunicação escolhe o que entra na fala, confere fonte; lacunas explícitas]
```
### Design UI (C)
- Design UI (gate) — dossiê: `docs/plans/dossie-solla-instituicao-ui-design.html` (+ assets em `docs/plans/dossie-solla-instituicao-ui-design-assets/` se houver SVG próprio) — layout do **dossiê A4 institucional** (página 1 "resumo de uma olhada" + seções por era, tabelas de números/fontes, tabela de lacunas, nota de defeso), produzido pelo `designer` **antes** do build e portado pela implementação. Mesma família visual do dossiê C186; seções próprias de instituição.
- Design UI (gate) — boletim modelo: `docs/plans/dossie-solla-instituicao-boletim-ui-design.html` (+ assets) — layout do **Boletim Informativo modelo (1 página A4, público eleitor)**, também produzido pelo `designer` antes do build e portado pela implementação.
## Objetivo e aceite
- Com uma instituição, sai um par **PDF A4 datado + companion `.md`** com: identificação da instituição (nome, tipo, esfera, abrangência); vínculo histórico de Solla com ela por **era A** (até 2006 — formação/SESAB/Conquista/SAS-MS), **B** (SESAB 2007–2014) e **C** (deputado federal 2015–2027); resumo de uma olhada; o que Solla fez pela/na instituição (emendas e recursos, proposições/relatorias, projetos, articulação/audiências, cargos/parcerias/homenagens) em tabelas **Objeto/Valor/Ano/Fase/Fonte**; abrangência (instituição × setor × rede); fontes e limites; nota de defeso.
- Com a mesma instituição, sai também o **Boletim Informativo modelo**: **1 página A4**, em linguagem de público eleitor, denso e direto (mais entregas por página, frases curtas), com os números em destaque e o rótulo de **insumo interno/modelo** (não é a peça final publicável). **Sem declaração de fontes** — as fontes vivem só no dossiê — e **sem CTA/propaganda**. Herda **apenas fatos já com fonte** do dossiê.
- **Toda afirmação não trivial tem fonte visível** (URL + data); o que não foi achado vira **lacuna explícita** — nunca inferência. **Números sempre que a fonte informar**, sempre com a fase.
- Lote de 1+N instituições funciona; **falha de uma não cancela as demais** (sucesso parcial explícito).
- Token fora do catálogo **falha fechado** com mensagem acionável (adicionar alias/entrada, ou escape `--slug`/`--name`), nunca slug inventado.
- Pesquisa roda em **sub-agente por era, por instituição, em paralelo**; o orquestrador agrega **apenas recibos curtos** (nunca o corpo dos JSONs) e serializa a extração read-only.
- O layout vem do artefato hi-fi do `designer` (fonte de verdade do port), não inventado na implementação.
- **Nenhum texto some por não caber:** nada de corte mecânico com "…" e nada de item descartado em silêncio — quando não couber, o texto é **reformulado para caber** (campo `summary` do researcher) ou o **campo/orçamento é ampliado** enquanto a guarda de fit permitir; lista truncada sempre declara o resto ("e mais N"). O dono dessa regra é o C188 (ver Dependências) — o C187 nasce já sob ela.
- Guardrails de produto: "sem fonte, não publica"; **empenho ≠ pagamento** (autorizado/empenhado/liquidado/pago/restos); **abrangência explícita** (`instituicao`/`setor`/`rede` — nunca somar); leitura relativa (nunca % estadual absoluto); atribuição de emenda só com autoria checada; PII mínima; artefato **gitignored** (repo público); falha isolada no lote.
## Dados (intenção)
- **Vou apresentar dados?** Sim, superfície neste item — o dossiê é documento de dados (números com fonte, séries por era e tabela de lacunas).
- **Decisões desbloqueadas:** a comunicação escolhe **o que entra na fala/agenda** com a instituição; **qual vínculo/entrega** priorizar; onde há **entrega documentada × só intenção**; **qual lacuna** buscar antes do encontro.
- **Forma:** _adiada ao plano de implementação_ — aqui só restrições de produto: fase rotulada por valor; abrangência rotulada em cada linha; empenho nunca tratado como pago; sem % estadual absoluto; lacuna explícita em vez de silêncio; ruído eleitoral fora.
## Dados da decisão (literais)
**Nome e artefatos (verbatim):** skill `.agents/skills/dossie-solla-instituicao/SKILL.md`; command `.opencode/commands/dossie-solla-instituicao.md`; subagente `.opencode/agent/dossie-solla-instituicao.md`; build entry + libs reusando o dono C186 (`scripts/build-dossie-solla-cidade.mjs`, `scripts/lib/dossie*.mjs`, `scripts/lib/reportText.mjs`).
**Definição de "instituição" (ampla):** universidade, instituto, empresa pública, autarquia, órgão público, conselho/entidade de classe, **categoria profissional**, movimento, rede.
**Eras (verbatim, reusar as do C186 — não criar eras novas):** **A** até 2006 (formação/residência/SESAB/consultoria MS/Secretaria Municipal de Saúde de Vitória da Conquista 1999–2002/SAS-MS 2003–2005); **B** 2007–2014 (Secretário Estadual de Saúde da Bahia, 01/01/2007–18/01/2014); **C** 2015–2027 (deputado federal). Carreira literal de apoio: 1985–1987 residência Medicina Social (UFBA/INAMPS); 1989/90–1998 SESAB; 1995–1999 consultor MS; 1998 professor Escola Bahiana de Medicina + pesquisador ISC/UFBA; 2006–2009 doutorado UFRJ; nascimento 11/04/1961; Comenda Dois de Julho (ALBA, 2013); **nunca** foi deputado estadual.
**Catálogo de instituições (v1):** arquivo novo (local exato decidido na implementação); entrada com `slug`, `name`, `aliases`, `kind` (`universidade | instituto_federal | empresa_publica | autarquia | orgao_publico | conselho_classe | entidade_classe | categoria_profissional | movimento | rede | outro`), `sphere` (`federal | estadual | municipal | nao_governamental`), `scope` (`nacional | BA`). Seed mínimo: **UFBA** (universidade/federal/BA), **Correios** (empresa_publica/federal/nacional), **Enfermagem** (categoria_profissional; âncoras ABEn-BA/COFEN/Coren-BA; federal/nacional). Token desconhecido → **fail-closed** acionável; escape `--slug=<x> --name="<Nome>"` para one-off; dedup após resolução; falha isolada.
**Abrangência/esfera (literais):** `instituicao` (a entidade como um todo) | `setor` (categoria/área; ex.: Enfermagem dentro da Saúde) | `rede` (entidades correlatas/colegiadas). **Nunca somar** setor/rede como se fosse a instituição (mesmo guardrail C163/C186).
**Fases de valor (verbatim):** `autorizado | empenhado | liquidado | pago | restos` (default `nao_informado`).
**Boletim modelo (literais de produto):** **1 página A4**; público-alvo **eleitores** (linguagem simples, sem jargão orçamentário); síntese **densa e direta** com **números destacados** quando houver; **≤6 destaques** + **≤14 itens** em "E mais" (todo item herdado carrega fonte no dossiê); timeline da trajetória; **sem declaração de fontes** (as fontes ficam exclusivamente no dossiê); rótulo **"Modelo — insumo interno"** + nota de defeso; **sem CTA/propaganda**; `NEEDS ASSET` para foto/selo/clipping. Herda **apenas** fatos já com fonte do dossiê (ledger), nunca introduz fato novo.
**Fontes de dados (verbatim):**
- Câmara dados abertos v2 (sem auth) `https://dadosabertos.camara.leg.br/api/v2`; deputy id **178857**; `/deputados/178857/discursos?dataInicio=&dataFim=` (**default 7 dias — sempre passar janela**); `/proposicoes?idDeputadoAutor=178857`; relatorias saem de `/proposicoes/{id}/tramitacoes`.
- Portal da Transparência CGU `https://api.portaldatransparencia.gov.br/api-de-dados`, header `chave-api-dados`, env `PORTAL_TRANSPARENCIA_API_KEY`; `/emendas` (**não filtra por município/instituição**; sem atribuição → **lacuna**, nunca zero silencioso); anos do mandato **2015–2026**. Complemento: Siga Brasil (Senado) e TCU – Painel de Execução de Emendas.
- Acervo interno Teqo **read-only** (homeserver): `Speech`/`SpeechSegment`/`SpeechCut`; facetas `src/lib/speechFacets.ts` (18 temas). **Mapa instituição→tema(s)** é fonte-chave do recorte institucional (ex.: Enfermagem→Saúde; UFBA→Educação/Ciência e Tecnologia); extração serializada com guard de confirmação (como C163/C186).
- IBGE/SIDRA/DATASUS só quando a instituição tiver recorte territorial (não obrigatório).
- Busca web datada: `"Jorge Solla" <instituição>` + `<tema>`; `site:` por fontes institucionais/oficiais (ufba.br, correios.com.br, cofen.gov.br, camara.leg.br, ptbahia.org.br, jorgesolla.com.br); excluir ruído de campanha 2026 (`-eleição -candidato -voto -coligação -pesquisa`); preferir verbos de entrega (emenda, recurso, convênio, parceria, projeto, relatoria, audiência, homenagem, repassado).
**Guarda de concorrência:** `MAX_RESEARCHERS_IN_FLIGHT` (referência C186) + extração read-only serializada 1 instituição por vez.
## Direção no codebase (hipótese)
- **Áreas prováveis:** skill `.agents/skills/dossie-solla-instituicao/`, command `.opencode/commands/`, subagente `.opencode/agent/`; catálogo de instituições novo (local a decidir); build entry reusando/generalizando `scripts/build-dossie-solla-cidade.mjs` + `scripts/lib/dossie*.mjs` (`reportText.mjs`, `dossieCareer`, `dossieCamara`, infra Chromium/`page.pdf`).
- **Precedente a olhar:** `.agents/skills/dossie-solla-cidade/SKILL.md` (lote, eras, recibo, guardrails), `.agents/skills/relatorio-cidade/SKILL.md`, `.opencode/agent/dossie-solla-cidade.md`, `scripts/lib/reportText.mjs`.
- **Risco de acoplamento:** **"edite o dono, não gema um irmão"** — estender o pipeline C186 para uma "unidade" plugável (município | instituição) em vez de fork paralelo; extração read-only à produção (guard + `default_transaction_read_only=on`); acervo cobre só 2011+ (pré-2011 = lacuna); PII mínima; defeso; registrar o command em `tests/unit/opencodeCommands.unit.spec.ts` e o mapa em `scripts/lib/test-affected-core.mjs`.
## Dependências
- **Hard:** nenhuma — pipeline C186, `reportText.mjs` e infra Chromium/PDF já existem; o `designer` produz o layout.
- **Soft:** **C188 (`relatorios-sem-truncamento`)** — o dossiê institucional deve nascer sem corte mecânico/sem descarte silencioso; o C188 conserta o dono que o C187 reusa (`docs/plans/relatorios-sem-truncamento.md`).
- **Soft:** `PORTAL_TRANSPARENCIA_API_KEY` (sem chave → emendas viram lacuna); acesso read-only ao acervo Teqo (guard de confirmação); catálogo de instituições (novo, seed mínimo).
## Fora de escopo
- Redigir/aprovar/veicular a **peça final** do boletim — a skill entrega o dossiê + o **boletim modelo** (1 página); a versão final, aprovada e veiculada, é da comunicação/campanha.
- Persistir dado novo na base, schema ou migration; segundo cadastro.
- Publicar/veicular a peça; qualquer peça de campanha/propaganda (defeso).
- Alterar `/dossie-solla-cidade` ou `/relatorio-cidade`; UI in-app de campanha; índice/PDF agregado de lote.
- Reconstruir a carreira pré-2011 fora do acervo (surge como lacuna, não invenção).
## Rabbit holes de produto
- **"Cobrir a instituição inteira vira escopo infinito."** Se alguém "só completar": instituição difusa (Correios no país todo) sem recorte. **Corte neste item:** eras fixas A/B/C + foco por fonte verificável + teto por seção.
- **"Categoria profissional vira a entidade."** Se alguém "só completar": somar ABEn/COFEN/Coren como se fossem a mesma coisa que "Enfermagem". **Corte neste item:** `kind`/abrangência explícitos (`instituicao`/`setor`/`rede`), nunca somados.
- **"IA plausível sem fonte."** **Corte neste item:** sem fonte não publica; lacuna explícita; número só com URL+data e fase.
- **"Vira recorte territorial."** **Corte neste item:** remover catálogo de municípios, IBGE por `ibgeCode` e esfera `municipio|regiao|polo` do caminho institucional.
- **"Empenho = entregue à instituição."** **Corte neste item:** fase por valor; empenho nunca tratado como pago.
- **"Fan-out infinito."** **Corte neste item:** 1 researcher por era por instituição + guarda de concorrência; extração serializada.
## Questões em aberto (produto)
- **Nome/slug?** **Opções:** A) `dossie-solla-instituicao` | B) `dossie-solla-orgao` | C) `dossie-solla-entidade`. **Recomendação:** A — casa com o escopo amplo (inclui categoria/rede). _(assumido — validar com a comunicação)_
- **Boletim no v1?** **Opções:** A) incluir | B) deixar de fora. **Recomendação:** A — _decidido pelo humano (2026-09-17): incluir o Boletim modelo no v1, com paridade com o C186._ Classe C, com hi-fi próprio.
- **Catálogo fail-closed ou livre?** **Opções:** A) fail-closed + escape one-off | B) livre. **Recomendação:** A — evita slug inventado/duplicado e mantém o catálogo como fonte de verdade. _(assumido)_
- **Taxonomia de "instituição"?** **Opções:** A) ampla, incl. categoria profissional | B) só entes formais. **Recomendação:** A — cobre "Enfermagem", caso de uso real declarado. _(assumido)_
- **Abrangência `instituicao|setor|rede`?** **Opções:** A) adotar os três | B) só `instituicao`. **Recomendação:** A — preserva o guardrail de não somar. _(assumido)_
- **Novo hi-fi ou reuso do layout C186?** **Opções:** A) novo, mesma família visual | B) reusar o HTML C186 direto. **Recomendação:** A — seções próprias de instituição exigem port novo; manter família. _(assumido)_
- **Destino do artefato?** **Opções:** A) gitignored (`docs/research/…` + `data/…`) | B) commitado. **Recomendação:** A — dado interno/defeso em repo público; só skill/scripts/testes/changelog entram no git. _(assumido)_
## Referências
- GitHub Issue #<N> (após `pnpm agent:register`)
- Débito/regra de texto: `docs/plans/relatorios-sem-truncamento.md` (C188) — sem "…" e sem descarte silencioso
- Skill-modelo (C186, #1132): `.agents/skills/dossie-solla-cidade/SKILL.md`; `docs/plans/dossie-solla-cidade.md` + `-impl.md`; `docs/changelog/2026-09-17-c186.md`
- `.opencode/commands/dossie-solla-cidade.md`, `.opencode/agent/dossie-solla-cidade.md`; padrão de lote OPS118: `docs/plans/ops118-relatorio-cidade-lote-municipios-sub-agentes.md`
- Builder: `scripts/build-dossie-solla-cidade.mjs`, `scripts/lib/dossie{Research,Blocks,Render,Bulletin,BulletinRender,Camara,Career,HealthData}.mjs`, `scripts/lib/reportText.mjs`
- Testes a espelhar: `tests/unit/dossie*.unit.spec.ts`, `tests/unit/dossieBatchSkill.unit.spec.ts`, `tests/unit/opencodeCommands.unit.spec.ts`; mapa `scripts/lib/test-affected-core.mjs`
- Design UI (gate) — dossiê: `docs/plans/dossie-solla-instituicao-ui-design.html` (+ `docs/plans/dossie-solla-instituicao-ui-design-assets/`)
- Design UI (gate) — boletim modelo: `docs/plans/dossie-solla-instituicao-boletim-ui-design.html` (+ assets); precedente `docs/plans/dossie-solla-cidade-boletim-ui-design.html`
- `src/lib/speechFacets.ts`; `src/collections/Organization.ts` (CRM operacional — **não** é acervo do dossiê)
- `AGENTS.md` — defeso, PII mínima, artefato gitignored e "edite o dono, não gema um irmão"

View file

@ -0,0 +1,118 @@
# Relatórios e dossiês sem truncamento mecânico — reformular para caber ou ampliar o campo
Status: rascunho
Atualizado em: 2026-09-17
Issue: #1136
Priority: P2
Impeccable: B — encaixe nas superfícies já desenhadas (relatório C163, dossiê/boletim C186); sem redesenho
Design UI: N/A — superfície inalterada; alvo é o hi-fi já aprovado do C186 (e o do C163)
Appetite: ~1–2 dias eng; um outcome verificável — gerar relatório/dossiê com texto longo e não ver nenhum "…", nenhum item sumido sem aviso, com o integral preservado no aprofundamento e a guarda de fit verde
Responsável: —
## Intenção
Ao gerar um relatório de cidade (C163) ou um dossiê/boletim (C186), informação se perde na última milha: ou o texto é **cortado mecanicamente no meio da frase com "…"** (C163, via `excerpt()`), ou **itens inteiros somem em silêncio** (C186, listas com `slice` e sem contador). Não é falta de espaço editorial — é o orçamento da superfície aplicado como corte cego. Regra do produto: **se uma informação não cabe, o texto deve ser reformulado para caber perdendo o mínimo de informação, ou o campo/orçamento deve ser ampliado** — nunca corte mecânico no meio, nunca item sumindo sem aviso. O pesquisador levanta o dado; o artefato não pode descartá-lo.
## Persona e fluxo
- **Persona / contexto:** o gabinete/assessoria prepara material pré-viagem; o researcher (humano ou skill) entrega respostas longas e ricas; o builder compõe a página 1/resumo (C163), o dossiê e o boletim (C186).
- **Job principal:** ao abrir o PDF, ler a informação completa e confiável — e, se algo não coube no resumo, **saber que existe e onde achá-lo**, nunca descobrir depois que um trecho foi cortado no meio.
- **Fluxo desejado:** researcher entrega o integral (`answer`/`details`) + um `summary` curto, completo e auto-contido quando a superfície de resumo exigir → o builder usa `summary`; sem ele, prefere `answer` e **amplia o campo/orçamento enquanto a guarda de fit permitir** → se ainda não couber, a linha aponta o aprofundamento **sem reticências** → toda lista truncada exibe contador ("e mais N"/"Mostrando X de Y") → o integral segue no aprofundamento → a guarda de fit mede `scrollHeight` e **aborta** se estourar.
- **Anti-goals de produto:** corte mecânico com "…" em superfície de resumo; item sumindo em silêncio; espremer o layout para caber (a guarda continua fail-closed); redesenhar as superfícies; o builder reescrever conteúdo editorial (quem redige o `summary` é o researcher); varrer todo `slice` do repo além da família C163/C186.
### Esboço de fluxo (B)
```text
pesquisa (answer/details integral)
├── summary? ──sim──> superfície de resumo (pg1/cartões)
└── não ─> prefere answer ─┤
▼
cabe no orçamento? ──sim──> renderiza
└── não ─> amplia orçamento (guarda permite?) ──> renderiza
└── não ─> linha aponta o aprofundamento SEM "…"
integral sempre preservado no aprofundamento (seção Fontes / páginas extras)
listas: slice → SEMPRE com contador "e mais N" / "Mostrando X de Y"
guarda de fit: scrollHeight > orçamento (+tolerância) → ABORTA (fail-closed)
```
### Design UI (B)
- Design UI: **N/A** — as superfícies têm design aprovado (relatório C163; dossiê e boletim C186). Este item não redesenha: ajusta **conteúdo/orçamento** dentro do hi-fi existente, sem componente/estado/layout novo. Se a execução exigir mudança material de layout, o `designer` entra e a mudança volta ao humano no PR.
## Objetivo e aceite
- Gerar relatório/dossiê/boletim com textos longos e **não ver nenhum "…"** em superfície de resumo.
- **Nenhuma lista truncada sem contador** de itens restantes.
- Texto **integral sempre disponível** no aprofundamento.
- **Guarda de fit verde** (fail-closed preservado; nunca espremer).
- Contrato `summary` documentado nos dois arquivos de pesquisa e instruído nas skills `relatorio-cidade` e `dossie-solla-cidade`.
- Guardrails de produto: sem fonte não publica; empenho ≠ pagamento; esfera/abrangência nunca somadas; PII mínima; artefato gitignored; defeso.
## Dados (intenção)
- **Vou apresentar dados?** Sim, superfície neste item — o item decide como o dado já pesquisado é **renderizado** (orçamento de texto e contadores), nas superfícies impressas C163/C186.
- **Decisões desbloqueadas:** o leitor decide **com base no texto completo** (não num fragmento cortado); o gabinete sabe **o que ficou de fora** do resumo (contador) e **onde** está o integral; o researcher sabe **para qual orçamento** redigir o `summary`.
- **Forma:** _adiada ao plano de implementação_ — aqui só restrições de produto: proibido "…" na superfície de resumo; contador em toda lista truncada; integral no aprofundamento; guarda de fit fail-closed; sem redesenho.
## Dados da decisão (literais)
**Corte mecânico com "…" — dono único no C163.** `excerpt()` em `scripts/lib/cityReportBlocks.mjs:91-94` (`slice(0,max).trimEnd()+'…'`). Caps: `PAGE_ONE_ANSWER_MAX=90`, `PAGE_ONE_WHO_MAX=26`, `PAGE_ONE_RISK_MAX=70`, `PAGE_ONE_NAMES_MAX=20`, `PAGE_ONE_INDICATOR_DETAIL_MAX=70` (`:64-79`); `SIGNAL_EXCERPT_MAX=180`, `SPEECH_SUMMARY_MAX=220`, `SPEECH_MENTION_MAX=220` (`:53-55`). Call-sites impressos na página 1: `:154-161`→`:232,236,255,288,292,310,350,382`; `joinLimited` `:100-105`→`:198,248,322`; `excerpt(indicator.purpose, 70)` `:368`. Integral preservado em `buildResearchAnswersTable` `:1362-1383`.
**Descarte silencioso no C186.** `limit = list.slice(0,max)` `scripts/lib/dossieBlocks.mjs:96` (sem flag de resto) em `:181-186` (`MAX_ERA_NUMBERS=12`), `:190` (`MAX_ERA_ACTIONS=4`), `:202-224` (`MAX_DELIVERIES_PAGE_ONE=3`), `:226-233` (`MAX_HOOKS_PAGE_ONE=2`), `:241-244` (`MAX_PENDING_PAGE_ONE=4`), `:247-255` (`MAX_REGION_ITEMS=4`); único com contador: `:333/:338` (`MAX_SCOPE_LIST=5`, guarda `.total`). Boletim: `scripts/lib/dossieBulletin.mjs:44` (6) + `:51` (14) = teto 20, sem contador (`dossieBulletinRender.mjs:171-175`).
**Corte silencioso de caractere sem "…":** `scripts/lib/dossieCamara.mjs:46` `(sumario ?? transcricao).slice(0,280)`, `ITEMS_PER_LIST=20` `:16,128`; `cityReportBlocks.mjs:870` `row.body.slice(0,180)`; `:1113` `row.summary.slice(0,220)`; `:1097` `mentionExcerpt.slice(0,220)`.
**Guarda de fit (não corta — aborta):** C163 `build-city-report.mjs:155-165` (`PAGE_ONE_BUDGET_PX`, −8px; aprofundamento não é medido); C186 dossiê `build-dossie-solla-cidade.mjs:196-227` e boletim `:241-249` (+10px). `.sheet { height:297mm; overflow:hidden }` (`dossieRender.mjs:477-488`, `dossieBulletinRender.mjs:31-43`).
**Contrato do resumo (nova regra, literal):** cada item de pesquisa passa a aceitar **`summary`** — curto, **completo e auto-contido**, redigido para caber no orçamento da superfície de resumo. Superfícies de resumo usam `summary`; aprofundamento continua com o integral (`answer`/`details`). Sem `summary`, prefere `answer` e **amplia o orçamento** enquanto a guarda permitir — **"…" proibido**; no limite, a linha aponta o aprofundamento sem reticências. **Nenhum item some em silêncio** (contador sempre). Guarda de fit **fail-closed**.
**Contratos hoje:** `cityReportResearch.mjs:129-138,186` e `dossieResearch.mjs:211-224,263` aceitam `answer`/`details`; `news[].summary` é validado e **nunca renderizado**; não há `summary` em `items[]`.
**Testes a atualizar:** `tests/unit/cityReportBlocks.unit.spec.ts:702,752,780`; `tests/unit/cityReportRender.unit.spec.ts:127,166`; `tests/unit/dossieBlocks.unit.spec.ts:155`; `tests/unit/dossieBulletin.unit.spec.ts:27,60`.
## Direção no codebase (hipótese)
- **Dono único** de orçamento/composição de texto substitui o `excerpt()` do C163, reusado por C163 + C186 (não gemar caminho paralelo).
- Contrato `summary` nos dois arquivos de pesquisa (`cityReportResearch.mjs`, `dossieResearch.mjs`).
- Renderers C163/C186 preferem `summary`; integral permanece no aprofundamento.
- Contadores "e mais N"/"Mostrando X de Y" em todas as listas hoje silenciosas (dossiê/boletim; `dossieCamara.mjs`).
- Testes unit dos caps revisados e do novo contrato; skills `relatorio-cidade` e `dossie-solla-cidade` instruem o researcher a redigir `summary`.
## Dependências
- **Soft com C187** (dossiê por instituição) — o novo item deve nascer sem truncamento; este item conserta o dono que o C187 reusa. Sem bloqueio.
- **Nenhuma dura.**
## Fora de escopo
- Redesenhar as superfícies (o design aprovado do C186/C163 permanece).
- Persistir dado novo, schema ou migration; alterar contratos públicos/URL.
- Mudar o conteúdo editorial além do que cabe — o `summary` é redigido pelo researcher.
- `build-solla-ceuci-salvador-report.mjs` (C157): só se for trivial e no mesmo dono; senão, item sucessor.
## Rabbit holes de produto
- **"Fazer caber" reescrevendo no builder.** Se alguém "só completar": o builder vira redator. **Corte neste item:** o builder não redige; sem `summary`, aponta o aprofundamento.
- **Um `summary` global em vez de por item.** **Corte neste item:** `summary` por item, auto-contido por superfície.
- **Ampliação de orçamento vira licença para a página crescer.** **Corte neste item:** a guarda de fit fail-closed é o teto.
- **Varrer todo `slice` silencioso do repo.** **Corte neste item:** só a família C163/C186 (C157 como sucessor, se não for trivial).
- **Confundir "e mais N" (lista) com "…" (frase).** **Corte neste item:** são dois defeitos distintos, com remediações distintas — tratar ambos, sem trocar um pelo outro.
## Questões em aberto (produto)
- **Campo `summary` vs só ampliar orçamento?** **Opções:** A) `summary` por item + ampliação como fallback | B) só ampliar orçamento. **Recomendação:** A — resolve na origem e dá ao researcher controle editorial. _(assumido — validar)_
- **"…" sempre proibido ou só no aprofundamento?** **Opções:** A) proibir nas superfícies de resumo, manter no aprofundamento | B) proibir em tudo. **Recomendação:** A — o aprofundamento já carrega o integral. _(assumido)_
- **Cobrir C157 agora ou sucessor?** **Opções:** A) incluir | B) sucessor. **Recomendação:** B — C157 não compartilha o dono reusado por C163/C186. _(assumido)_
- **Prioridade P1 vs P2?** **Opções:** A) P1 (perda de informação visível) | B) P2. **Recomendação:** B — reavaliar para P1 se o C187 entrar em produção imediatamente. _(assumido)_
## Referências
- GitHub Issue #<N> (após `pnpm agent:register`)
- `scripts/lib/cityReportBlocks.mjs:53-55,64-79,91-94,100-105,154-161,163-177,359-378,870,1097,1113,1362-1383`
- `scripts/lib/cityReportRender.mjs:243-244,470,531,631,872,901,1185`; `scripts/lib/cityReportResearch.mjs:129-138,186`
- `scripts/lib/dossieBlocks.mjs:96,181-186,190,202-233,241-255,333,338`; `scripts/lib/dossieBulletin.mjs:44,47-48,51`; `scripts/lib/dossieBulletinRender.mjs:171-175`
- `scripts/lib/dossieCamara.mjs:16,46,128`; `scripts/lib/dossieRender.mjs:477-488`; `scripts/lib/dossieResearch.mjs:211-224,263`
- `scripts/build-city-report.mjs:155-165`; `scripts/build-dossie-solla-cidade.mjs:196-227,241-249`
- Testes: `tests/unit/cityReportBlocks.unit.spec.ts:702,752,780`; `tests/unit/cityReportRender.unit.spec.ts:127,166`; `tests/unit/dossieBlocks.unit.spec.ts:155`; `tests/unit/dossieBulletin.unit.spec.ts:27,60`
- Skills: `.agents/skills/relatorio-cidade/SKILL.md`, `.agents/skills/dossie-solla-cidade/SKILL.md`; `AGENTS.md` (edite o dono, não gema um irmão)