Las descargas de Content y las imágenes OG pueden sobrevivir a un runner
efímero. Tienen reglas de invalidación distintas y por eso usan comandos duxt
separados.

## Fuentes remotas públicas

```yaml [.github/workflows/deploy.yml]
- id: sources
  run: duxt-cache-key --root . --github >> "$GITHUB_OUTPUT"
- if: steps.sources.outputs.cacheable == 'true'
  uses: actions/cache@v6
  with:
    path: ${{ steps.sources.outputs.paths }}
    key: ${{ steps.sources.outputs.key }}
```

`--root` nombra la aplicación Nuxt consumidora. La clave incluye repositorios y
refs ya resueltos; `contents.sqlite*` queda fuera porque es un resultado de
parseo. Una sola fuente privada, SSH o autenticada marca toda la lista como
`cacheable=false`. Sin `--github`, el comando muestra entradas censuradas y el
motivo.

## Imágenes OG renderizadas

```yaml [.github/workflows/deploy.yml]
- id: og
  run: duxt-og-cache --root . --run "$GITHUB_SHA" --github >> "$GITHUB_OUTPUT"
- uses: actions/cache@v6
  with:
    path: ${{ steps.og.outputs.path }}
    key: ${{ steps.og.outputs.key }}
    restore-keys: ${{ steps.og.outputs['restore-keys'] }}
```

La configuración Nuxt consumidora integra además
`@kirchdev/duxt/og-image-cache` y calcula la huella de opciones, fuentes y
versiones del renderer. Un cambio vacía la caché restaurada antes de servir una
imagen antigua. Después de la build, `duxt-og-cache --root . --report --since
"$STARTED_MS" --log build.log` informa de la reutilización real.

## Lista de comprobación

- [ ] `--root` apunta a la aplicación consumidora.
- [ ] La caché de fuentes solo se usa con `cacheable == 'true'`.
- [ ] `contents.sqlite*` y las fuentes privadas quedan fuera.
- [ ] La caché OG usa las rolling restore keys emitidas.
- [ ] Nuxt incluye en la huella los inputs de renderizado del sitio.