Summary
AGENTS.md has said since the language section landed that everything this repository delivers is written in English, and that the rule is a ratchet rather than a migration: documents that predate it stay as they are until somebody translates them. This is that translation, for the two categories the rule names by hand — the AGENTS.md files and the skills.
The same section already prescribes the shape of the work:
un fichero no se vuelve bilingüe. Si un cambio añade una frase a un documento que está en castellano, esa frase va en castellano. Traducir el fichero es un cambio propio, entero, con su propio commit -- porque media página en cada idioma se lee peor que cualquiera de los dos, y porque un diff que traduce y edita a la vez no se puede revisar.
So: one commit per file, translation only, no edits riding along.
Inventory
Measured, not estimated — the Spanish count is a marker-word frequency over each file.
Instruction files — all nine are Spanish, 3000 lines:
| file |
lines |
landing/AGENTS.md |
709 |
AGENTS.md |
670 |
internal/AGENTS.md |
455 |
cmd/kivgraph/AGENTS.md |
383 |
internal/mcp/AGENTS.md |
211 |
internal/rustloader/AGENTS.md |
197 |
benchmarks/AGENTS.md |
148 |
web/AGENTS.md |
142 |
ts-worker/AGENTS.md |
85 |
Skills — two of four:
| file |
lines |
state |
.claude/skills/running-tests/SKILL.md |
218 |
Spanish |
.claude/skills/publishing-releases/SKILL.md |
213 |
Spanish |
.claude/skills/adding-a-language/SKILL.md |
437 |
already English |
internal/integrations/assets/kivgraph/SKILL.md |
277 |
already English |
Total to translate: 3431 lines across 11 files.
The canonical shipped skill is already English, which is what you would expect — it is delivered to users, so the rule reached it first.
The part that is not translation
Four cross-references point at Spanish section titles from files that are already English, so translating the headings breaks them. They have to move in the same change as the file whose headings they name:
.claude/skills/adding-a-language/SKILL.md:108 and :306 — Superficies que rompen compatibilidad
.claude/skills/adding-a-language/SKILL.md:311 — Nunca modificar
docs/adr/0082-an-analyzer-never-builds-in-the-repository.md:9 — Nunca modificar
Two more live in files that are themselves in scope, so they resolve on their own:
.claude/skills/running-tests/SKILL.md:203 — El idioma de lo que se escribe
.claude/skills/adding-a-language/SKILL.md:403 — Smoke test del binario, a heading inside running-tests
A grep for *<Spanish heading>* before closing is the cheap way to catch any I missed.
Constraints
- Every
CLAUDE.md is a symlink to its AGENTS.md and must stay one. scripts/check-docs.sh verifies this and has to pass on each commit.
- Translate the meaning, not the words. These files are the repository's contracts and several passages carry measured numbers and named defects (
LUQUE-2002, LUQUE-2006, ADR references, the token tables). Numbers, identifiers, paths, command names and backticked terms are not translated.
- Terminology must be decided once and held. The recurring ones are
puerta (gate), pasada (indexing pass), hechos (facts), aristas (edges), generación (generation), suelo/techo (floor/ceiling), trinquete/ratchet, fallar cerrado (fail closed), sin resolver (unresolved). A glossary agreed in the first PR and reused is what keeps eleven files reading as one document.
- The language section translates itself. Once
AGENTS.md is English, the ratchet it describes is complete for these files, and the paragraph should say so rather than describing a migration that has happened.
- The 84-column rule in
scripts/check-docs.sh applies to docs/, which none of these files are under. Matching each file's existing wrap width is still the right thing.
Suggested staging
A single 3431-line diff is not reviewable, and these are the files that decide how everything else gets built. Four PRs, each independently mergeable, one commit per file:
- Root + the two Spanish skills — 1101 lines. The text that is read on every task, so it fixes the glossary for the rest.
internal/ + internal/mcp/ + internal/rustloader/ — 863 lines.
cmd/kivgraph/ + ts-worker/ + web/ + benchmarks/ — 758 lines.
landing/ — 709 lines, the largest single file.
Group 1 should land and be read before the rest start, because every later file inherits its vocabulary.
Out of scope
The 86 ADRs under docs/adr/, which are mixed — 0082 is English, 0057 is Spanish. They are a larger body with the same ratchet applying, and worth their own issue rather than being swept in here.
Summary
AGENTS.mdhas said since the language section landed that everything this repository delivers is written in English, and that the rule is a ratchet rather than a migration: documents that predate it stay as they are until somebody translates them. This is that translation, for the two categories the rule names by hand — theAGENTS.mdfiles and the skills.The same section already prescribes the shape of the work:
So: one commit per file, translation only, no edits riding along.
Inventory
Measured, not estimated — the Spanish count is a marker-word frequency over each file.
Instruction files — all nine are Spanish, 3000 lines:
landing/AGENTS.mdAGENTS.mdinternal/AGENTS.mdcmd/kivgraph/AGENTS.mdinternal/mcp/AGENTS.mdinternal/rustloader/AGENTS.mdbenchmarks/AGENTS.mdweb/AGENTS.mdts-worker/AGENTS.mdSkills — two of four:
.claude/skills/running-tests/SKILL.md.claude/skills/publishing-releases/SKILL.md.claude/skills/adding-a-language/SKILL.mdinternal/integrations/assets/kivgraph/SKILL.mdTotal to translate: 3431 lines across 11 files.
The canonical shipped skill is already English, which is what you would expect — it is delivered to users, so the rule reached it first.
The part that is not translation
Four cross-references point at Spanish section titles from files that are already English, so translating the headings breaks them. They have to move in the same change as the file whose headings they name:
.claude/skills/adding-a-language/SKILL.md:108and:306— Superficies que rompen compatibilidad.claude/skills/adding-a-language/SKILL.md:311— Nunca modificardocs/adr/0082-an-analyzer-never-builds-in-the-repository.md:9— Nunca modificarTwo more live in files that are themselves in scope, so they resolve on their own:
.claude/skills/running-tests/SKILL.md:203— El idioma de lo que se escribe.claude/skills/adding-a-language/SKILL.md:403— Smoke test del binario, a heading insiderunning-testsA grep for
*<Spanish heading>*before closing is the cheap way to catch any I missed.Constraints
CLAUDE.mdis a symlink to itsAGENTS.mdand must stay one.scripts/check-docs.shverifies this and has to pass on each commit.LUQUE-2002,LUQUE-2006, ADR references, the token tables). Numbers, identifiers, paths, command names and backticked terms are not translated.puerta(gate),pasada(indexing pass),hechos(facts),aristas(edges),generación(generation),suelo/techo(floor/ceiling),trinquete/ratchet,fallar cerrado(fail closed),sin resolver(unresolved). A glossary agreed in the first PR and reused is what keeps eleven files reading as one document.AGENTS.mdis English, the ratchet it describes is complete for these files, and the paragraph should say so rather than describing a migration that has happened.scripts/check-docs.shapplies todocs/, which none of these files are under. Matching each file's existing wrap width is still the right thing.Suggested staging
A single 3431-line diff is not reviewable, and these are the files that decide how everything else gets built. Four PRs, each independently mergeable, one commit per file:
internal/+internal/mcp/+internal/rustloader/— 863 lines.cmd/kivgraph/+ts-worker/+web/+benchmarks/— 758 lines.landing/— 709 lines, the largest single file.Group 1 should land and be read before the rest start, because every later file inherits its vocabulary.
Out of scope
The 86 ADRs under
docs/adr/, which are mixed —0082is English,0057is Spanish. They are a larger body with the same ratchet applying, and worth their own issue rather than being swept in here.