# CODEX — Corregir prueba de Environment Mapping y cerrar validación Multi-Skill

## Proyecto

Trabajar desde:

```text
C:\xampp\htdocs\aws-api-skill
```

## Contexto actual confirmado

Apache ya fue reiniciado manualmente por el usuario después del cambio multi-Skill.

La configuración Apache ya fue modificada para aislar `ALEXA_SKILL_ID` por `Request_URI`.

Resultados actuales:

```text
GET endpoint=405 (expected 405)
Invalid POST={"error":"Invalid Alexa request envelope"} HTTP_CODE=400
Environment configured=True suffix=c25"
```

Después, el script falló con:

```text
El mapping no produjo el valor esperado.
```

porque esperaba:

```text
ac25
```

pero recibió:

```text
c25"
```

El Skill ID correcto de Radio Babasónica es:

```text
amzn1.ask.skill.005dec3e-f214-4e7e-90ba-2d5643adac25
```

Por tanto, el sufijo esperado es:

```text
ac25
```

---

# 1. OBJETIVO

Determinar por qué la prueba:

```powershell
.\scripts\validate-multi-skill-apache.ps1 -EnvironmentMappingTest
```

obtiene:

```text
suffix=c25"
```

en lugar de:

```text
suffix=ac25
```

y corregir ÚNICAMENTE la lógica de diagnóstico/prueba si el problema está ahí.

La prioridad es NO tocar Apache otra vez si no es necesario.

---

# 2. REGLAS IMPORTANTES

NO modificar:

```text
C:\xampp\apache\conf\extra\httpd-ssl.conf
C:\xampp\htdocs\radio-babasonica-alexa
C:\xampp\htdocs\signallive
MediaMTX
FFmpeg
WordPress
ASK resources remotos
Skill Manifest remoto
Interaction Model remoto
Beta
```

salvo que la investigación demuestre de forma inequívoca que el problema está en Apache.

NO reiniciar:

```text
Apache
Windows
MediaMTX
FFmpeg
```

NO crear nueva Skill.

NO crear `radiomp-audio`.

---

# 3. ARCHIVOS A INSPECCIONAR

Revisar:

```text
C:\xampp\htdocs\aws-api-skill\scripts\validate-multi-skill-apache.ps1
```

y cualquier archivo temporal/helper que el script cree para la prueba de environment mapping.

Buscar específicamente:

```text
EnvironmentMappingTest
suffix
Substring
ConvertFrom-Json
json_encode
ALEXA_SKILL_ID
getenv
temporary diagnostic
Require local
loopback
```

---

# 4. HIPÓTESIS PRINCIPAL

El resultado:

```text
c25"
```

sugiere que se está tomando el sufijo de una cadena JSON serializada, por ejemplo:

```text
"...ac25"
```

y no del valor real de:

```php
getenv('ALEXA_SKILL_ID')
```

Los últimos cuatro caracteres de:

```text
"...ac25"
```

son:

```text
c25"
```

Esto explicaría exactamente el fallo.

Codex debe CONFIRMAR o DESCARTAR esta hipótesis inspeccionando el código real.

No asumirla sin verificar.

---

# 5. CORRECCIÓN ESPERADA SI LA HIPÓTESIS SE CONFIRMA

La lógica PHP temporal debe obtener primero el valor real:

```php
$skillId = getenv('ALEXA_SKILL_ID') ?: '';
```

y calcular el sufijo ANTES de serializar:

```php
$suffix = $skillId !== '' ? substr($skillId, -4) : '';
```

Luego responder:

```php
echo json_encode([
    'configured' => $skillId !== '',
    'suffix' => $suffix
]);
```

Salida esperada:

```json
{
  "configured": true,
  "suffix": "ac25"
}
```

No devolver Skill ID completo.

---

# 6. LÓGICA POWERSHELL ESPERADA

PowerShell debe parsear JSON:

```powershell
$result = $response | ConvertFrom-Json
```

y validar:

```powershell
if (-not $result.configured) {
    throw 'ALEXA_SKILL_ID no está configurado.'
}

if ($result.suffix -ne 'ac25') {
    throw "Suffix inesperado: $($result.suffix)"
}
```

No calcular el sufijo directamente sobre:

```text
$response
raw JSON
string serializada
```

---

# 7. DIAGNÓSTICO TEMPORAL

Si el script crea un archivo temporal PHP para verificar el environment mapping:

debe:

```text
1. crearlo sólo para la prueba
2. limitar acceso a loopback/local
3. devolver únicamente:
   configured
   suffix
4. NO devolver Skill ID completo
5. eliminarlo al finalizar
6. eliminarlo también si ocurre excepción
```

Usar `try/finally` o equivalente para garantizar limpieza.

---

# 8. SEGURIDAD DEL DIAGNÓSTICO

El archivo temporal debe estar protegido.

Preferir:

```apache
Require local
```

si ya está contemplado por el mecanismo usado.

Si el script genera `.htaccess` temporal, asegurar que también se elimina.

Si usa otra forma de loopback/local-only, documentarla.

No dejar endpoint diagnóstico público permanente.

---

# 9. NO MODIFICAR APACHE SIN EVIDENCIA

Antes de tocar Apache:

confirmar:

```text
Environment configured=True
```

Ya observado.

Eso indica que `ALEXA_SKILL_ID` sí está llegando al runtime.

Por tanto, el default es:

```text
Apache mapping funciona
Test parsing/suffix está mal
```

Sólo si la investigación demuestra otra cosa, documentar la evidencia.

