AvisoMétodoAPI← o jornalv0.23.6

The mail

The mail · 5 messages between the agents

The agents of this newsroom do not talk over a chat. They talk in files, under Email-FS-lite — the protocol the sgraph.ai team publishes and runs. No broker, no daemon, no API: every message is an RFC 2822 .eml file, and the commit history is the audit trail. Messages are immutable — never edited, never deleted, only moved. The protocol was written to run inside an sgit vault, where sgit pull is the inbox notification; here it runs inside a git repository, which changes the command and nothing else. That difference is written down in redacao/correio/LEIA-ME.md rather than glossed over.

And immutability here is a discipline, not a mechanism: nothing in a git repository stops a write. So the protocol note carries the one exception and the record of every use of it — the editor of record may authorise a sweep, a mechanical change applied identically to every message that does not alter what any of them asserts, such as a path that has been renamed. Rewriting a sentence, a number or a conclusion is not a sweep and is not allowed; that is what a reply is for. Every sweep ever made is listed in that note with the release it landed in and what authorised it — the number is not repeated here, because a page that printed «the current version» would claim the last sweep happened in whatever release you are reading. A rule the commit history quietly contradicts is worse than no rule.

Where a message sits is what state it is in

saida/the sender's copy expedicao/in transit entrada/delivered, open tratado/handled

There is no status field anywhere in the protocol. A field can disagree with the folder; a folder cannot disagree with itself. Delivery is the file having moved, and the read receipt is the mailroom copy no longer being there.

What each folder means, in the protocol's own words
Folder StateMeaning
expedicaoem trânsitoSent, not yet delivered — the recipient has not collected it
entradaentregueDelivered and open — work in progress while it sits here
tratadotratadoHandled — the work it asked for is complete
saidacópia de quem enviouThe sender's own record of what it sent

Every mailbox, counted

AgentAliasIn transit InboxHandledSent copies State
pesquisa.pt@Pesquisa01001 open
redacao.pt@Redacao0000clear
verificacao.pt@Verificacao0000clear
bastidores.pt@Bastidores10021 in transit
dinis.humano@Dinis21011 unread

The threads

Threaded by Message-ID and In-Reply-To. Replying does not close anything: a message stays open work while it sits in an inbox, and only moves to tratado/ when the work it asked for is done.

delivered · open @Arranque → @Dinis 2026-09-14T12:00:00Z run 2026-09-14T12:00:00Z historical sender

MVP v0.1.0 construído; o que é real, o que não é, e o que precisa da sua decisão

O site está construído e os portões estão verdes. O que é real: 92 ficheiros congelados com SHA-256, um grafo de verbos portugueses onde cada nó nomeia a sua fonte, o aviso de proteção de dados publicado ANTES da primeira página que nomeia alguém, e o fluxo de revisão de entregas.

O que NÃO é real e está dito em cada página onde importa: nenhuma história publicada, três das oito secções vazias, e a camada das empresas impossível de completar sem registo comercial aberto.

Precisa de decidir três coisas. Primeira: a entrega do ChatGPT (parte 1/8, políticas) está em /entregas/ com cada afirmação conferida contra os bytes — 9 confirmadas, 0 não encontradas, 10 sem fonte legível. Nada dela aparece em lado nenhum público até aprovar item a item. Segunda: a entrega propõe tipos que a ontologia não tem (Programa, InstrumentoJuridico, Infraestrutura); aceitá-los é uma alteração de ontologia e leva uma versão. Terceira: a página da ANACOM devolve 403 a esta redação, e isso não é uma recusa de informação — é um servidor a bloquear um cliente. Pode pedir acesso.

Uma nota que é um achado e não um detalhe: o Diário da República renderiza por script e devolve 22 caracteres a um leitor automático, mas publica os diplomas em PDF, e esses PDFs são legíveis depois de decifrados. build/pdf.py faz isso. Foi assim que as duas afirmações sobre a RCM n.º 70/2026 confirmaram. O mesmo caminho resolve provavelmente a história 001.

redacao/correio/dinis.humano/entrada/001__sessao-de-arranque__o-que-foi-construido.eml · 2012 bytes · in @Dinis's entrada · migrated from redacao/correio/editor/entrada/2026-09-14T1200__sessao-de-arranque__o-que-foi-construido.md

in transit @Bastidores → @Dinis 2026-09-14T23:55:00Z sender copy kept

A equipa passa a ser visível nos bastidores; a ponte para o navegador está construída e sem credencial

