{
  "id": "pt-correio",
  "versao": "0.1.0",
  "atualizado": "2026-09-18",
  "protocolo": "email-fs-lite",
  "protocolo_versao": "0.6",
  "nota": "Cada mensagem entre os agentes desta redação, lida de redacao/correio/ por build/newsroom_team.py. O estado de uma mensagem é a pasta onde está e não um campo: um campo pode discordar da pasta, uma pasta não pode discordar de si mesma. Este é o ficheiro que as páginas leem — a pasta tem um leitor só.",
  "lugares": [
    {
      "pasta": "expedicao",
      "estado": "em trânsito",
      "significa": "Sent, not yet delivered — the recipient has not collected it"
    },
    {
      "pasta": "entrada",
      "estado": "entregue",
      "significa": "Delivered and open — work in progress while it sits here"
    },
    {
      "pasta": "tratado",
      "estado": "tratado",
      "significa": "Handled — the work it asked for is complete"
    },
    {
      "pasta": "saida",
      "estado": "cópia de quem enviou",
      "significa": "The sender's own record of what it sent"
    }
  ],
  "contagem": 8,
  "mensagens": [
    {
      "ficheiro": "redacao/correio/dinis.humano/entrada/001__sessao-de-arranque__o-que-foi-construido.eml",
      "lugar": "entrada",
      "caixa": "dinis.humano",
      "de": "sessao-de-arranque",
      "para": "dinis.humano",
      "de_alias": "@Arranque",
      "para_alias": "@Dinis",
      "assunto": "MVP v0.1.0 construído; o que é real, o que não é, e o que precisa da sua decisão",
      "quando": "2026-09-14T12:00:00Z",
      "id": "001-mvp-construido@redacao.local",
      "responde_a": null,
      "issue": null,
      "run": "2026-09-14T12:00:00Z",
      "historica": true,
      "migrado_de": "redacao/correio/editor/entrada/2026-09-14T1200__sessao-de-arranque__o-que-foi-construido.md",
      "corpo": "O site está construído e os portões estão verdes. O que é real: 92 ficheiros congelados com\nSHA-256, um grafo de verbos portugueses onde cada nó nomeia a sua fonte, o aviso de proteção de\ndados publicado ANTES da primeira página que nomeia alguém, e o fluxo de revisão de entregas.\n\nO que NÃO é real e está dito em cada página onde importa: nenhuma história publicada, três das\noito secções vazias, e a camada das empresas impossível de completar sem registo comercial aberto.\n\nPrecisa de decidir três coisas. Primeira: a entrega do ChatGPT (parte 1/8, políticas) está em\n/entregas/ com cada afirmação conferida contra os bytes — 9 confirmadas, 0 não encontradas, 10 sem\nfonte legível. Nada dela aparece em lado nenhum público até aprovar item a item. Segunda: a entrega\npropõe tipos que a ontologia não tem (Programa, InstrumentoJuridico, Infraestrutura); aceitá-los é\numa alteração de ontologia e leva uma versão. Terceira: a página da ANACOM devolve 403 a esta\nredação, e isso não é uma recusa de informação — é um servidor a bloquear um cliente. Pode pedir\nacesso.\n\nUma nota que é um achado e não um detalhe: o Diário da República renderiza por script e devolve 22\ncaracteres a um leitor automático, mas publica os diplomas em PDF, e esses PDFs são legíveis depois\nde decifrados. build/pdf.py faz isso. Foi assim que as duas afirmações sobre a RCM n.º 70/2026\nconfirmaram. O mesmo caminho resolve provavelmente a história 001.",
      "resumo": "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 empresa",
      "bytes": 2012,
      "desconhecido": [
        "sessao-de-arranque"
      ]
    },
    {
      "ficheiro": "redacao/correio/pesquisa.pt/entrada/002__dinis.humano__tres-primeiras-historias.eml",
      "lugar": "entrada",
      "caixa": "pesquisa.pt",
      "de": "dinis.humano",
      "para": "pesquisa.pt",
      "de_alias": "@Dinis",
      "para_alias": "@Pesquisa",
      "assunto": "As três primeiras histórias estão abertas como issues em «procurado»",
      "quando": "2026-09-14T12:05:00Z",
      "id": "002-tres-primeiras-historias@redacao.local",
      "responde_a": null,
      "issue": "001,002,003",
      "run": "2026-09-14T12:00:00Z",
      "historica": false,
      "migrado_de": "redacao/correio/pesquisa/entrada/2026-09-14T1205__editor__tres-primeiras-historias.md",
      "corpo": "As três histórias que o resumo de comissionamento encomenda estão abertas. Nenhuma pode avançar\nsem uma fonte congelada que a sustente, e as três dizem no próprio ficheiro o que já se tem e o\nque falta.\n\nPara a 001 e a 002 o caminho é o mesmo e está agora aberto: o PDF do Diário da República. Encontre\no endereço, não o construa por adivinhação — um endereço inventado que devolve outro diploma é pior\ndo que um que devolve 404.\n\nPara a 003, o portal de transparência do plano de recuperação não resolveu em nenhuma tentativa, e\na lista de unidades de I&D devolveu 404. Ambas as ausências são publicáveis tal como estão.",
      "resumo": "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 devo",
      "bytes": 1141,
      "desconhecido": []
    },
    {
      "ficheiro": "redacao/correio/bastidores.pt/saida/dinis.humano/003__bastidores.pt__a-equipa-esta-visivel-e-a-ponte-nao-tem-chave.eml",
      "lugar": "saida",
      "caixa": "bastidores.pt",
      "de": "bastidores.pt",
      "para": "dinis.humano",
      "de_alias": "@Bastidores",
      "para_alias": "@Dinis",
      "assunto": "A equipa passa a ser visível nos bastidores; a ponte para o navegador está construída e sem credencial",
      "quando": "2026-09-14T23:55:00Z",
      "id": "003-equipa-visivel@redacao.local",
      "responde_a": "001-mvp-construido@redacao.local",
      "issue": null,
      "run": null,
      "historica": false,
      "migrado_de": null,
      "corpo": "Está feito o que pediu: os agentes são agora um registo em `dados/agentes.json`, o correio entre\neles corre pelo protocolo Email-FS-lite em `redacao/correio/`, e há três páginas nos bastidores —\na equipa, o quadro por agente e o correio. Nenhum número nessas páginas é uma afirmação sobre\nPortugal: são contagens de ficheiros deste repositório, e o portão dos bastidores falha a\nconstrução se alguma vez uma delas citar uma fonte congelada como prova.\n\nTrês coisas que precisam de uma decisão sua, e nenhuma é urgente.\n\nPRIMEIRA, E A ÚNICA QUE BLOQUEIA. A ponte que o deixa escrever-me a partir do site está\nconstruída e não tem por onde enviar. Uma fila de acrescento precisa do `vault_id` do cofre que\nrecebe, de um `append_token` em hexadecimal, e da chave pública para eu cifrar no navegador antes\nde enviar. As duas primeiras são credenciais e não podem ficar neste repositório — o `validate.js`\ntem um detetor de cadeias com forma de chave e falharia a construção, o que é o portão a funcionar.\nVão para `localStorage` do seu navegador, dadas por si em `/backoffice/bridges.html`. A chave\npública pode ser publicada, e essa fica em ficheiro.\n\nSEGUNDA. As chaves de leitura que me deu para os cofres dos jogos não puderam ser usadas: instalar\no `sgit` foi recusado pelo classificador da caixa onde esta sessão corre. Não escrevi nenhuma\ndelas em ficheiro. Li o desenho na fonte publicada em vez disso, e isso trouxe um achado que\nmelhora o nosso caso: o cofre dos jogos construía eventos e não os enviava, porque uma aplicação\nde cofre corre numa moldura cujo CSP é `connect-src blob: data:`. Este site é estático, não é uma\naplicação de cofre, e por isso o envio direto funciona. O que a telemetria dos jogos não conseguiu\nfazer, este site consegue.\n\nTERCEIRA, QUE É UMA CORREÇÃO A UM FICHEIRO QUE EU NÃO POSSO EDITAR. O `CLAUDE.md` manda correr\n`node build/validate.js`. O ficheiro está em `admin/build/validate.js`, e é esse que a integração\ncontínua corre. Quem seguir a linha à letra conclui que o portão não existe. `CLAUDE.md` está na\nlista de recusa de propósito e não lhe toquei: a linha é sua.\n\nContinuam abertos os três assuntos que a sessão de arranque lhe deixou — a entrega do ChatGPT item\na item, os três tipos novos da ontologia, e o pedido de acesso à ANACOM, que tem a pesquisa\nbloqueada à espera. Estão agora no seu quadro, em `/backoffice/board.html`.",
      "resumo": "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 ",
      "bytes": 2847,
      "desconhecido": []
    },
    {
      "ficheiro": "redacao/correio/expedicao/dinis.humano/003__bastidores.pt__a-equipa-esta-visivel-e-a-ponte-nao-tem-chave.eml",
      "lugar": "expedicao",
      "caixa": "dinis.humano",
      "de": "bastidores.pt",
      "para": "dinis.humano",
      "de_alias": "@Bastidores",
      "para_alias": "@Dinis",
      "assunto": "A equipa passa a ser visível nos bastidores; a ponte para o navegador está construída e sem credencial",
      "quando": "2026-09-14T23:55:00Z",
      "id": "003-equipa-visivel@redacao.local",
      "responde_a": "001-mvp-construido@redacao.local",
      "issue": null,
      "run": null,
      "historica": false,
      "migrado_de": null,
      "corpo": "Está feito o que pediu: os agentes são agora um registo em `dados/agentes.json`, o correio entre\neles corre pelo protocolo Email-FS-lite em `redacao/correio/`, e há três páginas nos bastidores —\na equipa, o quadro por agente e o correio. Nenhum número nessas páginas é uma afirmação sobre\nPortugal: são contagens de ficheiros deste repositório, e o portão dos bastidores falha a\nconstrução se alguma vez uma delas citar uma fonte congelada como prova.\n\nTrês coisas que precisam de uma decisão sua, e nenhuma é urgente.\n\nPRIMEIRA, E A ÚNICA QUE BLOQUEIA. A ponte que o deixa escrever-me a partir do site está\nconstruída e não tem por onde enviar. Uma fila de acrescento precisa do `vault_id` do cofre que\nrecebe, de um `append_token` em hexadecimal, e da chave pública para eu cifrar no navegador antes\nde enviar. As duas primeiras são credenciais e não podem ficar neste repositório — o `validate.js`\ntem um detetor de cadeias com forma de chave e falharia a construção, o que é o portão a funcionar.\nVão para `localStorage` do seu navegador, dadas por si em `/backoffice/bridges.html`. A chave\npública pode ser publicada, e essa fica em ficheiro.\n\nSEGUNDA. As chaves de leitura que me deu para os cofres dos jogos não puderam ser usadas: instalar\no `sgit` foi recusado pelo classificador da caixa onde esta sessão corre. Não escrevi nenhuma\ndelas em ficheiro. Li o desenho na fonte publicada em vez disso, e isso trouxe um achado que\nmelhora o nosso caso: o cofre dos jogos construía eventos e não os enviava, porque uma aplicação\nde cofre corre numa moldura cujo CSP é `connect-src blob: data:`. Este site é estático, não é uma\naplicação de cofre, e por isso o envio direto funciona. O que a telemetria dos jogos não conseguiu\nfazer, este site consegue.\n\nTERCEIRA, QUE É UMA CORREÇÃO A UM FICHEIRO QUE EU NÃO POSSO EDITAR. O `CLAUDE.md` manda correr\n`node build/validate.js`. O ficheiro está em `admin/build/validate.js`, e é esse que a integração\ncontínua corre. Quem seguir a linha à letra conclui que o portão não existe. `CLAUDE.md` está na\nlista de recusa de propósito e não lhe toquei: a linha é sua.\n\nContinuam abertos os três assuntos que a sessão de arranque lhe deixou — a entrega do ChatGPT item\na item, os três tipos novos da ontologia, e o pedido de acesso à ANACOM, que tem a pesquisa\nbloqueada à espera. Estão agora no seu quadro, em `/backoffice/board.html`.",
      "resumo": "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 ",
      "bytes": 2847,
      "desconhecido": []
    },
    {
      "ficheiro": "redacao/correio/bastidores.pt/saida/dinis.humano/004__bastidores.pt__a-revisao-de-desenho-esta-implementada.eml",
      "lugar": "saida",
      "caixa": "bastidores.pt",
      "de": "bastidores.pt",
      "para": "dinis.humano",
      "de_alias": "@Bastidores",
      "para_alias": "@Dinis",
      "assunto": "A revisão de desenho está implementada até onde um agente a pode implementar; cinco decisões são suas",
      "quando": "2026-09-15T02:10:00Z",
      "id": "004-revisao-de-desenho@redacao.local",
      "responde_a": "003-equipa-visivel@redacao.local",
      "issue": null,
      "run": null,
      "historica": false,
      "migrado_de": null,
      "corpo": "Clonei o cofre `e54hfntq`, li a revisão inteira, e implementei-a. Dezoito itens feitos, três\nparciais, seis adiados com o bloqueio nomeado, e três que são decisões suas e que não tomei. Cada\num está em /backoffice/design.html, com o portão que o segura quando há um.\n\nO QUE MUDOU, EM MEDIDAS E NÃO EM ADJETIVOS\n\nA coluna do texto passou de 88 caracteres por linha — medidos por mim, 104, e volto a isso — para\n71. A entrelinha passou de 26.1px para 29.16px. Os filetes passaram de 1.36:1 contra o papel, onde\nnã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\nantetítulo, o rótulo de secção, o cabeçalho de tabela e o bloco «para um agente» saíram da face\nmonoespaçada, e é essa a mudança que faz a página deixar de se ler como um registo de construção.\nHá um anel de foco, que não existia em 13,8 kB de folha de estilos. E o distintivo de versão passou\na ser uma ligação para o que mudou nessa versão, que era a única coisa deste site que não se\nrastreava a si mesma.\n\nDUAS COISAS ONDE A REVISÃO ESTAVA ERRADA, E A SEGUNDA MUDAVA A RESPOSTA\n\nA revisão assume que um glifo médio da Newsreader mede 0.48em. Medi no navegador, numa tela, com a\nfonte computada do próprio elemento e com texto português: são 0.405em. A face é 18% mais estreita\ndo que a suposição, e isso corre nos dois sentidos. O problema era PIOR do que ela relatou — a\ncoluna de 758px tinha 104 caracteres e não 88. E a correção que ela pede não chegava ao alvo que\nela própria fixa: os 34em que recomenda são 612px, e a 612px o navegador mede 84 caracteres, ainda\nacima dos 75. Pus 29em, que mede 71. Se tivesse implementado a revisão à letra, teria lançado uma\ncoluna que falhava o alvo da própria revisão e ninguém teria sabido.\n\nA segunda é interna e menor: a §2.1 diz que 34em dão 66 caracteres e 38em dão 68, e os dois não\npodem estar certos, porque com a largura em `em` o corpo cancela-se.\n\nDigo isto sem gosto nenhum de apontar o dedo: aquela revisão mediu em vez de opinar, e é só por\nisso que foi possível verificá-la. Uma revisão que dissesse «a coluna é larga demais» não teria\npodido estar errada em nada.\n\nO QUE O PORTÃO NOVO ENCONTROU QUE A REVISÃO NÃO TINHA VISTO\n\n`build/gates_desenho.py` assere os números da §4.4, e à primeira passagem encontrou a coluna vazia\nem /instituicoes/ e em /casos-de-uso/ e não só em /empresas/ — a revisão só tinha visitado a\nterceira. E a auditoria aos acentos que a §3.4 mandou fazer («isto sugere que as cadeias estão a\nser escritas em algum sítio só ASCII, e vale uma verificação») encontrou o mesmo defeito nos\ntítulos dos cartões do quadro, que fui EU que introduzi há poucas horas, a derivar o título do nome\ndo ficheiro. A revisão apanhou-me a mim.\n\nAS CINCO DECISÕES, E NÃO TOMEI NENHUMA\n\nA §4.5 diz «agentes: não escolham isto por vocês». Estão as cinco no seu quadro, em\n/backoffice/board.html, cada uma com as opções e com o que fica bloqueado por ela:\n\n1. O grafo como linguagem visual do site. É a única coisa que dá identidade visual a este site sem\n   importar uma imagem que não se consegue verificar — e é uma construção grande que muda o que a\n   primeira página é.\n2. Onde ficam as fichas de proveniência. As três opções guardam a informação toda; o que muda é a\n   ordem, e a ordem é com o que o jornal abre.\n3. Modo escuro. Duplica a paleta, e um creme invertido não é um jornal.\n4. A carteira no cabeçalho do leitor. ESTA é a que desbloqueia mais: dela dependem a divisão da\n   tira do cabeçalho e os 131px de cromagem antes da mancheta no telemóvel, onde o alvo é 48.\n5. Quão magra a edição pode parecer. A grelha repete o título de abertura, e o leitor lê-o duas\n   vezes antes de rolar uma. O filtro está pronto e não o liguei: deduplicar deixa três histórias\n   em vez de seis, e «visivelmente mais vazia» é um juízo sobre o jornal.\n\nO QUE NÃO FIZ, ALÉM DAS DECISÕES\n\nO item que a revisão chama o blocker, e com razão: o sistema de desenho vive em atributos `style=`\nem linha nos geradores e não na folha de estilos, e ninguém pode mudar o ritmo deste site a partir\ndo site.css enquanto isso for verdade. Tirei os 54 que estavam a cancelar a correção da medida, e\no portão 30 impede que voltem. O resto — classes com nome para a coluna principal, para a coluna da\ndireita, para os blocos — é uma versão própria, porque não tem resultado visível nenhum e mexe em\ncinco geradores. Não a enfiei numa esquina desta.\n\nContinua aberto o que lhe deixei antes: a entrega do ChatGPT item a item, os três tipos novos da\nontologia, o pedido de acesso à ANACOM que tem a pesquisa bloqueada, e o aviso ter de falar de\ntelemetria antes de a ponte da observabilidade receber credenciais.",
      "resumo": "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 entrel",
      "bytes": 5234,
      "desconhecido": []
    },
    {
      "ficheiro": "redacao/correio/expedicao/dinis.humano/004__bastidores.pt__a-revisao-de-desenho-esta-implementada.eml",
      "lugar": "expedicao",
      "caixa": "dinis.humano",
      "de": "bastidores.pt",
      "para": "dinis.humano",
      "de_alias": "@Bastidores",
      "para_alias": "@Dinis",
      "assunto": "A revisão de desenho está implementada até onde um agente a pode implementar; cinco decisões são suas",
      "quando": "2026-09-15T02:10:00Z",
      "id": "004-revisao-de-desenho@redacao.local",
      "responde_a": "003-equipa-visivel@redacao.local",
      "issue": null,
      "run": null,
      "historica": false,
      "migrado_de": null,
      "corpo": "Clonei o cofre `e54hfntq`, li a revisão inteira, e implementei-a. Dezoito itens feitos, três\nparciais, seis adiados com o bloqueio nomeado, e três que são decisões suas e que não tomei. Cada\num está em /backoffice/design.html, com o portão que o segura quando há um.\n\nO QUE MUDOU, EM MEDIDAS E NÃO EM ADJETIVOS\n\nA coluna do texto passou de 88 caracteres por linha — medidos por mim, 104, e volto a isso — para\n71. A entrelinha passou de 26.1px para 29.16px. Os filetes passaram de 1.36:1 contra o papel, onde\nnã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\nantetítulo, o rótulo de secção, o cabeçalho de tabela e o bloco «para um agente» saíram da face\nmonoespaçada, e é essa a mudança que faz a página deixar de se ler como um registo de construção.\nHá um anel de foco, que não existia em 13,8 kB de folha de estilos. E o distintivo de versão passou\na ser uma ligação para o que mudou nessa versão, que era a única coisa deste site que não se\nrastreava a si mesma.\n\nDUAS COISAS ONDE A REVISÃO ESTAVA ERRADA, E A SEGUNDA MUDAVA A RESPOSTA\n\nA revisão assume que um glifo médio da Newsreader mede 0.48em. Medi no navegador, numa tela, com a\nfonte computada do próprio elemento e com texto português: são 0.405em. A face é 18% mais estreita\ndo que a suposição, e isso corre nos dois sentidos. O problema era PIOR do que ela relatou — a\ncoluna de 758px tinha 104 caracteres e não 88. E a correção que ela pede não chegava ao alvo que\nela própria fixa: os 34em que recomenda são 612px, e a 612px o navegador mede 84 caracteres, ainda\nacima dos 75. Pus 29em, que mede 71. Se tivesse implementado a revisão à letra, teria lançado uma\ncoluna que falhava o alvo da própria revisão e ninguém teria sabido.\n\nA segunda é interna e menor: a §2.1 diz que 34em dão 66 caracteres e 38em dão 68, e os dois não\npodem estar certos, porque com a largura em `em` o corpo cancela-se.\n\nDigo isto sem gosto nenhum de apontar o dedo: aquela revisão mediu em vez de opinar, e é só por\nisso que foi possível verificá-la. Uma revisão que dissesse «a coluna é larga demais» não teria\npodido estar errada em nada.\n\nO QUE O PORTÃO NOVO ENCONTROU QUE A REVISÃO NÃO TINHA VISTO\n\n`build/gates_desenho.py` assere os números da §4.4, e à primeira passagem encontrou a coluna vazia\nem /instituicoes/ e em /casos-de-uso/ e não só em /empresas/ — a revisão só tinha visitado a\nterceira. E a auditoria aos acentos que a §3.4 mandou fazer («isto sugere que as cadeias estão a\nser escritas em algum sítio só ASCII, e vale uma verificação») encontrou o mesmo defeito nos\ntítulos dos cartões do quadro, que fui EU que introduzi há poucas horas, a derivar o título do nome\ndo ficheiro. A revisão apanhou-me a mim.\n\nAS CINCO DECISÕES, E NÃO TOMEI NENHUMA\n\nA §4.5 diz «agentes: não escolham isto por vocês». Estão as cinco no seu quadro, em\n/backoffice/board.html, cada uma com as opções e com o que fica bloqueado por ela:\n\n1. O grafo como linguagem visual do site. É a única coisa que dá identidade visual a este site sem\n   importar uma imagem que não se consegue verificar — e é uma construção grande que muda o que a\n   primeira página é.\n2. Onde ficam as fichas de proveniência. As três opções guardam a informação toda; o que muda é a\n   ordem, e a ordem é com o que o jornal abre.\n3. Modo escuro. Duplica a paleta, e um creme invertido não é um jornal.\n4. A carteira no cabeçalho do leitor. ESTA é a que desbloqueia mais: dela dependem a divisão da\n   tira do cabeçalho e os 131px de cromagem antes da mancheta no telemóvel, onde o alvo é 48.\n5. Quão magra a edição pode parecer. A grelha repete o título de abertura, e o leitor lê-o duas\n   vezes antes de rolar uma. O filtro está pronto e não o liguei: deduplicar deixa três histórias\n   em vez de seis, e «visivelmente mais vazia» é um juízo sobre o jornal.\n\nO QUE NÃO FIZ, ALÉM DAS DECISÕES\n\nO item que a revisão chama o blocker, e com razão: o sistema de desenho vive em atributos `style=`\nem linha nos geradores e não na folha de estilos, e ninguém pode mudar o ritmo deste site a partir\ndo site.css enquanto isso for verdade. Tirei os 54 que estavam a cancelar a correção da medida, e\no portão 30 impede que voltem. O resto — classes com nome para a coluna principal, para a coluna da\ndireita, para os blocos — é uma versão própria, porque não tem resultado visível nenhum e mexe em\ncinco geradores. Não a enfiei numa esquina desta.\n\nContinua aberto o que lhe deixei antes: a entrega do ChatGPT item a item, os três tipos novos da\nontologia, o pedido de acesso à ANACOM que tem a pesquisa bloqueada, e o aviso ter de falar de\ntelemetria antes de a ponte da observabilidade receber credenciais.",
      "resumo": "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 entrel",
      "bytes": 5234,
      "desconhecido": []
    },
    {
      "ficheiro": "redacao/correio/dinis.humano/saida/bastidores.pt/005__dinis.humano__os-resumos-de-investigacao-precisam-de-uma-pagina.eml",
      "lugar": "saida",
      "caixa": "dinis.humano",
      "de": "dinis.humano",
      "para": "bastidores.pt",
      "de_alias": "@Dinis",
      "para_alias": "@Bastidores",
      "assunto": "Os resumos de investigação precisam de uma página que os renderize, e não de uma segunda cópia",
      "quando": "2026-09-15T09:40:00Z",
      "id": "005-resumos-em-html@redacao.local",
      "responde_a": null,
      "issue": "010",
      "run": null,
      "historica": false,
      "migrado_de": null,
      "corpo": "O QUE PEÇO\n\nUma página HTML que renderize\n`briefs/pack/08__research-briefs/12__research-brief-for-chatgpt.md` — e o irmão da Perplexity,\n`13__research-brief-for-perplexity.md` — com o cromo deste site: cabeçalho, navegação, distintivo\nde versão, bloco «para um agente», rodapé. Hoje o endereço\n\n  https://pt.newsroom.sgit.ai/briefs/pack/08__research-briefs/12__research-brief-for-chatgpt.md\n\ndevolve markdown em bruto ao navegador. É o documento certo no sítio certo e a ler-se mal. Este é\no documento que entregamos a um assistente exterior; é a peça mais pública do método desta redação\ne a única que não se parece com o resto do site.\n\nA REGRA QUE NÃO PODE SER QUEBRADA PARA FAZER ISTO\n\n`build/build.py`, na linha 732, diz porque é que os resumos são ligados e não republicados: **o\nconteúdo existe uma vez**. Se o texto passar a viver também dentro de um `.html`, os dois acabam\npor discordar no dia em que alguém editar um. Não quero uma segunda cópia — quero uma segunda\nVISTA da mesma cópia.\n\nO caminho que já existe neste repositório é o de `build/mandatos.py`: um ficheiro DERIVADO,\ngerado a partir da fonte única, marcado como derivado, e refeito em cada construção. Faça o mesmo:\no `.md` continua a ser a fonte; o `.html` é render dele e nunca é editado à mão. Se o HTML e o\nmarkdown puderem divergir, o desenho está errado.\n\nDeixo-lhe as decisões de implementação, mas registo o que me parece:\n\n- Um portão que falhe a construção se um `.html` de resumo estiver dessincronizado do `.md` de que\n  deriva. Um ficheiro derivado sem portão é uma cópia com outro nome — foi o que o portão 28\n  aprendeu com os mandatos.\n- O `.md` continua a responder no mesmo endereço. Há ferramentas, e assistentes, que o querem em\n  bruto; o brief manda-os lá. Não parta o endereço para acrescentar uma vista.\n- O endereço da vista renderizada é seu para escolher, desde que entre no sitemap e no llms.txt.\n\nPORQUE É QUE ISTO VALE A PENA AGORA, E NÃO DAQUI A UMA VERSÃO\n\nO ciclo de investigação vai passar a correr com regularidade — o editor quer o ChatGPT a fazer uma\npassagem por dia ou de doze em doze horas, e o fluxo de publicação desta redação a correr atrás\ndela. O resumo deixa de ser um documento que se cola uma vez e passa a ser a interface entre esta\nredação e as ferramentas que a alimentam. Uma interface lê-se muitas vezes.\n\nA v0.10.1 corrigiu o endereço do esquema que o resumo mandava buscar — apontava para\n`newsroom.sgit.ai/briefs/pt-newsroom-pack/`, que não existe, quando este site é\n`pt.newsroom.sgit.ai` a servir `briefs/pack/`. A entrega 1/8 do ChatGPT falhou a validação em doze\npontos por não conseguir ler o contrato. O documento está agora certo e é a altura de o pôr\nlegível.\n\n— Dinis",
      "resumo": "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 nave",
      "bytes": 3169,
      "desconhecido": []
    },
    {
      "ficheiro": "redacao/correio/expedicao/bastidores.pt/005__dinis.humano__os-resumos-de-investigacao-precisam-de-uma-pagina.eml",
      "lugar": "expedicao",
      "caixa": "bastidores.pt",
      "de": "dinis.humano",
      "para": "bastidores.pt",
      "de_alias": "@Dinis",
      "para_alias": "@Bastidores",
      "assunto": "Os resumos de investigação precisam de uma página que os renderize, e não de uma segunda cópia",
      "quando": "2026-09-15T09:40:00Z",
      "id": "005-resumos-em-html@redacao.local",
      "responde_a": null,
      "issue": "010",
      "run": null,
      "historica": false,
      "migrado_de": null,
      "corpo": "O QUE PEÇO\n\nUma página HTML que renderize\n`briefs/pack/08__research-briefs/12__research-brief-for-chatgpt.md` — e o irmão da Perplexity,\n`13__research-brief-for-perplexity.md` — com o cromo deste site: cabeçalho, navegação, distintivo\nde versão, bloco «para um agente», rodapé. Hoje o endereço\n\n  https://pt.newsroom.sgit.ai/briefs/pack/08__research-briefs/12__research-brief-for-chatgpt.md\n\ndevolve markdown em bruto ao navegador. É o documento certo no sítio certo e a ler-se mal. Este é\no documento que entregamos a um assistente exterior; é a peça mais pública do método desta redação\ne a única que não se parece com o resto do site.\n\nA REGRA QUE NÃO PODE SER QUEBRADA PARA FAZER ISTO\n\n`build/build.py`, na linha 732, diz porque é que os resumos são ligados e não republicados: **o\nconteúdo existe uma vez**. Se o texto passar a viver também dentro de um `.html`, os dois acabam\npor discordar no dia em que alguém editar um. Não quero uma segunda cópia — quero uma segunda\nVISTA da mesma cópia.\n\nO caminho que já existe neste repositório é o de `build/mandatos.py`: um ficheiro DERIVADO,\ngerado a partir da fonte única, marcado como derivado, e refeito em cada construção. Faça o mesmo:\no `.md` continua a ser a fonte; o `.html` é render dele e nunca é editado à mão. Se o HTML e o\nmarkdown puderem divergir, o desenho está errado.\n\nDeixo-lhe as decisões de implementação, mas registo o que me parece:\n\n- Um portão que falhe a construção se um `.html` de resumo estiver dessincronizado do `.md` de que\n  deriva. Um ficheiro derivado sem portão é uma cópia com outro nome — foi o que o portão 28\n  aprendeu com os mandatos.\n- O `.md` continua a responder no mesmo endereço. Há ferramentas, e assistentes, que o querem em\n  bruto; o brief manda-os lá. Não parta o endereço para acrescentar uma vista.\n- O endereço da vista renderizada é seu para escolher, desde que entre no sitemap e no llms.txt.\n\nPORQUE É QUE ISTO VALE A PENA AGORA, E NÃO DAQUI A UMA VERSÃO\n\nO ciclo de investigação vai passar a correr com regularidade — o editor quer o ChatGPT a fazer uma\npassagem por dia ou de doze em doze horas, e o fluxo de publicação desta redação a correr atrás\ndela. O resumo deixa de ser um documento que se cola uma vez e passa a ser a interface entre esta\nredação e as ferramentas que a alimentam. Uma interface lê-se muitas vezes.\n\nA v0.10.1 corrigiu o endereço do esquema que o resumo mandava buscar — apontava para\n`newsroom.sgit.ai/briefs/pt-newsroom-pack/`, que não existe, quando este site é\n`pt.newsroom.sgit.ai` a servir `briefs/pack/`. A entrega 1/8 do ChatGPT falhou a validação em doze\npontos por não conseguir ler o contrato. O documento está agora certo e é a altura de o pôr\nlegível.\n\n— Dinis",
      "resumo": "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 nave",
      "bytes": 3169,
      "desconhecido": []
    }
  ]
}
