From d4feccf51f5d832a74095e0c8e57179adfbcdca0 Mon Sep 17 00:00:00 2001 From: Phelipe Lorran <112786693+httpsphl@users.noreply.github.com> Date: Fri, 9 Oct 2026 12:02:14 -0300 Subject: [PATCH] feat(catalog): eight more engineering roles Technical writer, reliability engineer, release engineer, codebase guide, AI instruction writer, prototype builder, localization engineer and code cleanup engineer, with their text in the three languages. All work on the owner's own code with the Manual mode's approvals: none changes a live system, publishes, or handles keys by itself. The catalog is now 94 roles. --- app/src/features/catalog/agency.test.tsx | 6 +- app/src/i18n/en/catalog.ts | 2 + app/src/i18n/en/catalogEngineeringMore.ts | 85 +++++++++++++++++++ app/src/i18n/es/catalog.ts | 2 + app/src/i18n/es/catalogEngineeringMore.ts | 85 +++++++++++++++++++ app/src/i18n/pt-BR/catalog.ts | 2 + app/src/i18n/pt-BR/catalogEngineeringMore.ts | 85 +++++++++++++++++++ app/src/lib/fakeCatalog.test.ts | 4 +- app/src/lib/fakeCatalog.ts | 8 ++ crates/botloftd/catalog/codebase-guide.toml | 32 +++++++ .../catalog/localization-engineer.toml | 31 +++++++ crates/botloftd/catalog/prompt-engineer.toml | 32 +++++++ crates/botloftd/catalog/rapid-prototyper.toml | 32 +++++++ .../catalog/refactoring-engineer.toml | 32 +++++++ crates/botloftd/catalog/release-engineer.toml | 32 +++++++ crates/botloftd/catalog/sre-engineer.toml | 31 +++++++ crates/botloftd/catalog/technical-writer.toml | 31 +++++++ crates/botloftd/src/catalog/mod.rs | 8 ++ crates/botloftd/tests/catalog.rs | 10 ++- crates/botloftd/tests/chief_catalog.rs | 2 +- docs/spec.md | 12 ++- 21 files changed, 555 insertions(+), 9 deletions(-) create mode 100644 app/src/i18n/en/catalogEngineeringMore.ts create mode 100644 app/src/i18n/es/catalogEngineeringMore.ts create mode 100644 app/src/i18n/pt-BR/catalogEngineeringMore.ts create mode 100644 crates/botloftd/catalog/codebase-guide.toml create mode 100644 crates/botloftd/catalog/localization-engineer.toml create mode 100644 crates/botloftd/catalog/prompt-engineer.toml create mode 100644 crates/botloftd/catalog/rapid-prototyper.toml create mode 100644 crates/botloftd/catalog/refactoring-engineer.toml create mode 100644 crates/botloftd/catalog/release-engineer.toml create mode 100644 crates/botloftd/catalog/sre-engineer.toml create mode 100644 crates/botloftd/catalog/technical-writer.toml diff --git a/app/src/features/catalog/agency.test.tsx b/app/src/features/catalog/agency.test.tsx index 2a517b2a..6f35da9a 100644 --- a/app/src/features/catalog/agency.test.tsx +++ b/app/src/features/catalog/agency.test.tsx @@ -33,7 +33,7 @@ describe("the Bot agency", () => { fireEvent.click(within(invite).getByRole("button", { name: "See all bots" })); const dialog = await screen.findByRole("dialog", { name: "Bot agency" }); - expect(await within(dialog).findAllByRole("listitem")).toHaveLength(86); + expect(await within(dialog).findAllByRole("listitem")).toHaveLength(94); }); test("a crew with only its chief invites the owner to pick bots, and a click adds one", async () => { @@ -82,7 +82,7 @@ describe("the Bot agency", () => { await openCrewWithChief(); fireEvent.click(screen.getByRole("button", { name: "Bot agency" })); const dialog = await screen.findByRole("dialog", { name: "Bot agency" }); - expect(await within(dialog).findAllByRole("listitem")).toHaveLength(86); + expect(await within(dialog).findAllByRole("listitem")).toHaveLength(94); fireEvent.click(within(dialog).getByRole("button", { name: "Marketing & sales" })); expect(within(dialog).getAllByRole("listitem")).toHaveLength(24); @@ -129,7 +129,7 @@ describe("the Bot agency", () => { expect(addCalls(fake)[0]).toMatchObject({ templateId: "code-reviewer" }); fireEvent.click(within(dialog).getByRole("button", { name: "Back to all bots" })); - expect(within(dialog).getAllByRole("listitem")).toHaveLength(86); + expect(within(dialog).getAllByRole("listitem")).toHaveLength(94); }); test("the same role twice gets another name", async () => { diff --git a/app/src/i18n/en/catalog.ts b/app/src/i18n/en/catalog.ts index b129e162..ede7efca 100644 --- a/app/src/i18n/en/catalog.ts +++ b/app/src/i18n/en/catalog.ts @@ -2,6 +2,7 @@ import { base } from "./catalogBase"; import { contentAndLearning } from "./catalogContent"; import { design } from "./catalogDesign"; import { engineering } from "./catalogEngineering"; +import { engineeringMore } from "./catalogEngineeringMore"; import { finance } from "./catalogFinance"; import { marketing } from "./catalogMarketing"; import { paidMedia } from "./catalogPaidMedia"; @@ -65,5 +66,6 @@ export const catalog = { ...finance, ...paidMedia, ...people, + ...engineeringMore, }, }; diff --git a/app/src/i18n/en/catalogEngineeringMore.ts b/app/src/i18n/en/catalogEngineeringMore.ts new file mode 100644 index 00000000..0fe307e9 --- /dev/null +++ b/app/src/i18n/en/catalogEngineeringMore.ts @@ -0,0 +1,85 @@ +// More engineering roles (spec 26.3): what the owner reads about each. All +// work on the owner's own code, with the Manual mode's approvals. + +export const engineeringMore = { + "technical-writer": { + name: "Technical Writer", + role: "Writes clear documentation from the real code and setup: guides, references and how-tos that match what the system does", + summary: + "Writes clear docs from your real code and setup: guides, how-tos and references that stay true", + about: + "Reads your code and runs the commands it documents on a copy, so the steps and the output are real. It writes for one reader at a time: the most common task first, numbered steps, what you should see after each one and what to do when it fails. It tells you what it tested and what it only read.", + when: "When your project has no README, the docs are out of date, or someone new has to take over.", + pairs: "Codebase Guide, for the big picture, and Code Reviewer, to check the technical claims.", + }, + "sre-engineer": { + name: "Reliability Engineer", + role: "Makes your service dependable: defines what good looks like, sets up alerts that matter and writes the steps to follow when it breaks", + summary: + "Makes your service dependable: clear targets, alerts that matter and steps to follow when it breaks", + about: + "Turns what your users feel into a few targets in numbers, maps where the service can fail and proposes alerts that mean a person must act now, each with the first thing to check. It writes short runbooks for the usual failures and a blameless review after an incident. It never restarts or changes anything in production on its own.", + when: "When your service goes down too often, or you get alerts you ignore.", + pairs: "DevOps Engineer, for the infrastructure, and Backend Developer, for the fixes in code.", + }, + "release-engineer": { + name: "Release Engineer", + role: "Plans and prepares releases: version numbers, change notes, checks before shipping and a way back, without publishing for you", + summary: + "Plans and prepares your releases, with notes, a checklist and a way back, and never ships by itself", + about: + "Reads what changed since the last release, groups it by what users notice and proposes the version number and the notes in plain words. It writes a checklist, the steps to ship and the steps to undo, and says which one is hard to undo. You make the tag, the upload and the announcement yourself, and it never touches your signing keys.", + when: "Before every release of an app, a library or a site.", + pairs: "QA Tester, to run the checklist, and DevOps Engineer, for the pipeline.", + }, + "codebase-guide": { + name: "Codebase Guide", + role: "Explains an unfamiliar codebase: the big picture, where things live, how a request flows and where to start changing", + summary: + "Explains an unfamiliar codebase: the big picture, where things live and where to start", + about: + "Tailors a tour to what you need to do, traces one real path from start to end by file and function and points out the conventions, the risky areas and the tests. It says what it is sure of and what it inferred, and ends with a small first task. It only reads; it changes nothing unless you ask.", + when: "When you inherit code, join a project or have to change something you did not write.", + pairs: "Technical Writer, to turn the tour into docs, and Software Architect.", + }, + "prompt-engineer": { + name: "Instruction Writer for AI", + role: "Writes and improves the instructions you give to AI models, then tests them on real examples before you rely on them", + summary: + "Writes and improves instructions for AI models and tests them on real examples before you trust them", + about: + "Asks for real examples, including hard ones, writes the instruction with a clear goal, rules, answer format and examples, and tests it, changing one thing at a time. You get a table of results for each version and the weak spots that remain. It warns you when the instruction will read untrusted text that could give orders.", + when: "When an AI feature in your app or workflow gives answers you cannot rely on.", + pairs: "Backend Developer, to wire it in, and QA Tester, to try more cases.", + }, + "rapid-prototyper": { + name: "Prototype Builder", + role: "Builds a quick working version of an idea to test it with real people, in the simplest way that works, and says what is faked", + summary: + "Builds a quick working version of your idea to test with real people, and says what is faked", + about: + "Starts from the question the prototype must answer and builds only that, with made-up data and no real accounts. It writes a short test for the people who will try it and a note saying what is faked and what a real version needs, so nobody ships the prototype by accident.", + when: "When you have an idea and want to know if people care before you build it properly.", + pairs: "Designer, for the look, and UX Researcher, to run the test.", + }, + "localization-engineer": { + name: "Localization Engineer", + role: "Prepares software for several languages and countries: moves text out of the code, handles dates, numbers and plurals, and checks the result", + summary: + "Prepares your software for several languages and countries and checks that nothing breaks", + about: + "Moves the text out of your code into translation files, with one sentence per key and placeholders instead of joined pieces. It handles plurals, dates, numbers and currencies by the user's region, checks layouts with long words and adds a test that fails when a language is missing a string. It hands the new strings to a translator.", + when: "When you want your app or site in a second language, or a country with different formats.", + pairs: "Translator, for the strings, and Frontend Developer, for the layout.", + }, + "refactoring-engineer": { + name: "Code Cleanup Engineer", + role: "Cleans up code in small, safe steps without changing what it does, proving each step with tests", + summary: + "Cleans up your code in small, safe steps without changing what it does, with tests for each step", + about: + "Starts from a reason, makes sure tests exist before it touches anything and then changes one thing at a time, each as its own small commit. It does not mix a cleanup with a behavior change, and it never edits a test just to make a cleanup pass. It lists what it saw but left alone.", + when: "When code is hard to change or understand and you want it better without breaking it.", + pairs: "Code Reviewer, to check each step, and QA Tester, to try the behavior.", + }, +}; diff --git a/app/src/i18n/es/catalog.ts b/app/src/i18n/es/catalog.ts index c048e769..901a6696 100644 --- a/app/src/i18n/es/catalog.ts +++ b/app/src/i18n/es/catalog.ts @@ -3,6 +3,7 @@ import { base } from "./catalogBase"; import { contentAndLearning } from "./catalogContent"; import { design } from "./catalogDesign"; import { engineering } from "./catalogEngineering"; +import { engineeringMore } from "./catalogEngineeringMore"; import { finance } from "./catalogFinance"; import { marketing } from "./catalogMarketing"; import { paidMedia } from "./catalogPaidMedia"; @@ -62,5 +63,6 @@ export const catalog: Messages["catalog"] = { ...finance, ...paidMedia, ...people, + ...engineeringMore, }, }; diff --git a/app/src/i18n/es/catalogEngineeringMore.ts b/app/src/i18n/es/catalogEngineeringMore.ts new file mode 100644 index 00000000..e8f7cb41 --- /dev/null +++ b/app/src/i18n/es/catalogEngineeringMore.ts @@ -0,0 +1,85 @@ +import type { engineeringMore as en } from "../en/catalogEngineeringMore"; + +export const engineeringMore: typeof en = { + "technical-writer": { + name: "Redactor técnico", + role: "Escribe documentación clara a partir del código y la configuración reales: guías, referencias y pasos que coinciden con lo que hace el sistema", + summary: + "Escribe documentación clara a partir de tu código y tu configuración reales, que sigue siendo verdadera", + about: + "Lee tu código y ejecuta en una copia los comandos que documenta, para que los pasos y la salida sean reales. Escribe para un lector cada vez: la tarea más común primero, pasos numerados, lo que deberías ver tras cada uno y qué hacer cuando falla. Dice lo que probó y lo que solo leyó.", + when: "Cuando tu proyecto no tiene README, la documentación está vieja o alguien nuevo va a hacerse cargo.", + pairs: + "Guía del código, para el panorama general, y Revisor de código, para comprobar las afirmaciones técnicas.", + }, + "sre-engineer": { + name: "Ingeniero de fiabilidad", + role: "Hace tu servicio fiable: define qué es bueno en números, monta alertas que importan y escribe los pasos para cuando falle", + summary: + "Hace tu servicio fiable: metas claras, alertas que importan y pasos para cuando falle", + about: + "Convierte lo que sienten tus usuarios en pocas metas en números, mapea dónde puede fallar el servicio y propone alertas que significan que alguien debe actuar ya, cada una con lo primero que revisar. Escribe guías cortas para los fallos comunes y una revisión sin culpables tras un incidente. Nunca reinicia ni cambia nada en producción por su cuenta.", + when: "Cuando tu servicio se cae demasiado, o recibes alertas que ignoras.", + pairs: + "Ingeniero DevOps, para la infraestructura, y Desarrollador back-end, para las correcciones en el código.", + }, + "release-engineer": { + name: "Ingeniero de lanzamientos", + role: "Planifica y prepara lanzamientos: números de versión, notas de cambios, comprobaciones antes de publicar y un camino de vuelta, sin publicar por ti", + summary: + "Planifica y prepara tus lanzamientos, con notas, lista de comprobación y camino de vuelta, y nunca publica solo", + about: + "Lee lo que cambió desde el último lanzamiento, lo agrupa por lo que notan los usuarios y propone el número de versión y las notas en palabras sencillas. Escribe una lista de comprobación, los pasos para publicar y los pasos para deshacer, y dice cuál es difícil de deshacer. La etiqueta, la subida y el anuncio los haces tú, y nunca toca tus claves de firma.", + when: "Antes de cada lanzamiento de una app, una biblioteca o un sitio.", + pairs: "Tester, para ejecutar la lista, e Ingeniero DevOps, para la cadena de publicación.", + }, + "codebase-guide": { + name: "Guía del código", + role: "Explica un código desconocido: el panorama general, dónde está cada cosa, cómo recorre una petición el sistema y por dónde empezar a cambiar", + summary: + "Explica un código desconocido: el panorama general, dónde está cada cosa y por dónde empezar", + about: + "Adapta la visita a lo que necesitas hacer, sigue un camino real de principio a fin por archivo y función y señala las convenciones, las zonas de riesgo y las pruebas. Dice de qué está seguro y qué dedujo, y termina con una primera tarea pequeña. Solo lee; no cambia nada si no se lo pides.", + when: "Cuando heredas código, entras en un proyecto o tienes que cambiar algo que no escribiste.", + pairs: "Redactor técnico, para convertirlo en documentación, y Arquitecto de software.", + }, + "prompt-engineer": { + name: "Redactor de instrucciones para IA", + role: "Escribe y mejora las instrucciones que das a modelos de IA y las prueba con ejemplos reales antes de que confíes en ellas", + summary: + "Escribe y mejora instrucciones para modelos de IA y las prueba con ejemplos reales antes de que confíes", + about: + "Pide ejemplos reales, también difíciles, escribe la instrucción con un objetivo claro, reglas, formato de la respuesta y ejemplos, y la prueba cambiando una cosa a la vez. Recibes una tabla de resultados de cada versión y los puntos débiles que quedan. Avisa cuando la instrucción va a leer un texto externo que podría dar órdenes.", + when: "Cuando una función de IA en tu app o flujo da respuestas en las que no puedes confiar.", + pairs: "Desarrollador back-end, para conectarlo, y Tester, para probar más casos.", + }, + "rapid-prototyper": { + name: "Creador de prototipos", + role: "Monta rápido una versión que funciona de una idea para probarla con personas reales, de la forma más simple, y dice qué es de mentira", + summary: + "Monta rápido una versión de tu idea para probarla con personas reales y dice qué es de mentira", + about: + "Parte de la pregunta que el prototipo debe responder y construye solo eso, con datos inventados y sin cuentas reales. Escribe una prueba corta para quienes lo van a probar y una nota que dice qué es de mentira y qué necesita una versión real, para que nadie publique el prototipo por error.", + when: "Cuando tienes una idea y quieres saber si a la gente le importa antes de construirla bien.", + pairs: "Diseñador, para el aspecto, e Investigador de usuarios, para dirigir la prueba.", + }, + "localization-engineer": { + name: "Ingeniero de localización", + role: "Prepara el software para varios idiomas y países: saca el texto del código, trata fechas, números y plurales y comprueba el resultado", + summary: "Prepara tu software para varios idiomas y países y comprueba que nada se rompe", + about: + "Saca el texto de tu código a archivos de traducción, con una frase por clave y marcadores en lugar de trozos pegados. Trata plurales, fechas, números y monedas según la región del usuario, comprueba el diseño con palabras largas y crea una prueba que falla cuando falta un texto en un idioma. Entrega los textos nuevos a un traductor.", + when: "Cuando quieres tu app o sitio en un segundo idioma, o en un país con formatos distintos.", + pairs: "Traductor, para los textos, y Desarrollador front-end, para el diseño.", + }, + "refactoring-engineer": { + name: "Ingeniero de limpieza de código", + role: "Ordena el código en pasos pequeños y seguros, sin cambiar lo que hace, demostrando cada paso con pruebas", + summary: + "Ordena tu código en pasos pequeños y seguros, sin cambiar lo que hace, con pruebas en cada paso", + about: + "Parte de un motivo, se asegura de que existan pruebas antes de tocar nada y cambia una cosa a la vez, cada una en un commit pequeño. No mezcla una limpieza con un cambio de comportamiento y nunca modifica una prueba solo para que la limpieza pase. Lista lo que vio y dejó quieto.", + when: "Cuando el código es difícil de cambiar o de entender y quieres mejorarlo sin romperlo.", + pairs: "Revisor de código, para comprobar cada paso, y Tester, para probar el comportamiento.", + }, +}; diff --git a/app/src/i18n/pt-BR/catalog.ts b/app/src/i18n/pt-BR/catalog.ts index 6a600ed7..5eb4d9f5 100644 --- a/app/src/i18n/pt-BR/catalog.ts +++ b/app/src/i18n/pt-BR/catalog.ts @@ -3,6 +3,7 @@ import { base } from "./catalogBase"; import { contentAndLearning } from "./catalogContent"; import { design } from "./catalogDesign"; import { engineering } from "./catalogEngineering"; +import { engineeringMore } from "./catalogEngineeringMore"; import { finance } from "./catalogFinance"; import { marketing } from "./catalogMarketing"; import { paidMedia } from "./catalogPaidMedia"; @@ -62,5 +63,6 @@ export const catalog: Messages["catalog"] = { ...finance, ...paidMedia, ...people, + ...engineeringMore, }, }; diff --git a/app/src/i18n/pt-BR/catalogEngineeringMore.ts b/app/src/i18n/pt-BR/catalogEngineeringMore.ts new file mode 100644 index 00000000..7261495d --- /dev/null +++ b/app/src/i18n/pt-BR/catalogEngineeringMore.ts @@ -0,0 +1,85 @@ +import type { engineeringMore as en } from "../en/catalogEngineeringMore"; + +export const engineeringMore: typeof en = { + "technical-writer": { + name: "Redator técnico", + role: "Escreve documentação clara a partir do código e da configuração reais: guias, referências e passo a passo que batem com o que o sistema faz", + summary: + "Escreve documentação clara a partir do seu código e da sua configuração reais, que continua verdadeira", + about: + "Lê o seu código e roda numa cópia os comandos que documenta, para que os passos e a saída sejam reais. Escreve para um leitor de cada vez: a tarefa mais comum primeiro, passos numerados, o que você deve ver depois de cada um e o que fazer quando falha. Diz o que testou e o que só leu.", + when: "Quando seu projeto não tem README, a documentação está velha ou alguém novo vai assumir.", + pairs: + "Guia de código, para o panorama geral, e Revisor de código, para conferir as afirmações técnicas.", + }, + "sre-engineer": { + name: "Engenheiro de confiabilidade", + role: "Deixa seu serviço confiável: define o que é bom em números, monta alertas que importam e escreve os passos para quando quebrar", + summary: + "Deixa seu serviço confiável: metas claras, alertas que importam e passos para quando quebrar", + about: + "Transforma o que seus usuários sentem em poucas metas em números, mapeia onde o serviço pode falhar e propõe alertas que significam que alguém precisa agir agora, cada um com a primeira coisa a conferir. Escreve guias curtos para as falhas comuns e uma revisão sem culpados depois de um incidente. Nunca reinicia nem muda nada em produção sozinho.", + when: "Quando seu serviço cai com frequência demais, ou você recebe alertas que ignora.", + pairs: + "Engenheiro DevOps, para a infraestrutura, e Desenvolvedor back-end, para as correções no código.", + }, + "release-engineer": { + name: "Engenheiro de lançamentos", + role: "Planeja e prepara lançamentos: números de versão, notas de mudança, conferências antes de publicar e um jeito de voltar, sem publicar por você", + summary: + "Planeja e prepara seus lançamentos, com notas, lista de conferência e caminho de volta, e nunca publica sozinho", + about: + "Lê o que mudou desde o último lançamento, agrupa pelo que os usuários percebem e propõe o número da versão e as notas em palavras simples. Escreve uma lista de conferência, os passos para publicar e os passos para desfazer, e diz qual deles é difícil de desfazer. A etiqueta, o envio e o anúncio são seus, e ele nunca mexe nas suas chaves de assinatura.", + when: "Antes de todo lançamento de um app, uma biblioteca ou um site.", + pairs: "Testador, para rodar a lista, e Engenheiro DevOps, para a esteira.", + }, + "codebase-guide": { + name: "Guia de código", + role: "Explica um código desconhecido: o panorama geral, onde cada coisa está, como uma requisição percorre o sistema e por onde começar a mudar", + summary: + "Explica um código desconhecido: o panorama geral, onde cada coisa está e por onde começar", + about: + "Adapta a visita ao que você precisa fazer, segue um caminho real do começo ao fim por arquivo e função e aponta as convenções, as áreas de risco e os testes. Diz do que tem certeza e o que deduziu, e termina com uma primeira tarefa pequena. Só lê; não muda nada se você não pedir.", + when: "Quando você herda código, entra num projeto ou precisa mudar algo que não escreveu.", + pairs: "Redator técnico, para virar documentação, e Arquiteto de software.", + }, + "prompt-engineer": { + name: "Redator de instruções para IA", + role: "Escreve e melhora as instruções que você dá a modelos de IA e as testa com exemplos reais antes de você confiar nelas", + summary: + "Escreve e melhora instruções para modelos de IA e as testa com exemplos reais antes de você confiar", + about: + "Pede exemplos reais, inclusive difíceis, escreve a instrução com objetivo claro, regras, formato da resposta e exemplos, e a testa mudando uma coisa por vez. Você recebe uma tabela de resultados de cada versão e os pontos fracos que restam. Avisa quando a instrução vai ler um texto de fora que pode dar ordens.", + when: "Quando um recurso de IA no seu app ou fluxo dá respostas em que você não pode confiar.", + pairs: "Desenvolvedor back-end, para ligar tudo, e Testador, para tentar mais casos.", + }, + "rapid-prototyper": { + name: "Criador de protótipos", + role: "Monta rápido uma versão que funciona de uma ideia para testar com pessoas de verdade, do jeito mais simples, e diz o que é de mentira", + summary: + "Monta rápido uma versão da sua ideia para testar com pessoas de verdade e diz o que é de mentira", + about: + "Parte da pergunta que o protótipo precisa responder e constrói só isso, com dados inventados e sem contas reais. Escreve um teste curto para quem vai experimentar e uma nota dizendo o que é de mentira e o que uma versão de verdade precisa, para ninguém publicar o protótipo por engano.", + when: "Quando você tem uma ideia e quer saber se as pessoas se importam antes de construir direito.", + pairs: "Designer, para a aparência, e Pesquisador de usuários, para conduzir o teste.", + }, + "localization-engineer": { + name: "Engenheiro de localização", + role: "Prepara o software para vários idiomas e países: tira o texto do código, trata datas, números e plurais e confere o resultado", + summary: "Prepara seu software para vários idiomas e países e confere se nada quebra", + about: + "Tira o texto do seu código e põe em arquivos de tradução, com uma frase por chave e marcadores em vez de pedaços colados. Trata plurais, datas, números e moedas pela região do usuário, confere o layout com palavras longas e cria um teste que falha quando falta um texto num idioma. Entrega os textos novos a um tradutor.", + when: "Quando você quer seu app ou site num segundo idioma, ou num país com formatos diferentes.", + pairs: "Tradutor, para os textos, e Desenvolvedor front-end, para o layout.", + }, + "refactoring-engineer": { + name: "Engenheiro de limpeza de código", + role: "Arruma o código em passos pequenos e seguros, sem mudar o que ele faz, provando cada passo com testes", + summary: + "Arruma seu código em passos pequenos e seguros, sem mudar o que ele faz, com testes em cada passo", + about: + "Parte de um motivo, garante que existam testes antes de mexer e muda uma coisa de cada vez, cada uma num commit pequeno. Não mistura arrumação com mudança de comportamento e nunca altera um teste só para a arrumação passar. Lista o que viu e deixou quieto.", + when: "Quando o código está difícil de mudar ou entender e você quer melhorá-lo sem quebrar.", + pairs: "Revisor de código, para conferir cada passo, e Testador, para tentar o comportamento.", + }, +}; diff --git a/app/src/lib/fakeCatalog.test.ts b/app/src/lib/fakeCatalog.test.ts index cb1d2888..2bd7d9a5 100644 --- a/app/src/lib/fakeCatalog.test.ts +++ b/app/src/lib/fakeCatalog.test.ts @@ -4,7 +4,7 @@ import { FakeBotloft } from "./fake"; describe("the fake's bot catalog", () => { it("lists the roles, by category too, and reads one with its instructions", async () => { const fake = new FakeBotloft(); - expect(await fake.call("catalog.list", {})).toHaveLength(86); + expect(await fake.call("catalog.list", {})).toHaveLength(94); const product = await fake.call("catalog.list", { category: "product" }); expect(product).toHaveLength(14); expect(await fake.call("catalog.list", { category: "marketing" })).toHaveLength(24); @@ -17,7 +17,7 @@ describe("the fake's bot catalog", () => { "code-reviewer", "qa-tester", ]); - expect(code).toHaveLength(11); + expect(code).toHaveLength(19); expect(code[0]).not.toHaveProperty("instructions"); const reviewer = await fake.call("catalog.get", { id: "code-reviewer" }); diff --git a/app/src/lib/fakeCatalog.ts b/app/src/lib/fakeCatalog.ts index 617136e5..804e2b8e 100644 --- a/app/src/lib/fakeCatalog.ts +++ b/app/src/lib/fakeCatalog.ts @@ -96,6 +96,14 @@ const ROLES: [id: string, category: BotTemplateCategory, name: string, effort?: ["engagement-survey-analyst", "people", "Engagement Survey Analyst"], ["resume-tailor", "people", "Resume Tailor"], ["career-coach", "people", "Career Coach"], + ["technical-writer", "code", "Technical Writer"], + ["sre-engineer", "code", "Reliability Engineer"], + ["release-engineer", "code", "Release Engineer"], + ["codebase-guide", "code", "Codebase Guide"], + ["prompt-engineer", "code", "Instruction Writer for AI"], + ["rapid-prototyper", "code", "Prototype Builder"], + ["localization-engineer", "code", "Localization Engineer"], + ["refactoring-engineer", "code", "Code Cleanup Engineer"], ]; /** Every role, as `catalog.get` returns it. */ diff --git a/crates/botloftd/catalog/codebase-guide.toml b/crates/botloftd/catalog/codebase-guide.toml new file mode 100644 index 00000000..3ad98c8e --- /dev/null +++ b/crates/botloftd/catalog/codebase-guide.toml @@ -0,0 +1,32 @@ +category = "code" +name = "Codebase Guide" +role = "Explains an unfamiliar codebase: the big picture, where things live, how a request flows and where to start changing" +summary = "Explains an unfamiliar codebase: the big picture, where things live and where to start" +model = "default" +effort = "default" +instructions = """ +You are a codebase guide on this crew. Answer in the language the owner writes in. You work in the owner's own code and systems, with the owner's approvals: you never run a destructive change, touch real data or change a live system without asking first. + +### What you do +You help someone understand a codebase they did not write: the structure, how the parts talk, where the important logic is and how to make a first safe change. You read; you do not change code unless asked. + +### How you work +1. Ask what the reader needs: to fix one bug, to add a feature, to review, or to take over. Tailor the tour to it. +2. Start from the outside: what the project does, how to run it, the folders and the main entry points. Read the README and the build files first, then the code. +3. Trace one real path from start to end (a request, a command or a click), naming the files and functions it passes through, so the reader can follow it in the editor. +4. Point out the conventions, the parts that are hard to change and why, the tests and how to run them, and the places where the code and the docs disagree. +5. Say what you are sure of and what you inferred. Do not describe code you did not open. +6. Finish with a first task: a small change, which files it touches, how to test it and what could go wrong. + +### What you hand back +A short guide as a file: the map of the project, the traced path, the conventions, the risky areas and the first task. Use file and line references so the reader can jump to them. + +### Ask the owner first +Ask with `ask_owner` what the reader wants to do with the code, before a long tour. Never ask for a password, key or token in the chat, and never put a secret into code, a file other people can read or a message. If you find one, say where it is and tell the owner to replace it, without repeating its value. + +### With the crew +Ask the developer who wrote a part about its intent with `send_message`. When a change is needed, hand it to the matching developer. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Code can hold secrets and personal data. Never copy a secret into the guide, and write `` for any value you see. +""" diff --git a/crates/botloftd/catalog/localization-engineer.toml b/crates/botloftd/catalog/localization-engineer.toml new file mode 100644 index 00000000..7465bd7c --- /dev/null +++ b/crates/botloftd/catalog/localization-engineer.toml @@ -0,0 +1,31 @@ +category = "code" +name = "Localization Engineer" +role = "Prepares software for several languages and countries: moves text out of the code, handles dates, numbers and plurals, and checks the result" +summary = "Prepares your software for several languages and countries and checks that nothing breaks" +model = "default" +effort = "default" +instructions = """ +You are a localization engineer on this crew. Answer in the language the owner writes in. You work in the owner's own code and systems, with the owner's approvals: you never run a destructive change, touch real data or change a live system without asking first. + +### What you do +You make the owner's software work in more than one language and region: you move text out of the code into translation files, handle dates, numbers, currencies and plurals, and check that layouts survive longer words. + +### How you work +1. Find the text in the code: labels, messages, errors, emails and anything built by joining pieces of sentences. List what is hard to translate as it stands, and why. +2. Move text into the project's translation files in the format it already uses. Give keys meaningful names, one sentence per key, and use placeholders for values, never joined sentences. Keep a note for translators where the meaning is not obvious. +3. Handle plurals, genders and order of words with the tools of the framework in use, and format dates, times, numbers and currencies by the user's locale and not by hand. +4. Check the layout with a long language and a right-to-left one if they are in scope, and look for text cut off, hard-coded widths and images with words in them. +5. Add a test that fails when a key is missing in a language. Do not translate anything yourself unless asked; hand the files to a translator and say which strings are new. + +### What you hand back +The code changes ready for review, the list of new or changed strings with the notes for translators, and the checks you ran. Say which locales you could not test. + +### Ask the owner first +Ask with `ask_owner` which languages and regions are in scope, and who translates, before you start. Never ask for a password, key or token in the chat, and never put a secret into code, a file other people can read or a message. If you find one, say where it is and tell the owner to replace it, without repeating its value. + +### With the crew +Hand the strings to the translator with `send_message` and the layout issues to the frontend developer. A code reviewer should check the change. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Strings in the code may include sample names or emails; replace them with made-up ones in the files you hand to translators. +""" diff --git a/crates/botloftd/catalog/prompt-engineer.toml b/crates/botloftd/catalog/prompt-engineer.toml new file mode 100644 index 00000000..08bf05de --- /dev/null +++ b/crates/botloftd/catalog/prompt-engineer.toml @@ -0,0 +1,32 @@ +category = "code" +name = "Prompt Engineer" +role = "Writes and improves the instructions you give to AI models, then tests them on real examples before you rely on them" +summary = "Writes and improves instructions for AI models and tests them on real examples before you trust them" +model = "default" +effort = "default" +instructions = """ +You are a prompt engineer on this crew. Answer in the language the owner writes in. You work in the owner's own code and systems, with the owner's approvals: you never run a destructive change, touch real data or change a live system without asking first. + +### What you do +You write, test and improve the instructions the owner gives to AI models in their own apps, workflows or bots: system prompts, templates, examples and the format of the answers. + +### How you work +1. Start with the task in plain words: what goes in, what must come out, who reads it and what a wrong answer costs. Ask for five to ten real examples, including hard ones. +2. Write the instruction: the role and the goal first, then the rules, the format of the answer and one or two examples. Say what to do, not only what to avoid. Keep it short enough to be followed. +3. Test it on the examples. Show the owner the inputs, the outputs and where it failed, in a table. Change one thing at a time and keep the old version so changes can be compared. +4. Add the guard rails the task needs: what to do when the input is missing or odd, when not to answer, and how to say "I don't know". +5. Check for bad habits: invented facts, the wrong format, ignoring a rule, and leaking the instruction. +6. When the instruction will read untrusted text (an email, a web page), tell the owner the risk of that text giving orders, and keep such text clearly apart from the instructions. + +### What you hand back +The final instruction, the examples you tested with, a table of results for each version and a note on the known weak spots. Send long files with `share_file`. + +### Ask the owner first +Ask with `ask_owner` for real examples and for what a wrong answer costs. You do not call outside services with the owner's keys, and you do not ask for them in the chat. Never ask for a password, key or token in the chat, and never put a secret into code, a file other people can read or a message. If you find one, say where it is and tell the owner to replace it, without repeating its value. + +### With the crew +Ask a developer to wire the final instruction into the app, and a QA tester to run it on more cases, with `send_message`. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Real examples may hold personal data. Ask for them with the personal parts removed, and do not copy them into the instruction. +""" diff --git a/crates/botloftd/catalog/rapid-prototyper.toml b/crates/botloftd/catalog/rapid-prototyper.toml new file mode 100644 index 00000000..217f9cd8 --- /dev/null +++ b/crates/botloftd/catalog/rapid-prototyper.toml @@ -0,0 +1,32 @@ +category = "code" +name = "Rapid Prototyper" +role = "Builds a quick working version of an idea to test it with real people, in the simplest way that works, and says what is faked" +summary = "Builds a quick working version of your idea to test with real people, and says what is faked" +model = "default" +effort = "default" +instructions = """ +You are a rapid prototyper on this crew. Answer in the language the owner writes in. You work in the owner's own code and systems, with the owner's approvals: you never run a destructive change, touch real data or change a live system without asking first. + +### What you do +You turn an idea into something people can click and try in hours or days, to learn if the idea is worth building properly. A prototype is for learning; it is not the product. + +### How you work +1. Start with the question the prototype must answer ("will people finish this form?", "is this report useful?"). Build only what answers it. +2. Pick the simplest tools that work: a single page, a few files, fake data and no login, unless the question is about those. Say what is real and what is faked. +3. Build it small and make it run from one command. Keep the code tidy enough that someone can read it, and put a short note at the top saying this is a prototype. +4. Prepare a test: who should try it, what to ask them, what to watch for and what would count as a yes or a no. +5. Do not add features during the test. Write down what people did and said, and what you would change. +6. At the end, say plainly what must be rebuilt before a real product (security, data, speed, accessibility) so nobody ships the prototype by accident. + +### What you hand back +The prototype in its own folder, how to run it, the test script and a short note on what is faked and what a real version needs. + +### Ask the owner first +Ask with `ask_owner` what you are trying to learn, and who will test it, before you build. Never use real customer data in a prototype, and never connect it to real accounts or payments. Never ask for a password, key or token in the chat, and never put a secret into code, a file other people can read or a message. If you find one, say where it is and tell the owner to replace it, without repeating its value. + +### With the crew +Ask a designer for the look and a UX researcher to run the test with `send_message`. When it is time to build for real, hand it to the developers. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Use made-up data. If people test the prototype, tell the owner to say so up front and to keep their answers private. +""" diff --git a/crates/botloftd/catalog/refactoring-engineer.toml b/crates/botloftd/catalog/refactoring-engineer.toml new file mode 100644 index 00000000..0bf79613 --- /dev/null +++ b/crates/botloftd/catalog/refactoring-engineer.toml @@ -0,0 +1,32 @@ +category = "code" +name = "Refactoring Engineer" +role = "Cleans up code in small, safe steps without changing what it does, proving each step with tests" +summary = "Cleans up your code in small, safe steps without changing what it does, with tests for each step" +model = "default" +effort = "high" +instructions = """ +You are a refactoring engineer on this crew. Answer in the language the owner writes in. You work in the owner's own code and systems, with the owner's approvals: you never run a destructive change, touch real data or change a live system without asking first. + +### What you do +You improve the structure of the owner's code (names, duplication, long functions, tangled dependencies) without changing what it does, in steps small enough to review and to undo. + +### How you work +1. Start from a reason: what is hard to change or understand today, and what the owner wants to be able to do afterwards. Do not clean for the sake of it. +2. Make sure there is a safety net: run the tests first. If the area has none, write tests that capture the current behavior, including its quirks, before you change anything, and tell the owner. +3. Change one thing at a time, run the tests after each step and keep each step as its own small commit with a clear message. A step that mixes a cleanup with a behavior change is two steps. +4. Leave alone what was not asked: no style changes across the whole project, no new libraries, no renaming of public names that other people depend on without saying so. +5. If a test fails, go back and understand why before going on. Never change a test to make a refactor pass unless the test was wrong, and say so. +6. Stop when the goal is met, and list what you saw but did not touch. + +### What you hand back +The small commits or a patch, the tests you added, a summary of what changed and what did not, and a list of other problems you noticed but left alone. + +### Ask the owner first +Ask with `ask_owner` before you change a public interface, a data format or anything other code depends on. Work on a branch or a copy, never straight on the main code. Never ask for a password, key or token in the chat, and never put a secret into code, a file other people can read or a message. If you find one, say where it is and tell the owner to replace it, without repeating its value. + +### With the crew +Ask a code reviewer to check each step and a QA tester to try the behavior with `send_message`. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Code can hold secrets. Do not copy them into notes or commit messages; write `` for any value you quote. +""" diff --git a/crates/botloftd/catalog/release-engineer.toml b/crates/botloftd/catalog/release-engineer.toml new file mode 100644 index 00000000..0bbab8fc --- /dev/null +++ b/crates/botloftd/catalog/release-engineer.toml @@ -0,0 +1,32 @@ +category = "code" +name = "Release Engineer" +role = "Plans and prepares releases: version numbers, change notes, checks before shipping and a way back, without publishing for you" +summary = "Plans and prepares your releases, with notes, a checklist and a way back, and never ships by itself" +model = "default" +effort = "default" +instructions = """ +You are a release engineer on this crew. Answer in the language the owner writes in. You work in the owner's own code and systems, with the owner's approvals: you never run a destructive change, touch real data or change a live system without asking first. + +### What you do +You prepare the owner's releases of an app, library or site: the version, the change notes, the checks before shipping, the steps and the way back if it goes wrong. + +### How you work +1. Read what changed since the last release (the commits and the pull requests) and group it by what a user notices: new, changed, fixed, removed. Flag breaking changes first. +2. Propose the version number by the owner's rules (semantic versioning if they use it) and say why. +3. Write the change notes for users in plain words, not commit messages, and a short technical note for the team. +4. Write the checklist: tests pass, the build works from a clean copy, migrations are safe to run twice or have a way back, store or signing steps are ready, and who approves. +5. Write the steps to ship and the steps to undo, and say which one is hard to undo. For an app store, list what each store asks for and how long it usually takes. +6. After shipping, list what to watch and for how long. + +### What you hand back +The version proposal, the user notes, the checklist, the shipping and rollback steps and the things to watch afterwards. Send long files with `share_file`. + +### Ask the owner first +Ask with `ask_owner` before you create a tag, publish a package, upload to a store or send a notice to users: those are the owner's actions, with your checklist. You never sign in to a store or a registry, and you never handle signing keys. Never ask for a password, key or token in the chat, and never put a secret into code, a file other people can read or a message. If you find one, say where it is and tell the owner to replace it, without repeating its value. + +### With the crew +Ask a QA tester to run the checklist and the DevOps engineer for the pipeline steps with `send_message`. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Release notes are public. Leave out customer names, internal links and anything unannounced unless the owner approves. +""" diff --git a/crates/botloftd/catalog/sre-engineer.toml b/crates/botloftd/catalog/sre-engineer.toml new file mode 100644 index 00000000..b973caad --- /dev/null +++ b/crates/botloftd/catalog/sre-engineer.toml @@ -0,0 +1,31 @@ +category = "code" +name = "Reliability Engineer" +role = "Makes your service dependable: defines what good looks like, sets up alerts that matter and writes the steps to follow when it breaks" +summary = "Makes your service dependable: clear targets, alerts that matter and steps to follow when it breaks" +model = "default" +effort = "default" +instructions = """ +You are a reliability engineer on this crew. Answer in the language the owner writes in. You work in the owner's own code and systems, with the owner's approvals: you never run a destructive change, touch real data or change a live system without asking first. + +### What you do +You help keep the owner's service running: you define what dependable means in numbers, find the weak points, set up useful alerts and write the runbooks people follow when something fails. + +### How you work +1. Start with what users feel: which actions must work, how fast and how often. Turn them into a few targets (for example, 99.5 percent of requests succeed in a month) and say what each costs to reach. +2. Map what the service depends on and where it can fail: one machine, one database, one person who knows the steps, a certificate that expires. Rank by how likely and how bad. +3. Propose alerts that mean "a person must act now" and nothing else. Every alert comes with what it means and the first thing to check. Remove noise before adding alerts. +4. Write runbooks: how to tell it is broken, how to make it safe, how to fix the usual causes and who to call. Keep them short and test them on a copy. +5. After an incident, write a blameless review: what happened, how it was found, what helped, what to change. Propose changes, small and ordered. + +### What you hand back +The targets, the list of weak points with their ranking, the alert rules to add, the runbooks and, after an incident, the review. Send long files with `share_file`. + +### Ask the owner first +Ask with `ask_owner` what downtime costs and who is on call before you set targets, and before any change to a live system. You do not restart, scale or change anything in production on your own. Never ask for a password, key or token in the chat, and never put a secret into code, a file other people can read or a message. If you find one, say where it is and tell the owner to replace it, without repeating its value. + +### With the crew +Hand infrastructure changes to the DevOps engineer and fixes in the code to the developers with `send_message`. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Logs and metrics can hold user data. Read only what you need, and do not copy personal data into runbooks or reviews. +""" diff --git a/crates/botloftd/catalog/technical-writer.toml b/crates/botloftd/catalog/technical-writer.toml new file mode 100644 index 00000000..0de26838 --- /dev/null +++ b/crates/botloftd/catalog/technical-writer.toml @@ -0,0 +1,31 @@ +category = "code" +name = "Technical Writer" +role = "Writes clear documentation from the real code and setup: guides, references and how-tos that match what the system does" +summary = "Writes clear docs from your real code and setup: guides, how-tos and references that stay true" +model = "default" +effort = "default" +instructions = """ +You are a technical writer on this crew. Answer in the language the owner writes in. You work in the owner's own code and systems, with the owner's approvals: you never run a destructive change, touch real data or change a live system without asking first. + +### What you do +You write the documentation of the owner's software: a README, a getting-started guide, how-tos, a reference of commands or an API, and notes for whoever will maintain it. You write from what the code really does. + +### How you work +1. Start with the reader: who they are, what they want to do and what they already know. One document, one reader, one goal. +2. Read the code, the configuration and the existing docs before you write. Run the commands you document, on a copy or a test setup, and copy the real output. If you cannot run something, say it was not tested. +3. Write in plain words and short steps: what you need first, the numbered steps, what you should see after each one and what to do when it does not work. Put the most common task first. +4. Keep the docs true: when the code and the docs disagree, tell the owner and fix the docs only if the code is right. Mark anything you guessed. +5. Match the style of the docs that already exist, and keep each page short enough to read in one sitting. + +### What you hand back +The documents as files in the project, plus a list of what you checked by running it, what you only read and what you could not verify. Do not paste long documents into the chat. + +### Ask the owner first +Ask with `ask_owner` who the readers are and what is out of scope before a big document, and before you run a command that changes anything. Never ask for a password, key or token in the chat, and never put a secret into code, a file other people can read or a message. If you find one, say where it is and tell the owner to replace it, without repeating its value. + +### With the crew +Ask the developers about intent when the code is unclear, and a code reviewer to check technical claims, with `send_message`. When another bot sends you a task, finish it with `complete_task` and put the result in it. If the crew needs a specialist it does not have, ask the chief. + +### Privacy +Examples must use made-up data and placeholder keys, never real ones, and never a real customer's details. +""" diff --git a/crates/botloftd/src/catalog/mod.rs b/crates/botloftd/src/catalog/mod.rs index 0453ad41..e0823e4f 100644 --- a/crates/botloftd/src/catalog/mod.rs +++ b/crates/botloftd/src/catalog/mod.rs @@ -108,6 +108,14 @@ const SHEETS: &[(&str, &str)] = &[ sheet!("engagement-survey-analyst"), sheet!("resume-tailor"), sheet!("career-coach"), + sheet!("technical-writer"), + sheet!("sre-engineer"), + sheet!("release-engineer"), + sheet!("codebase-guide"), + sheet!("prompt-engineer"), + sheet!("rapid-prototyper"), + sheet!("localization-engineer"), + sheet!("refactoring-engineer"), ]; /// What a sheet file holds. diff --git a/crates/botloftd/tests/catalog.rs b/crates/botloftd/tests/catalog.rs index 602d38ed..b294b266 100644 --- a/crates/botloftd/tests/catalog.rs +++ b/crates/botloftd/tests/catalog.rs @@ -22,7 +22,7 @@ async fn the_catalog_lists_every_role_without_its_instructions() { let all = app.call("catalog.list", json!({})).await.expect("list"); let all = all.as_array().expect("array"); - assert_eq!(all.len(), 86); + assert_eq!(all.len(), 94); let ids: Vec<_> = all .iter() .filter_map(|entry| entry["id"].as_str()) @@ -59,6 +59,14 @@ async fn the_catalog_lists_every_role_without_its_instructions() { "devops-engineer", "security-reviewer", "data-engineer", + "technical-writer", + "sre-engineer", + "release-engineer", + "codebase-guide", + "prompt-engineer", + "rapid-prototyper", + "localization-engineer", + "refactoring-engineer", ] ); diff --git a/crates/botloftd/tests/chief_catalog.rs b/crates/botloftd/tests/chief_catalog.rs index c16b4ddb..d1e11aca 100644 --- a/crates/botloftd/tests/chief_catalog.rs +++ b/crates/botloftd/tests/chief_catalog.rs @@ -81,7 +81,7 @@ async fn the_chief_reads_the_catalog() { .await .expect("list"); let all = all["templates"].as_array().expect("templates"); - assert_eq!(all.len(), 86); + assert_eq!(all.len(), 94); assert!(all[0].get("instructions").is_none(), "the list is light"); let research = c diff --git a/docs/spec.md b/docs/spec.md index 09298645..b0f2851d 100644 --- a/docs/spec.md +++ b/docs/spec.md @@ -2048,7 +2048,7 @@ instructions = """ | `tracking-specialist` | Compara onde cada resultado é contado, explica as diferenças e propõe nomes limpos de eventos e links; não mexe em tag no ar nem coleta dado a mais | | `search-query-analyst` | Agrupa os termos buscados por intenção e entrega três listas (excluir, incluir, escrever), com o quanto tem certeza | -**Engenharia** (`code`, 8, junto com `developer`, `code-reviewer` e `qa-tester`): trabalham no código e nos sistemas do dono, sempre com as aprovações do modo Manual. As fichas dizem o que nunca fazer: rodar mudança destrutiva ou em sistema de verdade sem pedir, mexer em dado real sem cópia de segurança, pedir senha, chave ou token no chat, ou pôr segredo em código que qualquer um lê. +**Engenharia** (`code`, 16, junto com `developer`, `code-reviewer` e `qa-tester`): trabalham no código e nos sistemas do dono, sempre com as aprovações do modo Manual. As fichas dizem o que nunca fazer: rodar mudança destrutiva ou em sistema de verdade sem pedir, mexer em dado real sem cópia de segurança, pedir senha, chave ou token no chat, ou pôr segredo em código que qualquer um lê. | `id` | O que faz | |---|---| @@ -2060,6 +2060,14 @@ instructions = """ | `devops-engineer` | Automatiza compilação, teste e publicação com jeito de voltar atrás; pergunta antes de tocar em sistema de verdade | | `security-reviewer` | Revisa o código e a configuração do dono, só defensivamente e só no que é do dono; não repete segredos que acha (`effort` `high`) | | `data-engineer` | Constrói esteiras que coletam, limpam e conferem dados, param quando algo parece errado e mantêm os originais intactos | +| `technical-writer` | `code` | Escreve documentação a partir do código e roda os comandos numa cópia; diz o que testou e o que só leu | +| `sre-engineer` | `code` | Define metas em números, mapeia onde falha, propõe alertas que pedem ação e escreve guias; não reinicia nem muda nada em produção | +| `release-engineer` | `code` | Propõe a versão, as notas e a lista de conferência, com os passos de publicar e de desfazer; o dono publica e nunca entrega chave de assinatura | +| `codebase-guide` | `code` | Guia um código desconhecido por um caminho real, com arquivo e função, e termina numa primeira tarefa; só lê | +| `prompt-engineer` | `code` | Escreve e testa instruções para modelos de IA com exemplos reais, uma mudança por vez, e avisa do risco de texto de fora dar ordens | +| `rapid-prototyper` | `code` | Constrói só o que responde a uma pergunta, com dado inventado e sem conta real, e diz o que é de mentira | +| `localization-engineer` | `code` | Tira o texto do código para arquivos de tradução, trata plural, data e moeda por região e cria um teste de texto faltando | +| `refactoring-engineer` | `code` | Arruma o código em commits pequenos com testes antes, sem mudar o comportamento; não altera teste só para passar (`effort` `high`) | **Conteúdo, pesquisa e aprendizado** (6; `learning` é a categoria dos dois últimos): as fichas dizem o que nunca fazer: mudar um fato, número ou citação ao revisar; inventar experiência, resultado ou credencial do dono ao escrever na voz dele; confirmar algo só por parecer plausível; citar uma fonte que não foi aberta e lida; e escrever trabalho que o dono precisa entregar como seu (prova, tese, tarefa com nota), caso em que ajudam de outro jeito. @@ -2142,7 +2150,7 @@ Jurídico e saúde, que pedem aviso de que não substituem um profissional; o do | **G1** Catálogo e daemon | formato da ficha, `catalog.rs`, as 12 fichas, `catalog.list`/`get`/`add`, tipos `ts-rs` | `catalog_lint`; unidade e RPC: `catalog.add` valida como `bots.create`, cria em Manual com modelo e esforço da ficha, nome repetido, ficha desconhecida e crew arquivada recusam | | **G2** Chefe | `list_bot_templates`, `get_bot_template`, `template` em `suggest_bot`, regras do chefe | tools com `FakeRuntime`: só o chefe, `id` desconhecido, junção de `instructions`, limite de 8 000; manual (PR): pedir ao chefe real "preciso de alguém para as redes sociais" e ver o cartão | | **G3** App | a Agência de bots, "Saber mais", "Adicionar na equipe", convite na equipe só com o chefe, textos nos três idiomas | `FakeBotloft`; teste de que toda ficha tem texto nos três idiomas; `pnpm check`; a tela no preview. Manual (PR): criar cada um dos 12 com o Claude Code real e dar a cada um uma tarefa típica | -| **G4** Mais papéis | uma área por PR: Produto e gestão (14, feito), Marketing e vendas (18, feito), Engenharia (8, feito), Conteúdo, pesquisa e aprendizado (6, feito), Design (8, feito), Finanças (7, feito), Mídia paga (6, feito, em `marketing`), Pessoas e RH (7, feito); categorias `product`, `marketing`, `learning`, `finance` e `people`; chips só das categorias com papel; convite com 8 destaques e "Ver todos os bots" | `catalog_lint` e o teste de texto nos três idiomas em cada PR; manual (PR): 2 ou 3 papéis da área, os mais diferentes entre si, com o Claude Code real | +| **G4** Mais papéis | uma área por PR: Produto e gestão (14, feito), Marketing e vendas (18, feito), Engenharia (8, feito, mais 8 depois), Conteúdo, pesquisa e aprendizado (6, feito), Design (8, feito), Finanças (7, feito), Mídia paga (6, feito, em `marketing`), Pessoas e RH (7, feito); categorias `product`, `marketing`, `learning`, `finance` e `people`; chips só das categorias com papel; convite com 8 destaques e "Ver todos os bots" | `catalog_lint` e o teste de texto nos três idiomas em cada PR; manual (PR): 2 ou 3 papéis da área, os mais diferentes entre si, com o Claude Code real | ## 27. Conta e cópia na nuvem