feat(i18n): translate agents.json chapter to Brazilian Portuguese

Fill the `pt` mirror fields on the /agents/ chapter so the bilingual
contract stops being silently English-only. 24 fields: hero eyebrow,
title, lede, three role cards (FRAME/HAND OFF/PROVE), and two
sections (the worktree-map panel and the handoff steps).

The chapter adds two shapes that the prior translations did not need:
the FRAME/HAND OFF/PROVE chip labels (uppercase action verbs in the
source) and the tree-drawing `panelCode` block. Both translate
cleanly:

- Chip labels become imperative Portuguese verbs in caps —
  ENQUADRAR, PASSAR, COMPROVAR — matching the DIAGNOSTICAR pattern
  already established by commonSkills/debug.json.
- Tree-drawing characters (├──, └──, │) in panelCode are
  language-neutral and preserved byte-for-byte. The English and
  Portuguese forms are visually parallel at every column.

Translation register follows the conventions established by
src/content/commonSkills/*.json, the full-guide PT snapshot, and
the three prior commits on this branch (1baa314 landing.json,
fd031b0 summary.json, 160a324 models.json): imperative voice,
second-person `você`, sentence-case prose, all-caps labels, and
English kept for product nouns (skill, worktree, brief, gate,
pipeline, recall, prompt, enforcement, runs, orchestrator). `Worker`
becomes `Agente` because the card title is a prose role-noun (per
the glossary rule: worker in tab labels and code-like fragments,
agente in prose). `Brief` (the handoff step) stays English as a
product noun. `Passagem` for "Handoff" follows full-guide-pt.json.

Verified by .agents/scripts/audit-translations.mjs: agents.json
contribution to the offenders list drops from 24 to 0 (one field,
`steps.0.label` for "Brief", remains identical by design — Brief is
a product noun and is intentionally kept in English). Remaining
identical fields live in skills.json (16) and the 7-each numeric
card-label residues in landing.json and summary.json, which land in
subsequent commits.

The English side is byte-identical to origin/main, including the
tree-drawing panelCode. Confirmed via byte-level diff before commit.
This commit is contained in:
Marcos Paulo
2026-09-06 18:39:48 -03:00
parent 160a324317
commit 18bf6b0943
+23 -23
View File
@@ -2,57 +2,57 @@
"id": "agents", "id": "agents",
"eyebrow": { "eyebrow": {
"en": "Subagent workflow", "en": "Subagent workflow",
"pt": "Subagent workflow" "pt": "Fluxo de subagentes"
}, },
"title": { "title": {
"en": "One branch<br>per <em>hand.</em>", "en": "One branch<br>per <em>hand.</em>",
"pt": "One branch<br>per <em>hand.</em>" "pt": "Uma branch<br>por <em>mão.</em>"
}, },
"lede": { "lede": {
"en": "Agents work when roles, files, and evidence are bounded. A worktree gives each worker its own checkout while the orchestrator protects intent.", "en": "Agents work when roles, files, and evidence are bounded. A worktree gives each worker its own checkout while the orchestrator protects intent.",
"pt": "Agents work when roles, files, and evidence are bounded. A worktree gives each worker its own checkout while the orchestrator protects intent." "pt": "Agentes funcionam quando papéis, arquivos e evidências são delimitados. Um worktree dá a cada agente seu próprio checkout enquanto o orquestrador protege a intenção."
}, },
"cards": [ "cards": [
{ {
"label": { "label": {
"en": "FRAME", "en": "FRAME",
"pt": "FRAME" "pt": "ENQUADRAR"
}, },
"title": { "title": {
"en": "Orchestrator", "en": "Orchestrator",
"pt": "Orchestrator" "pt": "Orquestrador"
}, },
"copy": { "copy": {
"en": "Owns scope, task graph, boundaries, and integration.", "en": "Owns scope, task graph, boundaries, and integration.",
"pt": "Owns scope, task graph, boundaries, and integration." "pt": "Dono do escopo, do grafo de tarefas, das fronteiras e da integração."
} }
}, },
{ {
"label": { "label": {
"en": "HAND OFF", "en": "HAND OFF",
"pt": "HAND OFF" "pt": "PASSAR"
}, },
"title": { "title": {
"en": "Worker", "en": "Worker",
"pt": "Worker" "pt": "Agente"
}, },
"copy": { "copy": {
"en": "Owns one coherent slice and one worktree.", "en": "Owns one coherent slice and one worktree.",
"pt": "Owns one coherent slice and one worktree." "pt": "Dono de uma fatia coerente e de um worktree."
} }
}, },
{ {
"label": { "label": {
"en": "PROVE", "en": "PROVE",
"pt": "PROVE" "pt": "COMPROVAR"
}, },
"title": { "title": {
"en": "Verifier", "en": "Verifier",
"pt": "Verifier" "pt": "Verificador"
}, },
"copy": { "copy": {
"en": "Re-runs gates and reports remaining gaps.", "en": "Re-runs gates and reports remaining gaps.",
"pt": "Re-runs gates and reports remaining gaps." "pt": "Roda gates novamente e reporta o que ainda falta."
} }
} }
], ],
@@ -60,29 +60,29 @@
{ {
"eyebrow": { "eyebrow": {
"en": "The tree", "en": "The tree",
"pt": "The tree" "pt": "A árvore"
}, },
"title": { "title": {
"en": "Split at<br>the <em>seam.</em>", "en": "Split at<br>the <em>seam.</em>",
"pt": "Split at<br>the <em>seam.</em>" "pt": "Divida na<br><em>costura.</em>"
}, },
"panelLabel": { "panelLabel": {
"en": "MAIN / ORCHESTRATOR", "en": "MAIN / ORCHESTRATOR",
"pt": "MAIN / ORCHESTRATOR" "pt": "MAIN / ORQUESTRADOR"
}, },
"panelCode": { "panelCode": {
"en": "├── agent/ui → components + visual states\n├── agent/tests → acceptance + regressions\n└── agent/docs → guide + examples\n\nmerge after each leaf returns a diff and evidence", "en": "├── agent/ui → components + visual states\n├── agent/tests → acceptance + regressions\n└── agent/docs → guide + examples\n\nmerge after each leaf returns a diff and evidence",
"pt": "├── agent/ui → components + visual states\n├── agent/tests → acceptance + regressions\n└── agent/docs → guide + examples\n\nmerge after each leaf returns a diff and evidence" "pt": "├── agent/ui → componentes + estados visuais\n├── agent/tests → aceitação + regressões\n└── agent/docs → guia + exemplos\n\nfaça merge depois que cada folha devolver um diff e evidências"
} }
}, },
{ {
"eyebrow": { "eyebrow": {
"en": "Handoff", "en": "Handoff",
"pt": "Handoff" "pt": "Passagem"
}, },
"title": { "title": {
"en": "Context that<br>can <em>travel.</em>", "en": "Context that<br>can <em>travel.</em>",
"pt": "Context that<br>can <em>travel.</em>" "pt": "Contexto que<br>pode <em>viajar.</em>"
}, },
"steps": [ "steps": [
{ {
@@ -92,27 +92,27 @@
}, },
"copy": { "copy": {
"en": "Goal, owned files, dependencies, non-goals, acceptance.", "en": "Goal, owned files, dependencies, non-goals, acceptance.",
"pt": "Goal, owned files, dependencies, non-goals, acceptance." "pt": "Objetivo, arquivos sob sua posse, dependências, fora de escopo, aceitação."
} }
}, },
{ {
"label": { "label": {
"en": "Isolation", "en": "Isolation",
"pt": "Isolation" "pt": "Isolamento"
}, },
"copy": { "copy": {
"en": "One branch and worktree per independent change.", "en": "One branch and worktree per independent change.",
"pt": "One branch and worktree per independent change." "pt": "Uma branch e um worktree por mudança independente."
} }
}, },
{ {
"label": { "label": {
"en": "Evidence", "en": "Evidence",
"pt": "Evidence" "pt": "Evidência"
}, },
"copy": { "copy": {
"en": "Commands, result, changed files, screenshots, gaps.", "en": "Commands, result, changed files, screenshots, gaps.",
"pt": "Commands, result, changed files, screenshots, gaps." "pt": "Comandos, resultado, arquivos alterados, capturas de tela, lacunas."
} }
} }
] ]