Está feito o que pediu: os agentes são agora um registo em `dados/agentes.json`, o correio entre eles corre pelo protocolo Email-FS-lite em `redacao/correio/`, e há três páginas nos bastidores — a equipa, o quadro por agente e o correio. Nenhum número nessas páginas é uma afirmação sobre Portugal: são contagens de ficheiros deste repositório, e o portão dos bastidores falha a construção se alguma vez uma delas citar uma fonte congelada como prova.

Três coisas que precisam de uma decisão sua, e nenhuma é urgente.

PRIMEIRA, E A ÚNICA QUE BLOQUEIA. A ponte que o deixa escrever-me a partir do site está construída e não tem por onde enviar. Uma fila de acrescento precisa do `vault_id` do cofre que recebe, de um `append_token` em hexadecimal, e da chave pública para eu cifrar no navegador antes de enviar. As duas primeiras são credenciais e não podem ficar neste repositório — o `validate.js` tem um detetor de cadeias com forma de chave e falharia a construção, o que é o portão a funcionar. Vão para `localStorage` do seu navegador, dadas por si em `/backoffice/bridges.html`. A chave pública pode ser publicada, e essa fica em ficheiro.

SEGUNDA. As chaves de leitura que me deu para os cofres dos jogos não puderam ser usadas: instalar o `sgit` foi recusado pelo classificador da caixa onde esta sessão corre. Não escrevi nenhuma delas em ficheiro. Li o desenho na fonte publicada em vez disso, e isso trouxe um achado que melhora o nosso caso: o cofre dos jogos construía eventos e não os enviava, porque uma aplicação de cofre corre numa moldura cujo CSP é `connect-src blob: data:`. Este site é estático, não é uma aplicação de cofre, e por isso o envio direto funciona. O que a telemetria dos jogos não conseguiu fazer, este site consegue.

TERCEIRA, QUE É UMA CORREÇÃO A UM FICHEIRO QUE EU NÃO POSSO EDITAR. O `CLAUDE.md` manda correr `node build/validate.js`. O ficheiro está em `admin/build/validate.js`, e é esse que a integração contínua corre. Quem seguir a linha à letra conclui que o portão não existe. `CLAUDE.md` está na lista de recusa de propósito e não lhe toquei: a linha é sua.

Continuam abertos os três assuntos que a sessão de arranque lhe deixou — a entrega do ChatGPT item a item, os três tipos novos da ontologia, e o pedido de acesso à ANACOM, que tem a pesquisa bloqueada à espera. Estão agora no seu quadro, em `/backoffice/board.html`.

redacao/correio/expedicao/dinis.humano/003__bastidores.pt__a-equipa-esta-visivel-e-a-ponte-nao-tem-chave.eml · 2847 bytes · in @Dinis's mailroom · sender copy at redacao/correio/bastidores.pt/saida/dinis.humano/003__bastidores.pt__a-equipa-esta-visivel-e-a-ponte-nao-tem-chave.eml

in transit @Bastidores → @Dinis 2026-09-15T02:10:00Z sender copy kept

A revisão de desenho está implementada até onde um agente a pode implementar; cinco decisões são suas

Clonei o cofre `e54hfntq`, li a revisão inteira, e implementei-a. Dezoito itens feitos, três parciais, seis adiados com o bloqueio nomeado, e três que são decisões suas e que não tomei. Cada um está em /backoffice/design.html, com o portão que o segura quando há um.

O QUE MUDOU, EM MEDIDAS E NÃO EM ADJETIVOS

A coluna do texto passou de 88 caracteres por linha — medidos por mim, 104, e volto a isso — para 71. A entrelinha passou de 26.1px para 29.16px. Os filetes passaram de 1.36:1 contra o papel, onde não se veem, para 2.65:1. A cor de «disputado» passou de 4.48:1, que FALHA o AA, para 5.81:1. O antetítulo, o rótulo de secção, o cabeçalho de tabela e o bloco «para um agente» saíram da face monoespaçada, e é essa a mudança que faz a página deixar de se ler como um registo de construção. Há um anel de foco, que não existia em 13,8 kB de folha de estilos. E o distintivo de versão passou a ser uma ligação para o que mudou nessa versão, que era a única coisa deste site que não se rastreava a si mesma.

DUAS COISAS ONDE A REVISÃO ESTAVA ERRADA, E A SEGUNDA MUDAVA A RESPOSTA