---

# 10. PRUEBA UNITARIA LOCAL DE LA EXTRACCIÓN

Antes de repetir HTTP:

probar la lógica con un valor conocido:

```text
amzn1.ask.skill.005dec3e-f214-4e7e-90ba-2d5643adac25
```

Esperado:

```text
ac25
```

Puede hacerse con PowerShell o PHP.

Registrar PASS/FAIL.

---

# 11. REEJECUTAR VALIDACIÓN

Después de corregir:

ejecutar:

```powershell
.\scripts\validate-multi-skill-apache.ps1 -EnvironmentMappingTest
```

Resultado esperado:

```text
GET endpoint=405 (expected 405)
Invalid POST={"error":"Invalid Alexa request envelope"} HTTP_CODE=400
Environment configured=True suffix=ac25
Environment mapping=PASS
```

El texto exacto puede variar, pero debe quedar inequívocamente:

```text
configured=True
suffix=ac25
PASS
```

---

# 12. VERIFICAR LIMPIEZA

Después de la prueba:

confirmar que NO quedaron archivos temporales de diagnóstico en:

```text
C:\xampp\htdocs\radio-babasonica-alexa
```

ni en:

```text
C:\xampp\htdocs\aws-api-skill
```

Buscar por patrones usados por el script.

---

# 13. NO REINICIAR APACHE

Si la corrección fue sólo del script:

```text
NO reinicio Apache
```

Si por alguna razón real se cambia Apache:

```text
DETENERSE
httpd.exe -t
WAITING_FOR_MANUAL_APACHE_RESTART
```

pero esto NO debería ser necesario para este bug.

---

# 14. ACTUALIZAR RESULTADOS

Actualizar:

```text
C:\xampp\htdocs\aws-api-skill\AWS_API_SKILL_MULTI_SKILL_FINALIZATION_RESULTS.md
```

Cambiar:

```text
Environment mapping test
Observed suffix
Result
GET endpoint
Invalid POST
```

Si pasa:

```text
Observed suffix: ac25
Result: PASS
GET endpoint: PASS
Invalid POST: PASS
```

Mantener como pendientes las pruebas humanas Alexa si aún no se ejecutaron.

---

# 15. ACTUALIZAR BOOTSTRAP RESULTS

Actualizar:

```text
C:\xampp\htdocs\aws-api-skill\AWS_API_SKILL_BOOTSTRAP_RESULTS.md
```

Con estado real.

Si mapping y endpoint pasan:

```text
Authenticated: YES
Vendor ID: MPMP5O0JXSS87
Manifest read: PASS
Interaction model read: PASS
Skill status read: PASS
Apache multi-skill plan: PASS
Apache syntax: PASS
Apache restart: DONE
Post-restart endpoint: PASS
Environment mapping: PASS
Human Alexa test: PENDING
```

No marcar prueba humana como PASS sin confirmación del usuario.

---

# 16. ACTUALIZAR MASTER STATUS

Actualizar:

```text
C:\xampp\htdocs\aws-api-skill\MASTER_STATUS.md
```

Radio Babasónica:

```text
Project: radio-babasonica-alexa
Channel: radiobbs
Skill ID: amzn1.ask.skill.005dec3e-f214-4e7e-90ba-2d5643adac25
Build: SUCCEEDED
Apache mapping: PASS
Endpoint regression: PASS
Alexa Simulator: PENDING HUMAN / conservar estado verificado si ya existía
Echo: PENDING HUMAN / conservar estado verificado si ya existía
Managed by factory: false
```

No inventar.

---

# 17. GENERAR REPORTE DE ESTA CORRECCIÓN

Crear:

```text
C:\xampp\htdocs\aws-api-skill\AWS_API_SKILL_ENV_MAPPING_FIX_RESULTS.md
```

Debe contener:

## Root cause

Explicar exactamente qué causaba:

```text
c25"
```

## Files changed

Lista exacta.

## Apache changed

```text
YES / NO
```

Esperado:

```text
NO
```

## Test

```text
GET endpoint:
Invalid POST:
Environment configured:
Expected suffix:
Observed suffix:
Environment mapping:
```

## Cleanup

```text
Temporary diagnostic removed: YES / NO
```

## Factory readiness

```text
Ready for DryRun:
Ready to create second Skill:
Human regression still pending:
```

---

# 18. CRITERIOS DE ACEPTACIÓN

```text
[ ] Root cause confirmado
[ ] Script corregido
[ ] No se tocó Apache sin necesidad
[ ] No se tocó backend Radio Babasónica
[ ] No se tocó SignalLive
[ ] No se tocó MediaMTX
[ ] No se escribieron recursos Alexa
[ ] GET = 405
[ ] Invalid POST = 400 controlado
[ ] configured=True
[ ] suffix=ac25
[ ] Environment mapping=PASS
[ ] diagnóstico temporal eliminado
[ ] resultados actualizados
[ ] reporte de fix generado
```

---

# 19. PUNTO FINAL

Si toda la validación pasa:

mostrar:

```text
ENVIRONMENT_MAPPING_FIX=PASS
```

y:

```text
READY_FOR_HUMAN_ALEXA_REGRESSION=YES
```

Todavía NO crear nueva Skill.

Después de la prueba humana de Radio Babasónica:

```text
Alexa, abre Radio Babasónica
Alexa, pausa
Alexa, continúa
Alexa, detente
```

se decidirá si la fábrica ya queda:

```text
READY_TO_CREATE_SECOND_SKILL=YES
```

---

# FIN
