granja: el `-i ~/.ssh/github5` de todos los scripts es un no-op — entra el fallback a id_ed25519
Delta semántico
Ninguna definición cambió: el cambio es de texto, documentación o datos.
1 archivos · +22 −2
- CLAUDE.md +22 −2
diff --git a/CLAUDE.md b/CLAUDE.md
index ad9432fa..a5d4fca5 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -57,10 +57,30 @@ nombre. El modelo efímero de pago sigue documentado y funcionando, pero está S
trabajo desde el 2026-09-05. Un `farm-up` por reflejo cuesta dinero real y no hace falta.
```sh
-ssh -i ~/.ssh/github5 root@dev.gioser.net # github5 está en su authorized_keys
-ssh -i ~/.ssh/sergio root@dev.gioser.net # la otra que entra; NO hay entrada en ssh/config
+ssh -i ~/.ssh/id_ed25519 root@dev.gioser.net # la que entra HOY; NO hay entrada en ssh/config
```
+⚠ **Los scripts piden `~/.ssh/github5`, ese fichero NO EXISTE en el hub, y aun así todo funciona —
+por accidente** (medido 2026-09-18). Una docena larga de scripts trae
+`SSH_KEY="${SSH_KEY:-$HOME/.ssh/github5}"`: `estado-granja.sh`, `cosecha-cron.sh`, `harvest-go.sh`,
+`farm-up.sh`, `farm-down.sh`, `harkaq-vol.sh`… El único fichero en `~/.ssh` es `id_ed25519`, y sin
+embargo `estado-granja.sh` con su default entra y reporta. **`ssh -i <fichero inexistente>` no
+falla**: avisa por stderr y cae a las identidades por defecto, que es donde está la buena:
+
+```
+Warning: Identity file /home/sergio/.ssh/github5 not accessible: No such file or directory.
+debug1: identity file /home/sergio/.ssh/id_ed25519 type 2
+debug1: Offering public key: /home/sergio/.ssh/id_ed25519 ED25519 SHA256:kAqayFW4hSqq…
+debug1: Server accepts key: … · Authenticated to dev.gioser.net using "publickey".
+```
+
+O sea que **el `-i` de todos esos scripts es hoy un no-op** y quien manda es el fallback. Se cae el
+día que alguien ponga un `~/.ssh/github5` que no entre (el `-i` explícito GANA sobre el default), o
+que aparezca un `IdentityFile`/`IdentitiesOnly` en `ssh/config`. Y el error dirá `Permission
+denied`, sin mencionar `SSH_KEY` ni `github5`. Mismo patrón que el reaper salvándose por la
+subcadena `gioser`: *una protección que funciona por accidente se ve igual que una que funciona por
+diseño*. Barrer el default de los scripts es su propia unidad de trabajo — no tocarlos de paso.
+
**Se enchufa por `scripts/farm/.fleet`** (`<nombre> <ip>` por línea), que **está en `.gitignore`**:
o sea que un hub recién clonado nace con la flota VACÍA y la granja queda desconectada **sin que
nada falle** — la cosecha dice «flota vacía» cada 30 min y los artefactos del worker no vuelven.