A revisão assume que um glifo médio da Newsreader mede 0.48em. Medi no navegador, numa tela, com a fonte computada do próprio elemento e com texto português: são 0.405em. A face é 18% mais estreita do que a suposição, e isso corre nos dois sentidos. O problema era PIOR do que ela relatou — a coluna de 758px tinha 104 caracteres e não 88. E a correção que ela pede não chegava ao alvo que ela própria fixa: os 34em que recomenda são 612px, e a 612px o navegador mede 84 caracteres, ainda acima dos 75. Pus 29em, que mede 71. Se tivesse implementado a revisão à letra, teria lançado uma coluna que falhava o alvo da própria revisão e ninguém teria sabido.

A segunda é interna e menor: a §2.1 diz que 34em dão 66 caracteres e 38em dão 68, e os dois não podem estar certos, porque com a largura em `em` o corpo cancela-se.

Digo isto sem gosto nenhum de apontar o dedo: aquela revisão mediu em vez de opinar, e é só por isso que foi possível verificá-la. Uma revisão que dissesse «a coluna é larga demais» não teria podido estar errada em nada.

O QUE O PORTÃO NOVO ENCONTROU QUE A REVISÃO NÃO TINHA VISTO

`build/gates_desenho.py` assere os números da §4.4, e à primeira passagem encontrou a coluna vazia em /instituicoes/ e em /casos-de-uso/ e não só em /empresas/ — a revisão só tinha visitado a terceira. E a auditoria aos acentos que a §3.4 mandou fazer («isto sugere que as cadeias estão a ser escritas em algum sítio só ASCII, e vale uma verificação») encontrou o mesmo defeito nos títulos dos cartões do quadro, que fui EU que introduzi há poucas horas, a derivar o título do nome do ficheiro. A revisão apanhou-me a mim.

AS CINCO DECISÕES, E NÃO TOMEI NENHUMA

A §4.5 diz «agentes: não escolham isto por vocês». Estão as cinco no seu quadro, em /backoffice/board.html, cada uma com as opções e com o que fica bloqueado por ela:

1. O grafo como linguagem visual do site. É a única coisa que dá identidade visual a este site sem importar uma imagem que não se consegue verificar — e é uma construção grande que muda o que a primeira página é. 2. Onde ficam as fichas de proveniência. As três opções guardam a informação toda; o que muda é a ordem, e a ordem é com o que o jornal abre. 3. Modo escuro. Duplica a paleta, e um creme invertido não é um jornal. 4. A carteira no cabeçalho do leitor. ESTA é a que desbloqueia mais: dela dependem a divisão da tira do cabeçalho e os 131px de cromagem antes da mancheta no telemóvel, onde o alvo é 48. 5. Quão magra a edição pode parecer. A grelha repete o título de abertura, e o leitor lê-o duas vezes antes de rolar uma. O filtro está pronto e não o liguei: deduplicar deixa três histórias em vez de seis, e «visivelmente mais vazia» é um juízo sobre o jornal.

O QUE NÃO FIZ, ALÉM DAS DECISÕES

O item que a revisão chama o blocker, e com razão: o sistema de desenho vive em atributos `style=` em linha nos geradores e não na folha de estilos, e ninguém pode mudar o ritmo deste site a partir do site.css enquanto isso for verdade. Tirei os 54 que estavam a cancelar a correção da medida, e o portão 30 impede que voltem. O resto — classes com nome para a coluna principal, para a coluna da direita, para os blocos — é uma versão própria, porque não tem resultado visível nenhum e mexe em cinco geradores. Não a enfiei numa esquina desta.

Continua aberto o que lhe deixei antes: a entrega do ChatGPT item a item, os três tipos novos da ontologia, o pedido de acesso à ANACOM que tem a pesquisa bloqueada, e o aviso ter de falar de telemetria antes de a ponte da observabilidade receber credenciais.

redacao/correio/expedicao/dinis.humano/004__bastidores.pt__a-revisao-de-desenho-esta-implementada.eml · 5234 bytes · in @Dinis's mailroom · sender copy at redacao/correio/bastidores.pt/saida/dinis.humano/004__bastidores.pt__a-revisao-de-desenho-esta-implementada.eml

delivered · open @Dinis → @Pesquisa 2026-09-14T12:05:00Z issue 001,002,003 run 2026-09-14T12:00:00Z

As três primeiras histórias estão abertas como issues em «procurado»

As três histórias que o resumo de comissionamento encomenda estão abertas. Nenhuma pode avançar sem uma fonte congelada que a sustente, e as três dizem no próprio ficheiro o que já se tem e o que falta.

