<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>TCDEV Blog</title>
  <subtitle>Practical notes on AI, engineering, and developer tooling.</subtitle>
  <link href="https://www.tcdev.de/pt/blog/feed.xml" rel="self" type="application/atom+xml" />
  <link href="https://www.tcdev.de/pt/blog/" rel="alternate" type="text/html" />
  <id>https://www.tcdev.de/pt/blog/</id>
  <updated>2026-04-27T00:00:00Z</updated>
  <author>
    <name>TCDEV Blog</name>
  </author>
  <entry>
    <title>Deixe seu LLM pensar em inglês</title>
    <link href="https://www.tcdev.de/pt/blog/let-your-llm-think-in-english/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/let-your-llm-think-in-english/</id>
    <updated>2026-04-27T00:00:00Z</updated>
    <summary>O RAG fiável e a chamada de ferramentas necessitam normalmente de uma língua de trabalho estável. Mantenha o inglês dentro do ciclo do modelo e, em seguida, localize-o para os utilizadores nas extremidades.</summary>
    <content type="html">&lt;p&gt;Você envia um chatbot para a sua equipa alemã. A interface do usuário é alemã. Os documentos de origem são parcialmente em alemão e parcialmente em inglês. As ferramentas por detrás do assistente esperam valores de enum em inglês, descrições de funções em inglês, nomes de produtos em inglês, tudo em inglês.&lt;/p&gt;
