# Plan final Apache Multi-Skill

## Current state

El VirtualHost HTTPS de `aproposito.ddns.net` está en `C:/xampp/apache/conf/extra/httpd-ssl.conf:121`. Actualmente contiene un `SetEnv ALEXA_SKILL_ID` global para Radio Babasónica. Apache ejecuta PHP mediante `php_module`; `env_module` y `setenvif_module` están cargados. El backend lee `getenv('ALEXA_SKILL_ID') ?: ''` en `config/config.php`; `AlexaRequestVerifier::verify()` rechaza la petición si queda vacío.

## Chosen strategy

Usar `SetEnvIf Request_URI` por slug. No cambia backends, no afecta otras aplicaciones, permite N Skills y se verifica en el request real de mod_php.

```apache
# Alexa Skill ID - Radio Babasónica
SetEnvIf Request_URI "^/radio-babasonica-alexa/" ALEXA_SKILL_ID="amzn1.ask.skill.005dec3e-f214-4e7e-90ba-2d5643adac25"
```

Se elimina la directiva global de la línea 123 y se inserta la anterior dentro del mismo VirtualHost. No se agrega ninguna segunda Skill.

## Rejected alternatives

- `<Directory> SetEnv`: aislaría por filesystem, pero la ruta URI es la identidad operativa que ya maneja la fábrica y `SetEnvIf` es más directo para mappings generados.
- `.htaccess`: `AllowOverride All` lo permite, pero dispersa configuración y obliga a tocar cada backend.
- PHP config: requeriría modificar código/config del backend y reduce la centralización.

## Backup and rollback

Backup exacto: `C:/xampp/apache/conf/extra/httpd-ssl.conf.backup-YYYYMMDD-HHMMSS`. Se comparan hashes SHA-256 antes de editar. Si `httpd.exe -t` falla, el instalador restaura inmediatamente el backup y vuelve a probar sintaxis. Para rollback manual, confirmar el backup elegido y copiarlo sobre `httpd-ssl.conf`, después ejecutar `httpd.exe -t`; no reiniciar sin aprobación.

## Validation

```powershell
C:\xampp\apache\bin\httpd.exe -t
C:\xampp\apache\bin\httpd.exe -S
.\scripts\validate-multi-skill-apache.ps1 -EnvironmentMappingTest
```

El último comando sólo se ejecuta después del reinicio manual. Crea un diagnóstico temporal que devuelve únicamente `configured` y sufijo, lo consulta por loopback y lo elimina en `finally`.

## Expected behavior and post-restart tests

Requests bajo `/radio-babasonica-alexa/` reciben el Skill ID terminado en `ac25`; otras aplicaciones no reciben un valor global. Luego se comprueba GET=405, POST inválido controlado, status SMAPI read-only y prueba humana de abrir/pausar/continuar/detener en Simulator o Echo.