Para a 001 e a 002 o caminho é o mesmo e está agora aberto: o PDF do Diário da República. Encontre o endereço, não o construa por adivinhação — um endereço inventado que devolve outro diploma é pior do que um que devolve 404.

Para a 003, o portal de transparência do plano de recuperação não resolveu em nenhuma tentativa, e a lista de unidades de I&D devolveu 404. Ambas as ausências são publicáveis tal como estão.

redacao/correio/pesquisa.pt/entrada/002__dinis.humano__tres-primeiras-historias.eml · 1141 bytes · in @Pesquisa's entrada · migrated from redacao/correio/pesquisa/entrada/2026-09-14T1205__editor__tres-primeiras-historias.md

in transit @Dinis → @Bastidores 2026-09-15T09:40:00Z issue 010 sender copy kept

Os resumos de investigação precisam de uma página que os renderize, e não de uma segunda cópia

O QUE PEÇO

Uma página HTML que renderize `briefs/pack/08__research-briefs/12__research-brief-for-chatgpt.md` — e o irmão da Perplexity, `13__research-brief-for-perplexity.md` — com o cromo deste site: cabeçalho, navegação, distintivo de versão, bloco «para um agente», rodapé. Hoje o endereço

https://pt.newsroom.sgit.ai/briefs/pack/08__research-briefs/12__research-brief-for-chatgpt.md

devolve markdown em bruto ao navegador. É o documento certo no sítio certo e a ler-se mal. Este é o documento que entregamos a um assistente exterior; é a peça mais pública do método desta redação e a única que não se parece com o resto do site.

A REGRA QUE NÃO PODE SER QUEBRADA PARA FAZER ISTO

`build/build.py`, na linha 732, diz porque é que os resumos são ligados e não republicados: **o conteúdo existe uma vez**. Se o texto passar a viver também dentro de um `.html`, os dois acabam por discordar no dia em que alguém editar um. Não quero uma segunda cópia — quero uma segunda VISTA da mesma cópia.

O caminho que já existe neste repositório é o de `build/mandatos.py`: um ficheiro DERIVADO, gerado a partir da fonte única, marcado como derivado, e refeito em cada construção. Faça o mesmo: o `.md` continua a ser a fonte; o `.html` é render dele e nunca é editado à mão. Se o HTML e o markdown puderem divergir, o desenho está errado.

Deixo-lhe as decisões de implementação, mas registo o que me parece:

- Um portão que falhe a construção se um `.html` de resumo estiver dessincronizado do `.md` de que deriva. Um ficheiro derivado sem portão é uma cópia com outro nome — foi o que o portão 28 aprendeu com os mandatos. - O `.md` continua a responder no mesmo endereço. Há ferramentas, e assistentes, que o querem em bruto; o brief manda-os lá. Não parta o endereço para acrescentar uma vista. - O endereço da vista renderizada é seu para escolher, desde que entre no sitemap e no llms.txt.

PORQUE É QUE ISTO VALE A PENA AGORA, E NÃO DAQUI A UMA VERSÃO

O ciclo de investigação vai passar a correr com regularidade — o editor quer o ChatGPT a fazer uma passagem por dia ou de doze em doze horas, e o fluxo de publicação desta redação a correr atrás dela. O resumo deixa de ser um documento que se cola uma vez e passa a ser a interface entre esta redação e as ferramentas que a alimentam. Uma interface lê-se muitas vezes.

A v0.10.1 corrigiu o endereço do esquema que o resumo mandava buscar — apontava para `newsroom.sgit.ai/briefs/pt-newsroom-pack/`, que não existe, quando este site é `pt.newsroom.sgit.ai` a servir `briefs/pack/`. A entrega 1/8 do ChatGPT falhou a validação em doze pontos por não conseguir ler o contrato. O documento está agora certo e é a altura de o pôr legível.

— Dinis

redacao/correio/expedicao/bastidores.pt/005__dinis.humano__os-resumos-de-investigacao-precisam-de-uma-pagina.eml · 3169 bytes · in @Bastidores's mailroom · sender copy at redacao/correio/dinis.humano/saida/bastidores.pt/005__dinis.humano__os-resumos-de-investigacao-precisam-de-uma-pagina.eml

For an agent. Generated by build/newsroom.py from the files in this repository; nothing here is hand-written. The machine-readable index of the publication is at llms.txt. Source: github.com/SGit-AI/SGit-AI__Website__Newsroom__PT · file: newsroom/mail.html · version v0.23.6.