&lt;p&gt;Depois, alguém faz uma pergunta perfeitamente normal em alemão, o modelo escolhe a ferramenta correta, passa um argumento em alemão em vez de inglês e tudo se desmorona silenciosamente.&lt;/p&gt;
&lt;p&gt;Já vi versões disto vezes suficientes e já não penso nisto como um problema de tradução. **É um problema de execução.&lt;/p&gt;
&lt;p&gt;O meu padrão atual é simples: deixar os utilizadores falarem a língua que quiserem, mas deixar o LLM fazer a sua recuperação, raciocínio e trabalho de ferramenta em inglês sempre que a fiabilidade for realmente importante. Depois, localizar a resposta fora desse ciclo.&lt;/p&gt;
&lt;p&gt;Isto parece um pouco herético à primeira vista. Mas é também, na minha opinião, a coisa mais prática que se pode fazer neste momento.&lt;/p&gt;
&lt;h2&gt;A pesquisa está a começar a dizer isto em voz alta&lt;/h2&gt;
&lt;p&gt;Os números já não são subtis.&lt;/p&gt;
&lt;p&gt;No [MASSIVE-Agents benchmark] (https://aclanthology.org/2025.findings-emnlp.1099/), os investigadores avaliaram a chamada de funções multilingues em 52 línguas, 47.020 amostras e 21 modelos. A melhor pontuação média em todas as línguas foi de apenas 34,05%. O inglês atingiu 57,37%. O amárico desceu para 6,81%.&lt;/p&gt;
&lt;p&gt;Isto não é uma pequena oscilação de qualidade. É um abismo de fiabilidade.&lt;/p&gt;
&lt;p&gt;Depois, há o [Lost in Execution] (https://arxiv.org/abs/2601.05366), que se aproxima ainda mais do problema dos sistemas reais. O documento mostra que muitas falhas na chamada de ferramentas multilingues acontecem &lt;strong&gt;depois de o modelo já ter compreendido a intenção e selecionado a ferramenta correta&lt;/strong&gt;. A questão dominante era a incompatibilidade linguística do valor dos parâmetros. Em termos simples, o modelo sabia o que fazer, mas expressou os bits executáveis na língua do utilizador em vez da língua da interface, pelo que a chamada falhou na mesma.&lt;/p&gt;
&lt;p&gt;E isto não se limita à chamada de ferramentas. Em [Do Multilingual Language Models Think Better in English?] (https://aclanthology.org/2024.naacl-short.46/), Etxaniz e colegas descobriram que a auto-tradução para inglês superava consistentemente a inferência direta em língua não inglesa em cinco tarefas. A sua formulação é refrescantemente direta: os modelos são &amp;quot;incapazes de aproveitar todo o seu potencial multilingue quando solicitados em línguas que não o inglês&amp;quot;.&lt;/p&gt;
&lt;p&gt;Portanto, sim, os modelos multilingues são impressionantes. Mas se a sua fasquia não for &amp;quot;soa muito bem&amp;quot; mas sim &amp;quot;deve comportar-se corretamente na produção&amp;quot;, o inglês continua a parecer a língua de trabalho mais segura com uma frequência notável.&lt;/p&gt;
&lt;h2&gt;Porque é que o RAG quebra no mesmo sítio&lt;/h2&gt;
&lt;p&gt;As pessoas normalmente ouvem este argumento e pensam primeiro em agentes. Chamada de função, saída estruturada, execução de API, esse tipo de coisa.&lt;/p&gt;
&lt;p&gt;O RAG tem a mesma fraqueza, apenas uma camada antes.&lt;/p&gt;
&lt;p&gt;Se a sua camada de recuperação tiver de fazer corresponder a fraseologia local de um utilizador ao conteúdo escrito em idiomas mistos, com terminologia inconsistente, nomes de produtos traduzidos e etiquetas de taxonomia semi-localizadas, cria mais hipóteses de o sistema se desviar antes mesmo de a geração começar. Honestamente, é daqui que vêm muitas das queixas &amp;quot;o modelo não é fiável&amp;quot;. O modelo pode ser bom. A interface de conteúdo não é.&lt;/p&gt;
&lt;p&gt;Eu prefiro normalizar cedo.&lt;/p&gt;
&lt;p&gt;Traduzir a pergunta para inglês. Recuperar a partir de um corpus canónico inglês. Deixar o modelo raciocinar sobre uma camada terminológica estável. Gerar um rascunho de resposta em inglês, se necessário. Em seguida, traduzir ou localizar a resposta final para o utilizador.&lt;/p&gt;
&lt;p&gt;Isto dá-lhe um local onde a nomenclatura se mantém estável:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;um título de documento canónico&lt;/li&gt;
&lt;li&gt;um vocabulário de produto canónico&lt;/li&gt;
&lt;li&gt;um esquema de ferramenta canónico&lt;/li&gt;
&lt;li&gt;um conjunto canónico de etiquetas de recuperação&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Continua a ser possível suportar todas as línguas do utilizador no exterior. Basta deixar de exigir que o percurso de execução principal seja perfeitamente multilingue em cada etapa.&lt;/p&gt;
&lt;h2&gt;Isto não é anti-localização&lt;/h2&gt;
&lt;p&gt;Muito pelo contrário.&lt;/p&gt;
&lt;p&gt;Uma má arquitetura de IA multilingue prejudica normalmente os utilizadores locais em primeiro lugar. Estes obtêm uma interface localizada agradável, mas depois o sistema oculto centrado no inglês comporta-se de forma inconsistente e fá-los pagar o preço.&lt;/p&gt;
&lt;p&gt;Uma localização correta significa ser honesto sobre onde a linguagem deve ser flexível e onde não deve.&lt;/p&gt;
&lt;p&gt;Para mim, a divisão é a seguinte:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Localizar a interface do utilizador, os avisos, o texto de ajuda, a integração e as respostas finais.&lt;/li&gt;
&lt;li&gt;Localizar o conteúdo de origem que as pessoas lêem diretamente quando esse conteúdo tem de existir no mercado.&lt;/li&gt;
&lt;li&gt;Mantenha as definições internas da ferramenta, os identificadores canónicos, as etiquetas de recuperação e os pivôs de raciocínio em inglês, se essa for a camada mais estável.&lt;/li&gt;
&lt;li&gt;Adicionar pós-processamento explícito ou revisão humana quando um resultado localizado tiver peso legal, regulamentar ou contratual.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Este último ponto é mais importante do que as equipas gostam de admitir. Se o modelo estiver a falar com um ser humano, a localização é uma decisão de experiência do utilizador. Se o modelo está a falar com outro sistema, a linguagem é um contrato de interface.&lt;/p&gt;
&lt;p&gt;Não são a mesma coisa.&lt;/p&gt;
&lt;h2&gt;A arquitetura em que mais confio neste momento&lt;/h2&gt;
&lt;p&gt;Esta é a versão em que eu apostaria atualmente para produtos de IA multilingues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;O utilizador pergunta na sua língua.&lt;/li&gt;
&lt;li&gt;O sistema traduz ou normaliza o pedido para inglês.&lt;/li&gt;
&lt;li&gt;A recuperação, o raciocínio, a classificação e as chamadas de ferramentas ocorrem em relação aos dados canónicos em inglês.&lt;/li&gt;
&lt;li&gt;A resposta final é localizada de volta para a língua do utilizador.&lt;/li&gt;
&lt;li&gt;Os resultados de alto risco recebem uma etapa de validação adicional antes de saírem do sistema.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Não é filosoficamente puro. É operacionalmente sensato.&lt;/p&gt;
&lt;p&gt;O que é bom é que a investigação recente aponta na mesma direção. A [Lost in Execution] (https://arxiv.org/abs/2601.05366) descobriu que a pré-tradução das consultas dos utilizadores reduzia geralmente os erros de incompatibilidade linguística melhor do que as correcções post-hoc, mesmo que ainda não recuperasse totalmente o desempenho ao nível do inglês. Isto corresponde ao que muitos construtores já suspeitam na prática. Se esperar até ao fim para eliminar as incoerências multilingues, normalmente é demasiado tarde.&lt;/p&gt;
&lt;p&gt;E sim, há excepções. Se estiver a construir para línguas com poucos recursos, para uma linguagem específica de um domínio ou para um fraseado culturalmente dependente, traduzir tudo para inglês pode introduzir desvios. O documento acima referido alerta explicitamente para esse facto. Por isso, não transforme isto num dogma.&lt;/p&gt;
&lt;p&gt;Mas como padrão para co-pilotos de empresas, assistentes internos, RAG multilingues e agentes utilizadores de ferramentas, penso que a regra se mantém surpreendentemente bem.&lt;/p&gt;
&lt;h2&gt;O que isto significa para o Rasepi&lt;/h2&gt;
&lt;p&gt;É exatamente por isto que me preocupo tanto com a estrutura canónica do conteúdo.&lt;/p&gt;
&lt;p&gt;Se a sua base de conhecimento tiver uma camada de fonte limpa, terminologia estável e localização controlada no topo, a IA torna-se mais fácil de confiar. Se cada versão linguística se desviar independentemente dentro do caminho de execução, está a pedir ao modelo para improvisar onde o seu sistema deve ser preciso.&lt;/p&gt;
&lt;p&gt;Toda a abordagem do Rasepi é construída em torno de separar essas preocupações de forma limpa. Manter um núcleo canónico. Localizar deliberadamente. Rastrear onde existem variantes. Não finja que todas as camadas da pilha devem ser igualmente multilíngues só porque a interface do usuário é.&lt;/p&gt;
&lt;p&gt;Eu costumava pensar que a melhor experiência de IA multilingue significava &amp;quot;fazer tudo na língua do utilizador&amp;quot;. Já não penso assim. Não para sistemas que têm de obter o parágrafo certo, escolher a ferramenta certa e devolver algo em que se possa confiar.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A regra prática é simples: os utilizadores devem permanecer locais, mas o caminho de execução do LLM deve permanecer estável. Atualmente, isso significa geralmente inglês no meio e localização nas extremidades.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Isso vai mudar com o tempo. Espero que mude rapidamente. Mas, se estiver a fazer envios hoje e a fiabilidade for mais importante do que a estética, eu deixaria o modelo pensar em inglês e deixaria o seu produto falar a língua do utilizador.&lt;/p&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="ai" />
    <category term="multilingual" />
    <category term="developer-experience" />
    <category term="knowledge-management" />
  </entry>
  <entry>
    <title>Claude Design e a agência criativa de uma pessoa só</title>
    <link href="https://www.tcdev.de/pt/blog/claude-design-the-one-person-creative-agency/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/claude-design-the-one-person-creative-agency/</id>
    <updated>2026-04-18T00:00:00Z</updated>
    <summary>A Anthropic acabou de lançar ferramentas de design, prototipagem e apresentação dentro do Claude. Em combinação com o Code e o Cowork, uma pessoa tem agora uma agência criativa completa no seu portátil.</summary>
    <content type="html">&lt;p&gt;Ontem, a Anthropic &lt;a href=&quot;https://www.anthropic.com/news/claude-design-anthropic-labs&quot;&gt;lançou o Claude Design&lt;/a&gt;, um novo produto da sua equipa Anthropic Labs que lhe permite criar designs, protótipos, apresentações e material de marketing falando com o Claude. E eu fiquei ali sentado a olhar para o anúncio a pensar: ok, então agora uma pessoa com uma subscrição do Claude tem genuinamente a maior parte do que uma pequena agência criativa oferece. Design. Código. Automatização. Apresentações. Consistência da marca. Tudo dentro do mesmo ecossistema.&lt;/p&gt;
&lt;p&gt;Esta é uma frase louca para escrever em 2026. Mas não acho que seja um exagero.&lt;/p&gt;
&lt;h2&gt;O que o Claude Design realmente faz&lt;/h2&gt;
&lt;p&gt;A versão curta: você descreve o que precisa e o Claude cria uma primeira versão. Depois, refina-se através de conversas, comentários inline, edições diretas ou sliders personalizados que o Claude gera para si. É alimentado por &lt;a href=&quot;https://www.anthropic.com/news/claude-opus-4-7&quot;&gt;Opus 4.7&lt;/a&gt; e é surpreendentemente bom a manter a consistência visual.&lt;/p&gt;
&lt;p&gt;Mas a funcionalidade que mais me chamou a atenção foi o onboarding. Durante a configuração, o Claude lê a sua base de código e os ficheiros de design existentes para criar um sistema de design para a sua equipa. Cores, tipografia, componentes. A partir daí, todos os projectos seguem automaticamente a sua marca. Pode importar imagens, documentos (DOCX, PPTX, XLSX) ou apontar diretamente para a sua base de código. Existe uma ferramenta de captura da Web que recolhe elementos do seu sítio Web ativo para que os protótipos se assemelhem ao produto real.&lt;/p&gt;
&lt;p&gt;Tem uma maquete do Figma que pretende utilizar? Exporte-o, coloque-o no Claude Design e inicie uma conversa sobre o que deve ser alterado. Ou simplesmente capture o seu site existente e diga &amp;quot;aumente a secção de heróis e adicione um carrossel de testemunhos&amp;quot;. Esse tipo de coisas.&lt;/p&gt;
&lt;p&gt;Os testemunhos do anúncio são reveladores. O designer de produto sénior da Brilliant disse que as suas páginas mais complexas, que precisavam de [mais de 20 prompts para recriar noutras ferramentas, apenas precisavam de 2 prompts no Claude Design] (https://www.anthropic.com/news/claude-design-anthropic-labs). O Gestor de Produto da Datadog descreveu a passagem de uma ideia aproximada para um protótipo funcional antes de qualquer pessoa sair da sala, e disse que o que costumava demorar uma semana de briefings, maquetas e rondas de revisão, agora acontece numa única conversa.&lt;/p&gt;
&lt;p&gt;Uma semana de idas e vindas, resumida numa só conversa. Pensem nisso por um segundo.&lt;/p&gt;
&lt;h2&gt;A pilha que muda tudo&lt;/h2&gt;
&lt;p&gt;É aqui que as coisas ficam interessantes. O Claude Design não existe isoladamente. A Anthropic tem agora três produtos que, combinados, cobrem uma quantidade absurda de terreno:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;: Escrever, rever e enviar software real. [2,5 mil milhões de dólares em receitas correntes] (https://www.anthropic.com/news/anthropic-raises-30-billion-series-g-funding-380-billion-post-money-valuation) a partir de fevereiro, responsável por cerca de 4% de todos os commits públicos do GitHub em todo o mundo.&lt;/li&gt;
&lt;li&gt;Cowork**: Automatizar o trabalho do conhecimento. Investigação, análise, processamento de documentos, tarefas recorrentes a partir do seu ambiente de trabalho.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claude Design&lt;/strong&gt;: Criar trabalho visual. Protótipos, apresentações, material de marketing, activos consistentes com a marca.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E eles trocam de mãos. Quando um design está pronto para ser criado, o Claude agrupa tudo num pacote de transferência que pode passar para o Claude Code com uma única instrução. Do design à produção num único fluxo. Sem ticket do Jira. Sem reunião de transferência. Nada de &amp;quot;você pode me enviar as especificações no Slack&amp;quot;.&lt;/p&gt;
&lt;p&gt;Não paro de pensar na previsão de Sam Altman, do início de 2024, sobre [a empresa de uma pessoa que vale bilhões de dólares] (https://every.to/napkin-math/the-one-person-billion-dollar-company). Na altura, parecia uma aspiração, talvez um pouco hiperbólica. As ferramentas ainda não estavam disponíveis. Era possível gerar texto e imagens, é certo, mas a distância entre gerar coisas e enviar produtos reais era enorme.&lt;/p&gt;
&lt;p&gt;Essa distância está a diminuir rapidamente.&lt;/p&gt;
&lt;h2&gt;O que eu teria dado por isto há dois meses&lt;/h2&gt;
&lt;p&gt;Quando construí o Rasepi, o sítio de marketing era uma das partes mais aborrecidas. Não era o código. O código era bom, o Claude lida com HTML e CSS como um campeão. Mas as decisões de design visual? A disposição dos heróis, os cartões da página de preços, as tabelas de comparação de caraterísticas? Eu descrevia as coisas por palavras, o Claude produzia algo e depois eu passava horas a tentar ajustar o espaçamento, as cores, a tipografia. Tudo através de mensagens de texto. Não havia um ciclo de feedback visual.&lt;/p&gt;
&lt;p&gt;Com o Claude Design, esse fluxo de trabalho passa a ser: &amp;quot;Aqui está o meu site&amp;quot; (captura da web), &amp;quot;redesenhar a secção de preços para enfatizar o plano da equipa&amp;quot; (conversa), ajustar a cor verde com uma barra deslizante, aprovar, entregar ao Claude Code para implementação. Calculo que isso me teria poupado um fim de semana inteiro.&lt;/p&gt;
&lt;p&gt;(Honestamente, estou um pouco aborrecido por não ter sido lançado dois meses antes).&lt;/p&gt;
&lt;p&gt;E a exportação do Canva é inteligente. &lt;a href=&quot;https://backlinko.com/canva-users&quot;&gt;O Canva tem 220 milhões de utilizadores activos&lt;/a&gt; e uma receita anual de 3 mil milhões de dólares. O Anthropic não está a tentar substituir o Canva. Está a tentar ser o local onde as ideias começam antes de aterrarem no Canva para polimento e distribuição final. Essa é uma jogada de posicionamento inteligente. A criatividade é gerada no Claude Design e depois exportada para o Canva, onde a sua equipa de marketing a recolhe. Ou exporta para o PPTX para aquele deck de investidores. Ou exportar como HTML autónomo para uma página de destino.&lt;/p&gt;
&lt;h2&gt;O multiplicador &amp;quot;basta adicionar ferramentas&lt;/h2&gt;
&lt;p&gt;Este é o padrão que continuo a ver no espaço da IA em 2026. O modelo de base fica mais inteligente, é certo, mas o verdadeiro salto de produtividade vem da ligação de ferramentas entre si. O Claude, por si só, é um gerador de texto muito inteligente. O Claude com o Code é um engenheiro de software. O Claude com Cowork é um analista de investigação. O Claude com Design é um diretor criativo. O Claude com os três? Isso é uma pequena agência.&lt;/p&gt;
&lt;p&gt;E as ligações continuam a aumentar. A Anthropic afirmou que irá adicionar mais integrações nas próximas semanas. Os servidores MCP já permitem ligar o Claude a ferramentas e fontes de dados externas. O ecossistema está a construir-se a si próprio.&lt;/p&gt;
&lt;p&gt;Para fundadores individuais, freelancers e pequenas equipas, isto muda completamente o cálculo. Não é necessário contratar um designer para produzir decks e protótipos com aspeto profissional. Não precisa de um programador de front-end separado para transformar as maquetas em código. Não precisa de um gestor de projeto para coordenar a transferência entre o design e a engenharia, porque não há transferência. É uma conversa contínua.&lt;/p&gt;
&lt;p&gt;Não estou a dizer que os designers são obsoletos. Longe disso. A Brilliant e a Datadog descreveram os seus &lt;em&gt;designers&lt;/em&gt; utilizando o Claude Design. A ferramenta torna os bons designers mais rápidos e dá a todos os outros acesso a resultados visuais competentes. Isso é diferente de substituir pessoas.&lt;/p&gt;
&lt;h2&gt;O que isto significa para os produtos de documentação&lt;/h2&gt;
&lt;p&gt;Esta é uma questão que estou a observar de perto. Na Rasepi, estamos a construir uma plataforma de documentação onde a qualidade visual é importante. As páginas de entrada precisam de ter bom aspeto. Os guias de início rápido precisam de diagramas claros. Os documentos de marketing precisam de consistência de marca entre línguas e equipas.&lt;/p&gt;
&lt;p&gt;Um mundo onde cada membro da equipa pode gerar documentação visual de acordo com a marca, entregá-la ao motor de tradução e distribuí-la em sete línguas sem tocar no Figma, no Photoshop ou no InDesign? É exatamente esse o problema que estamos a resolver de um ângulo diferente. (E sim, este é exatamente o tipo de fluxo de trabalho que o Rasepi foi concebido para suportar).&lt;/p&gt;
&lt;h2&gt;A parte em que fica estranhamente caro&lt;/h2&gt;
&lt;p&gt;Aqui está a coisa de que ninguém está a falar ainda. Criei uma nova conta Anthropic especificamente para experimentar o Claude Design. Uma conta nova, sem histórico, sem utilização anterior. Importei um pequeno ficheiro Figma e gerei um único ativo. Foi só isso. Duas operações. E fiquei sem créditos.&lt;/p&gt;
&lt;p&gt;Numa conta totalmente nova. Com uma nova dotação.&lt;/p&gt;
&lt;p&gt;Não sei como é a matemática dos tokens do lado do Anthropic quando o Opus 4.7 está a fazer a geração visual, mas seja o que for, queima créditos a um ritmo que faz com que a ideia de &amp;quot;agência criativa de uma só pessoa&amp;quot; pareça muito mais cara do que o esperado. Se importar um pequeno modelo Figma e produzir uma imagem consome todo o seu orçamento, a economia da utilização desta ferramenta de design diária ainda não funciona.&lt;/p&gt;
&lt;p&gt;Para ser justo, esta é uma pré-visualização de investigação e os preços irão provavelmente mudar. Mas, neste momento, existe uma diferença significativa entre a promessa (substituir o seu fluxo de trabalho de design) e a realidade (pode ficar sem créditos antes do almoço). Os ganhos de produtividade são reais. Se o rácio de créditos por produção o torna prático para uma utilização regular é uma questão completamente diferente.&lt;/p&gt;
&lt;h2&gt;A advertência honesta&lt;/h2&gt;
&lt;p&gt;O Claude Design está em fase de pesquisa prévia. Terá algumas arestas. Os testemunhos são de equipas de design de empresas bem financiadas com sistemas de design estabelecidos. A sua quilometragem pode variar, especialmente se estiver a começar do zero, sem diretrizes de marca para o alimentar.&lt;/p&gt;
&lt;p&gt;Mas a trajetória é clara. Há dezoito meses, era necessário um designer, um programador e um gestor de projectos para passar do conceito à página de destino enviada. Hoje em dia, uma única pessoa com uma subscrição Claude pode fazer uma versão surpreendentemente credível desse mesmo fluxo de trabalho numa tarde.&lt;/p&gt;
&lt;p&gt;Ainda não chegámos à empresa de mil milhões de dólares com uma só pessoa. Mas a agência criativa de uma só pessoa? Acho que acabámos de chegar.&lt;/p&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="ai" />
    <category term="developer-experience" />
    <category term="collaboration" />
  </entry>
  <entry>
    <title>Uma chave de API, muitos inquilinos: Como isolamos as traduções de DeepL entre os clientes</title>
    <link href="https://www.tcdev.de/pt/blog/one-api-key-many-tenants-deepl-isolation/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/one-api-key-many-tenants-deepl-isolation/</id>
    <updated>2026-04-18T00:00:00Z</updated>
    <summary>O Rasepi usa uma única chave de API DeepL para todos os locatários. Veja como lidamos com glossários por cliente, regras de estilo, traduções em cache e isolamento em nível de bloco sem vazamento de nada.</summary>
    <content type="html">&lt;p&gt;Há uma pergunta que surge sempre que explico a arquitetura de tradução do Rasepi a outro programador: &amp;quot;Espera, então todos os teus inquilinos partilham uma chave de API DeepL? Como é que evita que os seus glossários e regras de estilo se infiltrem uns nos outros?&amp;quot;&lt;/p&gt;
&lt;p&gt;É uma pergunta justa. E a resposta envolve mais trabalho de design do que seria de esperar.&lt;/p&gt;
&lt;p&gt;Cobrimos a &lt;a href=&quot;https://www.tcdev.de/pt/blog/inside-the-translation-engine-glossaries-style-rules-and-smart-retranslation/&quot;&gt;linha de tradução completa&lt;/a&gt; num post anterior, o hashing ao nível do bloco, o orquestrador, todo o fluxo desde a gravação do documento até à saída traduzida. Este post aborda o problema específico de multi-tenancy. Como se pega numa API de terceiros que não tem qualquer conceito de inquilinos e se constrói o isolamento de inquilinos em cima dela.&lt;/p&gt;
&lt;h2&gt;O problema: DeepL não sabe sobre seus clientes&lt;/h2&gt;
&lt;p&gt;A API do DeepL é autenticada com uma única chave de API. Tudo o que é criado com essa chave, glossários, listas de regras de estilo, histórico de tradução, pertence à mesma conta. Não há nenhum conceito de &amp;quot;este glossário pertence ao inquilino A&amp;quot; no lado do DeepL.&lt;/p&gt;
&lt;p&gt;Quando se chama &lt;code&gt;GET /v2/glossaries&lt;/code&gt;, obtém-se &lt;em&gt;todos&lt;/em&gt; os glossários de &lt;em&gt;todos&lt;/em&gt; os inquilinos. Quando se cria uma lista de regras de estilo, ela vive no mesmo espaço de nomes que as regras de estilo de todos os outros locatários. A API é plana.&lt;/p&gt;
&lt;p&gt;Para um produto auto-hospedado em que cada cliente executa a sua própria instância com a sua própria chave DeepL, isto é ótimo. Para um SaaS multi-tenant em que gerimos a infraestrutura? É necessária uma camada de isolamento.&lt;/p&gt;
&lt;h2&gt;A base de dados é a fonte da verdade&lt;/h2&gt;
&lt;p&gt;A nossa principal decisão de conceção: **a base de dados possui todo o conteúdo do glossário e a configuração das regras de estilo. DeepL é um alvo de execução em tempo de execução, nada mais.&lt;/p&gt;
&lt;p&gt;Todas as entidades &lt;code&gt;TenantGlossary&lt;/code&gt; e &lt;code&gt;TenantStyleRuleList&lt;/code&gt; implementam &lt;code&gt;ITenantScoped&lt;/code&gt;, o que significa que os filtros de consulta global do EF Core automaticamente abrangem todas as leituras para o locatário atual. Uma consulta de glossários no contexto de solicitação do locatário A nunca retornará as entradas do locatário B. Este é o mesmo padrão de isolamento que usamos em todo o Rasepi, aplicado ao nível do ORM.&lt;/p&gt;
&lt;p&gt;O que torna isto interessante é o seguinte. Quando um locatário edita um termo do glossário, não chamamos imediatamente DeepL. Actualizamos a linha da base de dados e definimos &lt;code&gt;IsDirty = true&lt;/code&gt;. É só isso. O glossário DeepL real é criado (ou recriado) preguiçosamente, mesmo antes de a próxima tradução precisar dele.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public async Task&amp;lt;string?&amp;gt; GetOrSyncDeepLGlossaryIdAsync(
    string sourceLanguage, string targetLanguage)
{
    var glossary = await _db.TenantGlossaries
        .Include(g =&amp;gt; g.Entries)
        .FirstOrDefaultAsync(g =&amp;gt;
            g.SourceLanguage == sourceLanguage &amp;amp;&amp;amp;
            g.TargetLanguage == targetLanguage);

    if (glossary?.Entries.Count == 0) return null;

    if (!glossary.IsDirty &amp;amp;&amp;amp; glossary.DeepLGlossaryId is not null)
        return glossary.DeepLGlossaryId;

    // Dirty: delete old, create new
    if (glossary.DeepLGlossaryId is not null)
        await _deepL.DeleteGlossaryAsync(glossary.DeepLGlossaryId);

    var entries = glossary.Entries
        .ToDictionary(e =&amp;gt; e.SourceTerm, e =&amp;gt; e.TargetTerm);

    var created = await _deepL.CreateGlossaryAsync(
        $&amp;quot;rasepi-{glossary.Id}&amp;quot;,
        glossary.SourceLanguage,
        glossary.TargetLanguage,
        entries);

    glossary.DeepLGlossaryId = created.GlossaryId;
    glossary.IsDirty = false;
    glossary.LastSyncedAt = DateTime.UtcNow;
    await _db.SaveChangesAsync();

    return glossary.DeepLGlossaryId;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O filtro de consulta em &lt;code&gt;TenantGlossaries&lt;/code&gt; faz o isolamento. O sinalizador &lt;code&gt;IsDirty&lt;/code&gt; faz a sincronização preguiçosa. E a convenção de nomenclatura (&lt;code&gt;rasepi-{glossary.Id}&lt;/code&gt;) é apenas para depuração no painel DeepL, não tem qualquer objetivo funcional.&lt;/p&gt;
&lt;p&gt;Porquê preguiçosa? Porque &lt;a href=&quot;https://developers.deepl.com/docs/api-reference/glossaries&quot;&gt;os glossários de DeepL v2 são imutáveis&lt;/a&gt;. Não é possível editá-los. Qualquer alteração significa apagar e recriar. Se uma equipa importar um CSV com 200 termos e depois corrigir um erro de digitação numa entrada, não queremos apagar e recriar o glossário DeepL duas vezes. Basta definir &lt;code&gt;IsDirty&lt;/code&gt; em ambas as vezes e a única recriação acontece quando a próxima tradução for executada.&lt;/p&gt;
&lt;h2&gt;Regras de estilo: mesmo padrão, API diferente&lt;/h2&gt;
&lt;p&gt;As regras de estilo do &lt;a href=&quot;https://developers.deepl.com/docs/api-reference/translate/openapi-spec-for-text-translation&quot;&gt;DeepL&lt;/a&gt; são mais novas (API v3) e realmente mutáveis, o que é melhor. Você pode atualizar regras configuradas no lugar com &lt;code&gt;PUT /v3/style_rules/{style_id}/configured_rules&lt;/code&gt;, e instruções personalizadas podem ser adicionadas ou removidas individualmente.&lt;/p&gt;
&lt;p&gt;Nós ainda usamos o mesmo padrão &lt;code&gt;IsDirty&lt;/code&gt;. Um &lt;code&gt;TenantStyleRuleList&lt;/code&gt; tem um &lt;code&gt;DeepLStyleId&lt;/code&gt; que mapeia para o identificador de tempo de execução de DeepL, mais &lt;code&gt;ConfiguredRulesJson&lt;/code&gt; para as regras de formatação e uma coleção de entradas &lt;code&gt;TenantCustomInstruction&lt;/code&gt; para diretivas de tradução de texto livre.&lt;/p&gt;
&lt;p&gt;O verdadeiro poder está nessas instruções personalizadas. Cada uma é uma diretiva de linguagem simples, até 300 caracteres, que molda a forma como DeepL traduz. Exemplos reais dos nossos inquilinos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&amp;quot;Utilize sempre a forma &#39;Sie&#39;, nunca &#39;du&#39;&amp;quot;&lt;/em&gt; para uma firma de advogados alemã&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;quot;Traduzir &#39;deployment&#39; como &#39;Bereitstellung&#39;, nunca &#39;Deployment&#39;&amp;quot;&lt;/em&gt; para termos dependentes do contexto que vão para além de simples mapeamentos de glossários&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;quot;Utilizar a ortografia do inglês britânico (cor, organização, licença)&amp;quot;&lt;/em&gt; para uma empresa do Reino Unido que esteja a traduzir entre variantes do inglês&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&amp;quot;Colocar símbolos de moeda após o valor numérico&amp;quot;&lt;/em&gt; para convenções europeias&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cada locatário pode ter instruções completamente diferentes por língua de destino, todas elas com a mesma chave API. O isolamento resulta do facto de cada chamada de tradução incluir apenas o &lt;code&gt;glossary_id&lt;/code&gt; e o &lt;code&gt;style_id&lt;/code&gt; pertencentes ao locatário requerente. Os recursos DeepL de outros locatários nunca são referenciados.&lt;/p&gt;
&lt;h2&gt;A chamada de tradução: tudo compõe&lt;/h2&gt;
&lt;p&gt;Quando o orquestrador traduz um bloco, ele reúne todas as configurações específicas do locatário em uma única solicitação:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var glossaryId = await _glossaryService
    .GetOrSyncDeepLGlossaryIdAsync(sourceLang, targetLang);
var styleId = await _styleRuleService
    .GetOrSyncStyleIdAsync(targetLang);
var formality = langConfig.Formality ?? &amp;quot;default&amp;quot;;

var options = new TranslationOptions
{
    GlossaryId = glossaryId,
    StyleId = styleId,
    Formality = formality,
    Context = documentContext,
    ModelType = styleId != null ? &amp;quot;quality_optimized&amp;quot; : null
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Todos os parâmetros aqui são específicos do locatário. O &lt;code&gt;glossaryId&lt;/code&gt; foi resolvido por meio de uma consulta filtrada por locatário. O &lt;code&gt;styleId&lt;/code&gt; foi resolvido da mesma forma. O &lt;code&gt;formality&lt;/code&gt; provém do &lt;code&gt;TenantLanguageConfig&lt;/code&gt;, também com escopo de locatário. Mesmo o &lt;code&gt;context&lt;/code&gt; (parágrafos envolventes enviados para melhorar a qualidade da tradução, não facturados) provém do próprio documento do locatário.&lt;/p&gt;
&lt;p&gt;Um aspeto que quero realçar: quando &lt;code&gt;style_id&lt;/code&gt; é definido, DeepL utiliza automaticamente o seu modelo &lt;code&gt;quality_optimized&lt;/code&gt;. Não é possível combinar regras de estilo com &lt;code&gt;latency_optimized&lt;/code&gt;. Essa é uma restrição do DeepL, mas honestamente uma restrição razoável. Se está a investir em regras de estilo personalizadas, provavelmente quer a melhor qualidade de saída.&lt;/p&gt;
&lt;h2&gt;Caching a nível de bloco: a base de dados como memória de tradução&lt;/h2&gt;
&lt;p&gt;Nós não chamamos DeepL para blocos que não foram alterados. O mecanismo de cache é a própria tabela &lt;code&gt;TranslationBlock&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Cada &lt;code&gt;EntryBlock&lt;/code&gt; de origem tem um &lt;code&gt;ContentHash&lt;/code&gt;, um SHA256 do seu conteúdo semântico (com atributos de metadados como &lt;code&gt;blockId&lt;/code&gt; e &lt;code&gt;deleted&lt;/code&gt; eliminados). Cada &lt;code&gt;TranslationBlock&lt;/code&gt; armazena o &lt;code&gt;SourceContentHash&lt;/code&gt; que estava atual quando a tradução foi feita. Quando o bloco de origem muda, seu hash muda. O orquestrador compara os hashes e só coloca em fila os blocos com incompatibilidades.&lt;/p&gt;
&lt;p&gt;A árvore de decisão para cada bloco se parece com isso:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hash corresponde, existe tradução&lt;/strong&gt; = ignorar (em cache, atualizado)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hash alterado, tradução automática, não bloqueado&lt;/strong&gt; = retraduzir automaticamente&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hash alterado, editado por humanos ou bloqueado&lt;/strong&gt; = marcar como obsoleto, não sobrescrever&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Este terceiro caso é crucial. Se o seu tradutor de alemão tiver refinado manualmente um parágrafo, não o apagamos só porque a fonte inglesa mudou. Marcamo-lo como obsoleto para que ele saiba que precisa de ser revisto, mas o texto traduzido permanece intacto.&lt;/p&gt;
&lt;p&gt;O resultado prático: a edição de um parágrafo num documento de 30 parágrafos desencadeia exatamente uma chamada à API DeepL (bem, um lote que inclui um bloco). Os outros 29 parágrafos, em todas as línguas, já estão armazenados em cache e não custam nada.&lt;/p&gt;
&lt;h2&gt;Porque não usar uma chave separada por inquilino?&lt;/h2&gt;
&lt;p&gt;Pensei seriamente nisso. Dar a cada inquilino a sua própria chave API DeepL, eliminando completamente o problema de isolamento.&lt;/p&gt;
&lt;p&gt;Três razões para não o fazermos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Complexidade de faturação&lt;/strong&gt; Cada inquilino precisaria da sua própria subscrição de DeepL ou de uma forma de fornecer subcontas. O DeepL não oferece gestão de chaves multi-tenant nativamente.&lt;/li&gt;
&lt;li&gt;**Eficiência de custos: Infraestrutura partilhada significa limites de taxas e descontos por volume partilhados. A nossa utilização agregada obtém melhores preços.&lt;/li&gt;
&lt;li&gt;**Simplicidade operacional: uma chave para rodar, uma quota para monitorizar, uma integração para manter.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A desvantagem é que precisamos da camada de isolamento que descrevi. Mas como já temos consultas EF Core com escopo de locatário para todo o resto do sistema, adicioná-las a glossários e regras de estilo foi simples. O padrão já estava lá.&lt;/p&gt;
&lt;h2&gt;O que realmente o protege&lt;/h2&gt;
&lt;p&gt;Para resumir as garantias de isolamento:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Entradas do glossário&lt;/strong&gt; são armazenadas em &lt;code&gt;TenantGlossary&lt;/code&gt; (implementa &lt;code&gt;ITenantScoped&lt;/code&gt;), filtradas pelos filtros de consulta global do EF Core. DeepL IDs de glossário são referências opacas que só são resolvidas dentro do contexto do locatário.&lt;/li&gt;
&lt;li&gt;As regras de estilo e as instruções personalizadas** seguem o mesmo padrão através do &lt;code&gt;TenantStyleRuleList&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;O conteúdo traduzido** reside em &lt;code&gt;TranslationBlock&lt;/code&gt;, com escopo através da cadeia &lt;code&gt;Entry&lt;/code&gt; → &lt;code&gt;Hub&lt;/code&gt;, que também tem escopo de locatário.&lt;/li&gt;
&lt;li&gt;O &lt;code&gt;SaveChanges&lt;/code&gt; guard** define &lt;code&gt;TenantId&lt;/code&gt; automaticamente em novas entidades e lança em escritas entre inquilinos.&lt;/li&gt;
&lt;li&gt;Não há &lt;code&gt;IgnoreQueryFilters()&lt;/code&gt;** em código de produção. Sempre.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;O princípio de design é simples: DeepL vê IDs de recursos. O Rasepi vê entidades com escopo de locatário. O mapeamento entre eles nunca ultrapassa os limites do locatário porque a consulta que resolve o mapeamento é fisicamente incapaz de devolver os dados de outro locatário.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se estiver a construir um SaaS multilocatário que se integra com APIs de terceiros sem suporte nativo do locatário, este padrão funciona bem. Trate a API externa como um mecanismo de execução sem estado, mantenha toda a configuração em seu próprio banco de dados com escopo de locatário, sincronize preguiçosamente e nunca confie em listagens de recursos externos para isolamento.&lt;/p&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="architecture" />
    <category term="translations" />
    <category term="multilingual" />
  </entry>
  <entry>
    <title>Tokens queimados são as novas linhas de código</title>
    <link href="https://www.tcdev.de/pt/blog/tokens-burned-is-the-new-lines-of-code/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/tokens-burned-is-the-new-lines-of-code/</id>
    <updated>2026-04-13T00:00:00Z</updated>
    <summary>Medir a adoção da IA através do gasto de tokens é o mesmo erro que cometemos com as linhas de código nos anos 90. A mesma falha, um novo painel de controlo, riscos muito maiores.</summary>
    <content type="html">&lt;p&gt;O meu feed do LinkedIn está cheio disso há semanas. A minha linha de tempo do X também. Pessoas a publicar capturas de ecrã de gastos com tokens como se fossem relatórios de progresso. Fundadores de startups a gabarem-se de terem gasto 16 mil dólares em Claude Code no mês passado e de terem como objetivo os próximos 60 mil dólares. Tabelas de classificação. Rankings. Títulos como &amp;quot;Lenda do Token&amp;quot; e &amp;quot;Deus da IA&amp;quot;.&lt;/p&gt;
&lt;p&gt;E então, na semana passada, atingiu a massa crítica. A Forbes &lt;a href=&quot;https://www.forbes.com/sites/richardnieva/2026/03/31/the-ai-gods-spending-as-much-as-they-can-on-ai-tokens/&quot;&gt;noticiou o movimento &amp;quot;tokenmaxxing&amp;quot;&lt;/a&gt; que está a varrer o Vale do Silício, onde as empresas competem para ver quem queima mais tokens de IA. Jensen Huang foi ao podcast All-In e disse: &lt;em&gt;&amp;quot;Aquele engenheiro de 500 mil dólares, no final do ano, vou perguntar-lhe: &#39;Quanto gastaste em tokens? Se essa pessoa disser &#39;$5.000&#39;, eu vou-me passar. Se esse engenheiro de 500.000 dólares não consumiu pelo menos 250.000 dólares em fichas, vou ficar profundamente alarmado.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Depois, a [Fortune noticiou] (https://fortune.com/2026/04/09/meta-killed-employee-ai-token-dashboard/) que um funcionário da Meta tinha criado uma tabela de classificação interna chamada &amp;quot;Claudeonomics&amp;quot;, que monitorizava o consumo de tokens pelos mais de 85.000 funcionários da empresa. Os melhores utilizadores recebiam títulos. Num período de 30 dias, o consumo total atingiu 60 biliões de tokens. O melhor utilizador individual teve uma média de 281 mil milhões. Mark Zuckerberg nem sequer entrou no top 250. Enquanto isso, o CTO da Meta, Andrew Bosworth, dizia publicamente que seu melhor engenheiro estava gastando seu salário equivalente em tokens, mas funcionando &amp;quot;5x a 10x mais produtivo&amp;quot;. &amp;quot;É como se fosse dinheiro fácil&amp;quot;, disse Bosworth. &amp;quot;Sem limite.&amp;quot;&lt;/p&gt;
&lt;p&gt;Já trabalho com software há tempo suficiente para perceber o que está a acontecer aqui. Isto são &amp;quot;linhas de código&amp;quot; com um preço muito mais elevado.&lt;/p&gt;
&lt;h2&gt;Já estivemos aqui antes&lt;/h2&gt;
&lt;p&gt;Em 2003, Martin Fowler escreveu [um pequeno artigo sobre por que a produtividade de software não pode ser medida] (https://martinfowler.com/bliki/CannotMeasureProductivity.html) que provavelmente deveria ser leitura obrigatória para todos os executivos técnicos. O seu argumento sobre as linhas de código era preciso:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Uma das minhas maiores irritações são os estudos de produtividade baseados em linhas de código. Qualquer bom programador sabe que pode codificar as mesmas coisas com grandes variações nas linhas de código.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;O problema é óbvio quando o dizemos em voz alta. O LOC mede a atividade, não a produção. Dois programadores podem construir a mesma funcionalidade: um escreve 1.200 linhas, o outro escreve 80. O mais conciso provavelmente construiu um sistema melhor. Sob um regime de LOC, o verboso parece mais produtivo.&lt;/p&gt;
&lt;p&gt;As equipas avaliadas com base no LOC responderam de forma racional. Escreveram mais linhas. Copiaram e colaram em vez de abstrair. Evitaram refactoring porque a eliminação de código prejudicaria os seus números. A métrica moldou o comportamento, mas não em direção a um software melhor. Mais código. Sistemas piores.&lt;/p&gt;
&lt;p&gt;Então, em 2023, a McKinsey publicou um artigo afirmando ter descoberto a medição objetiva da produtividade dos programadores. &lt;a href=&quot;https://newsletter.pragmaticengineer.com/p/measuring-developer-productivity&quot;&gt;A resposta completa de Gergely Orosz e Kent Beck&lt;/a&gt; apontou a mesma falha: quase todas as métricas da McKinsey estavam medindo esforço e produção, não resultados. Kent Beck contou como os inquéritos internos do Facebook sobre o sentimento dos programadores deixaram de ser um feedback útil e passaram a ser negociados pelos gestores com os engenheiros para obterem pontuações mais elevadas. É isso que acontece quando se incentiva uma métrica proxy. O número melhora. A coisa que realmente importava não melhora.&lt;/p&gt;
&lt;p&gt;Seria de esperar que tivéssemos aprendido. Mas não aprendemos.&lt;/p&gt;
&lt;h2&gt;O mesmo erro, unidade diferente&lt;/h2&gt;
&lt;p&gt;A lógica sedutora do tokenmaxxing é assim. Consumo de fichas = uso de IA. Mais uso de IA = as equipas estão a usar IA. Portanto, alto gasto de token = alta adoção de IA = bom.&lt;/p&gt;
&lt;p&gt;É precisamente tão falho quanto medir linhas de código, apenas com um painel de faturamento em vez de um gráfico de confirmação. E para ser justo com o artigo da Forbes, o CEO da Sendbird, John Kim, basicamente disse exatamente isso: &amp;quot;Já vimos este filme antes&amp;quot;. Ele estava a referir-se à cultura LOC dos anos 90 e 2000. O verdadeiro indicador, observou ele, é a quantidade de código gerado por IA que realmente entra em produção. Os gastos com tokens &amp;quot;são mais para iniciar uma conversa&amp;quot;. Eu concordo com isso. Torna-se um problema quando o início da conversa é promovido ao KPI principal.&lt;/p&gt;
&lt;p&gt;[Pesquisa de desenvolvedor 2024 do GitHub] (https://github.blog/news-insights/research/survey-ai-wave-grows/) descobriu que 97% dos desenvolvedores corporativos usaram ferramentas de codificação de IA no trabalho em algum momento. A adoção organizacional significativa, no entanto, exigiu políticas claras, fluxos de trabalho e resultados mensuráveis vinculados aos resultados reais do negócio. Não apenas uso. Não apenas consumo.&lt;/p&gt;
&lt;p&gt;Boris Cherny, o engenheiro por trás do Claude Code, [compartilhou publicamente] (https://x.com/bcherny/status/2004626064187031831) que ele não abriu um IDE durante um mês de trabalho, com o Opus 4.5 escrevendo cerca de 200 PRs. Isso é impressionante. Mas o que o torna impressionante não são os tokens que esses 200 PRs consumiram. O que torna isso impressionante não são os tokens que esses 200 PRs consumiram, mas sim o facto de serem 200 contribuições reais com software a funcionar do outro lado.&lt;/p&gt;
&lt;p&gt;O valor está no resultado. Os tokens são a energia que o levou até lá, nada mais.&lt;/p&gt;
&lt;h2&gt;Quando a métrica se torna o objetivo&lt;/h2&gt;
&lt;p&gt;Existe um princípio chamado Lei de Goodhart: quando uma medida se torna um alvo, ela deixa de ser uma boa medida. A história do desenvolvimento de software é basicamente um museu da Lei de Goodhart em ação.&lt;/p&gt;
&lt;p&gt;O rastreamento de tokens como um KPI de adoção de IA estabelece exatamente a mesma dinâmica. As equipas de engenharia medidas pelo consumo de tokens irão consumir mais tokens. É assim que os incentivos funcionam. Quer parecer mais produtivo? Execute mais alguns loops agênticos. Deixe o modelo raciocinar longamente antes de gerar resultados. Envolva cada tarefa em uma camada de orquestração que chama quatro ferramentas onde uma seria suficiente. O gasto de fichas aumenta. O valor entregue não aumenta.&lt;/p&gt;
&lt;p&gt;Na verdade, a história da Claudeonomics provou-o quase imediatamente. A Fortune observou que &amp;quot;alguns funcionários colocaram agentes de IA a trabalhar durante horas para maximizar a utilização de tokens&amp;quot;. Aí está. A Lei de Goodhart a ser executada em tempo real, dentro de uma empresa que é suposto estar na fronteira da produtividade impulsionada pela IA. A tabela de classificação estava no ar há talvez algumas semanas antes de ser encerrada, e os funcionários já a estavam a manipular, executando agentes em loops. A métrica tinha três semanas e já tinha deixado de medir o que era suposto medir.&lt;/p&gt;
&lt;p&gt;Qualquer programador que esteja a ler isto pode provavelmente pensar em cinco formas de inflacionar as métricas de utilização de tokens sem qualquer benefício para ninguém. Eu não vou listá-las. Mas se eu consigo pensar em cinco, os engenheiros que estão a ser medidos também conseguem.&lt;/p&gt;
&lt;p&gt;Andrej Karpathy descreveu [o momento atual da engenharia de software] (https://x.com/karpathy/status/2004607146781278521) como um &amp;quot;terramoto de magnitude 9&amp;quot; para a profissão. Ele tem razão. Mas os terramotos não se medem pela eletricidade consumida. Eles são medidos pelo que se moveu.&lt;/p&gt;
&lt;h2&gt;A versão documental deste problema&lt;/h2&gt;
&lt;p&gt;Este não é apenas um problema para as equipas de engenharia. Vejo a mesma dinâmica na gestão do conhecimento, que está muito mais perto de nós na Rasepi.&lt;/p&gt;
&lt;p&gt;&amp;quot;Publicámos 400 documentos este trimestre&amp;quot; é um número que soa bem numa apresentação de diapositivos. Não tem nada a dizer sobre se esses documentos são exactos, se alguém os leu ou se a informação neles contida ainda é verdadeira seis meses depois. É possível atingir esse número com IA e sem qualquer tipo de raciocínio. Ruído assistido por tokens publicado em grande escala.&lt;/p&gt;
&lt;p&gt;A métrica honesta é mais difícil de recolher, mas muito mais útil: que percentagem da sua base de conhecimentos reflecte realmente a forma como os seus sistemas funcionam atualmente? Quantas pessoas chegaram a uma resposta correta utilizando a sua documentação? Quantas tentaram, falharam e acabaram por perguntar a alguém no Slack?&lt;/p&gt;
&lt;p&gt;Essas perguntas ainda não têm painéis de controle bonitos. Elas exigem uma reflexão real sobre o que você deseja que a documentação faça pela sua organização. (Este é, não por coincidência, exatamente o problema em torno do qual o Rasepi foi construído. As datas de expiração forçadas existem precisamente para que as equipas tenham de avaliar se o conteúdo ainda é válido, em vez de o deixarem decair silenciosamente por detrás de uma métrica de elevado número de páginas).&lt;/p&gt;
&lt;h2&gt;O que acompanhar em vez disso&lt;/h2&gt;
&lt;p&gt;A resposta honesta a &amp;quot;o nosso investimento em IA está a compensar?&amp;quot; não pode ser lida a partir de um painel de faturação.&lt;/p&gt;
&lt;p&gt;É possível aproximá-la com perguntas melhores: os tempos de ciclo estão a melhorar? O rácio entre as funcionalidades enviadas e os bugs reportados está a evoluir na direção certa? Os engenheiros estão a reportar que passam mais tempo a fazer trabalho de avaliação e menos a escrever? A sua documentação está a manter-se actualizada em vez de se acumular como sedimentos?&lt;/p&gt;
&lt;p&gt;Estes são dados mais difíceis de extrair de uma API. Requerem uma reflexão sobre os resultados que se pretende obter das equipas, o que, reconhecidamente, é o trabalho mais difícil. Mas são as perguntas que interessam, porque têm a ver com resultados e não com entradas.&lt;/p&gt;
&lt;p&gt;O gasto com tokens diz-lhe a quantidade de computação que comprou. Se esse computador se transformou em algo útil é uma questão totalmente diferente. As empresas que não fazem essa distinção vão construir painéis de controlo muito caros que não lhes mostram quase nada.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Passámos anos a otimizar a métrica errada para a produtividade dos programadores. Temos talvez um trimestre antes que o mesmo erro seja incorporado em todos os relatórios de adoção de IA na empresa. A janela para evitar isso está aberta, mas não vai continuar assim.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="ai" />
    <category term="developer-experience" />
    <category term="knowledge-management" />
  </entry>
  <entry>
    <title>A divisão da IA está a dividir a sua equipa ao meio</title>
    <link href="https://www.tcdev.de/pt/blog/the-ai-divide-is-splitting-your-team-in-half/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/the-ai-divide-is-splitting-your-team-in-half/</id>
    <updated>2026-04-10T00:00:00Z</updated>
    <summary>Metade da sua equipa está a construir o futuro com a IA. A outra metade pensa que é uma moda passageira. A diferença entre eles está a tornar-se o maior risco competitivo que a maioria das empresas não vê.</summary>
    <content type="html">&lt;p&gt;Na semana passada, estava numa chamada com um amigo meu que me falou de um dos seus clientes, uma empresa de logística. Um chefe de equipa teve uma reunião de planeamento em que dois dos seus colaboradores construíram um modelo de cenário completo utilizando IA antes mesmo de a reunião começar. Previsões, análises de risco, três abordagens alternativas. As outras quatro pessoas da equipa apareceram com o mesmo formato de apresentação de diapositivos que têm vindo a utilizar há dois anos. A mesma estrutura, o mesmo processo manual, as mesmas estimativas de prazos.&lt;/p&gt;
&lt;p&gt;A reunião foi rapidamente por água abaixo. O par assistido por IA não conseguia perceber porque é que os outros não tinham feito a preparação básica que &amp;quot;demora cinco minutos&amp;quot;. Os outros sentiram-se emboscados, como se as regras do jogo tivessem mudado e ninguém lhes tivesse dito nada. O líder da equipa passou o resto do dia a controlar os danos.&lt;/p&gt;
&lt;p&gt;Esta história já não me surpreende. Há meses que ouço versões dela.&lt;/p&gt;
&lt;h2&gt;A diferença agora é mensurável&lt;/h2&gt;
&lt;p&gt;Não se trata apenas de vibrações. O [2025 Work Trend Index] da Microsoft (https://www.microsoft.com/en-us/worklab/work-trend-index/2025-the-year-the-frontier-firm-is-born), um inquérito a 31.000 trabalhadores em 31 países, revelou que 67% dos líderes estão familiarizados com os agentes de IA, em comparação com apenas 40% dos funcionários. Os líderes são muito mais propensos a ver a IA como um acelerador de carreira (79% contra 67% dos funcionários), e também estão a poupar mais tempo com ela. Quase um terço dos líderes afirma que a IA lhes poupa mais de uma hora por dia.&lt;/p&gt;
&lt;p&gt;Mas aqui está a parte que realmente me marcou: quando questionados sobre como vêem a IA, 52% dos inquiridos disseram que a tratam como uma ferramenta baseada em comandos. Dá-lhe uma instrução, obtém um resultado. Apenas 46% a descreveram como um parceiro de pensamento, algo com o qual se tem uma troca de ideias.&lt;/p&gt;
&lt;p&gt;Esta não é uma diferença pequena. São duas relações fundamentalmente diferentes com a mesma tecnologia. E estes dois grupos participam nas mesmas reuniões, trabalham nos mesmos projectos e, supostamente, caminham na mesma direção.&lt;/p&gt;
&lt;h2&gt;Duas velocidades, uma equipa&lt;/h2&gt;
&lt;p&gt;A consequência prática é que as equipas estão agora a trabalhar a duas velocidades completamente diferentes. As pessoas que integraram a IA no seu trabalho diário não se limitam a produzir mais depressa. Pensam de forma diferente. Abordam os problemas de forma diferente. Chegam às reuniões com o trabalho que costumava demorar uma semana feito numa tarde.&lt;/p&gt;
&lt;p&gt;E as pessoas que ainda não adoptaram a IA (ou que a experimentaram uma vez, acharam-na pouco satisfatória e seguiram em frente) estão a fazer um trabalho genuinamente sólido. Quero ser claro quanto a isso. Não é que eles sejam maus no seu trabalho. É que o teto do que é possível mudou e eles estão a trabalhar sob o antigo.&lt;/p&gt;
&lt;p&gt;Um [estudo de Harvard sobre IA generativa em equipas] (https://papers.ssrn.com/sol3/papers.cfm?abstract_id=5188231) descobriu algo notável: um único indivíduo com IA tem um desempenho superior ao de uma equipa inteira sem IA. Mas uma equipa em que todos utilizam a IA tem um desempenho superior a todos. A implicação é brutal. A adoção mista não oferece um meio-termo. Dá-nos fricção.&lt;/p&gt;
&lt;p&gt;Vi isto em primeira mão num workshop que organizei no mês passado. Os participantes que utilizavam a IA regularmente estavam a terminar os exercícios em metade do tempo, ficando depois frustrados à espera do resto. Os participantes que não utilizavam a IA sentiram-se apressados e, honestamente, um pouco humilhados. Ninguém pretendia este resultado. Aconteceu simplesmente porque a diferença de velocidade é agora tão grande.&lt;/p&gt;
&lt;h2&gt;A vantagem competitiva de que ninguém fala&lt;/h2&gt;
&lt;p&gt;É aqui que isto se torna realmente consequente. O inquérito [State of AI 2025] da McKinsey (https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-state-of-ai) concluiu que 88% das organizações estão a utilizar a IA em pelo menos uma função. Parece ótimo, certo? Mas quase dois terços ainda estão presos em fases de experimentação e piloto. Apenas cerca de um terço começou a escalar a IA em seus negócios. E as empresas que escalaram, aquelas que a McKinsey chama de &amp;quot;alto desempenho&amp;quot;? Representam cerca de 6% dos inquiridos.&lt;/p&gt;
&lt;p&gt;Esses 6% estão a afastar-se de todos os outros a uma velocidade que penso que a maioria das pessoas subestima.&lt;/p&gt;
&lt;p&gt;As empresas de elevado desempenho têm três vezes mais probabilidades de ter redesenhado fundamentalmente os seus fluxos de trabalho em torno da IA. Têm três vezes mais probabilidades de ter líderes seniores a defender ativamente e a modelar a utilização da IA. Três quartos deles estão a expandir ou já expandiram a IA na sua organização, em comparação com um terço de todos os outros.&lt;/p&gt;
&lt;p&gt;Os dados da Microsoft contam uma história semelhante. As empresas que eles chamam de &amp;quot;Empresas de Fronteira&amp;quot; (aquelas com implantação de IA em toda a organização e maturidade avançada) relatam resultados dramaticamente diferentes. 71% dos líderes das Empresas de Fronteira dizem que a sua empresa está a prosperar, em comparação com 39% dos trabalhadores a nível global. 55% dizem que podem assumir mais trabalho, contra 25% globalmente. E têm menos medo de que a IA lhes tire o emprego, e não mais.&lt;/p&gt;
&lt;p&gt;O fosso entre estas empresas e todas as outras não está a diminuir. Está a acelerar.&lt;/p&gt;
&lt;h2&gt;Este é um problema de pessoas disfarçado de um problema de tecnologia&lt;/h2&gt;
&lt;p&gt;A tentação é resolver isto com ferramentas. Lançar o Copilot, comprar algumas licenças, enviar um e-mail a toda a empresa sobre os recursos de IA. Pronto.&lt;/p&gt;
&lt;p&gt;Mas o verdadeiro desafio é cultural. É o chefe de equipa que está na chamada a tentar manter unido um grupo em que metade das pessoas se sente sobrecarregada e a outra metade se sente deixada para trás. É o gestor que tem de explicar a um veterano de 20 anos que o seu fluxo de trabalho, aquele que aperfeiçoou ao longo de uma década, pode já não ser a melhor abordagem. É o empregado júnior que está a utilizar discretamente a IA para produzir trabalho de nível superior e não sabe se deve estar orgulhoso ou preocupado com as consequências políticas.&lt;/p&gt;
&lt;p&gt;A Microsoft descobriu que 47% dos líderes listam a melhoria das competências dos funcionários existentes como uma das principais estratégias da força de trabalho. Isso é encorajador, suponho. Mas a melhoria das competências só funciona se as pessoas quiserem efetivamente aprender. E, neste momento, uma parte significativa da força de trabalho decidiu que a IA não é relevante para eles, não é fiável ou não vale a pena o esforço. Alguns deles podem ter razão em relação a ferramentas específicas. Mas a trajetória mais geral não é opcional (digo isto como alguém que tem sido cético em relação a muitos ciclos de propaganda tecnológica ao longo dos anos, mas este parece diferente).&lt;/p&gt;
&lt;h2&gt;Para onde isto está a ir&lt;/h2&gt;
&lt;p&gt;Não creio que o fosso desapareça. Penso que se alarga. As pessoas que adoptam a IA vão continuar a ser mais rápidas, a produzir mais, a elevar a fasquia do que é uma &amp;quot;produção normal&amp;quot;. As pessoas que não o fizerem sentir-se-ão cada vez mais pressionadas, seja pela administração, pelos colegas ou apenas pela realidade ambiente de que os seus colegas estão a fazer coisas que elas não conseguem.&lt;/p&gt;
&lt;p&gt;As empresas que descobrirem como fazer com que toda a sua equipa acompanhe o processo, e não apenas os entusiastas, terão uma vantagem genuína. E essa vantagem aumenta. Cada mês de fluência organizacional em IA é um mês que os seus concorrentes passam a discutir se devem comprar licenças do ChatGPT.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A maior vantagem competitiva na era da IA não será o modelo que utilizar. Será se toda a sua equipa o utiliza realmente.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A equipa de logística de que falei? O meu amigo disse-me que o chefe da equipa marcou um workshop interno de dois dias. Não é &amp;quot;aqui está como fazer&amp;quot;. É mais do tipo &amp;quot;eis como isto muda a forma como planeamos em conjunto&amp;quot;. Os cépticos precisavam de ver o que era possível no contexto do seu trabalho, não numa demonstração genérica com um cenário inventado. E os entusiastas precisavam de aprender a ter paciência. Para trazer as pessoas consigo em vez de correrem à frente.&lt;/p&gt;
&lt;p&gt;Parece que é esse o trabalho neste momento. Não apenas adotar a IA. Fechar o fosso. Antes que ela nos feche a nós.&lt;/p&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="ai" />
    <category term="collaboration" />
    <category term="knowledge-management" />
  </entry>
  <entry>
    <title>Construir vs Comprar Reimaginado: O que realmente significa em 2026</title>
    <link href="https://www.tcdev.de/pt/blog/build-vs-buy-reimagined-what-it-means-in-2026/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/build-vs-buy-reimagined-what-it-means-in-2026/</id>
    <updated>2026-04-07T00:00:00Z</updated>
    <summary>O custo de construção acabou de cair. Então, o que é que isso significa para todas as empresas SaaS que apostam o seu negócio em &quot;não tem de o construir você mesmo&quot;?</summary>
    <content type="html">&lt;p&gt;Na semana passada, vi um programador júnior da nossa equipa criar uma aplicação CRUD funcional com autenticação, migrações de bases de dados e uma interface de utilizador decente em cerca de 90 minutos. Com o Copilot. Do zero.&lt;/p&gt;
&lt;p&gt;Há cinco anos, essa mesma tarefa teria demorado uma semana. Talvez duas, se contarmos com as configurações de implantação e os fluxos OAuth. E essa mudança, essa compressão do tempo de construção de dias para horas, está a desmantelar silenciosamente uma das questões mais antigas do software: devemos construir ou devemos comprar?&lt;/p&gt;
&lt;h2&gt;A velha estrutura está morta&lt;/h2&gt;
&lt;p&gt;Durante décadas, &amp;quot;construir vs comprar&amp;quot; era um cálculo de custo. Você estimava quantos meses de desenvolvimento seriam necessários para construir algo, multiplicava pelo salário, adicionava algum buffer para manutenção e comparava com a taxa de licença anual de qualquer produto SaaS que fizesse mais ou menos a mesma coisa. Se o SaaS fosse mais barato, comprava-se. Se os seus requisitos fossem suficientemente estranhos, construía.&lt;/p&gt;
&lt;p&gt;Esse enquadramento pressupunha que construir era caro. E era. Mas [de acordo com os dados do Octoverse 2025 do GitHub] (https://github.blog/ai-and-ml/generative-ai/how-ai-is-reshaping-developer-choice-and-octoverse-data-proves-it/), o desenvolvimento assistido por IA agora produz um aumento de 20 a 30 por cento na taxa de transferência. Oitenta por cento dos novos desenvolvedores no GitHub usam o Copilot na primeira semana. Mais de 1,1 milhão de repositórios públicos já integram SDKs do LLM. Construir ficou dramaticamente mais barato, quase da noite para o dia.&lt;/p&gt;
&lt;p&gt;Portanto, a questão não é mais &amp;quot;construir ou comprar&amp;quot;. É algo mais parecido com: pelo que está realmente a pagar quando compra SaaS?&lt;/p&gt;
&lt;h2&gt;O Novo Cálculo&lt;/h2&gt;
&lt;p&gt;Aqui está o que eu acho que a maioria dos fundadores de SaaS (eu incluído, honestamente) não querem ouvir: se toda a sua proposta de valor é &amp;quot;nós salvamos você de construir isso&amp;quot;, você está em apuros. Porque esse fosso acabou de ficar muito mais raso.&lt;/p&gt;
&lt;p&gt;Quando uma equipa consegue criar um protótipo de uma ferramenta interna funcional num dia, a fasquia para o que justifica uma subscrição mensal sobe muito. Não precisa apenas de ser melhor do que aquilo que eles conseguem construir. Tem de ser melhor do que aquilo que eles poderiam construir &lt;em&gt;com a ajuda da IA&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;[A Gartner previu em abril de 2026] (https://www.gartner.com/en/newsroom/press-releases/2026-04-02-gartner-expects-most-enterprises-to-abandon-assistive-ai-for-outcome-focused-workflow-by-2028) que, até 2028, mais de metade das empresas deixará de pagar pela inteligência de assistência e preferirá plataformas que se comprometam com os resultados do fluxo de trabalho. Ainda mais grave: prevêem que, até 2030, as empresas de software que colocam IA sobre aplicações antigas, em vez de as redesenharem para uma execução agêntica, enfrentarão uma compressão das margens de até 80%.&lt;/p&gt;
&lt;p&gt;Oitenta por cento. Isto não é um erro de arredondamento.&lt;/p&gt;
&lt;h2&gt;Então, o que é que realmente sobrevive?&lt;/h2&gt;
&lt;p&gt;Tenho pensado muito sobre isto, em parte porque estamos a construir o Rasepi e preciso de ser honesto comigo mesmo sobre onde está o nosso valor. E acho que a resposta se resume a três coisas que são genuinamente difíceis de replicar com um sprint de codificação de fim de semana, por melhor que seja o seu assistente de IA.&lt;/p&gt;
&lt;p&gt;**Qualquer pessoa pode construir um editor de texto. Construir um sistema de tradução que acompanhe as alterações de conteúdo ao nível do parágrafo, detecte traduções obsoletas através de hashing de conteúdo e trate da adaptação estrutural entre línguas? Isso requer anos de conhecimento do domínio incorporado na arquitetura. A IA pode ajudá-lo a escrever o código mais rapidamente, mas não lhe pode dizer &lt;em&gt;o que&lt;/em&gt; construir.&lt;/p&gt;
&lt;p&gt;**Alguém ainda tem de o executar e manter. Eis o que se passa com a construção: é divertido. Manter? Não é nada divertido. Lidar com casos extremos em sistemas de permissão multi-tenant, acompanhar as peculiaridades dos browsers, gerir migrações de bases de dados entre versões, corrigir CVEs às 2 da manhã, lidar com aquele bug de exportação de PDF que só aparece no Safari. A IA torna a construção inicial mais rápida, com certeza. Mas [pesquisa da Forrester de abril de 2026] (https://www.forrester.com/press-newsroom/forrester-three-years-into-genai-enterprises-are-still-chasing-its-true-transformative-value/) mostra que a maioria das empresas ainda não consegue transformar a adoção da IA em um impacto mensurável, em parte porque a parte difícil nunca foi escrever código. É manter a coisa funcionando, atualizada e funcionando corretamente por anos. A construção é a parte fácil. É o tempo de atividade, as rotações de plantão e as correções incrementais que realmente custam caro.&lt;/p&gt;
&lt;p&gt;**Confiança, segurança e privacidade dos dados: Esta é subestimada. Quando se constrói algo por si próprio, a segurança é sua. É responsável pela encriptação em repouso, registo de auditorias, testes de penetração, conformidade com o GDPR, SOC 2 e o próximo regulamento de que ainda ninguém ouviu falar. Um bom fornecedor de SaaS tem uma equipa inteira cuja única função é garantir que os seus dados não vão parar a um sítio onde não deveriam estar. Para a maioria das empresas, esse não é um custo que queiram suportar internamente. E, honestamente, a maioria das ferramentas internas que vi nem sequer têm controlos de acesso adequados, quanto mais uma pista de auditoria de segurança.&lt;/p&gt;
&lt;h2&gt;O meio-termo compostável&lt;/h2&gt;
&lt;p&gt;O que é interessante é que a resposta cada vez mais não é &amp;quot;construir&amp;quot; &lt;em&gt;ou&lt;/em&gt; &amp;quot;comprar&amp;quot;. É compor. Escolha as ferramentas SaaS que fazem bem as coisas difíceis, expõem boas APIs e permitem que você construa em torno delas.&lt;/p&gt;
&lt;p&gt;É por isso que as arquitecturas de plugins são tão importantes neste momento (e sim, é exatamente nisto que temos investido com o sistema de plugins do Rasepi). Os produtos SaaS que vão prosperar são aqueles que dizem: &amp;quot;Nós tratamos do núcleo duro e específico do domínio. Você personaliza tudo o resto&amp;quot;. Não &amp;quot;aqui está o nosso monólito, é pegar ou largar&amp;quot;.&lt;/p&gt;
&lt;p&gt;[O relatório da Forrester de abril de 2026] (https://www.forrester.com/press-newsroom/forrester-three-years-into-genai-enterprises-are-still-chasing-its-true-transformative-value/) concluiu que a maioria das empresas ainda está a lutar para transformar a adoção da IA num impacto comercial mensurável. As empresas que mais adotam a IA têm 47% mais probabilidade de trabalhar com parceiros de consultoria para preparar seus dados e sistemas. A mensagem é clara: a capacidade de construção em bruto não é o estrangulamento. Saber o que construir e ter a infraestrutura para o suportar é que é o verdadeiro constrangimento.&lt;/p&gt;
&lt;h2&gt;O que isto significa para o SaaS&lt;/h2&gt;
&lt;p&gt;Se estiver a gerir uma empresa SaaS em 2026, penso que existem algumas verdades incómodas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O seu argumento de venda &amp;quot;vamos poupar-lhe tempo&amp;quot; está mais fraco do que nunca.** A poupança de tempo era a venda clássica de SaaS. Mas quando a IA comprime o tempo de construção em 20-30%, o número &amp;quot;tempo poupado&amp;quot; na sua folha de cálculo do ROI diminui proporcionalmente. Você precisa de uma história diferente.&lt;/li&gt;
&lt;li&gt;Ninguém quer saber se você tem 47 integrações. O que lhes interessa é que a documentação permaneça actualizada, que as traduções sejam exactas e que a sua equipa utilize efetivamente a ferramenta. A linguagem da Gartner sobre &amp;quot;fluxo de trabalho centrado nos resultados&amp;quot; não é apenas jargão de analista. É para onde o mercado se está a dirigir.&lt;/li&gt;
&lt;li&gt;O instinto de fechar a sua plataforma e dificultar a mudança é compreensível. Mas a Gartner avisou explicitamente que &amp;quot;os fornecedores de SaaS antigos que tentam fechar os sistemas de registo correm o risco de serem ultrapassados por camadas de orquestração em que as empresas confiam mais&amp;quot;. Ai.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;A versão honesta&lt;/h2&gt;
&lt;p&gt;Vou ser franco sobre o meu ponto de vista. Construir vs comprar nunca foi realmente sobre a tecnologia. Foi sempre uma questão de confiança. Será que confio que este fornecedor compreende o meu problema de forma suficientemente profunda para que a sua solução seja melhor do que a que eu poderia arranjar?&lt;/p&gt;
&lt;p&gt;Em 2026, o &amp;quot;remendar&amp;quot; sofreu uma grande atualização. Por isso, a fasquia da confiança também subiu.&lt;/p&gt;
&lt;p&gt;Para nós, na Rasepi, isso significa que não podemos ser apenas uma ferramenta de documentação que, por acaso, suporta traduções. Temos de ser tão bons nos problemas difíceis, no acompanhamento da tradução ao nível do bloco, na aplicação da frescura do conteúdo, na complexidade multi-tenant, que construir um substituto seria genuinamente doloroso, mesmo com as melhores ferramentas de IA do mundo.&lt;/p&gt;
&lt;p&gt;Esta é a nova questão &amp;quot;construir ou comprar&amp;quot;. Não se trata de &amp;quot;é possível construí-lo?&amp;quot;, mas sim de &amp;quot;deve gastar a sua energia a construí-lo quando outra pessoa já resolveu as partes mais difíceis?&amp;quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A questão nunca foi realmente o custo. A questão era saber onde quer gastar a sua atenção. E num mundo onde construir é barato, a atenção é o único recurso escasso que resta.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="ai" />
    <category term="developer-experience" />
    <category term="knowledge-management" />
  </entry>
  <entry>
    <title>Pare de despedir pessoas porque a IA existe</title>
    <link href="https://www.tcdev.de/pt/blog/stop-firing-people-because-ai-exists/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/stop-firing-people-because-ai-exists/</id>
    <updated>2026-04-04T00:00:00Z</updated>
    <summary>Uma pessoa com IA pode fazer o trabalho de dez. Mas alguém parou para perguntar o que acontece a essa pessoa? Ou o que acontece se mantivermos os dez?</summary>
    <content type="html">&lt;p&gt;Uma amiga minha gere conteúdos para uma empresa SaaS de média dimensão. No ano passado, a sua equipa era composta por oito pessoas. Escritores, editores, um especialista em localização, alguém que tratava da base de conhecimentos. Boa equipa, resultados sólidos. Depois, o diretor executivo participou numa conferência, voltou entusiasmado com a IA e, em três meses, a equipa ficou reduzida a três pessoas. O motivo? _&amp;quot;Com as ferramentas de IA, três pessoas podem produzir o que oito costumavam produzir.&lt;/p&gt;
&lt;p&gt;E, tecnicamente, isso é verdade. As três pessoas restantes estão a produzir praticamente o mesmo volume. Publicações em blogues, documentos de ajuda, actualizações de produtos, comunicações internas. Os números parecem bons num painel de controlo.&lt;/p&gt;
&lt;p&gt;Mas a minha amiga não dorme bem há meses. Está a alternar entre a escrita, a edição, a engenharia de prontidão, o controlo de qualidade dos resultados da IA, a gestão das traduções e todo o trabalho estratégico que costumava ser partilhado por toda a equipa. Os dois colegas que lhe restam estão no mesmo barco. Um deles já está à procura de outro emprego.&lt;/p&gt;
&lt;p&gt;A empresa poupou cinco salários. Está também a perder lentamente as três pessoas que sabem realmente como as coisas funcionam.&lt;/p&gt;
&lt;h2&gt;A matemática que parece correta mas não é&lt;/h2&gt;
&lt;p&gt;Eis o argumento que tem estado a circular nas salas de reuniões desde que o ChatGPT se tornou popular: uma pessoa com IA pode agora fazer o trabalho de dez. E se for esse o caso, porquê manter dez?&lt;/p&gt;
&lt;p&gt;É um argumento convincente. Simples. Limpo. Cabe num slide.&lt;/p&gt;
&lt;p&gt;Também é perigosamente incompleto.&lt;/p&gt;
&lt;p&gt;Sim, a IA pode comprimir tarefas. De acordo com o [Índice de Tendências de Trabalho 2024 da Microsoft] (https://www.microsoft.com/en-us/worklab/work-trend-index/ai-at-work-is-here-now-comes-the-hard-part), 90% dos utilizadores de IA no trabalho afirmam que as ferramentas os ajudam a poupar tempo. Os utilizadores mais intensivos do Microsoft Teams resumiram oito horas de reuniões utilizando o Copilot num único mês. Isto representa um dia inteiro de trabalho recuperado apenas com os resumos das reuniões. E 85% dizem que a IA ajuda-os a concentrarem-se no trabalho mais importante.&lt;/p&gt;
&lt;p&gt;Estes são números reais. Os ganhos de produtividade não são imaginários.&lt;/p&gt;
&lt;p&gt;Mas eis o que os adeptos do &amp;quot;despedir nove pessoas&amp;quot; nunca mencionam: a pessoa que fica não absorve apenas o resultado. Absorve a carga cognitiva, o contexto, a tomada de decisões, a coordenação, a garantia de qualidade e todo o conhecimento institucional que saiu pela porta fora com esses nove antigos colegas.&lt;/p&gt;
&lt;h2&gt;A carga mental não é uma folha de cálculo&lt;/h2&gt;
&lt;p&gt;Existe um conceito em psicologia chamado teoria da carga cognitiva. Este conceito descreve a quantidade total de esforço mental que está a ser utilizado na memória de trabalho num determinado momento. E sempre que se pede a uma pessoa para pensar o que cinco pessoas costumavam partilhar, não se está a poupar esforço. Está a concentrá-lo.&lt;/p&gt;
&lt;p&gt;Penso muito nisto quando as pessoas me dizem que a IA torna os trabalhadores &amp;quot;10 vezes mais produtivos&amp;quot;. Produtivos em quê? A produzir mais palavras? A enviar mais bilhetes? A gerar mais apresentações de diapositivos? Claro. Mas a parte difícil do trabalho do conhecimento nunca foi a produção. É o pensar. Decidir o que produzir. Compreender o contexto. Fazer juízos de valor. Saber quando algo está errado, mesmo quando parece correto à primeira vista.&lt;/p&gt;
&lt;p&gt;A IA não faz isso por si. A IA dá-lhe um primeiro rascunho, e agora tem de ser suficientemente inteligente para o avaliar, suficientemente experiente para detetar os erros subtis e suficientemente presente para reparar quando o resultado está seguramente errado. (Se alguma vez viu alguém enviar um documento interno gerado por IA sem o ler, sabe exatamente o que quero dizer).&lt;/p&gt;
&lt;p&gt;O relatório &lt;a href=&quot;https://www.gallup.com/workplace/659279/global-engagement-falls-second-time-2009.aspx&quot;&gt;Gallup&#39;s 2025 State of the Global Workplace&lt;/a&gt; concluiu que o envolvimento global dos trabalhadores caiu para 21% em 2024, contra 23% no ano anterior. Esta queda custou à economia mundial um valor estimado de 438 mil milhões de dólares em perda de produtividade. O envolvimento dos gestores registou uma queda ainda mais acentuada, de 30% para 27%. As mulheres gestoras registaram um declínio de sete pontos. Os gestores com menos de 35 anos registaram uma descida de cinco pontos.&lt;/p&gt;
&lt;p&gt;Estas são as pessoas que deveriam estar a liderar a adoção da IA. E estão a esgotar-se.&lt;/p&gt;
&lt;h2&gt;O argumento da amplificação&lt;/h2&gt;
&lt;p&gt;Deixem-me oferecer uma forma diferente de pensar sobre isto.&lt;/p&gt;
&lt;p&gt;Se uma pessoa com IA pode fazer o trabalho de dez, então dez pessoas com IA podem fazer o trabalho de cem.&lt;/p&gt;
&lt;p&gt;Lê isto outra vez. Porque esta é a parte de que quase ninguém está a falar, e é a parte que deveria manter todos os CEO acordados à noite. Não porque seja assustadora, mas porque é uma enorme oportunidade que a maioria das empresas está a desperdiçar.&lt;/p&gt;
&lt;p&gt;As empresas que despedem metade da sua força de trabalho porque &amp;quot;a IA dá conta do recado&amp;quot; não estão a ser eficientes. Estão a ser míopes. Estão a otimizar para um número trimestral de efectivos enquanto os seus concorrentes descobrem o que acontece quando se dão ferramentas poderosas a uma equipa completa de pessoas motivadas e experientes.&lt;/p&gt;
&lt;p&gt;Vi isto acontecer num evento de startups em Zurique, no mês passado. Duas empresas do mesmo sector. Mais ou menos do mesmo tamanho, no mesmo mercado. A empresa A tinha reduzido a sua equipa de conteúdos de doze para quatro pessoas. A empresa B manteve os doze e deu-lhes ferramentas de IA e formação. Adivinhe qual delas estava a produzir conteúdos multilingues em seis línguas, a fazer experiências com novos formatos e a enviar actualizações semanais de produtos para a sua base de conhecimentos? (Não era a empresa A.)&lt;/p&gt;
&lt;h2&gt;O que realmente acontece quando se corta&lt;/h2&gt;
&lt;p&gt;Deixem-me explicar o que acontece na prática quando se substitui uma equipa de dez pessoas por um ou dois super-trabalhadores &amp;quot;melhorados com IA&amp;quot;.&lt;/p&gt;
&lt;p&gt;**A primeira semana é óptima. As restantes pessoas estão cheias de energia. Têm novas ferramentas. Estão a produzir muito. A liderança está entusiasmada. Os números do painel de controlo parecem incríveis em relação ao número de funcionários.&lt;/p&gt;
&lt;p&gt;**A única pessoa responsável pela documentação descobre que o conteúdo gerado pela IA precisa de uma revisão séria. Não é uma edição ligeira. Uma revisão profunda. Porque a IA não conhece as nuances do seu produto, o contexto do seu cliente ou as três coisas que mudou na semana passada e que invalidaram metade do que foi escrito. O trabalho de revisão, por si só, consome o tempo que foi &amp;quot;poupado&amp;quot; ao gerar conteúdo mais rapidamente.&lt;/p&gt;
&lt;p&gt;**No quarto mês, surgem as lacunas de conhecimento institucional. Lembra-se das oito pessoas que dispensou? Elas não se limitavam a escrever conteúdos. Tinham relações com os gestores de produto. Entendiam os pontos fracos dos clientes com base em anos de padrões de tickets de suporte. Eles sabiam quais tópicos de documentação geravam mais perguntas. Esse conhecimento foi-se. A IA certamente não o tem.&lt;/p&gt;
&lt;p&gt;**Porque as pessoas restantes estão sobrecarregadas, a qualidade caiu e alguém finalmente percebeu que a base de conhecimento não foi atualizada adequadamente em semanas. Mas os contratados também não têm contexto, pelo que está a pagar mais por hora para obter piores resultados.&lt;/p&gt;
&lt;p&gt;Não estou a inventar isto. Vi este padrão repetir-se em três empresas diferentes só no último ano.&lt;/p&gt;
&lt;h2&gt;Os dados dizem para manter o seu pessoal (e formá-lo)&lt;/h2&gt;
&lt;p&gt;O [Relatório sobre o Futuro do Emprego 2025 do Fórum Económico Mundial] (https://www.weforum.org/publications/the-future-of-jobs-report-2025/digest/) questionou mais de 1.000 empregadores globais sobre os seus planos para a força de trabalho. Os números contam uma história interessante. Sim, 40% dos empregadores planeiam reduzir o pessoal nos casos em que a IA automatiza as tarefas. Mas 85% planeiam melhorar as competências da sua força de trabalho existente. E 70% esperam contratar pessoas com novas competências, e não menos pessoas.&lt;/p&gt;
&lt;p&gt;O relatório prevê um crescimento líquido de 78 milhões de postos de trabalho até 2030. Isto depois de contabilizar os 92 milhões de postos de trabalho deslocados. O mundo não está a evoluir para menos trabalhadores. Está a evoluir para trabalhadores com competências diferentes.&lt;/p&gt;
&lt;p&gt;E eis o que deveria fazer parar todos os diretores executivos &amp;quot;vamos reduzir o número de funcionários&amp;quot;: 64% dos empregadores identificaram o apoio à saúde e ao bem-estar dos empregados como uma estratégia fundamental para a disponibilidade de talentos. Não é &amp;quot;reduzir custos&amp;quot;. Não é &amp;quot;automatizar tudo&amp;quot;. **Apoiar o bem-estar. Porque as empresas que queimam o seu pessoal não conseguem contratar os bons mais tarde.&lt;/p&gt;
&lt;p&gt;Entretanto, um estudo [da BCG e da Harvard Business School] (https://www.bcg.com/publications/2023/how-people-create-and-destroy-value-with-gen-ai) concluiu que, quando as equipas utilizaram a IA para tarefas criativas, cerca de 90% melhoraram o seu desempenho, tendo a qualidade dos resultados aumentado 40% em relação aos grupos de controlo. Mas o estudo também descobriu algo que deveria deixar qualquer líder desconfortável: a diversidade de ideias entre os grupos assistidos por IA caiu 41%.&lt;/p&gt;
&lt;p&gt;Pense no que isso significa. Despedimos sete pessoas da nossa equipa de dez pessoas. As três que ficam utilizam a IA para produzir o mesmo volume. Mas o leque de ideias, perspectivas e abordagens diminui para quase metade. A sua produção parece produtiva, mas torna-se gradualmente homogénea. E ninguém repara até que um concorrente lança algo genuinamente criativo e você não consegue perceber porque é que a sua equipa não está a fazer o mesmo.&lt;/p&gt;
&lt;h2&gt;A carga mental que ninguém orçamenta&lt;/h2&gt;
&lt;p&gt;O inquérito da Microsoft revelou que 68% das pessoas se debatem com o ritmo e o volume de trabalho e 46% sentem-se esgotadas. E este era o estado das coisas &lt;em&gt;antes&lt;/em&gt; de lhes dizer que agora estão a fazer o trabalho dos seus três antigos colegas de equipa.&lt;/p&gt;
&lt;p&gt;Aqui está algo que não aparece nos painéis de produtividade: o custo cognitivo de ser a última linha de defesa. Quando se é a única pessoa a rever os resultados da IA, não se pode ter um dia de folga. Quando é o único proprietário da base de conhecimentos, todas as questões de apoio vão parar à sua secretária. Quando não há ninguém com quem trocar ideias porque a equipa foi &amp;quot;bem dimensionada&amp;quot;, cada decisão é só sua.&lt;/p&gt;
&lt;p&gt;Tenho estado a construir o Rasepi em parte porque vi este problema de perto. Quando as equipas de documentação diminuem, o conhecimento não diminui com elas. A quantidade de conteúdo que precisa de existir, manter-se atualizado e ser exato em todas as línguas não diminui só porque há menos pessoas a mantê-lo. Pelo contrário, aumenta (isto é verdade). Pelo contrário, aumenta (este é exatamente o problema que estamos a construir para resolver com o Rasepi, já agora, com funcionalidades como datas de expiração forçadas e traduções por blocos que tornam as equipas mais pequenas genuinamente mais eficazes em vez de mais sobrecarregadas).&lt;/p&gt;
&lt;p&gt;Mas mesmo as melhores ferramentas não resolvem uma decisão de pessoal fundamentalmente errada. Não se pode automatizar a necessidade de julgamento humano, contexto e cuidado. Apenas se pode tornar esses humanos mais eficazes.&lt;/p&gt;
&lt;h2&gt;O que as empresas inteligentes realmente fazem&lt;/h2&gt;
&lt;p&gt;O mais impressionante nos dados da Microsoft é o aspeto dos &amp;quot;utilizadores avançados de IA&amp;quot;. São pessoas que utilizam a IA várias vezes por dia e poupam mais de 30 minutos. Têm 68% mais probabilidades de experimentar diferentes formas de utilizar a IA. Não se limitam a gerar mais resultados. Reformulam a forma como o trabalho acontece.&lt;/p&gt;
&lt;p&gt;E o melhor de tudo é que existem nas organizações que investem neles. Os utilizadores avançados de IA têm 61% mais probabilidades de ouvir o seu CEO falar da importância da IA no trabalho. Têm mais 53% de probabilidades de serem encorajados pela liderança a repensar toda a sua função. Recebem formação personalizada e não apenas um login no ChatGPT.&lt;/p&gt;
&lt;p&gt;Por outras palavras, os trabalhadores de IA mais produtivos não são sobreviventes solitários de um despedimento. São membros de equipas apoiadas e investidas.&lt;/p&gt;
&lt;p&gt;Deixem-me comparar isto com o que vejo nas empresas que optaram pela via da &amp;quot;redução de efectivos&amp;quot;. Os empregados que ficam não são utilizadores avançados. São generalistas sobrecarregados que tentam desesperadamente manter as coisas a funcionar. Não têm tempo para experimentar a IA porque estão demasiado ocupados a utilizá-la para sobreviver. Não há como repensar a função porque a função é apenas... eles, sozinhos, a fazer tudo.&lt;/p&gt;
&lt;h2&gt;O problema do conhecimento que ninguém menciona&lt;/h2&gt;
&lt;p&gt;Há mais uma coisa. E não ouço ninguém falar sobre isso, o que é estranho porque deveria ser óbvio.&lt;/p&gt;
&lt;p&gt;Quando se despedem trabalhadores experientes, o conhecimento vai-se embora com eles. Não fica no edifício. Não fica no wiki. Não está na IA. Está nas cabeças das pessoas que criaram os processos, compreenderam os casos extremos e sabiam que clientes se preocupavam com que pormenores.&lt;/p&gt;
&lt;p&gt;Sabe o que acontece quando se tem óptimas ferramentas de IA e nenhum conhecimento institucional? Obtém-se uma informação perfeitamente formatada, entregue com confiança e completamente errada. Em grande escala.&lt;/p&gt;
&lt;p&gt;No mês passado, conversei com uma chefe de documentação de uma empresa de fintech (ela não quis ser identificada, o que nos diz alguma coisa). Depois de a sua equipa ter sido reduzida de seis para dois, começaram a confiar fortemente na IA para manter os documentos dos seus programadores. Em quatro meses, notaram um aumento nos pedidos de apoio. Os documentos pareciam bem. Estavam bem escritos e actualizados à primeira vista. Mas continham erros subtis que só alguém com um conhecimento profundo do produto teria detectado. Uma descrição de parâmetro de API que era tecnicamente correta mas praticamente enganadora. Um guia de migração que não incluía um passo que todos os membros da antiga equipa já conheciam. Pequenas coisas que a IA não pode saber porque a IA não participa das suas reuniões, não lê os seus tópicos do Slack, não ouve o frustrado &amp;quot;oh, esse documento está errado novamente&amp;quot; do engenheiro de suporte na máquina de café.&lt;/p&gt;
&lt;h2&gt;A verdadeira questão&lt;/h2&gt;
&lt;p&gt;Portanto, eis o que eu acho que a conversa deveria ser.&lt;/p&gt;
&lt;p&gt;Não: &amp;quot;Quantas pessoas podemos cortar agora que temos IA?&amp;quot;&lt;/p&gt;
&lt;p&gt;Mas sim: &lt;em&gt;&amp;quot;O que é que se torna possível quando damos IA a todas as pessoas que já temos?&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;A sua equipa de documentação de dez pessoas com ferramentas de IA não se torna redundante. Torna-se uma equipa que pode manter o conteúdo em doze línguas em vez de duas. Que pode manter todos os conteúdos actualizados com verificações automáticas de atualidade. Que pode experimentar novos formatos, executar testes A/B em conteúdos de ajuda, criar guias interactivos e ainda ter tempo para pensar estrategicamente sobre o que os clientes realmente precisam.&lt;/p&gt;
&lt;p&gt;A sua equipa de marketing de dez pessoas com IA não se transforma em cinco pessoas a fazer o mesmo trabalho com mais stress. Passa a ser dez pessoas que podem personalizar campanhas a uma escala que antes era impossível, testar mais variações criativas, responder mais rapidamente às mudanças do mercado e ainda ter a largura de banda cognitiva para ter ideias genuinamente originais que a IA nunca teria gerado.&lt;/p&gt;
&lt;p&gt;Isto não é um custo. É um investimento com um retorno que aumenta.&lt;/p&gt;
&lt;h2&gt;Onde é que isto vai parar&lt;/h2&gt;
&lt;p&gt;As empresas que vencerão nos próximos cinco anos não serão as que cortarem mais cabeças. Serão aquelas que descobriram como tornar as suas equipas existentes genuinamente mais capazes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A questão não é se uma pessoa pode fazer o trabalho de dez. A questão é o que acontece quando todos os dez podem fazer o trabalho de cem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se é um líder que está a ler isto, gostaria de lhe pedir uma coisa. Antes de aprovar a próxima ronda de &amp;quot;reestruturação com recurso a IA&amp;quot;, fale com as pessoas que ficaram depois da última ronda. Pergunte-lhes como estão a reagir. Perguntem-lhes o que deixaram de fazer por não haver tempo. Pergunte-lhes o que está a ficar para trás.&lt;/p&gt;
&lt;p&gt;E depois imagine o que poderiam fazer se, em vez de carregarem o fardo sozinhas, tivessem uma equipa completa e as melhores ferramentas disponíveis.&lt;/p&gt;
&lt;p&gt;Isso não é uma fantasia. Para as empresas que estão dispostas a investir nos seus colaboradores em vez de os substituir, esses são os próximos doze meses.&lt;/p&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="ai" />
    <category term="knowledge-management" />
    <category term="collaboration" />
  </entry>
  <entry>
    <title>Leitores e escritores estão em modos mentais diferentes. Porque é que todas as ferramentas lhes dão a mesma interface de utilizador?</title>
    <link href="https://www.tcdev.de/pt/blog/readers-and-writers-need-different-interfaces/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/readers-and-writers-need-different-interfaces/</id>
    <updated>2026-04-03T00:00:00Z</updated>
    <summary>As plataformas de documentação forçam os leitores, os escritores e a IA a entrar numa única interface. Mas consumir conhecimento e criá-lo são tarefas cognitivamente diferentes. O Rasepi separa-as.</summary>
    <content type="html">&lt;p&gt;Abra o Confluence agora mesmo e encontre um documento que precise de ler. O que é que vê?&lt;/p&gt;
&lt;p&gt;Uma barra de ferramentas. Botões de edição. Caixas de comentários. Ligações para o histórico da página. Uma barra lateral cheia de navegação de que não precisa. Pistas de navegação. Campos de metadados. Indicadores de permissão. Toda uma interface de criação em torno do texto que veio aqui para ler.&lt;/p&gt;
&lt;p&gt;Agora pense no que realmente queria: a resposta a uma pergunta, ou os três passos seguintes de um processo, ou uma política que precisa de consultar antes de uma reunião daqui a dez minutos.&lt;/p&gt;
&lt;p&gt;Veio para consumir. A interface pressupõe que veio para criar.&lt;/p&gt;
&lt;p&gt;Este é o padrão em quase todas as plataformas de documentação. Confluence, Notion, SharePoint, GitBook, Nuclino, Slite. Todas elas apresentam o mesmo ambiente aos leitores e escritores. A página é a página. Toda a gente tem a mesma visão, com mais ou menos alguns botões com permissões.&lt;/p&gt;
&lt;p&gt;Parece normal porque nunca tivemos outra coisa. Mas é uma decisão de design, não uma lei da natureza. E é a decisão errada.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.tcdev.de/pt/blog/img/readers-writers-ui.svg&quot; alt=&quot;A mesma interface para ler e escrever cria uma sobrecarga cognitiva&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Ler e escrever não são a mesma tarefa cognitiva&lt;/h2&gt;
&lt;p&gt;Isto não é uma preferência de interface. Trata-se de uma diferença fundamental na forma como o cérebro funciona.&lt;/p&gt;
&lt;p&gt;Quando se escreve, está-se em modo generativo. Está a construir, a organizar, a decidir o que incluir e o que deixar de fora. Precisa de ferramentas: opções de formatação, controlos de estrutura, incorporação de suportes, campos de metadados, histórico de versões, funcionalidades de colaboração. A interface deve proporcionar-lhe poder e flexibilidade.&lt;/p&gt;
&lt;p&gt;Quando se lê, está-se em modo recetivo. Está a analisar, a filtrar, a extrair o que é relevante e a tentar seguir em frente. Necessita de clareza: tipografia limpa, disposição clara, distração mínima. A interface deve sair do caminho.&lt;/p&gt;
&lt;p&gt;A psicologia cognitiva tem uma estrutura clara para isto. A [Teoria da Carga Cognitiva] (https://www.instructionaldesign.org/theories/cognitive-load/), desenvolvida por John Sweller no final dos anos 80, distingue entre carga intrínseca (a dificuldade do material em si), carga germânica (o esforço de aprendizagem e integração) e carga externa (tudo o que o ambiente acrescenta que não ajuda). Todas as barras de ferramentas, barras laterais e botões de edição visíveis para um leitor são cargas estranhas. Não os ajuda a compreender o conteúdo. Concorre ativamente pela atenção.&lt;/p&gt;
&lt;p&gt;A investigação de [Mayer e Moreno (2003)] (https://doi.org/10.1207/S15326985EP3801_6) sobre a aprendizagem multimédia demonstrou que a redução de elementos estranhos melhora a compreensão e a retenção. O seu princípio de coerência é direto: Uma interface de documentação que mostra os controlos de criação aos leitores está a violar este princípio em cada carregamento de página.&lt;/p&gt;
&lt;p&gt;**O leitor não precisa de ver as ferramentas do autor. Mostrá-las na mesma não é neutro. É ativamente prejudicial para a compreensão.&lt;/p&gt;
&lt;h2&gt;Como é que as plataformas actuais lidam com isto (a maioria não lida)&lt;/h2&gt;
&lt;p&gt;Vejamos o que existe.&lt;/p&gt;
&lt;p&gt;O &lt;strong&gt;Confluence&lt;/strong&gt; tem um modo de leitura e um modo de edição, mas o modo de leitura ainda está rodeado pela navegação, metadados e árvore de páginas da plataforma. A barra de ferramentas de edição desaparece quando não se está a editar, mas o quadro mental de &amp;quot;esta é uma página wiki editável&amp;quot; nunca desaparece completamente. Todos os leitores vêem o botão &amp;quot;Editar&amp;quot;. A página sussurra: &lt;em&gt;podes mudar isto.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;O &lt;strong&gt;Notion&lt;/strong&gt; é pior neste aspeto. A sua principal filosofia de design é que tudo é sempre editável. Clique em qualquer lugar e está a escrever. Isso é ótimo para os escritores. É terrível para os leitores que querem apenas absorver o conteúdo sem a ansiedade de modificar algo acidentalmente. A própria [galeria de modelos] do Notion (https://www.notion.com/templates) mostra isso: cada modelo é um espaço de trabalho, não uma publicação.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;O SharePoint&lt;/strong&gt; suporta tecnicamente diferentes layouts de página para visualização e edição, mas a experiência geral continua a ser uma intranet corporativa. Os leitores sentem-se como se estivessem dentro de uma ferramenta empresarial e não a ler um documento optimizado para a compreensão.&lt;/p&gt;
&lt;p&gt;O &lt;strong&gt;GitBook&lt;/strong&gt; é o que mais se aproxima de uma experiência de leitura em primeiro lugar, com a sua saída limpa ao estilo de documentação. Mas mesmo aí, a experiência de leitura serve o pressuposto de que o leitor é um programador que está a olhar para documentos técnicos. Não foi concebido para o consumidor de conhecimentos gerais.&lt;/p&gt;
&lt;p&gt;Nenhuma destas plataformas trata a leitura como uma atividade fundamentalmente diferente da escrita. Tratam-na como escrever com a barra de ferramentas escondida.&lt;/p&gt;
&lt;p&gt;Ferramentas actuais: uma interface, todos os públicos](/pt/blog/img/leitores-escritores-ferramentas-actuais.svg)&lt;/p&gt;
&lt;h2&gt;O custo de uma interface única&lt;/h2&gt;
&lt;p&gt;Este não é apenas um problema estético. Tem consequências mensuráveis.&lt;/p&gt;
&lt;h3&gt;A sobrecarga de informação reduz a compreensão&lt;/h3&gt;
&lt;p&gt;Um [estudo publicado no Journal of Consumer Research] (https://doi.org/10.1086/209336) descobriu que a sobrecarga de informação leva a uma pior qualidade de decisão, com o efeito a aumentar à medida que o rácio entre informação irrelevante e relevante cresce. Uma página de documentação com controlos de criação visíveis, árvores de navegação e campos de metadados aumenta esse rácio para todos os leitores que não estão lá para escrever.&lt;/p&gt;
&lt;h3&gt;A mudança de contexto tem um custo real&lt;/h3&gt;
&lt;p&gt;Quando um sinal de interface diz &amp;quot;pode editar isto&amp;quot;, ativa um quadro cognitivo diferente de &amp;quot;leia isto&amp;quot;. &lt;a href=&quot;https://www.ics.uci.edu/~gmark/&quot;&gt;A investigação de Gloria Mark na UC Irvine&lt;/a&gt; sobre atenção e multitarefas concluiu que são necessários, em média, 23 minutos e 15 segundos para voltar a concentrar-se totalmente após uma mudança de contexto. Um leitor que considere momentaneamente a hipótese de editar (mesmo para corrigir uma gralha) foi retirado do modo de leitura. Não se trata de uma hipótese. Qualquer pessoa que tenha utilizado o Notion conhece a experiência de clicar para selecionar texto e acidentalmente começar a escrever.&lt;/p&gt;
&lt;h3&gt;Leitores e escritores têm necessidades diferentes para o mesmo conteúdo&lt;/h3&gt;
&lt;p&gt;Um escritor precisa de ver a estrutura, os marcadores de formatação, os tipos de blocos, os metadados e os sinais de colaboração. Precisa de toda a maquinaria.&lt;/p&gt;
&lt;p&gt;Um leitor precisa de ver texto limpo, hierarquia clara e o caminho mais rápido para a informação que procura. Precisa do conteúdo, não da maquinaria.&lt;/p&gt;
&lt;p&gt;Servir ambos a partir da mesma interface significa que nenhum deles obtém uma experiência optimizada para o que estão realmente a fazer.&lt;/p&gt;
&lt;h2&gt;E depois há o terceiro público: A IA&lt;/h2&gt;
&lt;p&gt;É aqui que tudo se complica e que as plataformas existentes não estão preparadas.&lt;/p&gt;
&lt;p&gt;A documentação em 2026 tem três consumidores distintos, não dois:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Escritores&lt;/strong&gt; que criam e mantêm conteúdos&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leitores&lt;/strong&gt; que consomem conteúdos visualmente&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sistemas de IA&lt;/strong&gt; que recuperam, analisam e sintetizam conteúdos de forma programática&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cada um destes públicos necessita de uma interface fundamentalmente diferente para o mesmo conteúdo subjacente.&lt;/p&gt;
&lt;p&gt;Os escritores precisam de ferramentas de edição ricas, funcionalidades de colaboração e controlos estruturais. Os leitores precisam de uma apresentação clara e concentrada, com o mínimo de distracções. A IA necessita de resultados estruturados e analisáveis por máquina com metadados explícitos: sinais de atualidade, etiquetas de classificação, endereçamento ao nível do bloco e marcação semântica clara.&lt;/p&gt;
&lt;p&gt;Como discutimos em &lt;a href=&quot;https://www.tcdev.de/pt/blog/builders-not-developers-how-claude-changed-devrel/&quot;&gt;Builders, Not Developers&lt;/a&gt;, os intermediários de IA já são o consumidor dominante de documentação para uma parte crescente dos trabalhadores do conhecimento. &lt;a href=&quot;https://github.blog/news-insights/research/survey-ai-wave-grows/&quot;&gt;A pesquisa de desenvolvedores do GitHub de 2024&lt;/a&gt; descobriu que 97% dos desenvolvedores corporativos usaram ferramentas de codificação de IA. Em 2026, [84% dos programadores utilizam regularmente ferramentas de IA] (https://www.index.dev/blog/developer-productivity-statistics-with-ai-tools), sendo que 41% de todo o código é gerado por IA.&lt;/p&gt;
&lt;p&gt;Estes sistemas de IA não querem saber da sua barra lateral ou da sua barra de ferramentas. Eles precisam de dados limpos. E uma plataforma que confunde a visão do leitor com a visão do escritor também está a confundir a superfície consumível pela IA com a superfície de criação humana. São três incompatibilidades numa só interface.&lt;/p&gt;
&lt;p&gt;Três públicos, três necessidades diferentes] (/blog/img/leitores-escritores-três-audiências.svg)&lt;/p&gt;
&lt;h2&gt;Como o Rasepi separa as experiências&lt;/h2&gt;
&lt;p&gt;O Rasepi foi concebido com base no princípio de que criar conteúdos e consumir conteúdos são actividades diferentes que merecem interfaces diferentes.&lt;/p&gt;
&lt;h3&gt;O ambiente do escritor&lt;/h3&gt;
&lt;p&gt;Quando está a escrever no Rasepi, obtém um ambiente de criação completo. Edição de texto rico com TipTap, controlos ao nível do bloco, indicadores de estado da tradução, gestão de expiração, ferramentas de colaboração, vistas da estrutura de conteúdos e tudo o que um escritor precisa para criar e manter documentação de alta qualidade.&lt;/p&gt;
&lt;p&gt;O escritor vê a maquinaria porque precisa da maquinaria.&lt;/p&gt;
&lt;!-- Captura de ecrã: Ambiente de escrita do Rasepi --&gt;
&lt;h3&gt;O ambiente do leitor&lt;/h3&gt;
&lt;p&gt;Quando alguém consome um documento Rasepi, vê uma experiência de leitura limpa e focada. Sem chrome de edição. Sem barras de ferramentas. Sem sinais de &amp;quot;pode modificar isto&amp;quot;. Apenas o conteúdo, apresentado num esquema optimizado para compreensão e leitura.&lt;/p&gt;
&lt;p&gt;O leitor não vê o botão de edição porque não está aqui para editar. Está aqui para aprender algo, seguir um processo ou encontrar uma resposta. A interface respeita essa intenção.&lt;/p&gt;
&lt;!-- Captura de ecrã: Experiência de leitura do Rasepi --&gt;
&lt;h3&gt;A superfície da IA&lt;/h3&gt;
&lt;p&gt;Para os consumidores de IA, o Rasepi expõe o conteúdo através de APIs estruturadas com metadados completos. Cada bloco tem a sua pontuação de frescura, estado de tradução, hash de conteúdo e etiquetas de classificação. Os sistemas de IA podem consultar o conteúdo ao nível do bloco, filtrar por frescura, excluir material obsoleto ou de rascunho e obter exatamente os dados estruturados de que necessitam.&lt;/p&gt;
&lt;p&gt;Não é preciso raspar uma página wiki e esperar pelo melhor. A IA obtém uma interface criada para o efeito, tal como o leitor e o escritor.&lt;/p&gt;
&lt;!-- Captura de ecrã: Superfície / API do Rasepi AI --&gt;
&lt;h2&gt;Uma camada de conteúdo, três interfaces&lt;/h2&gt;
&lt;p&gt;O importante é que não estamos a manter três cópias do conteúdo. Este não é o problema das cinco cópias de integração que discutimos em [Stop Maintaining Five Copies of the Same Document] (/blog/stop-maintaining-five-copies-of-the-same-document/).&lt;/p&gt;
&lt;p&gt;Trata-se de uma camada de conteúdo, armazenada como blocos estruturados, servida através de três vistas diferentes optimizadas para três públicos diferentes.&lt;/p&gt;
&lt;p&gt;O redator edita os blocos. O leitor vê o conteúdo montado e estilizado. A IA consulta dados estruturados com metadados. Os mesmos blocos. A mesma fonte de verdade. Camada de apresentação diferente para cada consumidor.&lt;/p&gt;
&lt;p&gt;Isto só é possível devido à arquitetura ao nível dos blocos. Cada conteúdo é uma unidade individualizável com os seus próprios metadados. Pode apresentar esses blocos de forma diferente, dependendo de quem os está a pedir:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Audiência&lt;/th&gt;
&lt;th&gt;Necessidades&lt;/th&gt;
&lt;th&gt;Obtém&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ambiente de criação completo com controlos ao nível dos blocos&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leitor**&lt;/td&gt;
&lt;td&gt;Texto limpo, hierarquia clara, digitalização rápida&lt;/td&gt;
&lt;td&gt;Vista de leitura focada, sem cromo de edição&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API a nível de bloco com metadados completos&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Porque é que isto é mais importante do que parece&lt;/h2&gt;
&lt;p&gt;Poderá ler isto e pensar: &amp;quot;É apenas a interface do utilizador. Vistas diferentes da mesma coisa. Quão importante pode ser?&amp;quot;&lt;/p&gt;
&lt;p&gt;Muito importante, ao que parece.&lt;/p&gt;
&lt;h3&gt;Confiança do leitor&lt;/h3&gt;
&lt;p&gt;As pessoas confiam em conteúdos que parecem publicados. Quando uma página parece um wiki que qualquer pessoa pode editar, os leitores inconscientemente desconfiam dela. Quando o mesmo conteúdo é apresentado numa visualização de leitura limpa e com qualidade de publicação, tem mais autoridade. Isto não é irracional. É um sinal de que alguém levou a apresentação a sério, o que implica que também levou o conteúdo a sério.&lt;/p&gt;
&lt;p&gt;O Nielsen Norman Group estudou extensivamente esta questão. A sua [investigação sobre a credibilidade do conteúdo] (https://www.nngroup.com/articles/trust-signals-content/) mostra que a qualidade do design e a apresentação são dos sinais mais fortes em que os utilizadores confiam para avaliar a fiabilidade do conteúdo. Uma vista de editor desordenada prejudica ativamente a credibilidade do conteúdo que apresenta.&lt;/p&gt;
&lt;h3&gt;Produtividade do escritor&lt;/h3&gt;
&lt;p&gt;Os escritores que trabalham num ambiente de criação dedicado não têm de alternar entre &amp;quot;estou a ler ou estou a escrever?&amp;quot;. As ferramentas estão lá porque é suposto estarem lá, não porque a interface não consegue decidir quem está a olhar para ela.&lt;/p&gt;
&lt;h3&gt;Fiabilidade da IA&lt;/h3&gt;
&lt;p&gt;Quando os sistemas de IA têm uma superfície criada para o efeito com metadados estruturados, podem tomar melhores decisões sobre o que recuperar e o que excluir. Podem verificar as pontuações de atualidade antes de incluir um bloco numa resposta. Podem respeitar as etiquetas de classificação. Podem filtrar por idioma, estado ou público. Nada disto é possível quando a IA está a extrair a mesma página HTML que foi concebida para leitores humanos.&lt;/p&gt;
&lt;h2&gt;A mudança de modelo mental&lt;/h2&gt;
&lt;p&gt;O pressuposto fundamental da maioria das plataformas de documentação é: &lt;em&gt;a página é a unidade, e toda a gente interage com a página.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;O pressuposto do Rasepi é diferente: O pressuposto do Rasepi é diferente: &lt;em&gt;o bloco é a unidade, e diferentes públicos interagem com os blocos através de superfícies criadas para o efeito.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Isto parece uma pequena distinção arquitetónica. Mas não é. É a diferença entre uma ferramenta que mostra acidentalmente conteúdos a sistemas de IA e uma que os serve deliberadamente. Entre um ambiente de escrita que por acaso é legível e uma experiência de leitura que foi concebida de raiz. Entre uma interface suficientemente boa e três excelentes.&lt;/p&gt;
&lt;p&gt;A documentação já não é apenas escrita e lida. É escrita, lida, consultada, traduzida, pontuada, classificada e fornecida a sistemas de IA em grande escala. Uma única interface não pode otimizar tudo isso, e fingir que pode é a razão pela qual acabámos com wikis que ninguém quer ler e assistentes de IA a extrair respostas de páginas que nunca foram concebidas para serem consumidas por máquinas.&lt;/p&gt;
&lt;p&gt;Os leitores e os escritores estão em modos mentais diferentes. A IA está num modo completamente diferente. A interface deve refletir isso mesmo.&lt;/p&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="ux" />
    <category term="documentation" />
    <category term="knowledge-management" />
  </entry>
  <entry>
    <title>O estado dos documentos em 2026: cinco tendências que definirão a próxima era</title>
    <link href="https://www.tcdev.de/pt/blog/the-state-of-docs-in-2026/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/the-state-of-docs-in-2026/</id>
    <updated>2026-04-03T00:00:00Z</updated>
    <summary>O número de leitores de IA aumentou 500%. A Notion enviou 21.000 agentes. O Confluence recebeu o Rovo. O GitBook publicou o State of Docs. Cinco tendências de toda a indústria que nos dizem para onde a documentação está a ir.</summary>
    <content type="html">&lt;p&gt;De tempos a tempos, reservo uma manhã para ler. Não o código Rasepi, não os problemas do GitHub. Blogs de concorrentes, relatórios do setor, anúncios de palestras, pesquisas com desenvolvedores. O que quer que tenha sido lançado no último trimestre e que tenha a ver com documentação, gestão do conhecimento ou fluxos de trabalho assistidos por IA.&lt;/p&gt;
&lt;p&gt;Fiz isso na semana passada, e a imagem que surgiu foi mais nítida do que eu esperava. Não porque um único anúncio tenha sido inovador, mas porque cinco tendências distintas estão a convergir e, quando as alinhamos, elas traçam um quadro muito claro do que as plataformas de documentação terão de fazer nos próximos dois anos.&lt;/p&gt;
&lt;p&gt;Eis o que descobri.&lt;/p&gt;
&lt;h2&gt;1. A IA é o principal leitor agora. Não os humanos.&lt;/h2&gt;
&lt;p&gt;O GitBook publicou um número impressionante em seu [relatório de dados de documentos de IA] (https://www.gitbook.com/blog/ai-docs-data-2025): A leitura de documentação por IA aumentou mais de 500% em 2025. Quinhentos por cento. Isso não é um erro de arredondamento.&lt;/p&gt;
&lt;p&gt;Enquanto isso, o [2024 Developer Survey] do Stack Overflow (https://survey.stackoverflow.co/2024/) mostrou que 61% dos desenvolvedores gastam mais de 30 minutos por dia procurando respostas. Mas a forma como eles pesquisam mudou. A própria pesquisa do GitHub descobriu que &lt;a href=&quot;https://github.blog/news-insights/research/survey-ai-wave-grows/&quot;&gt;97% dos desenvolvedores corporativos&lt;/a&gt; usaram ferramentas de codificação de IA. Até 2026, &lt;a href=&quot;https://www.index.dev/blog/developer-productivity-statistics-with-ai-tools&quot;&gt;84% dos desenvolvedores&lt;/a&gt; usam ferramentas de IA diariamente, com 41% do código agora gerado por IA. Estas pessoas não estão a navegar na barra lateral do seu wiki. Estão a perguntar ao Claude ou ao Copilot, e a IA está a ler os seus documentos em nome delas.&lt;/p&gt;
&lt;p&gt;A implicação é difícil de exagerar. O seu consumidor mais frequente de documentação já não é uma pessoa com um separador do browser aberto. É um modelo de linguagem que faz chamadas de recuperação. E esse modelo não tem capacidade para olhar para uma página e pensar &amp;quot;hmm, isto parece desatualizado&amp;quot;.&lt;/p&gt;
&lt;p&gt;O GitBook apercebeu-se disso cedo e respondeu com o seu relatório &lt;a href=&quot;https://www.gitbook.com/blog/state-of-docs-2026&quot;&gt;State of Docs 2026&lt;/a&gt; e um impulso para formatos legíveis por máquinas. Também lançaram o &lt;a href=&quot;https://www.gitbook.com/blog/skill-md&quot;&gt;skill.md&lt;/a&gt;, uma convenção para estruturar informações sobre produtos especificamente para agentes de IA. A Google foi mais longe com o seu &lt;a href=&quot;https://blog.google/innovation-and-ai/technology/developers-tools/gemini-api-docsmcp-agent-skills/&quot;&gt;Gemini API Docs MCP&lt;/a&gt;, que liga os agentes de codificação à documentação atual através do Protocolo de Contexto de Modelo. O seu raciocínio foi explícito: os agentes geram código desatualizado porque os seus dados de treino têm uma data limite. A correção do MCP elevou a taxa de aprovação da avaliação para 96,3%.&lt;/p&gt;
&lt;p&gt;Portanto, a primeira tendência está estabelecida. A IA é o leitor principal. As plataformas que tratarem este facto como uma restrição de conceção fundamental, e não como uma funcionalidade a acrescentar mais tarde, terão uma vantagem estrutural.&lt;/p&gt;
&lt;h2&gt;2. A frescura e os metadados de confiança estão a tornar-se obrigatórios&lt;/h2&gt;
&lt;p&gt;A Anthropic entrevistou &lt;a href=&quot;https://www.anthropic.com/81k-interviews&quot;&gt;81.000 utilizadores do Claude&lt;/a&gt; em dezembro de 2025 e publicou os resultados em março de 2026. É o maior estudo qualitativo de utilizadores de IA alguma vez realizado (159 países, 70 línguas). A preocupação mais citada? A falta de fiabilidade. 27% dos inquiridos indicaram-na como a sua principal preocupação, e 79% dessas pessoas tinham-na experimentado em primeira mão.&lt;/p&gt;
&lt;p&gt;Este número deveria deixar qualquer equipa de documentação acordada à noite.&lt;/p&gt;
&lt;p&gt;Quando as respostas da IA não são fiáveis, o problema nem sempre é o modelo. Muitas vezes, o modelo está a reproduzir fielmente o que encontrou num documento obsoleto. O modelo não alucinou. Os seus documentos estavam simplesmente errados e ninguém os assinalou.&lt;/p&gt;
&lt;p&gt;Os dados do Stack Overflow reforçam isso de um ângulo diferente: &lt;a href=&quot;https://survey.stackoverflow.co/2024/&quot;&gt;81% dos programadores&lt;/a&gt; esperam que a IA seja mais integrada na forma como documentam o código no próximo ano. Se 81% dos seus utilizadores estão a fornecer documentos à IA, e 27% dos utilizadores de IA dizem que a falta de fiabilidade é o maior problema, tem um problema de confiança que nenhuma quantidade de engenharia rápida resolve. A correção está na fonte.&lt;/p&gt;
&lt;p&gt;É por isso que os metadados de atualidade são importantes. Não os carimbos de data/hora da &amp;quot;última edição&amp;quot; (estes dizem-nos quando alguém tocou no ficheiro, não se o conteúdo ainda está correto). Frescura real: estado da revisão, saúde da ligação, alinhamento da tradução, sinais de leitura, deteção de desvios de conteúdo. Metadados que uma máquina pode ler e utilizar para decidir se um documento é seguro para citar.&lt;/p&gt;
&lt;p&gt;Estou sempre a voltar a um enquadramento simples. A sua documentação precisa de uma pontuação de crédito. Não um registo de data e hora. Uma pontuação de crédito. (Temos estado a construir exatamente isto com o [sistema de pontuação de frescura] do Rasepi(/features/freshness) e, honestamente, ver os dados da indústria só me deixa mais convencido de que é a decisão certa).&lt;/p&gt;
&lt;h2&gt;3. A tradução está a passar de &amp;quot;projeto&amp;quot; para &amp;quot;pipeline&amp;quot;&lt;/h2&gt;
&lt;p&gt;DeepL publicou um artigo em fevereiro intitulado [&amp;quot;The 6 Translation Transformations Global Businesses Can&#39;t Afford to Miss&amp;quot;] (https://www.deepl.com/en/blog/six-translation-transformations). O seu argumento: a tradução está a tornar-se um desafio operacional contínuo e não um projeto de lote que se realiza trimestralmente.&lt;/p&gt;
&lt;p&gt;Isto está de acordo com tudo o que vejo.&lt;/p&gt;
&lt;p&gt;O modelo antigo era simples. Escrever em inglês. Quando se tem orçamento, contrata-se um tradutor ou recorre-se a um serviço. Receber as traduções. Carregue-as. Está feito até à próxima vez. O problema é que a &amp;quot;próxima vez&amp;quot; chega cada vez mais depressa quando o seu produto é enviado semanalmente e os seus documentos são actualizados constantemente. Na altura em que a versão alemã volta da revisão, a versão inglesa já foi alterada duas vezes.&lt;/p&gt;
&lt;p&gt;O [Customization Hub] (https://www.deepl.com/customization-hub) do próprio DeepL agora oferece glossários, regras de estilo e configurações de formalidade, o que é ótimo. Mas se essas ferramentas estiverem fora da sua plataforma de documentação, está a gerir uma cadeia de ferramentas de tradução: editor, exportar, traduzir, rever, reimportar, repetir. Cada passo é uma oportunidade para se desviar.&lt;/p&gt;
&lt;p&gt;O Notion não tem suporte multilingue nativo. O Confluence oferece-o através de plugins do mercado. O GitBook &lt;a href=&quot;https://www.gitbook.com/blog/new-in-gitbook-august-2025&quot;&gt;adicionou a tradução automática em agosto de 2025&lt;/a&gt;, que é um passo, mas funciona ao nível da página.&lt;/p&gt;
&lt;p&gt;A verdadeira mudança é do nível da página para o nível do bloco. Quando se controlam as traduções ao nível do parágrafo, só se retraduz o que realmente mudou. Uma edição típica afecta talvez dois parágrafos em quarenta. Isso representa 94% menos trabalho de tradução. (Esta é a arquitetura de tradução principal do Rasepi e, honestamente, a coisa de que mais me orgulho no produto. Mas mesmo deixando-nos de lado, a direção da indústria é clara: tradução contínua, incremental e incorporada é para onde isto se dirige).&lt;/p&gt;
&lt;h2&gt;4. Os agentes de IA precisam de conteúdo estruturado, não de páginas wiki&lt;/h2&gt;
&lt;p&gt;Esta questão cristalizou-se para mim quando a Notion anunciou [Custom Agents] (https://www.notion.com/blog/introducing-custom-agents) em fevereiro. 21.000 agentes construídos durante o acesso antecipado. Agentes que respondem a perguntas de bases de conhecimento, encaminham tarefas, compilam relatórios de estado. Só o Ramp tem mais de 300 agentes.&lt;/p&gt;
&lt;p&gt;A Atlassian seguiu uma direção semelhante. A &lt;a href=&quot;https://www.atlassian.com/blog/confluence/create-and-edit-with-rovo&quot;&gt;Rovo AI in Confluence&lt;/a&gt; extrai contexto de toda a Atlassian e de aplicações de terceiros para gerar conteúdo. A sua proposta: &amp;quot;conteúdo rico em contexto e de alta qualidade baseado no trabalho existente da sua equipa&amp;quot;.&lt;/p&gt;
&lt;p&gt;E depois a Anthropic lançou &lt;a href=&quot;https://www.anthropic.com/news/claude-opus-4-6&quot;&gt;equipas de agentes no Claude Code&lt;/a&gt;, onde vários agentes de IA se coordenam autonomamente em tarefas complexas. O Opus 4.6 tem uma pontuação de 76% no benchmark MRCR de 1M com 8 agulhas (acima dos 18,5% do modelo anterior), o que significa que pode realmente recuperar informações enterradas em grandes conjuntos de documentos sem perder o rasto.&lt;/p&gt;
&lt;p&gt;As três empresas estão a criar agentes que consomem documentação. Nenhuma delas resolveu o problema da qualidade da fonte.&lt;/p&gt;
&lt;p&gt;A documentação dos agentes personalizados da Notion reconhece explicitamente o [risco de injeção imediata] (https://www.notion.com/blog/introducing-custom-agents) quando os agentes lêem conteúdo não confiável. O Rovo da Atlassian pega tudo o que encontra no seu Confluence. Se esse conteúdo estiver três meses desatualizado, o Rovo não sabe. Ele se baseia nele de qualquer maneira.&lt;/p&gt;
&lt;p&gt;Para que os agentes trabalhem de forma confiável, eles precisam de mais do que páginas de texto. Precisam de conteúdo estruturado com identificadores estáveis, sinais de atualização explícitos, metadados de classificação claros e a capacidade de distinguir &amp;quot;isto é atual e revisto&amp;quot; de &amp;quot;isto existe mas ninguém lhe toca há um ano&amp;quot;. As páginas Wiki não oferecem isso. O conteúdo estruturado ao nível do bloco com metadados de confiança fornece-o.&lt;/p&gt;
&lt;h2&gt;5. O código aberto e a auto-hospedagem estão a regressar&lt;/h2&gt;
&lt;p&gt;Este último é mais um pressentimento apoiado por dados do que um anúncio único.&lt;/p&gt;
&lt;p&gt;GitBook &lt;a href=&quot;https://www.gitbook.com/blog/free-open-source-documentation&quot;&gt;open-sourced sua documentação publicada&lt;/a&gt; no final de 2024 e lançou um fundo OSS. O seu raciocínio: os projectos de código aberto merecem ferramentas de documentação gratuitas e de alta qualidade. Mas o movimento também sinaliza algo mais amplo.&lt;/p&gt;
&lt;p&gt;O Notion é apenas na nuvem. Não há opção de auto-hospedagem. O Confluence Data Center existe, mas requer uma licença. Quando a sua plataforma de documentação contém o seu conhecimento operacional mais sensível (manuais de incidentes, procedimentos de conformidade, decisões de arquitetura), a questão de &amp;quot;quem controla estes dados?&amp;quot; não é abstrata.&lt;/p&gt;
&lt;p&gt;O post do Anthropic &lt;a href=&quot;https://www.anthropic.com/news/claude-is-a-space-to-think&quot;&gt;&amp;quot;Claude is a space to think&amp;quot;&lt;/a&gt; de fevereiro apresentou um argumento interessante sobre confiança e modelos de negócio. A sua alegação principal: os incentivos publicitários são incompatíveis com um assistente de IA genuinamente útil. Optaram por não ter publicidade para que os utilizadores possam confiar na ferramenta.&lt;/p&gt;
&lt;p&gt;Penso que existe um paralelo para as plataformas de documentação. Se o seu sistema de documentação é de código fechado e apenas na nuvem, não pode verificar o que alimenta a IA. Não é possível auditar os cálculos de atualização. Não pode garantir que os seus dados permaneçam sob o seu controlo. Para as equipas que estão a implementar assistentes de IA sobre a sua base de conhecimentos (e cada vez mais, todos o fazem), a auditabilidade é importante.&lt;/p&gt;
&lt;p&gt;Esta não é uma polémica sobre o código aberto ser moralmente superior. Os produtos de código fechado podem ser absolutamente fiáveis. Mas quando se está a construir fluxos de trabalho com IA em cima da documentação interna, a capacidade de inspecionar e verificar o sistema é uma vantagem prática. Para nós, o licenciamento do Rasepi pelo MIT não foi uma reflexão tardia. Foi uma decisão de design baseada na mesma lógica: a infraestrutura de documentação deve ser auditável.&lt;/p&gt;
&lt;h2&gt;O que estas cinco tendências significam em conjunto&lt;/h2&gt;
&lt;p&gt;Individualmente, cada uma dessas tendências é gerenciável. A IA lê os seus documentos? Muito bem, adicione alguns metadados legíveis por máquina. A atualidade é importante? Ótimo, adicione datas de revisão. A tradução precisa de ser contínua? Claro, integre DeepL. Os agentes precisam de estrutura? É justo, melhore o seu modelo de conteúdos. A soberania é importante? Ótimo, ofereça uma opção auto-hospedada.&lt;/p&gt;
&lt;p&gt;Mas, em conjunto, descrevem uma plataforma que é fundamentalmente diferente da que a maioria das equipas utiliza atualmente.&lt;/p&gt;
&lt;p&gt;A diferença é arquitetónica. Não se trata de cinco funcionalidades que se acrescentam. São cinco pressupostos que precisam de ser incorporados na base. Como o conteúdo é armazenado (a nível de bloco, não a nível de página). Como a confiança é modelada (pontuações de frescura, não carimbos de data/hora). Como funciona a tradução (incremental, incorporada, por parágrafo). Como é que os agentes de IA acedem ao conteúdo (APIs estruturadas com metadados, e não scrapes de páginas). Como é que os dados são controlados (abertos, auditáveis, auto-hospedados).&lt;/p&gt;
&lt;p&gt;Nenhuma plataforma estabelecida foi concebida em torno de todos estes cinco aspectos em simultâneo. Algumas estão a adicioná-los peça a peça. O GitBook está a avançar mais rapidamente na frente da legibilidade da IA. A Notion está a construir uma infraestrutura de agentes. A Atlassian tem uma distribuição empresarial.&lt;/p&gt;
&lt;p&gt;Mas projetar para todos os cinco desde o primeiro dia? Essa é a vantagem de começar do zero quando o terreno muda.&lt;/p&gt;
&lt;p&gt;Sei que estou a ser parcial. Construímos o Rasepi especificamente porque vimos estas tendências a convergir e queríamos uma plataforma que assumisse todas elas desde o início. Tradução ao nível do bloco, expiração forçada, pontuação de frescura, conteúdo estruturado pronto para IA, código aberto. É a tese de todo o projeto.&lt;/p&gt;
&lt;p&gt;Mas mesmo que não existíssemos, penso que qualquer leitura honesta do que aconteceu no primeiro trimestre de 2026 aponta na mesma direção. A documentação está a tornar-se infraestrutura. E as infra-estruturas têm requisitos diferentes das páginas wiki.&lt;/p&gt;
&lt;p&gt;As equipas que descobrirem isto primeiro não terão apenas melhores documentos. Terão agentes de IA mais fiáveis, custos de tradução mais baixos, menos surpresas de conformidade e bases de conhecimento que se mantêm fiáveis ao longo do tempo.&lt;/p&gt;
&lt;p&gt;Esse é o estado dos documentos em 2026. A questão não é se essas tendências são reais. É saber se a sua plataforma foi concebida para elas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cinco tendências. Uma questão de arquitetura: a sua plataforma de documentação foi concebida para 2026 ou continua a servir pressupostos de 2016?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Fontes: &lt;a href=&quot;https://www.gitbook.com/blog/ai-docs-data-2025&quot;&gt;GitBook AI docs data report&lt;/a&gt;, &lt;a href=&quot;https://www.gitbook.com/blog/state-of-docs-2026&quot;&gt;GitBook State of Docs 2026&lt;/a&gt;, &lt;a href=&quot;https://www.gitbook.com/blog/skill-md&quot;&gt;GitBook skill.md&lt;/a&gt;, &lt;a href=&quot;https://blog.google/innovation-and-ai/technology/developers-tools/gemini-api-docsmcp-agent-skills/&quot;&gt;Google Gemini API Docs MCP&lt;/a&gt;, &lt;a href=&quot;https://survey.stackoverflow.co/2024/&quot;&gt;Stack Overflow 2024 Developer Survey&lt;/a&gt;, &lt;a href=&quot;https://github.blog/news-insights/research/survey-ai-wave-grows/&quot;&gt;GitHub 2024 developer survey&lt;/a&gt;, &lt;a href=&quot;https://www.index.dev/blog/developer-productivity-statistics-with-ai-tools&quot;&gt;Index.dev developer productivity statistics&lt;/a&gt;, &lt;a href=&quot;https://www.anthropic.com/81k-interviews&quot;&gt;Anthropic &amp;quot;What 81,000 People Want from AI&amp;quot;&lt;/a&gt;, &lt;a href=&quot;https://www.anthropic.com/news/claude-is-a-space-to-think&quot;&gt;Anthropic &amp;quot;Claude is a space to think&amp;quot;&lt;/a&gt;, &lt;a href=&quot;https://www.anthropic.com/news/claude-opus-4-6&quot;&gt;Claude Opus 4.6&lt;/a&gt;, &lt;a href=&quot;https://www.notion.com/blog/introducing-custom-agents&quot;&gt;Notion Custom Agents&lt;/a&gt;, &lt;a href=&quot;https://www.atlassian.com/blog/confluence/create-and-edit-with-rovo&quot;&gt;Atlassian Rovo in Confluence&lt;/a&gt;, &lt;a href=&quot;https://www.deepl.com/en/blog/six-translation-transformations&quot;&gt;DeepL &amp;quot;6 Translation Transformations&amp;quot;&lt;/a&gt;, &lt;a href=&quot;https://www.deepl.com/customization-hub&quot;&gt;DeepL Customization Hub&lt;/a&gt;, &lt;a href=&quot;https://www.gitbook.com/blog/free-open-source-documentation&quot;&gt;GitBook open source documentation&lt;/a&gt;, &lt;a href=&quot;https://www.gitbook.com/blog/new-in-gitbook-august-2025&quot;&gt;GitBook auto-translate&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="ai" />
    <category term="documentation" />
    <category term="platforms" />
  </entry>
  <entry>
    <title>Construtores, não desenvolvedores: Como a Claude mudou para quem são os seus documentos</title>
    <link href="https://www.tcdev.de/pt/blog/builders-not-developers-how-claude-changed-devrel/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/builders-not-developers-how-claude-changed-devrel/</id>
    <updated>2026-04-02T00:00:00Z</updated>
    <summary>A pessoa que integra a sua API já não lê os seus documentos. Ela senta-se no Claude e descreve o que quer. As relações com os programadores, a documentação da API e todo o funil de arranque têm de ser repensados para esta nova realidade.</summary>
    <content type="html">&lt;p&gt;Há uma pessoa neste momento, algures, a integrar a sua API. Ela não está no seu site de documentação. Não abriu o seu guia de iniciação. Nunca viu o seu playground interativo ou a navegação cuidadosamente concebida na barra lateral.&lt;/p&gt;
&lt;p&gt;Eles estão sentados no Claude. Ou no Copilot. Ou Cursor. Escreveram algo como &lt;em&gt;&amp;quot;integrar a API de faturação Stripe com a minha aplicação Next.js utilizando o router de aplicações&amp;quot;&lt;/em&gt; e esperaram que o código de trabalho voltasse. A IA lia os seus documentos em nome deles. Encontrou os endpoints relevantes, compreendeu o fluxo de autenticação, escolheu os métodos SDK corretos e produziu uma implementação.&lt;/p&gt;
&lt;p&gt;Há duas semanas, na Start Summit Hackathon em St. Gallen, vi isto acontecer em tempo real. Estava a falar com um grupo de estudantes de Ciências da Computação e com alguns fundadores de startups em fase inicial sobre a forma como abordam as novas API, e todos eles descreveram o mesmo fluxo de trabalho: colar o problema numa IA, receber o código de volta, iterar a partir daí. Uma das alunas riu-se quando lhe perguntei se tinha lido os documentos. &amp;quot;Porque é que eu havia de ler? O Claude lê-os por mim&amp;quot;.&lt;/p&gt;
&lt;p&gt;A pessoa nunca visitou o seu sítio. Pode ser que nunca visite o seu site. E é cada vez mais assim que o software é construído.&lt;/p&gt;
&lt;h2&gt;A principal mudança&lt;/h2&gt;
&lt;p&gt;A documentação tem agora dois consumidores fundamentalmente diferentes: os humanos que a lêem e os assistentes de IA que a lêem em nome dos construtores. A maior parte da documentação é optimizada exclusivamente para humanos. A IA já é o leitor dominante.&lt;/p&gt;
&lt;p&gt;Isto muda tudo a jusante:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quando uma IA serve conteúdos obsoletos, o construtor não tem forma de detetar o problema. Os danos são silenciosos.&lt;/li&gt;
&lt;li&gt;Os gestores de produto, designers e analistas estão a enviar software através de assistentes de IA, muitas vezes sem nunca terem lido uma linha de documentação.&lt;/li&gt;
&lt;li&gt;A estrutura legível pela máquina é mais importante do que o design visual. O markdown limpo, os blocos autónomos e os metadados explícitos são o que permite à IA representar o seu produto com precisão.&lt;/li&gt;
&lt;li&gt;Os requisitos de formato dividiram-se.** Os leitores humanos precisam de narrativa. Os intermediários de IA precisam de especificações estruturadas e analisáveis. É necessário servir ambos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;O resto deste post revela como chegamos aqui, o que isso significa para o DevRel e o que você pode fazer sobre isso agora.&lt;/p&gt;
&lt;h2&gt;A viagem que ninguém planeou&lt;/h2&gt;
&lt;p&gt;Durante muito tempo, as relações com os programadores seguiram um caminho bem compreendido. Você escreveu uma documentação abrangente. Publicou guias de início rápido. Dava palestras em conferências. Mantinha uma presença no Stack Overflow. Tornou a referência da sua API pesquisável, os seus SDKs idiomáticos, as suas mensagens de erro úteis.&lt;/p&gt;
&lt;p&gt;Esse caminho pressupõe que o desenvolvedor lerá seu conteúdo. Navegar na sua estrutura. Seguir os seus passos.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.blog/news-insights/research/survey-ai-wave-grows/&quot;&gt;A pesquisa de desenvolvedores do GitHub de 2024&lt;/a&gt; descobriu que 97% dos desenvolvedores corporativos já usaram ferramentas de codificação de IA em algum momento. [A pesquisa anual do Stack Overflow] (https://survey.stackoverflow.co/2024/) mostrou que 76% de todos os desenvolvedores estão usando ou planejando usar ferramentas de IA, com 62% dos profissionais usando-as ativamente no dia a dia. Em 2026, esse número &lt;a href=&quot;https://www.index.dev/blog/developer-productivity-statistics-with-ai-tools&quot;&gt;subiu para 84%&lt;/a&gt;, com 41% de todo o código agora gerado por IA e 51% dos desenvolvedores profissionais usando ferramentas de IA diariamente. Estes números não estão a abrandar.&lt;/p&gt;
&lt;p&gt;A nova viagem tem um aspeto diferente. Alguém descreve o que pretende em linguagem natural. Um assistente de IA lê a documentação, encontra as secções relevantes e gera a integração. O construtor revê o resultado, talvez refine o pedido, talvez faça um seguimento. Minutos, não horas.&lt;/p&gt;
&lt;p&gt;O funil de arranque que as equipas DevRel passaram anos a aperfeiçoar? Está a ser contornado. Não por ser mau. O ponto de entrada simplesmente mudou.&lt;/p&gt;
&lt;h2&gt;Dois consumidores, um conjunto de documentos&lt;/h2&gt;
&lt;p&gt;A documentação tem agora dois públicos fundamentalmente diferentes.&lt;/p&gt;
&lt;p&gt;O primeiro é o leitor humano. Esta pessoa ainda existe. Aparece para tomar decisões de arquitetura, depurar casos extremos, analisar a conformidade e compreender conceitos. Quer explicações narrativas, material de referência bem organizado e um raciocínio claro sobre as soluções de compromisso.&lt;/p&gt;
&lt;p&gt;O segundo é o intermediário de IA. Este lê a sua documentação em nome de um construtor. Não se preocupa com a sua barra lateral. Não aprecia o seu design visual. Precisa de conteúdo estruturado e analisável por máquina: markdown limpo, formatação consistente, especificações explícitas sobre as quais possa raciocinar sem ambiguidade.&lt;/p&gt;
&lt;p&gt;Atualmente, quase todos os sítios de documentação são optimizados exclusivamente para o primeiro público. O segundo público já é o consumidor dominante.&lt;/p&gt;
&lt;p&gt;Jeremy Howard identificou esta tensão quando [propôs a norma /llms.txt] (https://llmstxt.org/) em 2024. A sua observação foi precisa: &lt;em&gt;&amp;quot;Os grandes modelos linguísticos dependem cada vez mais de informações de sítios Web, mas enfrentam uma limitação crítica: as janelas de contexto são demasiado pequenas para lidar com a maioria dos sítios Web na sua totalidade.&amp;quot;&lt;/em&gt; A proposta é simples. Um ficheiro markdown com curadoria em &lt;code&gt;/llms.txt&lt;/code&gt; que dá aos modelos de IA uma visão geral estruturada do seu produto e ligações para os recursos mais importantes. FastHTML, os próprios documentos do Anthropic e um [diretório crescente de projectos] (https://llmstxt.site/) já têm um.&lt;/p&gt;
&lt;p&gt;É uma convenção útil. Mas é também um sintoma de um problema mais profundo. O verdadeiro problema não é o formato. É o facto de a maior parte da documentação nunca ter sido concebida tendo em mente o consumo por parte das máquinas.&lt;/p&gt;
&lt;h2&gt;O construtor não está a cortar nos cantos&lt;/h2&gt;
&lt;p&gt;Existe a tentação de olhar para a pessoa que pede Claude em vez de ler a documentação e concluir que ela está a tomar atalhos. Que ela não entende realmente o que está acontecendo no código. Que ela é, de alguma forma, um desenvolvedor inferior.&lt;/p&gt;
&lt;p&gt;Já tive esta conversa vezes suficientes para saber que isso é normalmente errado.&lt;/p&gt;
&lt;p&gt;Muitos destes construtores são engenheiros sénior que fazem escolhas deliberadas de eficiência. Eles entendem o código, só não querem navegar por quatro páginas de documentação para encontrar as três linhas de que realmente precisam. Eles aprenderam que um assistente de IA pode extrair essas linhas mais rápido do que eles podem procurar por elas, então eles delegam a leitura. (Honestamente, eu próprio faço isto. Não me lembro da última vez que li um guia de iniciação de cima a baixo).&lt;/p&gt;
&lt;p&gt;A Anthropic reconheceu este padrão quando construiu o [Model Context Protocol] (https://modelcontextprotocol.io/introduction). O MCP é agora suportado pelo Claude, ChatGPT, VS Code, Cursor, entre outros. Foi explicitamente concebido para que os assistentes de IA possam aceder a sistemas externos, obter contexto e agir com base nele. A especificação descreve-a como fornecendo &lt;em&gt;&amp;quot;acesso a um ecossistema de fontes de dados, ferramentas e aplicações que irão aumentar as capacidades e melhorar a experiência do utilizador final&amp;quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Leia isto com atenção. É uma linguagem de infraestrutura, não de conveniência. Os construtores que utilizam estas ferramentas não estão a evitar o trabalho. Estão a trabalhar através de uma nova camada, e a sua documentação faz parte dessa camada, quer a tenha concebido ou não.&lt;/p&gt;
&lt;p&gt;Os números confirmam isso. Só o Claude lida agora com [25 mil milhões de chamadas de API por mês] (https://www.incremys.com/en/resources/blog/claude-statistics), com 30 milhões de utilizadores activos mensais em 159 países. &lt;a href=&quot;https://www.incremys.com/en/resources/blog/claude-statistics&quot;&gt;70% das empresas da Fortune 100&lt;/a&gt; usam o Claude. De acordo com um inquérito da Menlo Ventures, a Anthropic detém &lt;a href=&quot;https://fortune.com/2025/12/02/how-anthropics-safety-first-approach-won-over-big-business-and-how-its-own-engineers-are-using-its-claude-ai/&quot;&gt;32% da quota de mercado da IA empresarial por utilização de modelos&lt;/a&gt;, à frente da OpenAI com 25%. Um relatório de investigação do HSBC coloca esse valor ainda mais alto: 40% do total de despesas com IA. Não se trata de ferramentas experimentais. São infra-estruturas primárias.&lt;/p&gt;
&lt;h2&gt;As relações com os programadores foram criadas para uma era diferente&lt;/h2&gt;
&lt;p&gt;Se a sua estratégia DevRel foi concebida antes de 2023, foi concebida para um mundo onde os programadores liam os documentos diretamente. Esse mundo não desapareceu, mas já não é o padrão de interação dominante para uma parte crescente dos criadores.&lt;/p&gt;
&lt;p&gt;Isto altera o cálculo de várias actividades DevRel de longa data.&lt;/p&gt;
&lt;p&gt;**Uma apresentação de 45 minutos numa conferência de programadores chega a uma sala com algumas centenas de pessoas. Um ficheiro &lt;code&gt;/llms.txt&lt;/code&gt; bem estruturado e uma documentação limpa e legível por máquina chegam a todos os construtores que perguntam a qualquer assistente de IA sobre o seu produto, continuamente, em qualquer altura. A palestra é um evento único. A documentação legível por máquina é composta. Não estou a dizer que as conferências não têm valor (acabei de regressar de uma, literalmente), mas a equação de alavancagem mudou.&lt;/p&gt;
&lt;p&gt;**O clássico tutorial de início rápido em cinco passos é cada vez mais uma formalidade. O construtor não segue passos. Descrevem o que pretendem e esperam que a IA produza a integração. Se a API estiver bem documentada num formato de fácil utilização, a IA trata da experiência de arranque de forma mais eficiente do que qualquer tutorial poderia fazer. Em vez disso, os tutoriais devem tornar-se material concetual: explicar por que razão se deve escolher a abordagem A em vez da abordagem B. A IA pode gerar a implementação. É muito menos fiável a explicar as soluções de compromisso.&lt;/p&gt;
&lt;p&gt;**Os dados do seu próprio inquérito mostraram que &lt;a href=&quot;https://survey.stackoverflow.co/2024/&quot;&gt;84% dos programadores&lt;/a&gt; utilizam a documentação técnica diretamente, sendo que 90% destes confiam na documentação contida nos pacotes API e SDK. Mas a forma como &lt;em&gt;acedem&lt;/em&gt; a esses documentos é cada vez mais através de uma camada de IA e não de um separador do browser. As perguntas que ainda chegam ao Stack Overflow tendem a ser as mais difíceis. Casos extremos, depuração de produção, coisas que exigem nuances. Valiosas, com certeza. Mas já não é onde está o volume.&lt;/p&gt;
&lt;h2&gt;Quando a IA lê os seus documentos, a atualidade torna-se crítica&lt;/h2&gt;
&lt;p&gt;Aqui está a parte em que a maioria das equipas não pensou.&lt;/p&gt;
&lt;p&gt;Quando um ser humano lê uma página de documentação, ele pode fazer um julgamento. Pode reparar que as capturas de ecrã parecem antigas, ou que um comentário no final diz que o processo mudou. Podem olhar para ela e pensar &amp;quot;isto parece desatualizado&amp;quot;.&lt;/p&gt;
&lt;p&gt;Um assistente de IA não pode fazer nada disso. Lê o texto, processa-o como um facto e gera uma resposta com total confiança. Se a documentação descrever um ponto final obsoleto, a IA recomendará alegremente a integração com ele. Se a documentação fizer referência a uma infraestrutura que foi substituída há seis meses, a IA descreverá a configuração antiga como atual. Sem hesitação.&lt;/p&gt;
&lt;p&gt;E aqui está o que torna isto pior do que parece: &lt;a href=&quot;https://www.index.dev/blog/developer-productivity-statistics-with-ai-tools&quot;&gt;66% dos programadores&lt;/a&gt; já afirmam que o maior problema das ferramentas de IA é o facto de darem resultados que estão &amp;quot;quase certos, mas não totalmente&amp;quot;. A documentação obsoleta contribui diretamente para esse problema. A IA não está a alucinar. Está a reproduzir fielmente conteúdo desatualizado, e não há forma de o construtor perceber a diferença.&lt;/p&gt;
&lt;p&gt;O construtor confia na IA. A IA confia na documentação. Se a documentação estiver desactualizada, essa cadeia de confiança dá uma resposta seguramente errada.&lt;/p&gt;
&lt;p&gt;Isto sempre foi um problema, obviamente. Os conteúdos obsoletos sempre confundiram as pessoas. Mas os danos foram contidos porque os leitores humanos podiam, por vezes, detectá-los. Os intermediários de IA não conseguem. Amplificam os conteúdos obsoletos, fornecendo-os em grande escala, com autoridade, a pessoas que não têm motivos para duvidar deles.&lt;/p&gt;
&lt;p&gt;A atualidade já não é uma questão de qualidade do conteúdo. É um problema de fiabilidade para todos os fluxos de trabalho alimentados por IA que tocam nos seus documentos.&lt;/p&gt;
&lt;h2&gt;A palavra &amp;quot;programador&amp;quot; é demasiado restrita&lt;/h2&gt;
&lt;p&gt;As pessoas que estão a criar software em 2026 não se identificam todas como programadores. Alguns são designers que pedem ao Claude para construir um protótipo funcional. Alguns são gestores de produto que utilizam o Cursor para enviar ferramentas internas. Outros são analistas de dados que descrevem um pipeline de dados em linguagem natural e deixam um agente montá-lo. Na Start Summit, metade das equipas da hackathon tinha membros sem qualquer experiência em programação que, no final do fim de semana, já estavam a enviar software funcional.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://ramp.com/&quot;&gt;Ramp&lt;/a&gt; é um exemplo útil. A empresa fintech passou de uma avaliação de US $ 5.8 bilhões em 2023 para [US $ 32 bilhões no final de 2025] (https://techcrunch.com/2025/11/17/ramp-hits-32b-valuation-just-three-months-after-hitting-22-5b/), ultrapassando US $ 1 bilhão em receita anualizada ao longo do caminho. Uma das startups de crescimento mais rápido da história. Uma parte amplamente discutida de sua abordagem: gerentes de produto construindo recursos diretamente com ferramentas de IA em vez de esperar em um backlog de engenharia. Os PMs da Ramp não se limitam a escrever especificações. Eles enviam o código. A IA trata da implementação. O PM lida com a intenção.&lt;/p&gt;
&lt;p&gt;Não é um atalho. Trata-se de um novo modelo operacional, que está a funcionar a uma escala que torna muito difícil descartá-lo como uma experiência.&lt;/p&gt;
&lt;p&gt;O próprio estudo interno da Anthropic é revelador. Quando eles [entrevistaram 132 de seus próprios engenheiros] (https://fortune.com/2025/12/02/how-anthropics-safety-first-approach-won-over-big-business-and-how-its-own-engineers-are-using-its-claude-ai/) sobre como eles usam o Claude, os engenheiros relataram usá-lo para cerca de 60% de suas tarefas de trabalho. As utilizações mais comuns? Depurar código existente, compreender o que partes da base de código estavam a fazer e implementar novas funcionalidades. Os engenheiros afirmaram que tendem a entregar ao Claude tarefas que &amp;quot;não são complexas, repetitivas, em que a qualidade do código não é crítica&amp;quot;. E 27% do trabalho que agora fazem com o Claude simplesmente não teria sido feito antes.&lt;/p&gt;
&lt;p&gt;Esta é a própria equipa da Anthropic. As pessoas que construíram o modelo estão a usá-lo como um leitor de documentação, um navegador de base de código e um gerador de primeiro rascunho. Todos os outros estão a fazer o mesmo, apenas com os seus documentos em vez dos deles.&lt;/p&gt;
&lt;p&gt;A Anthropic foi deliberada em chamar isso de persona &amp;quot;construtora&amp;quot;. As suas ferramentas foram concebidas não apenas para engenheiros de software profissionais, mas para qualquer pessoa que consiga descrever o que pretende construir. Quando Claude pode criar uma aplicação full-stack a partir de um design Figma via MCP, a linha tradicional entre &amp;quot;desenvolvedor&amp;quot; e &amp;quot;não desenvolvedor&amp;quot; se dissolve.&lt;/p&gt;
&lt;p&gt;Isso tem implicações reais para qualquer pessoa que mantenha documentação ou se preocupe com a experiência do desenvolvedor. O seu público já não se limita às pessoas que sabem o que é um ponto de extremidade REST. Ele inclui qualquer pessoa cujo assistente de IA possa interagir com seu produto. O PM da Ramp que envia um recurso usando sua API? Provavelmente nunca lerá a sua documentação diretamente. O agente de IA deles lerá com certeza.&lt;/p&gt;
&lt;h2&gt;O que isso significa para a documentação&lt;/h2&gt;
&lt;p&gt;Se a documentação serve agora dois públicos, leitores humanos e intermediários de IA, precisa de funcionar para ambos. Parece óbvio. Na prática, quase ninguém o faz.&lt;/p&gt;
&lt;p&gt;Eis o que eu acho que realmente importa:&lt;/p&gt;
&lt;p&gt;**Se os documentos da sua API são uma página HTML lindamente renderizada que um LLM tem que raspar e analisar, a IA está a trabalhar mais do que deveria. Envie a especificação OpenAPI em bruto juntamente com a versão renderizada. Enviar markdown limpo. Tornar as especificações acessíveis sem exigir que a IA interprete o layout da página.&lt;/p&gt;
&lt;p&gt;**Estrutura ao nível do bloco em vez de narrativa ao nível da página. Os assistentes de IA não consomem documentação página a página. Extraem as secções relevantes. Um documento com títulos claros, parágrafos autónomos e semântica explícita ao nível do bloco é muito mais útil para uma IA do que uma narrativa fluida que requer a leitura de toda a página para obter o contexto.&lt;/p&gt;
&lt;p&gt;**Quando é que este documento foi revisto pela última vez? Ainda é atual? O conteúdo foi assinalado? Estes sinais têm de existir numa forma a que a IA possa aceder, e não apenas como sinais visuais numa página Web. Uma pontuação de atualidade, um estado de expiração, uma data de revisão, são os metadados que permitem a uma IA decidir se um documento é seguro para ser utilizado como fonte.&lt;/p&gt;
&lt;p&gt;**Quando um assistente de IA fornece a um construtor uma resposta confiante baseada num ponto final obsoleto, os danos são piores do que um 404. O construtor constrói sobre ele. Faz o envio. Depois, ele quebra na produção e ninguém sabe o motivo até que alguém rastreie a documentação que deveria ter sido atualizada meses atrás. Cada documento que uma IA possa referenciar precisa de um mecanismo para provar que ainda está atualizado. (Isto é, revelação completa, exatamente o problema que estamos a construir para resolver com o Rasepi. Forçar a expiração de blocos de documentação para que o conteúdo obsoleto não se possa esconder).&lt;/p&gt;
&lt;h2&gt;Começando: audite sua documentação atual&lt;/h2&gt;
&lt;p&gt;Se leu até aqui e está a pensar &amp;quot;ok, mas o que é que eu faço na segunda-feira?&amp;quot;, aqui estão quatro coisas concretas que pode verificar esta semana.&lt;/p&gt;
&lt;p&gt;**1. Abra o Claude ou o ChatGPT e peça-lhe para integrar o seu produto num cenário realista. Não utilize os seus conhecimentos internos. Veja apenas o que a IA produz. Está correto? Está actualizada? Está a utilizar os pontos finais corretos, a versão correta do SDK, o fluxo de autenticação correto? Se a IA estiver errada, é isso que os construtores estão a receber neste momento.&lt;/p&gt;
&lt;p&gt;**2. Escolha as cinco páginas de documentação mais visitadas e pergunte: quando foi a última revisão? Ainda descreve o estado atual do produto? Se não conseguir responder a esta pergunta com confiança, a IA também não conseguirá. Esta é a correção mais importante para a maioria das equipas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Envie formatos legíveis por máquina&lt;/strong&gt; Se você não tem um arquivo &lt;code&gt;/llms.txt&lt;/code&gt;, crie um. Se a sua referência de API estiver disponível apenas como HTML renderizado, exporte a especificação OpenAPI bruta e torne-a acessível. Se os seus documentos estão num CMS que não produz markdown limpo, esse é um problema que vale a pena resolver agora.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Adicione datas de revisão e metadados de atualização.&lt;/strong&gt; Mesmo algo simples, um campo &lt;code&gt;last-reviewed&lt;/code&gt; em seu sistema de gerenciamento de conteúdo, um ciclo de revisão obrigatório para páginas de alto tráfego. Isto dá aos humanos e à IA um sinal sobre se o conteúdo é fiável. Ferramentas como o Rasepi podem &lt;a href=&quot;https://www.tcdev.de/features/freshness&quot;&gt;automatizar isto com expiração forçada ao nível do bloco&lt;/a&gt;, mas mesmo um processo manual é melhor do que nada.&lt;/p&gt;
&lt;h2&gt;A mudança silenciosa na forma como os produtos são representados&lt;/h2&gt;
&lt;p&gt;Há uma consequência mais ampla de tudo isto que vale a pena referir diretamente.&lt;/p&gt;
&lt;p&gt;A sua documentação já não é apenas um manual de referência para os programadores. É o material de origem que os assistentes de IA utilizam para representar o seu produto para o mundo. Quando um construtor pergunta ao Claude como utilizar o seu produto, a resposta do Claude é moldada por tudo o que consegue encontrar e analisar na sua documentação.&lt;/p&gt;
&lt;p&gt;Bons documentos, boa resposta. Desactualizados, ambíguos, fechados em HTML que é difícil de analisar por um modelo? Pior resposta, ou uma resposta incorrecta. Tão simples quanto isso.&lt;/p&gt;
&lt;p&gt;A qualidade da resposta da IA sobre o seu produto é agora um indicador direto da experiência do programador. A maioria das empresas ainda não está a tratar isso dessa forma.&lt;/p&gt;
&lt;p&gt;As equipas que estão à frente nesta matéria, Stripe, Vercel, Cloudflare, Anthropic, tratam a legibilidade da IA como uma preocupação de primeira classe. Um requisito fundamental que molda a forma como a documentação é escrita, estruturada e mantida. Não é um item do backlog para o próximo trimestre.&lt;/p&gt;
&lt;p&gt;O construtor sentado no Claude neste momento, descrevendo o que quer construir, esperando um código funcional em minutos. Talvez nunca mais volte a visitar um sítio de documentação. Mas a IA que os serve fá-lo-á. Constantemente.&lt;/p&gt;
&lt;p&gt;Essa IA é agora o seu leitor mais frequente. A questão é saber se os seus documentos estão preparados para isso.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A melhor estratégia de experiência do programador em 2026 não é uma palestra numa conferência ou um guia de início rápido. É garantir que a IA o faz corretamente.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Este post faz referência a pesquisas e documentação de produtos disponíveis publicamente. As estatísticas são extraídas do &lt;a href=&quot;https://github.blog/news-insights/research/survey-ai-wave-grows/&quot;&gt;Inquérito aos programadores do GitHub de 2024&lt;/a&gt;, do &lt;a href=&quot;https://survey.stackoverflow.co/2024/&quot;&gt;Inquérito aos programadores do Stack Overflow de 2024&lt;/a&gt;, do &lt;a href=&quot;https://www.index.dev/blog/developer-productivity-statistics-with-ai-tools&quot;&gt;Relatório de produtividade dos programadores do Index.dev de 2026&lt;/a&gt;, das &lt;a href=&quot;https://www.incremys.com/en/resources/blog/claude-statistics&quot;&gt;Estatísticas da Incremys Claude&lt;/a&gt; e do &lt;a href=&quot;https://fortune.com/2025/12/02/how-anthropics-safety-first-approach-won-over-big-business-and-how-its-own-engineers-are-using-its-claude-ai/&quot;&gt;Relatório da Fortune sobre o Anthropic&lt;/a&gt;. A especificação /llms.txt é mantida em &lt;a href=&quot;https://llmstxt.org/&quot;&gt;llmstxt.org&lt;/a&gt;. O Protocolo de Contexto de Modelo está documentado em &lt;a href=&quot;https://modelcontextprotocol.io/&quot;&gt;modelcontextprotocol.io&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="ai" />
    <category term="documentation" />
    <category term="developer-experience" />
  </entry>
  <entry>
    <title>Por dentro do mecanismo de tradução: Glossários, Regras de Estilo e Retradução Inteligente</title>
    <link href="https://www.tcdev.de/pt/blog/inside-the-translation-engine-glossaries-style-rules-and-smart-retranslation/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/inside-the-translation-engine-glossaries-style-rules-and-smart-retranslation/</id>
    <updated>2026-03-31T00:00:00Z</updated>
    <summary>Um passo a passo técnico profundo de como o pipeline de tradução do Rasepi realmente funciona: resolução de glossário, DeepL regras de estilo e instruções personalizadas, hashing de conteúdo e a integração que une tudo isso.</summary>
    <content type="html">&lt;p&gt;O nosso &lt;a href=&quot;https://www.tcdev.de/pt/blog/how-plugin-guardrail-and-pipeline-systems-work/&quot;&gt;post de arquitetura anterior&lt;/a&gt; cobriu plugins, guardas de ação e o sistema de pipeline. Este vai mais fundo no motor de tradução, a parte que eu acho que torna o Rasepi fundamentalmente diferente de qualquer outra plataforma de documentação.&lt;/p&gt;
&lt;p&gt;Não é o discurso de marketing sobre traduzir parágrafos em vez de páginas. O código real. Como os glossários são resolvidos por locatário, como as regras de estilo do DeepL e as instruções personalizadas moldam cada tradução, como o hashing de conteúdo impulsiona a deteção de desatualização e como o orquestrador decide quais blocos devem ser retraduzidos.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.tcdev.de/pt/blog/img/translation-engine-deep-dive.svg&quot; alt=&quot;Motor de tradução: glossários, regras de estilo e retradução inteligente&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;A linha de tradução&lt;/h2&gt;
&lt;p&gt;Quando um utilizador guarda um documento, o sistema não se limita a retraduzir tudo. Ele executa uma sequência bastante específica:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Analisa o JSON do TipTap em blocos individuais&lt;/li&gt;
&lt;li&gt;Compara hashes de conteúdo para detetar quais blocos foram realmente alterados&lt;/li&gt;
&lt;li&gt;Para blocos alterados, resolver o glossário do locatário e a lista de regras de estilo para o par de idiomas&lt;/li&gt;
&lt;li&gt;Aplicar regras de estilo, instruções personalizadas e formalidade da configuração do locatário&lt;/li&gt;
&lt;li&gt;Enviar apenas blocos modificados para DeepL&lt;/li&gt;
&lt;li&gt;Atualizar os blocos de tradução e sincronizar os hashes de conteúdo&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cada passo é o seu próprio serviço com a sua própria interface. Isso é importante porque qualquer etapa pode ser trocada por outra coisa, um fornecedor de tradução diferente, um algoritmo de hashing diferente, uma fonte de glossário diferente.&lt;/p&gt;
&lt;h2&gt;Resolução do glossário: com escopo do locatário, sincronizado com DeepL&lt;/h2&gt;
&lt;p&gt;DeepL glossários têm uma restrição que a maioria das pessoas não conhece: &lt;strong&gt;eles são imutáveis.&lt;/strong&gt; Você não pode editar um glossário DeepL. Qualquer mudança significa apagar o antigo e criar um novo.&lt;/p&gt;
&lt;p&gt;O Rasepi lida com isto tratando a base de dados como a fonte da verdade e os DeepL glossários como artefactos descartáveis em tempo de execução. A entidade &lt;code&gt;TenantGlossary&lt;/code&gt; armazena tudo localmente:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public class TenantGlossary : ITenantScoped
{
    public Guid Id { get; set; }
    public Guid TenantId { get; set; }
    public string Name { get; set; }
    public string SourceLanguage { get; set; }     // e.g. &amp;quot;en&amp;quot;
    public string TargetLanguage { get; set; }     // e.g. &amp;quot;de&amp;quot;
    public string? DeepLGlossaryId { get; set; }   // Runtime DeepL ID
    public DateTime? LastSyncedAt { get; set; }
    public bool IsDirty { get; set; } = true;      // Triggers re-sync
    public ICollection&amp;lt;TenantGlossaryEntry&amp;gt; Entries { get; set; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quando um utilizador adiciona uma entrada no glossário, por exemplo, mapeando &amp;quot;Sprint Review&amp;quot; para &amp;quot;Sprint-Überprüfung&amp;quot; para EN→DE, o registo da base de dados é atualizado imediatamente e &lt;code&gt;IsDirty&lt;/code&gt; é definido para &lt;code&gt;true&lt;/code&gt;. O glossário DeepL não é recriado imediatamente. Ele é recriado preguiçosamente, na próxima vez que uma tradução realmente precisar dele.&lt;/p&gt;
&lt;h3&gt;O fluxo de sincronização&lt;/h3&gt;
&lt;p&gt;Antes de cada chamada de tradução, o sistema resolve o glossário:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public async Task&amp;lt;string?&amp;gt; GetOrSyncDeepLGlossaryIdAsync(
    string sourceLanguage, string targetLanguage,
    CancellationToken ct = default)
{
    var glossary = await _db.TenantGlossaries
        .Include(g =&amp;gt; g.Entries)
        .FirstOrDefaultAsync(g =&amp;gt;
            g.SourceLanguage == sourceLanguage &amp;amp;&amp;amp;
            g.TargetLanguage == targetLanguage, ct);

    if (glossary is null || glossary.Entries.Count == 0)
        return null;

    if (!glossary.IsDirty &amp;amp;&amp;amp; glossary.DeepLGlossaryId is not null)
        return glossary.DeepLGlossaryId;

    // Dirty - delete old, create new
    if (glossary.DeepLGlossaryId is not null)
        await _deepL.DeleteGlossaryAsync(glossary.DeepLGlossaryId);

    var entries = glossary.Entries
        .ToDictionary(e =&amp;gt; e.SourceTerm, e =&amp;gt; e.TargetTerm);

    var deepLGlossary = await _deepL.CreateGlossaryAsync(
        $&amp;quot;rasepi-{glossary.Id}&amp;quot;,
        glossary.SourceLanguage,
        glossary.TargetLanguage,
        entries);

    glossary.DeepLGlossaryId = deepLGlossary.GlossaryId;
    glossary.IsDirty = false;
    glossary.LastSyncedAt = DateTime.UtcNow;
    await _db.SaveChangesAsync(ct);

    return glossary.DeepLGlossaryId;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Três coisas dignas de nota aqui:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Sincronização preguiçosa&lt;/strong&gt; Nós só acessamos a API DeepL quando uma tradução é realmente necessária. A edição de entradas do glossário em massa não desencadeia dezenas de chamadas à API.&lt;/li&gt;
&lt;li&gt;**A consulta é executada através de filtros de consulta global EF, então &lt;code&gt;TenantGlossaries&lt;/code&gt; é automaticamente escopo. As entradas do glossário do locatário A nunca entram nas traduções do locatário B.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Um glossário por par de línguas&lt;/strong&gt; DeepL impõe isto de qualquer forma. Um glossário EN→DE, um glossário EN→FR, e assim por diante. O par &lt;code&gt;(SourceLanguage, TargetLanguage)&lt;/code&gt; é único por locatário.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Entradas do glossário&lt;/h3&gt;
&lt;p&gt;As entradas individuais são apenas mapeamentos de termos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public class TenantGlossaryEntry
{
    public Guid Id { get; set; }
    public Guid GlossaryId { get; set; }
    public string SourceTerm { get; set; }   // e.g. &amp;quot;Sprint Review&amp;quot;
    public string TargetTerm { get; set; }   // e.g. &amp;quot;Sprint-Überprüfung&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A API oferece-lhe CRUD completo e importação/exportação de CSV para gestão em massa:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST   /admin/glossaries                       Create glossary
POST   /admin/glossaries/{id}/entries           Add term
PUT    /admin/glossaries/{id}/entries/{entryId}  Update term
DELETE /admin/glossaries/{id}/entries/{entryId}  Remove term
POST   /admin/glossaries/{id}/import            Import CSV
GET    /admin/glossaries/{id}/export            Export CSV
POST   /admin/glossaries/{id}/sync              Force DeepL sync
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A importação de CSV é muito útil para equipas que migram de sistemas de memória de tradução existentes. Exporte os seus termos, limpe-os, importe-os para o Rasepi, e a próxima tradução usa o novo glossário automaticamente.&lt;/p&gt;
&lt;h2&gt;Regras de estilo, instruções personalizadas e formalidade&lt;/h2&gt;
&lt;p&gt;Os glossários lidam com a terminologia. Mas a terminologia é apenas metade da questão. Uma tradução pode usar todas as palavras corretas e ainda assim soar mal. Tom errado, formato de data errado, convenções de pontuação erradas.&lt;/p&gt;
&lt;p&gt;A ** API de regras de estilo** (v3) do DeepL resolve este problema. É possível criar listas de regras de estilo reutilizáveis que combinam dois tipos de controlos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Regras configuradas&lt;/strong&gt;, convenções de formatação predefinidas para datas, horas, pontuação, números e muito mais&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instruções personalizadas&lt;/strong&gt;, diretivas de texto livre que moldam o tom, o fraseado e as convenções específicas do domínio&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;O Rasepi cria e gere estas instruções por inquilino, por idioma de destino. A entidade &lt;code&gt;TenantStyleRuleList&lt;/code&gt; armazena o DeepL &lt;code&gt;style_id&lt;/code&gt; juntamente com as regras configuradas e as instruções personalizadas do locatário:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public class TenantStyleRuleList : ITenantScoped
{
    public Guid Id { get; set; }
    public Guid TenantId { get; set; }
    public string Name { get; set; }
    public string TargetLanguage { get; set; }      // e.g. &amp;quot;de&amp;quot;
    public string? DeepLStyleId { get; set; }       // Runtime DeepL style_id
    public string ConfiguredRulesJson { get; set; }  // Serialized configured rules
    public bool IsDirty { get; set; } = true;
    public DateTime? LastSyncedAt { get; set; }
    public ICollection&amp;lt;TenantCustomInstruction&amp;gt; CustomInstructions { get; set; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Criar listas de regras de estilo&lt;/h3&gt;
&lt;p&gt;Quando um administrador define regras de tradução para alemão, o Rasepi chama a API v3 do DeepL para criar a lista de regras de estilo. Aqui está o que parece:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public async Task&amp;lt;string&amp;gt; CreateOrSyncStyleRuleListAsync(
    TenantStyleRuleList ruleList, CancellationToken ct = default)
{
    if (!ruleList.IsDirty &amp;amp;&amp;amp; ruleList.DeepLStyleId is not null)
        return ruleList.DeepLStyleId;

    // DeepL style rule lists are mutable - we can update in place
    if (ruleList.DeepLStyleId is not null)
    {
        // Replace configured rules on existing list
        await _httpClient.PutAsJsonAsync(
            $&amp;quot;v3/style_rules/{ruleList.DeepLStyleId}/configured_rules&amp;quot;,
            JsonSerializer.Deserialize&amp;lt;JsonElement&amp;gt;(ruleList.ConfiguredRulesJson),
            ct);

        // Sync custom instructions
        await SyncCustomInstructionsAsync(ruleList, ct);

        ruleList.IsDirty = false;
        ruleList.LastSyncedAt = DateTime.UtcNow;
        return ruleList.DeepLStyleId;
    }

    // Create new style rule list
    var payload = new
    {
        name = $&amp;quot;rasepi-{ruleList.TenantId}-{ruleList.TargetLanguage}&amp;quot;,
        language = ruleList.TargetLanguage,
        configured_rules = JsonSerializer.Deserialize&amp;lt;JsonElement&amp;gt;(
            ruleList.ConfiguredRulesJson),
        custom_instructions = ruleList.CustomInstructions.Select(ci =&amp;gt; new
        {
            label = ci.Label,
            prompt = ci.Prompt,
            source_language = ci.SourceLanguage
        })
    };

    var response = await _httpClient.PostAsJsonAsync(&amp;quot;v3/style_rules&amp;quot;, payload, ct);
    var result = await response.Content.ReadFromJsonAsync&amp;lt;StyleRuleResponse&amp;gt;(ct);

    ruleList.DeepLStyleId = result.StyleId;
    ruleList.IsDirty = false;
    ruleList.LastSyncedAt = DateTime.UtcNow;
    await _db.SaveChangesAsync(ct);

    return ruleList.DeepLStyleId;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ao contrário dos glossários, as listas de regras de estilo do DeepL são &lt;strong&gt;mutáveis&lt;/strong&gt;. Pode substituir as regras configuradas no local com &lt;code&gt;PUT /v3/style_rules/{style_id}/configured_rules&lt;/code&gt;, e as instruções personalizadas podem ser adicionadas, actualizadas ou eliminadas individualmente. Muito mais amigável para refinamento iterativo.&lt;/p&gt;
&lt;h3&gt;Como são as regras configuradas&lt;/h3&gt;
&lt;p&gt;As regras configuradas cobrem convenções de formatação que variam de acordo com o idioma ou preferência da empresa. Coisas como:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;dates_and_times&amp;quot;: {
    &amp;quot;time_format&amp;quot;: &amp;quot;use_24_hour_clock&amp;quot;,
    &amp;quot;calendar_era&amp;quot;: &amp;quot;use_bc_and_ad&amp;quot;
  },
  &amp;quot;punctuation&amp;quot;: {
    &amp;quot;periods_in_academic_degrees&amp;quot;: &amp;quot;do_not_use&amp;quot;
  },
  &amp;quot;numbers&amp;quot;: {
    &amp;quot;decimal_separator&amp;quot;: &amp;quot;use_comma&amp;quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Estas regras parecem triviais, mas são muito rápidas. Um documento alemão que usa o formato de hora AM/PM e decimais separados por ponto final é lido como &amp;quot;traduzido do inglês&amp;quot; para um leitor alemão. Definir &lt;code&gt;use_24_hour_clock&lt;/code&gt; e &lt;code&gt;use_comma&lt;/code&gt; para separadores decimais em todas as traduções alemãs elimina isso imediatamente.&lt;/p&gt;
&lt;h3&gt;Instruções personalizadas: este é o verdadeiro poder&lt;/h3&gt;
&lt;p&gt;As instruções personalizadas são diretivas de texto livre, até 200 por lista de regras de estilo, cada uma com um máximo de 300 caracteres. Basicamente, diz a DeepL como moldar a tradução em linguagem simples:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public class TenantCustomInstruction
{
    public Guid Id { get; set; }
    public Guid StyleRuleListId { get; set; }
    public string Label { get; set; }              // e.g. &amp;quot;Tone instruction&amp;quot;
    public string Prompt { get; set; }             // e.g. &amp;quot;Use a friendly, diplomatic tone&amp;quot;
    public string? SourceLanguage { get; set; }    // Optional source lang filter
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Exemplos reais dos nossos inquilinos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;Use a friendly, diplomatic tone&amp;quot;&lt;/code&gt; para uma empresa em fase de arranque que pretende documentos acessíveis&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;Always use &#39;Sie&#39; form, never &#39;du&#39;&amp;quot;&lt;/code&gt; para um escritório de advogados alemão&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;Translate &#39;deployment&#39; as &#39;Bereitstellung&#39;, never &#39;Deployment&#39;&amp;quot;&lt;/code&gt; para termos que necessitam de tratamento dependente do contexto para além do simples mapeamento do glossário&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;Use British English spelling (colour, organisation, licence)&amp;quot;&lt;/code&gt; para empresas sediadas no Reino Unido que traduzem entre variantes do inglês&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;Put currency symbols after the numeric amount&amp;quot;&lt;/code&gt; para corresponder às convenções europeias&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As instruções personalizadas são realmente poderosas para convenções específicas do domínio que não cabem nas entradas do glossário. Um glossário mapeia um termo para outro. Uma instrução personalizada pode dizer &amp;quot;ao traduzir documentos API, use o modo imperativo em vez da voz passiva&amp;quot;. Trata-se de um tipo de controlo completamente diferente.&lt;/p&gt;
&lt;h3&gt;Formalidade&lt;/h3&gt;
&lt;p&gt;O parâmetro &lt;code&gt;formality&lt;/code&gt; de DeepL (&lt;code&gt;default&lt;/code&gt;, &lt;code&gt;more&lt;/code&gt;, &lt;code&gt;less&lt;/code&gt;, &lt;code&gt;prefer_more&lt;/code&gt;, &lt;code&gt;prefer_less&lt;/code&gt;) ainda está disponível como um controlo separado juntamente com as regras de estilo. Alemão &amp;quot;du&amp;quot; versus &amp;quot;Sie&amp;quot;, francês &amp;quot;tu&amp;quot; versus &amp;quot;vous&amp;quot;, níveis de polidez japoneses. Estes são definidos por idioma do locatário através de &lt;code&gt;TenantLanguageConfig&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public class TenantLanguageConfig : ITenantScoped
{
    public string LanguageCode { get; set; }
    public string DisplayName { get; set; }
    public bool IsEnabled { get; set; }
    public TranslationTrigger Trigger { get; set; }
    public string? Formality { get; set; }         // &amp;quot;more&amp;quot;, &amp;quot;less&amp;quot;, &amp;quot;prefer_more&amp;quot;, etc.
    public string? StyleRuleListId { get; set; }   // Links to TenantStyleRuleList
    public string? TranslationProvider { get; set; }
    public int SortOrder { get; set; }
    public bool IsDefault { get; set; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A formalidade, as regras de estilo e os glossários são todos compostos. Uma única chamada de tradução pode conter todos os três:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var glossaryId = await GetOrSyncDeepLGlossaryIdAsync(sourceLang, targetLang, ct);
var styleId = await GetOrSyncStyleRuleListAsync(targetLang, ct);
var formality = tenantLanguageConfig.Formality ?? &amp;quot;default&amp;quot;;

// Build the v2/translate request payload
var payload = new
{
    text = new[] { blockContent },
    source_lang = NormalizeLanguageCode(sourceLang),
    target_lang = NormalizeLanguageCode(targetLang),
    glossary_id = glossaryId,
    style_id = styleId,
    formality = formality,
    preserve_formatting = true,
    context = surroundingContext,  // Adjacent blocks, not billed
    model_type = &amp;quot;quality_optimized&amp;quot;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Duas coisas que vale a pena notar aqui:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;**Passamos blocos adjacentes como contexto para melhorar a qualidade da tradução. O DeepL usa-o para resolver ambiguidades, mas não o traduz nem o fatura. Um parágrafo sobre &amp;quot;células&amp;quot; é traduzido de forma diferente quando o contexto circundante é um documento de biologia versus um manual de folha de cálculo.&lt;/li&gt;
&lt;li&gt;**Seleção do modelo Qualquer pedido com &lt;code&gt;style_id&lt;/code&gt; ou &lt;code&gt;custom_instructions&lt;/code&gt; utiliza automaticamente o modelo &lt;code&gt;quality_optimized&lt;/code&gt; de DeepL. Este é o nível de qualidade mais elevado. Não é possível combiná-los com &lt;code&gt;latency_optimized&lt;/code&gt;, o que é uma limitação deliberada de DeepL. A personalização do estilo necessita do modelo completo.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Porque é que isto é mais importante do que se pensa&lt;/h3&gt;
&lt;p&gt;Imagine uma empresa que escreve documentos internos em alemão com o informal &amp;quot;du&amp;quot; que subitamente muda para o formal &amp;quot;Sie&amp;quot; numa secção traduzida. Parece inconsistente, na melhor das hipóteses, e pouco profissional, na pior. A formalidade trata disso. Mas a formalidade, por si só, não vai apanhar um documento que usa carimbos de data e hora AM/PM quando o seu escritório alemão usa o formato de 24 horas, ou que coloca o símbolo da moeda antes do número em vez de depois.&lt;/p&gt;
&lt;p&gt;Todos estes elementos em conjunto (regras de estilo, instruções personalizadas, formalidade, glossários) produzem traduções que parecem ter sido escritas por alguém da sua equipa. Não como se fossem produzidas por uma máquina que não sabe que a sua empresa existe.&lt;/p&gt;
&lt;h2&gt;A camada de serviço DeepL&lt;/h2&gt;
&lt;p&gt;Toda a comunicação DeepL passa pelo &lt;code&gt;IDeepLService&lt;/code&gt;. Ele envolve o SDK oficial do DeepL .NET e lida com as chamadas da API v3 para regras de estilo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public interface IDeepLService
{
    // Text translation (v2)
    Task&amp;lt;TextResult&amp;gt; TranslateTextAsync(
        string text, string sourceLanguage, string targetLanguage,
        string? options = null);

    Task&amp;lt;TextResult[]&amp;gt; TranslateTextBatchAsync(
        IEnumerable&amp;lt;string&amp;gt; texts, string sourceLanguage,
        string targetLanguage, string? options = null);

    // Glossary management (v2)
    Task&amp;lt;GlossaryInfo&amp;gt; CreateGlossaryAsync(
        string name, string sourceLang, string targetLang,
        Dictionary&amp;lt;string, string&amp;gt; entries);
    Task DeleteGlossaryAsync(string glossaryId);
    Task&amp;lt;GlossaryInfo&amp;gt; GetGlossaryAsync(string glossaryId);
    Task&amp;lt;GlossaryInfo[]&amp;gt; ListGlossariesAsync();
    Task&amp;lt;Dictionary&amp;lt;string, string&amp;gt;&amp;gt; GetGlossaryEntriesAsync(
        string glossaryId);

    // Style rules (v3)
    Task&amp;lt;StyleRuleResponse&amp;gt; CreateStyleRuleListAsync(
        string name, string language,
        JsonElement configuredRules,
        IEnumerable&amp;lt;CustomInstructionRequest&amp;gt; customInstructions);
    Task ReplaceConfiguredRulesAsync(
        string styleId, JsonElement configuredRules);
    Task&amp;lt;CustomInstructionResponse&amp;gt; AddCustomInstructionAsync(
        string styleId, string label, string prompt,
        string? sourceLanguage = null);
    Task DeleteCustomInstructionAsync(
        string styleId, string instructionId);
    Task DeleteStyleRuleListAsync(string styleId);

    // Usage tracking
    Task&amp;lt;Usage&amp;gt; GetUsageAsync();
    Task&amp;lt;Language[]&amp;gt; GetSourceLanguagesAsync();
    Task&amp;lt;Language[]&amp;gt; GetTargetLanguagesAsync();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A implementação trata da normalização do código da língua. DeepL requer &lt;code&gt;EN-US&lt;/code&gt; ou &lt;code&gt;EN-GB&lt;/code&gt; em vez de &lt;code&gt;en&lt;/code&gt; simples, e &lt;code&gt;PT-PT&lt;/code&gt; ou &lt;code&gt;PT-BR&lt;/code&gt; em vez de &lt;code&gt;pt&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;private static string NormalizeLanguageCode(string code)
    =&amp;gt; code.ToLower() switch
    {
        &amp;quot;en&amp;quot; =&amp;gt; &amp;quot;EN-US&amp;quot;,
        &amp;quot;pt&amp;quot; =&amp;gt; &amp;quot;PT-PT&amp;quot;,
        _ =&amp;gt; code.ToUpper()
    };
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A tradução em lote usa 50-item chunking para ficar dentro dos limites da API do DeepL enquanto maximiza a taxa de transferência:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public async Task&amp;lt;TranslationBatchResult&amp;gt; TranslateBatchAsync(
    Dictionary&amp;lt;string, string&amp;gt; texts,
    string sourceLanguage, string targetLanguage)
{
    var translations = new Dictionary&amp;lt;string, string&amp;gt;();
    long totalChars = 0;

    foreach (var chunk in texts.Chunk(50))
    {
        var results = await _deepL.TranslateTextBatchAsync(
            chunk.Select(kv =&amp;gt; kv.Value),
            sourceLanguage, targetLanguage);

        for (int i = 0; i &amp;lt; chunk.Length; i++)
        {
            translations[chunk[i].Key] = results[i].Text;
            totalChars += chunk[i].Value.Length;
        }
    }

    return new TranslationBatchResult
    {
        Translations = translations,
        BilledCharacters = totalChars
    };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Como só enviamos blocos obsoletos, e não documentos inteiros, um lote de tradução típico para uma única edição contém 1-3 blocos em vez de mais de 40. É daí que vem a redução de custos de 94%.&lt;/p&gt;
&lt;h2&gt;O orquestrador de tradução&lt;/h2&gt;
&lt;p&gt;O &lt;code&gt;TranslationOrchestrator&lt;/code&gt; decide o que fazer com cada bloco quando o documento de origem é alterado. Vamos percorrer a árvore de decisão:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public async Task OrchestrateTranslationAsync(
    Guid entryId, List&amp;lt;Guid&amp;gt; changedBlockIds,
    CancellationToken ct = default)
{
    var entry = await _db.Entries
        .FirstOrDefaultAsync(e =&amp;gt; e.Id == entryId, ct);

    var translations = await _db.EntryTranslations
        .Where(t =&amp;gt; t.EntryId == entryId)
        .ToListAsync(ct);

    foreach (var translation in translations)
    {
        var langConfig = await GetLanguageConfigAsync(
            translation.Language, ct);

        var translationBlocks = await _db.TranslationBlocks
            .Where(tb =&amp;gt; changedBlockIds.Contains(tb.SourceBlockId)
                      &amp;amp;&amp;amp; tb.Language == translation.Language)
            .ToListAsync(ct);

        foreach (var block in translationBlocks)
        {
            if (block.IsLocked || block.TranslatedById is not null)
            {
                // Human-edited or locked - mark stale, don&#39;t overwrite
                block.Status = TranslationStatus.Stale;
            }
            else if (langConfig.Trigger == TranslationTrigger.AlwaysTranslate)
            {
                // Machine-translated, auto mode - retranslate now
                await RetranslateBlockAsync(block, translation.Language, ct);
            }
            else
            {
                // TranslateOnFirstVisit - mark stale, translate later
                block.Status = TranslationStatus.Stale;
            }
        }
    }

    await _db.SaveChangesAsync(ct);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A parte chave: **Se um tradutor ajustou manualmente um bloco, talvez adicionando contexto cultural ou reformulando a redação para maior clareza, o sistema respeita esse trabalho. Marca o bloco como obsoleto para que o tradutor saiba que a fonte mudou, mas não substitui silenciosamente as suas edições.&lt;/p&gt;
&lt;p&gt;Blocos traduzidos por máquina com &lt;code&gt;AlwaysTranslate&lt;/code&gt; ativado são retraduzidos imediatamente. Os blocos traduzidos automaticamente com &lt;code&gt;TranslateOnFirstVisit&lt;/code&gt; são marcados como obsoletos e traduzidos quando alguém abre efetivamente o documento nessa língua.&lt;/p&gt;
&lt;h2&gt;Gatilhos de tradução: quando as traduções acontecem&lt;/h2&gt;
&lt;p&gt;Cada língua tem um &lt;code&gt;TranslationTrigger&lt;/code&gt; que controla o tempo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public enum TranslationTrigger
{
    AlwaysTranslate,         // Translate on every save
    TranslateOnFirstVisit    // Translate when first opened in that language
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O &lt;code&gt;AlwaysTranslate&lt;/code&gt; é útil para línguas de alta prioridade onde quer que as traduções sejam imediatamente actuais. Francês para uma empresa com um grande escritório em Paris. Alemão para uma empresa com sede em Munique.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;TranslateOnFirstVisit&lt;/code&gt; é útil para línguas que são ocasionalmente necessárias, mas que não valem o custo da API para manter perfeitamente actualizadas em todos os momentos. Quando alguém abre o documento nessa língua, os blocos obsoletos são traduzidos em tempo real.&lt;/p&gt;
&lt;p&gt;Ambos os modos usam a mesma resolução de glossário, as mesmas configurações de formalidade e o mesmo hashing de conteúdo. A única diferença é o tempo.&lt;/p&gt;
&lt;h2&gt;Adaptação única de conteúdo e estrutura&lt;/h2&gt;
&lt;p&gt;É aqui que a arquitetura compensa realmente, para além da simples tradução.&lt;/p&gt;
&lt;p&gt;Quando um tradutor alemão adiciona uma secção de conformidade DSGVO que não existe em inglês, adiciona-a como um novo bloco na versão alemã. Esse bloco não tem &lt;code&gt;SourceBlockId&lt;/code&gt;, é assinalado como conteúdo único. O sistema nunca o envia para retradução porque não existe uma fonte a partir da qual traduzir. Só existe em alemão.&lt;/p&gt;
&lt;p&gt;Quando um tradutor japonês muda uma lista de marcadores para uma lista numerada (uma convenção comum na escrita técnica japonesa), a marca &lt;code&gt;IsStructureAdapted&lt;/code&gt; do bloco preserva-o em futuros ciclos de retradução:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var translation = new TranslationBlock
{
    SourceBlockId = sourceBlockId,
    Language = targetLanguage,
    BlockType = translatedBlockType,
    SourceBlockType = sourceBlock.BlockType,
    IsStructureAdapted = translatedBlockType != sourceBlock.BlockType,
    StructureAdaptationNotes = &amp;quot;Numbered list preferred in JP technical docs&amp;quot;,
    SourceContentHash = sourceBlock.ContentHash,
    Status = TranslationStatus.UpToDate,
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O sinalizador &lt;code&gt;IsNoTranslate&lt;/code&gt; lida com o conteúdo que deve ser copiado literalmente: blocos de código, URLs, nomes de produtos, notação matemática. O fornecedor de tradução ignora-os completamente.&lt;/p&gt;
&lt;h2&gt;Colocando tudo junto&lt;/h2&gt;
&lt;p&gt;Vamos percorrer o fluxo completo. Um utilizador em Londres edita um parágrafo no documento de origem em inglês e o seu escritório em Munique tem o alemão definido como &lt;code&gt;AlwaysTranslate&lt;/code&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;**O utilizador guarda. O TipTap envia JSON para a API.&lt;/li&gt;
&lt;li&gt;**O &lt;code&gt;CreateBlocksFromDocumentAsync&lt;/code&gt; analisa o JSON, recalcula os hashes de conteúdo e compara os hashes antigos e novos para identificar os blocos que foram efetivamente alterados.&lt;/li&gt;
&lt;li&gt;**Encontra o &lt;code&gt;EntryTranslation&lt;/code&gt; alemão e verifica o bloco alemão. É traduzido por máquina, não está bloqueado, não foi editado por humanos, por isso é elegível para retradução.&lt;/li&gt;
&lt;li&gt;**Configuração de tradução carregada: ID do glossário resolvido através de &lt;code&gt;GetOrSyncDeepLGlossaryIdAsync(&amp;quot;en&amp;quot;, &amp;quot;de&amp;quot;)&lt;/code&gt;, regras de estilo através de &lt;code&gt;GetOrSyncStyleRuleListAsync(&amp;quot;de&amp;quot;)&lt;/code&gt;, formalidade definida para &amp;quot;more&amp;quot; (formal &amp;quot;Sie&amp;quot;), blocos adjacentes passados como contexto para desambiguação.&lt;/li&gt;
&lt;li&gt;Chamada &lt;strong&gt;DeepL&lt;/strong&gt; Bloco único enviado com ID do glossário, ID do estilo, formalidade e contexto.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bloco atualizado.&lt;/strong&gt; Conteúdo traduzido armazenado, &lt;code&gt;SourceContentHash&lt;/code&gt; sincronizado, estado definido para &lt;code&gt;UpToDate&lt;/code&gt;. Um bloco traduzido em vez de 40+. Os restantes 39 blocos? Inalterados.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Entretanto, o seu escritório de Tóquio tem o japonês definido para &lt;code&gt;TranslateOnFirstVisit&lt;/code&gt;. A mesma edição marca o bloco de tradução em japonês como &lt;code&gt;Stale&lt;/code&gt;. Quando alguém em Tóquio abre o documento, os passos 5-9 acontecem na hora. A adaptação da sua estrutura (lista numerada) é preservada. Os seus blocos únicos permanecem exatamente onde estão.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Penso que o motor de tradução é a parte do Rasepi que oferece o valor mais visível. As traduções que utilizam a sua terminologia, seguem as suas convenções de formatação, obedecem às suas instruções personalizadas, correspondem ao seu tom, respeitam o trabalho dos seus tradutores e custam uma fração do que custaria a retradução de um documento completo. A arquitetura torna tudo isto automático e mantém-se fora do caminho quando os humanos querem assumir o controlo.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;O mesmo motor DeepL que alimenta as traduções escritas também alimenta o Talk to Docs, a nossa interface de documentação conversacional, com o DeepL Voice a tratar da interação falada. Os mesmos glossários, as mesmas regras de estilo, a mesma formalidade, a mesma consistência. Quer a sua equipa leia a documentação ou fale com ela, a qualidade da linguagem é idêntica.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.rasepi.com/&quot;&gt;Explore a API de tradução →&lt;/a&gt;&lt;/p&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="architecture" />
    <category term="translation" />
    <category term="deepl" />
  </entry>
  <entry>
    <title>Falar com os documentos é melhor do que lê-los</title>
    <link href="https://www.tcdev.de/pt/blog/why-talking-to-documents-feels-better-than-reading/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/why-talking-to-documents-feels-better-than-reading/</id>
    <updated>2026-03-10T00:00:00Z</updated>
    <summary>A leitura é poderosa, mas trabalhosa. A conversação é mais antiga, mais rápida e mais natural. Falar com a informação parece muitas vezes mentalmente mais leve do que ler páginas de texto.</summary>
    <content type="html">&lt;p&gt;Há uma razão para as pessoas dizerem &lt;em&gt;&amp;quot;vamos falar sobre isso&amp;quot;&lt;/em&gt; quando algo é complexo.&lt;/p&gt;
&lt;p&gt;Quando estamos a tentar compreender uma nova ideia, resolver um problema ou recordar um processo sob pressão, a conversa é muitas vezes mais fácil do que a leitura. Não porque a leitura seja má. A leitura é uma das ferramentas mais poderosas que o ser humano já desenvolveu. Mas a leitura é uma competência aprendida que se sobrepõe a algo muito mais antigo: a fala.&lt;/p&gt;
&lt;p&gt;Somos faladores muito antes de sermos leitores.&lt;/p&gt;
&lt;p&gt;Isso é mais importante do que as pessoas imaginam, especialmente agora que a maior parte do conhecimento do mundo vive em documentos, wikis, PDFs e longas páginas internas que ninguém quer abrir a menos que seja absolutamente necessário.&lt;/p&gt;
&lt;h2&gt;A leitura é aprendida. A conversação é nativa.&lt;/h2&gt;
&lt;p&gt;Os seres humanos falaram durante muito tempo antes de escreverem qualquer coisa. As crianças aprendem a compreender a linguagem falada naturalmente. A leitura requer instrução explícita, repetição e anos de prática.&lt;/p&gt;
&lt;p&gt;Mesmo para adultos altamente alfabetizados, a leitura continua a ser um ato mais deliberado do que ouvir ou falar. Exige concentração visual, atenção contínua, memória de trabalho e interpretação da estrutura na página. Está a descodificar símbolos, a analisar frases, a construir contextos e a decidir o que é importante.&lt;/p&gt;
&lt;p&gt;A conversação funciona de forma diferente. Quando a informação é transmitida de forma falada e interactiva, o cérebro tem uma experiência diferente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parece sequencial em vez de visualmente avassaladora&lt;/li&gt;
&lt;li&gt;Dá feedback e esclarecimentos imediatos&lt;/li&gt;
&lt;li&gt;Reduz a necessidade de analisar e filtrar grandes blocos de texto&lt;/li&gt;
&lt;li&gt;reflecte a forma como as pessoas já pedem ajuda na vida real&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Este último ponto é muito importante. Em situações de incerteza, a maioria das pessoas não quer instintivamente ler 1500 palavras. Querem perguntar: &lt;em&gt;&amp;quot;O que é que faço a seguir?&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Falar reduz o atrito cognitivo&lt;/h2&gt;
&lt;p&gt;Um documento é estático. Contém tudo ao mesmo tempo.&lt;/p&gt;
&lt;p&gt;Isso parece útil, e muitas vezes é. Mas também cria fricção. Uma página cheia de títulos, chamadas de atenção, ligações, notas, exemplos e casos extremos obriga o leitor a decidir o que deve ignorar. Isso é cognitivamente dispendioso.&lt;/p&gt;
&lt;p&gt;Quando se fala com um sistema de informação, normalmente obtém-se a experiência oposta: relevância em primeiro lugar, detalhe em segundo.&lt;/p&gt;
&lt;p&gt;Faz-se uma pergunta. Obtém uma resposta. Depois, faz uma nova pergunta.&lt;/p&gt;
&lt;p&gt;Este padrão de interação reduz a sobrecarga mental de algumas formas importantes:&lt;/p&gt;
&lt;h3&gt;1. Reduz o espaço do problema&lt;/h3&gt;
&lt;p&gt;Um documento completo apresenta todo o cenário. Uma conversa apresenta o próximo passo útil.&lt;/p&gt;
&lt;p&gt;Quando alguém pergunta, &lt;em&gt;&amp;quot;Como é que eu integro um novo engenheiro?&amp;quot;&lt;/em&gt; normalmente não quer o manual completo imediatamente. Quer orientação. A conversa permite-lhes começar com pouco e expandir apenas quando necessário.&lt;/p&gt;
&lt;h3&gt;2. Preserva a memória de trabalho&lt;/h3&gt;
&lt;p&gt;A leitura exige que mantenha várias coisas na sua cabeça enquanto procura a parte relevante. A interação falada ou conversacional externaliza esse esforço. O sistema faz a maior parte da filtragem por si.&lt;/p&gt;
&lt;h3&gt;3. Parece socialmente familiar&lt;/h3&gt;
&lt;p&gt;Os seres humanos estão profundamente adaptados à troca de informações. Nós perguntamos. Alguém responde. Nós aperfeiçoamos. Eles esclarecem-nos. Este ciclo é uma das formas mais antigas de aprendizagem que temos.&lt;/p&gt;
&lt;p&gt;Mesmo quando o &amp;quot;alguém&amp;quot; é um sistema, a estrutura continua a parecer natural.&lt;/p&gt;
&lt;h2&gt;A leitura não é passiva. É exatamente esse o objetivo.&lt;/h2&gt;
&lt;p&gt;Uma das razões pelas quais falar pode parecer mais fácil é o facto de a leitura não ser tão fácil como as pessoas supõem. Os leitores experientes fazem com que pareça fácil, mas o processo é altamente ativo.&lt;/p&gt;
&lt;p&gt;Para ler bem, é preciso:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;identificar a estrutura&lt;/li&gt;
&lt;li&gt;inferir a importância&lt;/li&gt;
&lt;li&gt;resolver ambiguidades&lt;/li&gt;
&lt;li&gt;guardar o contexto na memória&lt;/li&gt;
&lt;li&gt;ligar uma secção a outra&lt;/li&gt;
&lt;li&gt;decidir quando passar os olhos e quando abrandar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Este é o verdadeiro trabalho cognitivo.&lt;/p&gt;
&lt;p&gt;Em muitas situações, esse trabalho vale a pena. A leitura aprofundada ajuda a obter nuances, precisão e uma compreensão mais alargada. Mas noutras situações, especialmente quando alguém está cansado, stressado, sobrecarregado ou apenas a tentar desbloquear, falar é muitas vezes a opção mentalmente mais leve.&lt;/p&gt;
&lt;p&gt;Isto é especialmente verdade no local de trabalho, onde as pessoas não estão normalmente a abordar a documentação em condições ideais. Estão:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a meio da tarefa&lt;/li&gt;
&lt;li&gt;interrompidas&lt;/li&gt;
&lt;li&gt;a mudar de contexto&lt;/li&gt;
&lt;li&gt;estão a tentar resolver algo rapidamente&lt;/li&gt;
&lt;li&gt;muitas vezes já ligeiramente frustrado&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nesse estado, o &lt;em&gt;acesso conversacional&lt;/em&gt; à informação pode parecer dramaticamente melhor do que o acesso à primeira página.&lt;/p&gt;
&lt;h2&gt;Falar muda a relação com a informação&lt;/h2&gt;
&lt;p&gt;Há também uma dimensão emocional aqui.&lt;/p&gt;
&lt;p&gt;Os documentos podem parecer formais e distantes. Eles implicam: &lt;em&gt;leia tudo isto, compreenda-o corretamente e não perca nada de importante.&lt;/em&gt; Isto pode ser útil como material de referência, mas também pode criar hesitação.&lt;/p&gt;
&lt;p&gt;A conversa parece permissiva. Pode ser-se vago. Pode perguntar mal. Pode admitir-se a confusão. Pode dizer: &lt;em&gt;&amp;quot;Não sei bem o que procuro, mas preciso da informação sobre os pedidos de acesso.&amp;quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Isso é importante porque as pessoas muitas vezes evitam a documentação não porque não gostem da informação, mas porque não gostam do esforço e da incerteza envolvidos na procura da parte correta da mesma.&lt;/p&gt;
&lt;p&gt;Falar reduz essa barreira.&lt;/p&gt;
&lt;h2&gt;Porque é que isto é importante agora&lt;/h2&gt;
&lt;p&gt;Durante muito tempo, os documentos tinham de ser lidos porque não havia alternativa prática. A pesquisa ajudou as pessoas a encontrar páginas, mas não alterou o modelo de interação. Continuava a ser necessário abrir a página, digitalizá-la e extrair o que era necessário.&lt;/p&gt;
&lt;p&gt;Isso está a mudar.&lt;/p&gt;
&lt;p&gt;À medida que as interfaces se tornam mais conversacionais, as pessoas esperam cada vez mais que a informação responda em vez de simplesmente existir. Querem pedir o que precisam numa linguagem simples e receber algo adaptado ao momento.&lt;/p&gt;
&lt;p&gt;Isto não torna a leitura obsoleta. Altera o seu papel.&lt;/p&gt;
&lt;p&gt;A leitura torna-se a camada profunda. A conversação passa a ser a camada de acesso.&lt;/p&gt;
&lt;p&gt;Os melhores sistemas suportam ambos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;falar quando se precisa de orientação ou rapidez&lt;/li&gt;
&lt;li&gt;ler quando se precisa de profundidade, verificação ou contexto completo&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;O risco de simplificação excessiva&lt;/h2&gt;
&lt;p&gt;Há uma ressalva importante: falar com a informação só é melhor se as respostas forem fiáveis.&lt;/p&gt;
&lt;p&gt;Se uma interface de conversação der respostas parciais, enganadoras ou demasiado confiantes, a experiência torna-se pior do que a leitura, porque retira ao utilizador a capacidade de inspecionar diretamente o material de origem.&lt;/p&gt;
&lt;p&gt;Portanto, o futuro não é &amp;quot;substituir todos os documentos por voz&amp;quot;. O futuro é dar às pessoas uma forma mais humana de aceder a documentos sem perder a profundidade e a precisão que o conhecimento escrito proporciona.&lt;/p&gt;
&lt;p&gt;Esse equilíbrio é importante. A conversação é mais fácil, mas os documentos continuam a ter a estrutura duradoura, o detalhe e a responsabilidade de que as organizações necessitam.&lt;/p&gt;
&lt;h2&gt;Uma interface mais humana para o conhecimento&lt;/h2&gt;
&lt;p&gt;O ponto mais profundo é simples: as pessoas não pensam naturalmente em páginas. Pensam em perguntas, histórias, fragmentos e diálogos.&lt;/p&gt;
&lt;p&gt;Nós perguntamos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O que é que isto significa?&lt;/li&gt;
&lt;li&gt;O que é que eu faço primeiro?&lt;/li&gt;
&lt;li&gt;Qual é a parte importante?&lt;/li&gt;
&lt;li&gt;Consegues explicar isso de outra forma?&lt;/li&gt;
&lt;li&gt;O que é que mudou?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estes são movimentos de conversação, não de leitura.&lt;/p&gt;
&lt;p&gt;Por isso, quando falar com a informação parece mentalmente mais fácil do que lê-la, isso não é um sinal de preguiça intelectual. É normalmente um sinal de que a interface corresponde à forma como o cérebro prefere abordar a incerteza.&lt;/p&gt;
&lt;p&gt;A leitura continua a ser essencial. Mas, como ponto de entrada para o conhecimento, a conversa é muitas vezes melhor porque está mais próxima daquilo que somos por natureza.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Não somos leitores em primeiro lugar. Somos primeiro faladores. Os sistemas de conhecimento mais intuitivos lembrar-se-ão disso.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="voice" />
    <category term="knowledge" />
    <category term="documentation" />
  </entry>
  <entry>
    <title>Plataformas de documentação criadas para outra era</title>
    <link href="https://www.tcdev.de/pt/blog/why-confluence-and-notion-are-struggling-in-the-ai-era/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/why-confluence-and-notion-are-struggling-in-the-ai-era/</id>
    <updated>2026-03-08T00:00:00Z</updated>
    <summary>O Confluence e o Notion foram criados para um modelo de documentação anterior à IA. Eles podem evoluir, mas as plataformas estabelecidas carregam uma bagagem estrutural. Os sistemas mais recentes podem ser projetados para IA desde o primeiro dia.</summary>
    <content type="html">&lt;p&gt;O Confluence e o Notion não são produtos ruins. Isso precisa ser dito claramente no início.&lt;/p&gt;
&lt;p&gt;Eles tiveram sucesso por boas razões. O Confluence tornou-se o &lt;a href=&quot;https://www.atlassian.com/software/confluence&quot;&gt;local predefinido para a documentação interna&lt;/a&gt; em muitas empresas porque proporcionou às equipas um local central para escrever, organizar e partilhar conhecimentos. O Notion &lt;a href=&quot;https://www.notion.com/about&quot;&gt;conquistou as pessoas&lt;/a&gt; com flexibilidade, experiências de escrita mais limpas e uma superfície de produto mais moderna.&lt;/p&gt;
&lt;p&gt;Ambas as plataformas resolveram problemas reais na era para a qual foram criadas.&lt;/p&gt;
&lt;p&gt;O problema agora é que o mundo à sua volta mudou mais depressa do que as suas fundações.&lt;/p&gt;
&lt;p&gt;Já não estamos num mundo em que a documentação só precisa de ser escrita, armazenada e pesquisada. Estamos num mundo em que se espera cada vez mais que a documentação o seja:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;legível por máquinas&lt;/li&gt;
&lt;li&gt;consciente da atualidade&lt;/li&gt;
&lt;li&gt;segura para recuperação por IA&lt;/li&gt;
&lt;li&gt;suficientemente estruturada para a automatização&lt;/li&gt;
&lt;li&gt;dinâmicas entre línguas e públicos&lt;/li&gt;
&lt;li&gt;continuamente fiável, não apenas disponível&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esta é uma barreira diferente.&lt;/p&gt;
&lt;h2&gt;Foram criados para um modelo de conhecimento anterior à IA&lt;/h2&gt;
&lt;p&gt;As plataformas de documentação tradicionais foram concebidas com base num pressuposto simples: se a página existir e for pesquisável, o problema está praticamente resolvido.&lt;/p&gt;
&lt;p&gt;Isto era suficientemente bom quando o utilizador principal era um ser humano que abria uma wiki, passava os olhos pela página e fazia a sua avaliação. Nesse modelo, a função da plataforma era facilitar a criação e a navegação.&lt;/p&gt;
&lt;p&gt;A IA altera a descrição do trabalho.&lt;/p&gt;
&lt;p&gt;Agora, a plataforma não está apenas a armazenar conhecimentos para as pessoas. Está a produzir material de origem para sistemas que recuperam, classificam, resumem e respondem a perguntas automaticamente.&lt;/p&gt;
&lt;p&gt;Isto introduz novos requisitos a que as arquitecturas mais antigas não davam prioridade:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Que conteúdos são fiáveis neste momento?&lt;/li&gt;
&lt;li&gt;Que páginas estão desactualizadas mas ainda são pesquisáveis?&lt;/li&gt;
&lt;li&gt;Que secções foram alteradas recentemente?&lt;/li&gt;
&lt;li&gt;Que versão linguística é a atual?&lt;/li&gt;
&lt;li&gt;Que conteúdos são projectos, arquivados, específicos de uma região ou de baixa confiança?&lt;/li&gt;
&lt;li&gt;Que documentos devem ser totalmente excluídos das respostas de IA?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Uma plataforma que não tenha sido construída em torno destas questões tem de as adaptar. Isso é sempre mais difícil do que concebê-las desde o início.&lt;/p&gt;
&lt;h2&gt;A força do legado transforma-se em travão do legado&lt;/h2&gt;
&lt;p&gt;Os produtos estabelecidos têm vantagens: distribuição, ecossistema, marca, familiaridade com o cliente, integrações e equipas que sabem como fazer o envio. Mas esses mesmos pontos fortes podem atrasar a mudança estrutural.&lt;/p&gt;
&lt;p&gt;Porquê? Porque as plataformas maduras implicam compromissos.&lt;/p&gt;
&lt;p&gt;Elas têm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;anos de decisões acumuladas sobre produtos&lt;/li&gt;
&lt;li&gt;enormes bases instaladas com fluxos de trabalho existentes&lt;/li&gt;
&lt;li&gt;expectativas em relação à compatibilidade com versões anteriores&lt;/li&gt;
&lt;li&gt;plugins e extensões que dependem de comportamentos antigos&lt;/li&gt;
&lt;li&gt;modelos de dados optimizados para os casos de utilização de ontem&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quando uma plataforma como o Confluence ou o Notion pretende acrescentar uma capacidade genuinamente nova, muitas vezes tem de a adaptar ao sistema existente e não através dele.&lt;/p&gt;
&lt;p&gt;Este é o desafio da incumbência: não está apenas a construir o futuro, está a arrastar o passado consigo.&lt;/p&gt;
&lt;h2&gt;Acrescentar funcionalidades de IA não é o mesmo que tornar-se nativo da IA&lt;/h2&gt;
&lt;p&gt;Muitas plataformas estabelecidas estão agora a colocar a IA no topo. Resumos. Assistência à escrita. Melhorias na pesquisa. Interfaces de perguntas e respostas. O Confluence tem &lt;a href=&quot;https://www.atlassian.com/platform/intelligence&quot;&gt;Atlassian Intelligence&lt;/a&gt;, o Notion tem &lt;a href=&quot;https://www.notion.com/product/ai&quot;&gt;Notion AI&lt;/a&gt;, e o GitBook adicionou &lt;a href=&quot;https://docs.gitbook.com/product-tour/searching-your-content/gitbook-ai&quot;&gt;AI-powered search&lt;/a&gt;. Estas funcionalidades são úteis. Algumas delas são boas.&lt;/p&gt;
&lt;p&gt;Mas há uma diferença significativa entre:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;adicionar caraterísticas de IA a um produto de documentação&lt;/li&gt;
&lt;li&gt;construir um produto de documentação cuja arquitetura central pressupõe o consumo de IA desde o primeiro dia&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A primeira abordagem conduz frequentemente a funcionalidades de assistência nas extremidades. A segunda altera a base.&lt;/p&gt;
&lt;p&gt;Uma plataforma de conhecimento nativa de IA coloca questões de design diferentes desde o início:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;como é que os documentos devem ser estruturados para que os sistemas possam raciocinar sobre eles com segurança?&lt;/li&gt;
&lt;li&gt;como deve ser representada a confiança?&lt;/li&gt;
&lt;li&gt;que metadados devem ser de primeira classe e não opcionais?&lt;/li&gt;
&lt;li&gt;Como é que os conteúdos obsoletos devem perder visibilidade?&lt;/li&gt;
&lt;li&gt;como é que as respostas devem ser restringidas quando as fontes subjacentes são fracas?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estas são questões de arquitetura, não de caraterísticas.&lt;/p&gt;
&lt;h2&gt;As plataformas novas têm uma vantagem temporária&lt;/h2&gt;
&lt;p&gt;É aqui que as plataformas mais recentes podem ganhar, pelo menos durante algum tempo.&lt;/p&gt;
&lt;p&gt;Uma nova plataforma tem a liberdade de conceber em função das restrições actuais e não dos hábitos de ontem. Não tem de preservar uma década de pressupostos sobre o que é um documento ou como uma wiki se deve comportar. Pode fazer escolhas diferentes numa fase inicial:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tratar a atualidade como um conceito de primeira classe&lt;/li&gt;
&lt;li&gt;tornar a confiança na fonte visível tanto para humanos como para máquinas&lt;/li&gt;
&lt;li&gt;armazenar metadados mais ricos sobre o estado do conteúdo&lt;/li&gt;
&lt;li&gt;incorporar fluxos de trabalho multilingues no modelo principal, em vez de os acrescentar&lt;/li&gt;
&lt;li&gt;decidir que a pesquisa e a recuperação por IA devem ser classificadas por confiança e não apenas por relevância&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Essa liberdade é importante.&lt;/p&gt;
&lt;p&gt;Na tecnologia, os operadores históricos são frequentemente mais fortes durante períodos estáveis. Os novos operadores são muitas vezes mais fortes quando o próprio modelo está a mudar.&lt;/p&gt;
&lt;p&gt;A era da IA é uma dessas mudanças.&lt;/p&gt;
&lt;h2&gt;Porque é que isto é especialmente difícil para o Confluence&lt;/h2&gt;
&lt;p&gt;O Confluence é poderoso, mas vem de uma visão de mundo mais antiga. Foi construído em torno de [espaços de equipa, páginas, navegação hierárquica] (https://support.atlassian.com/confluence-cloud/docs/use-spaces-to-organize-your-work/) e de um [modelo empresarial rico em plug-ins] (https://marketplace.atlassian.com/). Essas escolhas faziam sentido. Ainda fazem sentido para muitas organizações.&lt;/p&gt;
&lt;p&gt;Mas também significam que o produto está a carregar uma grande complexidade. As plataformas empresariais raramente se conseguem reinventar de forma limpa. Têm de negociar com a sua própria história.&lt;/p&gt;
&lt;p&gt;Isso torna a modernização mais lenta. Não é impossível. Apenas mais lenta.&lt;/p&gt;
&lt;p&gt;Quando os requisitos da era da IA exigem metadados mais limpos, uma modelação de confiança mais explícita ou uma governação de conteúdos mais opinativa, um sistema criado para uma flexibilidade máxima através de anos de extensões pode ter dificuldade em avançar de forma coesa.&lt;/p&gt;
&lt;h2&gt;Por que isso é especialmente complicado para o Notion&lt;/h2&gt;
&lt;p&gt;O Notion tem um problema diferente. Ele parece mais novo, mais leve e mais flexível. Mas a flexibilidade também pode funcionar contra ele.&lt;/p&gt;
&lt;p&gt;O ponto forte do Notion é que [quase tudo pode se tornar uma página, um banco de dados, uma nota, um documento leve ou um espaço colaborativo] (https://www.notion.com/product). Essa flexibilidade é óptima para as equipas. Não é tão boa quando são necessárias garantias sólidas sobre o significado do conteúdo, o estado em que se encontra e se deve ser utilizado como uma fonte fiável por um sistema de IA.&lt;/p&gt;
&lt;p&gt;Quanto mais livre for uma plataforma, mais difícil será impor posteriormente uma semântica fiável.&lt;/p&gt;
&lt;p&gt;Os sistemas de IA prosperam com estrutura, metadados explícitos e sinais de confiança. Os espaços de trabalho flexíveis de uso geral precisam frequentemente de muita interpretação antes de o seu conteúdo ser seguro para esse tipo de utilização.&lt;/p&gt;
&lt;h2&gt;Nada disto significa que estão condenados&lt;/h2&gt;
&lt;p&gt;Seria uma análise preguiçosa dizer que o Confluence e o Notion não se podem adaptar. Claro que podem.&lt;/p&gt;
&lt;p&gt;Têm equipas inteligentes, recursos significativos e fortes incentivos. Vão lançar mais capacidades de IA. Vão melhorar a recuperação, a assistência à criação, os resumos, a governação e os fluxos de trabalho estruturados. Com o tempo, poderão colmatar uma grande parte da lacuna.&lt;/p&gt;
&lt;p&gt;Mas o tempo é importante.&lt;/p&gt;
&lt;p&gt;Quando uma mudança como esta acontece, a vantagem pertence frequentemente a quem estiver disposto a reconstruir os pressupostos mais rapidamente. As plataformas mais recentes podem avançar com mais coerência porque não estão a adaptar-se tanto. Isso dá-lhes uma janela.&lt;/p&gt;
&lt;p&gt;Pode não ser uma janela permanente. Mas é real.&lt;/p&gt;
&lt;h2&gt;A próxima fase das plataformas de documentação&lt;/h2&gt;
&lt;p&gt;A próxima geração de ferramentas de documentação será provavelmente julgada menos pela forma como permitem que as pessoas escrevam páginas e mais pela forma como gerem o conhecimento como um sistema de confiança.&lt;/p&gt;
&lt;p&gt;Isso significa que os vencedores provavelmente farão cinco coisas bem:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Modelarão a confiança de forma explícita.&lt;/li&gt;
&lt;li&gt;Distinguem o conhecimento atual do conhecimento obsoleto.&lt;/li&gt;
&lt;li&gt;Tratarão a recuperação de IA como uma superfície central do produto e não como um complemento.&lt;/li&gt;
&lt;li&gt;Suportarão conhecimentos multilingues e específicos do público sem fragmentação.&lt;/li&gt;
&lt;li&gt;Darão às equipas um maior controlo sobre as informações que são apresentadas, a quem e em que condições.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Esta é uma categoria diferente da wiki clássica.&lt;/p&gt;
&lt;h2&gt;Porque é que os novos começos são importantes&lt;/h2&gt;
&lt;p&gt;Há momentos no software em que um produto novo tem uma vantagem, não porque os operadores históricos sejam incompetentes, mas porque a história é cara.&lt;/p&gt;
&lt;p&gt;Este é um desses momentos.&lt;/p&gt;
&lt;p&gt;Uma nova plataforma pode decidir, desde o primeiro dia, que os documentos não são apenas páginas. São fontes activas para humanos, agentes, sistemas de pesquisa e assistentes de IA. Esse pressuposto altera tudo a jusante.&lt;/p&gt;
&lt;p&gt;O Confluence e o Notion podem lá chegar. Mas o caminho é mais longo porque têm de transformar sistemas que foram optimizados para outra era.&lt;/p&gt;
&lt;p&gt;Essa transformação leva tempo. Entretanto, as plataformas mais recentes têm espaço para definir o que deve ser uma infraestrutura de conhecimento moderna.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A maior vantagem de uma nova plataforma não é a novidade. É a libertação de velhos pressupostos exatamente no momento em que esses pressupostos deixam de funcionar.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Este é um artigo de perspetiva. As afirmações sobre produtos concorrentes baseiam-se em documentação e anúncios de produtos disponíveis publicamente em março de 2026. Temos um respeito genuíno pelo Confluence e pelo Notion - são produtos excelentes que servem bem milhões de equipas.&lt;/em&gt;&lt;/p&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="ai" />
    <category term="platforms" />
    <category term="documentation" />
  </entry>
  <entry>
    <title>Por dentro da arquitetura Rasepi: Plugins, Action Guards e Pipelines</title>
    <link href="https://www.tcdev.de/pt/blog/how-plugin-guardrail-and-pipeline-systems-work/" rel="alternate" type="text/html" />
    <id>https://www.tcdev.de/pt/blog/how-plugin-guardrail-and-pipeline-systems-work/</id>
    <updated>2026-03-06T00:00:00Z</updated>
    <summary>Um passo-a-passo técnico profundo sobre como o sistema de plugins do Rasepi, o pipeline de proteção de acções e o motor de tradução ao nível do bloco funcionam realmente, com código real da base de código.</summary>
    <content type="html">&lt;p&gt;A maioria das plataformas de documentação fala sobre &amp;quot;extensibilidade&amp;quot; da mesma forma que as companhias aéreas falam sobre &amp;quot;espaço para as pernas&amp;quot;. Tecnicamente presente, praticamente dececionante. Eu queria que a arquitetura do Rasepi fosse genuinamente extensível sem se tornar imprevisível, por isso construímos três sistemas interligados: &lt;strong&gt;plugins&lt;/strong&gt; para capacidade, &lt;strong&gt;action guards&lt;/strong&gt; para controlo, e &lt;strong&gt;pipelines&lt;/strong&gt; para execução determinística.&lt;/p&gt;
&lt;p&gt;Este post mostra como cada um deles funciona em nossa base de código atual.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.tcdev.de/pt/blog/img/architecture-pipeline.svg&quot; alt=&quot;Arquitetura Rasepi: Plugins, Guardas, e Pipelines a trabalhar em conjunto&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;O sistema de plugins: modular por design&lt;/h2&gt;
&lt;p&gt;Cada plugin no Rasepi implementa &lt;code&gt;IPluginModule&lt;/code&gt;, uma única interface que declara o que o plugin é, quais serviços ele precisa, e quais rotas ele expõe:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public interface IPluginModule
{
    PluginManifest Manifest { get; }
    void RegisterServices(IServiceCollection services);
    void MapRoutes(IEndpointRouteBuilder routes);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O &lt;code&gt;PluginManifest&lt;/code&gt; é puro dado. Ele descreve o plugin sem executar nada:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public sealed class PluginManifest
{
    public required string Id { get; init; }
    public required string Name { get; init; }
    public required string Version { get; init; }
    public string Description { get; init; }
    public string Category { get; init; }
    public IReadOnlyDictionary&amp;lt;string, string&amp;gt; UiContributions { get; init; }
    public bool HasSettings { get; init; }
    public bool HasEndpoints { get; init; }
    public IReadOnlyList&amp;lt;string&amp;gt; Dependencies { get; init; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Repare no &lt;code&gt;UiContributions&lt;/code&gt;. Esse dicionário mapeia os pontos de extensão do frontend para os nomes dos componentes, então o frontend do Vue sabe quais componentes de UI cada plugin contribui (um botão da barra de ferramentas, um painel da barra lateral, uma página de configurações).&lt;/p&gt;
&lt;h3&gt;O registo é uma linha por cada plugin&lt;/h3&gt;
&lt;p&gt;Na inicialização, nós registramos plugins através de uma API fluente:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var pluginRegistry = new PluginRegistry();

pluginRegistry
    .AddPlugin&amp;lt;WorkflowPluginModule&amp;gt;(builder.Services)
    .AddPlugin&amp;lt;RulesPluginModule&amp;gt;(builder.Services)
    .AddPlugin&amp;lt;RetentionPluginModule&amp;gt;(builder.Services)
    .AddPlugin&amp;lt;ClassificationPluginModule&amp;gt;(builder.Services);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cada chamada instancia o módulo, armazena-o no registo e chama &lt;code&gt;RegisterServices()&lt;/code&gt; para ligar as suas dependências. Depois que a aplicação é construída, uma única linha mapeia todas as rotas de plugins:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;app.MapPluginRoutes(pluginRegistry);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Por baixo do capô, cada plugin recebe um grupo de rotas com escopo em &lt;code&gt;/plugins/{pluginId}/&lt;/code&gt; com autorização aplicada automaticamente.&lt;/p&gt;
&lt;h3&gt;Exemplo real: o plugin Workflow&lt;/h3&gt;
&lt;p&gt;Aqui está o aspeto de um plugin real, o módulo Workflow &amp;amp; Approvals:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public sealed class WorkflowPluginModule : IPluginModule
{
    public const string PluginId = &amp;quot;workflow&amp;quot;;

    public PluginManifest Manifest { get; } = new()
    {
        Id = PluginId,
        Name = &amp;quot;Workflow &amp;amp; Approvals&amp;quot;,
        Version = &amp;quot;1.0.0&amp;quot;,
        Description = &amp;quot;Adds approval workflows to entry publishing.&amp;quot;,
        Category = &amp;quot;Workflow&amp;quot;,
        HasSettings = true,
        HasEndpoints = true,
        UiContributions = new Dictionary&amp;lt;string, string&amp;gt;
        {
            [&amp;quot;entry.toolbar.publish&amp;quot;] = &amp;quot;WorkflowPublishButton&amp;quot;,
            [&amp;quot;entry.sidebar.status&amp;quot;]  = &amp;quot;WorkflowStatusPanel&amp;quot;,
            [&amp;quot;hub.admin.settings&amp;quot;]    = &amp;quot;WorkflowHubSettings&amp;quot;,
        }
    };

    public void RegisterServices(IServiceCollection services)
    {
        services.AddScoped&amp;lt;IWorkflowService, WorkflowService&amp;gt;();
        services.AddScoped&amp;lt;IActionGuard, WorkflowPublishGuard&amp;gt;();
    }

    public void MapRoutes(IEndpointRouteBuilder routes)
    {
        WorkflowEndpoints.Map(routes);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A plataforma principal nunca referencia &lt;code&gt;WorkflowService&lt;/code&gt; ou &lt;code&gt;WorkflowPublishGuard&lt;/code&gt; diretamente. Descobre-os através do contentor DI. Essa é a chave para o acoplamento zero. A aplicação principal nunca toca no código do plugin.&lt;/p&gt;
&lt;h2&gt;Guardas de ação: a camada de controlo&lt;/h2&gt;
&lt;p&gt;Os plugins adicionam capacidades. Os guardas de ação decidem se essa capacidade, ou qualquer ação do núcleo, tem permissão para continuar. Eles são validadores síncronos que interceptam operações antes da execução.&lt;/p&gt;
&lt;p&gt;Fluxo de avaliação dos guardas de ação](/pt/blog/img/action-guard-flow.svg)&lt;/p&gt;
&lt;p&gt;A interface é deliberadamente mínima:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public interface IActionGuard
{
    string PluginId { get; }
    string? ActionName { get; }  // null means guard ALL actions

    Task&amp;lt;ActionGuardResult&amp;gt; EvaluateAsync(
        ActionGuardContext context,
        IServiceProvider services,
        CancellationToken ct = default);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quando &lt;code&gt;ActionName&lt;/code&gt; é &lt;code&gt;null&lt;/code&gt;, o guarda é executado para cada ação. Quando está definido para algo como &lt;code&gt;&amp;quot;Entry.Publish&amp;quot;&lt;/code&gt;, apenas intercepta essa ação específica.&lt;/p&gt;
&lt;h3&gt;O contexto e os contratos de resultado&lt;/h3&gt;
&lt;p&gt;Cada guard recebe um contexto tipado com o nome da ação, inquilino, utilizador, entidade e um saco de propriedades:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public sealed record ActionGuardContext(
    string ActionName,
    Guid TenantId,
    Guid UserId,
    Guid EntityId,
    IReadOnlyDictionary&amp;lt;string, object?&amp;gt; Properties)
{
    public T? Get&amp;lt;T&amp;gt;(string key) =&amp;gt;
        Properties.TryGetValue(key, out var v) &amp;amp;&amp;amp; v is T typed
            ? typed : default;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;E cada guarda retorna um resultado previsível: permitir, negar ou permitir-com-modificações:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public sealed record ActionGuardResult
{
    public bool IsAllowed { get; init; }
    public string? ReasonCode { get; init; }
    public string? Message { get; init; }
    public IReadOnlyDictionary&amp;lt;string, object?&amp;gt;? Modifications { get; init; }

    public static ActionGuardResult Allow() =&amp;gt;
        new() { IsAllowed = true };

    public static ActionGuardResult Deny(
        string reasonCode, string message) =&amp;gt;
        new() { IsAllowed = false, ReasonCode = reasonCode, Message = message };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O campo &lt;code&gt;Modifications&lt;/code&gt; é importante. Um guard pode aprovar uma ação mas reescrever parte do conteúdo (por exemplo, redigir segredos antes de publicar).&lt;/p&gt;
&lt;h3&gt;Nomes de acções canónicas&lt;/h3&gt;
&lt;p&gt;Nós definimos todas as ações interceptáveis como constantes de string para que não haja nenhuma ambigüidade sobre o que um guard pode ter como alvo:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public static class ActionNames
{
    public static class Entry
    {
        public const string Create  = &amp;quot;Entry.Create&amp;quot;;
        public const string Save    = &amp;quot;Entry.Save&amp;quot;;
        public const string Publish = &amp;quot;Entry.Publish&amp;quot;;
        public const string Delete  = &amp;quot;Entry.Delete&amp;quot;;
        public const string Archive = &amp;quot;Entry.Archive&amp;quot;;
        public const string Renew   = &amp;quot;Entry.Renew&amp;quot;;
    }

    public static class Hub
    {
        public const string Create = &amp;quot;Hub.Create&amp;quot;;
        public const string Delete = &amp;quot;Hub.Delete&amp;quot;;
        public const string TransferOwnership = &amp;quot;Hub.TransferOwnership&amp;quot;;
    }

    public static class Translation
    {
        public const string Create  = &amp;quot;Translation.Create&amp;quot;;
        public const string Publish = &amp;quot;Translation.Publish&amp;quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Exemplo real: bloquear publicação sem aprovação&lt;/h3&gt;
&lt;p&gt;O plugin Workflow regista um guard que intercepta &lt;code&gt;Entry.Publish&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public sealed class WorkflowPublishGuard : IActionGuard
{
    public string PluginId =&amp;gt; WorkflowPluginModule.PluginId;
    public string? ActionName =&amp;gt; ActionNames.Entry.Publish;

    public async Task&amp;lt;ActionGuardResult&amp;gt; EvaluateAsync(
        ActionGuardContext context,
        IServiceProvider services,
        CancellationToken ct = default)
    {
        var db = services.GetRequiredService&amp;lt;RasepiDbContext&amp;gt;();
        var entry = await db.Entries
            .AsNoTracking()
            .FirstOrDefaultAsync(e =&amp;gt; e.Id == context.EntityId, ct);

        if (entry is null)
            return ActionGuardResult.Allow();

        var workflowService = services.GetRequiredService&amp;lt;IWorkflowService&amp;gt;();
        var check = await workflowService
            .CheckPublishAllowedAsync(entry.Id, entry.HubId);

        if (check.IsAllowed)
            return ActionGuardResult.Allow();

        return ActionGuardResult.Deny(
            &amp;quot;workflow.approval_required&amp;quot;,
            check.Message ?? &amp;quot;Approval required before publishing.&amp;quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A plataforma principal não sabe nada sobre workflows de aprovação. Apenas chama &lt;code&gt;Entry.Publish&lt;/code&gt; através do pipeline, e o guard bloqueia-o se o workflow não tiver sido concluído.&lt;/p&gt;
&lt;h2&gt;O pipeline de ação: onde tudo converge&lt;/h2&gt;
&lt;p&gt;O &lt;code&gt;ActionPipeline&lt;/code&gt; é o único caminho de execução para todas as operações protegidas. Ele resolve quais guardas se aplicam, avalia-os, e bloqueia ou executa a ação.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public sealed class ActionPipeline : IActionPipeline
{
    public async Task&amp;lt;ActionPipelineResult&amp;gt; ExecuteAsync(
        string actionName,
        ActionGuardContext context,
        Func&amp;lt;Task&amp;gt; action,
        CancellationToken ct = default)
    {
        var result = await EvaluateAsync(actionName, context, ct);
        if (!result.IsAllowed) return result;

        await action();  // All guards passed — execute

        return result;   // Return modifications for caller
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O método &lt;code&gt;EvaluateAsync&lt;/code&gt; faz o trabalho pesado:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public async Task&amp;lt;ActionPipelineResult&amp;gt; EvaluateAsync(
    string actionName,
    ActionGuardContext context,
    CancellationToken ct = default)
{
    // 1. Which plugins are enabled for this tenant?
    var enabledPlugins = await _resolver.GetEnabledPluginIdsAsync();

    // 2. Which guards match this action?
    var applicable = _guards
        .Where(g =&amp;gt; enabledPlugins.Contains(g.PluginId))
        .Where(g =&amp;gt; g.ActionName == null || g.ActionName == actionName)
        .ToList();

    // 3. Evaluate each guard
    var denials = new List&amp;lt;ActionGuardResult&amp;gt;();
    var modifications = new List&amp;lt;ActionGuardResult&amp;gt;();

    foreach (var guard in applicable)
    {
        try
        {
            var guardResult = await guard.EvaluateAsync(context, _services, ct);
            if (!guardResult.IsAllowed)
                denials.Add(guardResult);
            else if (guardResult.Modifications?.Count &amp;gt; 0)
                modifications.Add(guardResult);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, &amp;quot;Guard threw. Treating as Allow.&amp;quot;);
        }
    }

    // 4. Any denial blocks the whole action
    if (denials.Count &amp;gt; 0)
        return ActionPipelineResult.Blocked(denials);

    return modifications.Count &amp;gt; 0
        ? ActionPipelineResult.Allowed(modifications)
        : ActionPipelineResult.Allowed();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Três importantes decisões de design aqui:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Resolução por inquilino&lt;/strong&gt; O &lt;code&gt;TenantPluginResolver&lt;/code&gt; verifica quais os plugins que cada inquilino tem instalados e activados. Um guarda para um plugin desativado nunca é executado.&lt;/li&gt;
&lt;li&gt;**Se algum guarda negar, a ação é bloqueada. Esta é uma postura de segurança deliberada.&lt;/li&gt;
&lt;li&gt;**Se um guarda lança uma exceção, esta é registada e tratada como &lt;code&gt;Allow()&lt;/code&gt;. Isso evita que um plugin quebrado bloqueie toda a plataforma.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Resolução de plugins por inquilino&lt;/h3&gt;
&lt;p&gt;O resolvedor consulta a tabela &lt;code&gt;TenantPluginInstallations&lt;/code&gt; (com escopo automático para o locatário atual pelos filtros de consulta global EF):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public sealed class TenantPluginResolver : ITenantPluginResolver
{
    public async Task&amp;lt;IReadOnlySet&amp;lt;string&amp;gt;&amp;gt; GetEnabledPluginIdsAsync(
        CancellationToken ct = default)
    {
        if (_cache is not null) return _cache;

        var ids = await _db.TenantPluginInstallations
            .Where(i =&amp;gt; i.IsEnabled)
            .Select(i =&amp;gt; i.PluginId)
            .ToListAsync(ct);

        _cache = ids.ToHashSet();
        return _cache;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Efeitos colaterais orientados por eventos&lt;/h2&gt;
&lt;p&gt;As acções são síncronas. Os efeitos colaterais não são. Depois que uma ação é concluída, o serviço publica um evento de domínio:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;await _eventPublisher.PublishAsync(
    EventNames.Entry.Created, entry.Id, new { entry.OriginalLanguage });
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Os eventos são enfileirados em um canal na memória e processados por um &lt;code&gt;EventConsumerWorker&lt;/code&gt; em segundo plano. O trabalhador encaminha os eventos para vários sistemas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registo de actividades. Regista quem fez o quê, quando&lt;/li&gt;
&lt;li&gt;Faturação da tradução: regista os custos por fornecedor&lt;/li&gt;
&lt;li&gt;Manipuladores de eventos de plugins.** Qualquer plugin pode subscrever eventos do domínio&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Os manipuladores de eventos de plugins implementam &lt;code&gt;IPluginEventHandler&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public interface IPluginEventHandler
{
    string PluginId { get; }
    IReadOnlyList&amp;lt;string&amp;gt; SubscribedEvents { get; }

    Task HandleAsync(
        string eventName, Guid entityId,
        Guid? tenantId, Guid? userId,
        string payloadJson, IServiceProvider services,
        CancellationToken ct = default);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O trabalhador só invoca manipuladores cujo plugin está habilitado para o locatário. Isso significa que os efeitos colaterais do plugin A nunca vazam para um locatário que só tem o plugin B instalado.&lt;/p&gt;
&lt;h2&gt;O motor de tradução a nível de bloco&lt;/h2&gt;
&lt;p&gt;É aqui que a arquitetura compensa de forma mais visível.&lt;/p&gt;
&lt;p&gt;Tradução por blocos: apenas os blocos alterados são retraduzidos](/pt/blog/img/block-translation.svg)&lt;/p&gt;
&lt;p&gt;As plataformas tradicionais traduzem documentos inteiros. Nós traduzimos &lt;strong&gt;blocos&lt;/strong&gt; individuais: parágrafos, títulos, itens de lista. Quando um utilizador edita um parágrafo num documento de 50 blocos, apenas esse parágrafo precisa de ser traduzido novamente. Esta é a fonte da nossa poupança de custos de 94%.&lt;/p&gt;
&lt;h3&gt;Como os blocos são criados a partir do TipTap JSON&lt;/h3&gt;
&lt;p&gt;Quando um usuário salva um documento, o editor TipTap envia JSON como este:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;type&amp;quot;: &amp;quot;doc&amp;quot;,
  &amp;quot;content&amp;quot;: [
    {
      &amp;quot;type&amp;quot;: &amp;quot;paragraph&amp;quot;,
      &amp;quot;attrs&amp;quot;: { &amp;quot;blockId&amp;quot;: &amp;quot;a1b2c3d4-...&amp;quot; },
      &amp;quot;content&amp;quot;: [{ &amp;quot;type&amp;quot;: &amp;quot;text&amp;quot;, &amp;quot;text&amp;quot;: &amp;quot;Hello world&amp;quot; }]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O &lt;code&gt;BlockTranslationService&lt;/code&gt; analisa este JSON e cria registos &lt;code&gt;EntryBlock&lt;/code&gt; individuais:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public async Task&amp;lt;List&amp;lt;EntryBlock&amp;gt;&amp;gt; CreateBlocksFromDocumentAsync(
    Guid entryId, string language, string contentJson,
    int version, Guid userId)
{
    var doc = JsonDocument.Parse(contentJson);
    var content = doc.RootElement.GetProperty(&amp;quot;content&amp;quot;);

    int position = 0;
    foreach (var node in content.EnumerateArray())
    {
        var blockType = node.GetProperty(&amp;quot;type&amp;quot;).GetString();
        var blockJson = JsonSerializer.Serialize(node);

        // Strip metadata attrs before hashing
        var hashInput = StripBlockMetaAttrs(blockJson);

        var block = new EntryBlock
        {
            Id = ExtractOrGenerateBlockId(node),
            EntryId = entryId,
            Language = language,
            Position = position++,
            BlockType = blockType,
            ContentJson = blockJson,
            ContentHash = CalculateContentHash(hashInput),
            IsNoTranslate = ExtractNoTranslateFlag(node),
            Version = version,
        };

        _context.EntryBlocks.Add(block);
    }

    await _context.SaveChangesAsync();
    return blocks;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;hashing SHA256 para deteção de desatualização&lt;/h3&gt;
&lt;p&gt;O hash de conteúdo é o núcleo da deteção de desatualização. Fazemos o hash do conteúdo do bloco (depois de retirar os atributos de metadados como &lt;code&gt;blockId&lt;/code&gt; e &lt;code&gt;deleted&lt;/code&gt;) usando SHA256:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;private string CalculateContentHash(string content)
{
    using var sha256 = SHA256.Create();
    var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(content));
    return Convert.ToHexString(hashBytes);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quando um bloco de origem muda, seu hash muda. O sistema compara então o &lt;code&gt;SourceContentHash&lt;/code&gt; de cada bloco de tradução com o hash de origem atual, e as incompatibilidades são marcadas como &lt;code&gt;Stale&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public async Task MarkTranslationsAsStaleAsync(List&amp;lt;Guid&amp;gt; changedBlockIds)
{
    var affected = await _context.TranslationBlocks
        .Where(t =&amp;gt; changedBlockIds.Contains(t.SourceBlockId))
        .ToListAsync();

    foreach (var translation in affected)
    {
        translation.Status = TranslationStatus.Stale;
        translation.UpdatedAt = DateTime.UtcNow;
    }

    await _context.SaveChangesAsync();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Adaptação da estrutura&lt;/h3&gt;
&lt;p&gt;Os tradutores podem alterar os tipos de blocos nas várias línguas. Uma lista de pontos em inglês pode tornar-se numa lista numerada em alemão, uma preferência cultural. O sistema regista este facto:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var translation = new TranslationBlock
{
    SourceBlockId = sourceBlockId,
    Language = targetLanguage,
    BlockType = translatedBlockType,
    SourceBlockType = sourceBlock.BlockType,
    IsStructureAdapted = translatedBlockType != sourceBlock.BlockType,
    SourceContentHash = sourceBlock.ContentHash,
    Status = TranslationStatus.UpToDate,
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Fornecedores de tradução como plugins&lt;/h3&gt;
&lt;p&gt;Os serviços de tradução externos (DeepL, Google Translate, etc.) ligam-se através de &lt;code&gt;ITranslationProviderPlugin&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public interface ITranslationProviderPlugin : IRasepiPlugin
{
    string[] GetSupportedLanguages();

    Task&amp;lt;string&amp;gt; TranslateAsync(
        string text, string sourceLanguage, string targetLanguage);

    Task&amp;lt;TranslationBatchResult&amp;gt; TranslateBatchAsync(
        Dictionary&amp;lt;string, string&amp;gt; texts,
        string sourceLanguage, string targetLanguage);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O método batch recebe um dicionário de IDs de blocos para o conteúdo, traduz todos eles e retorna as traduções com uma contagem de caracteres facturados. Como só enviamos blocos antigos, e não o documento inteiro, os custos são mínimos.&lt;/p&gt;
&lt;h2&gt;Isolamento do inquilino: a rede de segurança invisível&lt;/h2&gt;
&lt;p&gt;Todos os sistemas descritos acima funcionam dentro de um isolamento rigoroso do locatário.&lt;/p&gt;
&lt;p&gt;O &lt;code&gt;TenantContextMiddleware&lt;/code&gt; resolve o inquilino a partir do JWT em cada pedido e verifica a adesão:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;public async Task InvokeAsync(
    HttpContext context, TenantContext tenantContext, RasepiDbContext db)
{
    var tenantIdClaim = context.User.FindFirstValue(&amp;quot;tenant_id&amp;quot;);
    var userIdClaim = context.User.FindFirstValue(ClaimTypes.NameIdentifier);

    // Populate scoped context
    tenantContext.TenantId = Guid.Parse(tenantIdClaim);
    tenantContext.UserId = Guid.Parse(userIdClaim);

    // Verify membership — fail closed
    var membership = await db.TenantMemberships
        .Where(m =&amp;gt; m.TenantId == tenantContext.TenantId
                  &amp;amp;&amp;amp; m.UserId == tenantContext.UserId)
        .FirstOrDefaultAsync();

    if (membership == null)
    {
        context.Response.StatusCode = 401;
        return;  // No membership = no access
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Os filtros de consulta globais do Entity Framework garantem que, mesmo que um programador se esqueça de filtrar por inquilino, a camada de base de dados fá-lo automaticamente:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;modelBuilder.Entity&amp;lt;Hub&amp;gt;()
    .HasQueryFilter(h =&amp;gt; h.TenantId == _tenantContext.TenantId);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O resultado: &lt;code&gt;db.Hubs.ToListAsync()&lt;/code&gt; sempre retorna apenas os hubs do locatário atual. As fugas de dados exigem que se contorne ativamente o filtro de consulta, o que é proibido na nossa base de código.&lt;/p&gt;
&lt;h2&gt;A imagem completa&lt;/h2&gt;
&lt;p&gt;Quando um utilizador clica em &amp;quot;Publicar&amp;quot; numa entrada, eis o que acontece:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;**A autenticação valida o JWT, &lt;code&gt;TenantContextMiddleware&lt;/code&gt; resolve e verifica o inquilino.&lt;/li&gt;
&lt;li&gt;**O controlador chama o pipeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O pipeline resolve os guardas.&lt;/strong&gt; Consulta quais os plugins que o inquilino activou, seleciona os guardas aplicáveis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Os guardas avaliam.&lt;/strong&gt; O guarda de Fluxo de trabalho verifica as aprovações, o guarda de Retenção verifica a política, o guarda de Regras valida o conteúdo. Todos passam? A entrada é publicada.&lt;/li&gt;
&lt;li&gt;**O evento &lt;code&gt;Entry.Published&lt;/code&gt; é colocado na fila. Um trabalhador em segundo plano regista a atividade, actualiza a faturação da tradução e chama os manipuladores de eventos do plugin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traduções de blocos verificadas.&lt;/strong&gt; Blocos obsoletos são identificados para retradução.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Cada camada faz o seu trabalho. Nenhuma camada se intromete em outra. Esta é a arquitetura.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Não construímos isto porque a extensibilidade está na moda. Construímo-la porque uma plataforma de documentação que não se pode adaptar ao fluxo de trabalho de cada equipa acabará por ser substituída por uma que o possa fazer. E uma plataforma que se adapta sem proteção acabará por quebrar algo que é importante.&lt;/p&gt;
&lt;/blockquote&gt;
</content>
    <author><name>Tim Cadenbach</name></author>
    <category term="architecture" />
    <category term="plugins" />
    <category term="ai" />
  </entry>
</feed>
