# CODEX — Corregir ZIP Skill Package en Windows y completar iconos de “Radio La Mano Peluda”

## Proyecto

Trabajar desde:

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

## Estado confirmado

La Skill EXISTENTE es:

```text
Display Name: Radio La Mano Peluda
Project: radio-mano-peluda-alexa
Skill ID: amzn1.ask.skill.596ad9c6-906d-48fb-9e5f-c60850bd2cad
Stage: development
```

NO crear una nueva Skill.

Los iconos ya son válidos:

```text
Small:
assets\radio-mano-peluda-alexa\es-MX_smallIcon.png
108x108
PNG PASS
Transparency YES

Large:
assets\radio-mano-peluda-alexa\es-MX_largeIcon.png
512x512
PNG PASS
Transparency YES
```

La importación anterior falló únicamente porque las entradas internas del ZIP usaron separadores Windows:

```text
\
```

en lugar de separadores ZIP/URI:

```text
/
```

Estado remoto actual:

```text
REMOTE_STATE_INTACT=YES
SAFE_TO_RETRY_WITH_CORRECTED_ZIP=YES
```

---

# 1. OBJETIVO

Corregir el generador/empaquetador de Skill Package para que TODAS las rutas internas del ZIP usen `/`.

Después:

```text
recrear ZIP
→ validar nombres internos
→ subir ZIP
→ importar a la Skill EXISTENTE
→ esperar SUCCEEDED
→ verificar iconos remotos
→ verificar interaction model intacto
→ ejecutar SMAPI Validation nueva
→ confirmar Required failures = 0
→ corregir la fábrica para futuras Skills
```

---

# 2. REGLAS CRÍTICAS

NO:

```text
create-skill-for-vendor
crear otra Skill
cambiar Skill ID
cambiar invocation name
cambiar stream URL
modificar backend
modificar Apache
reiniciar Apache
modificar Radio Babasónica
modificar SignalLive
modificar MediaMTX
crear/finalizar beta
enviar certificación
publicar
```

Skill ID obligatorio:

```text
amzn1.ask.skill.596ad9c6-906d-48fb-9e5f-c60850bd2cad
```

---

# 3. INSPECCIONAR EL PACKAGER ACTUAL

Localizar en:

```text
scripts\
```

la función que construye:

```text
generated\radio-mano-peluda-alexa\radio-mano-peluda-skill-package.zip
```

Buscar:

```text
Compress-Archive
ZipArchive
CreateEntry
relative path
GetRelativePath
FullName
entry name
skill-package
```

Confirmar exactamente por qué se generaron entradas con:

```text
assets\images\es-MX_smallIcon.png
interactionModels\custom\es-MX.json
```

en lugar de:

```text
assets/images/es-MX_smallIcon.png
interactionModels/custom/es-MX.json
```

Documentar causa raíz.

---

# 4. CORREGIR LA CREACIÓN DEL ZIP

Preferir una implementación determinista con:

```text
System.IO.Compression.ZipArchive
```

o mecanismo equivalente que permita controlar el `entryName`.

Regla obligatoria:

```powershell
$entryName = $relativePath.Replace('\','/')
```

antes de crear cada entrada.

No confiar en el separador nativo de Windows dentro del ZIP.

---

# 5. ESTRUCTURA INTERNA OBLIGATORIA

El ZIP debe contener EXACTAMENTE en su raíz:

```text
skill.json
assets/images/es-MX_smallIcon.png
assets/images/es-MX_largeIcon.png
interactionModels/custom/es-MX.json
```

Puede contener otros archivos válidos si el package actual los requiere, pero:

```text
NO debe existir una carpeta wrapper extra
NO deben existir rutas con \
NO deben existir rutas absolutas
NO deben existir drive letters
```

Ejemplos prohibidos:

```text
skill-package/skill.json
C:/xampp/...
assets\images\...
interactionModels\custom\...
```

---

# 6. VALIDACIÓN DEL ZIP ANTES DE SUBIR

Después de recrearlo, enumerar todas las entradas.

Con .NET / PowerShell o herramienta equivalente.

Generar:

```text
generated\radio-mano-peluda-alexa\ZIP_ENTRIES_VALIDATION.txt
```

Debe mostrar al menos:

```text
skill.json
assets/images/es-MX_smallIcon.png
assets/images/es-MX_largeIcon.png
interactionModels/custom/es-MX.json
```

Gate obligatorio:

```text
[ ] ninguna entrada contiene "\"
[ ] ninguna entrada comienza con "/"
[ ] ninguna entrada contiene ":"
[ ] skill.json está en raíz
[ ] small icon existe
[ ] large icon existe
[ ] es-MX model existe
```

Si cualquier gate falla:

```text
DETENER
ZIP_PATH_VALIDATION=FAIL
```

NO subir.

---

# 7. VALIDAR SKILL.JSON

Confirmar:

```text
smallIconUri = file://assets/images/es-MX_smallIcon.png
largeIconUri = file://assets/images/es-MX_largeIcon.png
```

No usar:

```text
file://assets\images\...
file:///C:/...
```

Validar JSON.

---

# 8. VALIDAR INTERACTION MODEL

Confirmar en:

```text
interactionModels/custom/es-MX.json
```

que sigue:

```text
invocationName = la mano peluda
```

No modificar intents ni samples en esta fase.

---

# 9. SNAPSHOT REMOTO PRE-RETRY

Antes del nuevo import:

```cmd
ask smapi get-skill-manifest --skill-id amzn1.ask.skill.596ad9c6-906d-48fb-9e5f-c60850bd2cad --stage development --profile signal-radio-factory
```

Guardar:

```text
generated\radio-mano-peluda-alexa\pre-zipfix-remote-manifest.json
```

También:

```cmd
ask smapi get-interaction-model --skill-id amzn1.ask.skill.596ad9c6-906d-48fb-9e5f-c60850bd2cad --stage development --locale es-MX --profile signal-radio-factory
```

Guardar:

```text
generated\radio-mano-peluda-alexa\pre-zipfix-interaction-model-es-MX.json
```

---

# 10. RECREAR EL ZIP

Eliminar o reemplazar únicamente:

```text
generated\radio-mano-peluda-alexa\radio-mano-peluda-skill-package.zip
```

No borrar:

```text
skill-state.json
snapshots
reports
assets de entrada
```

Crear ZIP corregido.

---

# 11. USAR EL WORKFLOW SMAPI YA VALIDADO

Usar los comandos reales de ASK CLI 2.30.7 ya descubiertos para:

```text
create-upload-url
upload
import-skill-package
get-import-status
```

Antes de cada operación sensible:

```cmd
ask smapi <comando> --help
```

si hace falta confirmar flags.

El import debe apuntar a la Skill EXISTENTE:

```text
amzn1.ask.skill.596ad9c6-906d-48fb-9e5f-c60850bd2cad
```

Stage:

```text
development
```

Nunca usar creación de Skill.

---

# 12. SUBIR EL ZIP

Subir el ZIP corregido a la upload URL.

Esperado:

```text
HTTP 200
```

Registrar:

```text
Upload URL requested: YES
ZIP upload: PASS/FAIL
```

No registrar tokens o URLs firmadas completas en logs persistentes.

---

# 13. IMPORTAR A LA SKILL EXISTENTE

Ejecutar import package contra:

```text
Skill ID: amzn1.ask.skill.596ad9c6-906d-48fb-9e5f-c60850bd2cad
```

Guardar nuevo:

```text
Import ID
```

Consultar `get-import-status` hasta:

```text
SUCCEEDED
```

o:

```text
FAILED
```

Timeout razonable.

Si falla:

```text
guardar error exacto
DETENER
NO crear otra Skill
```

---

# 14. VERIFICAR MANIFEST REMOTO POST-IMPORT

Después de `SUCCEEDED`:

```cmd
ask smapi get-skill-manifest --skill-id amzn1.ask.skill.596ad9c6-906d-48fb-9e5f-c60850bd2cad --stage development --profile signal-radio-factory
```

Guardar:

```text
generated\radio-mano-peluda-alexa\post-zipfix-remote-manifest.json
```

Confirmar:

```text
smallIconUri present = YES
largeIconUri present = YES
```

Amazon puede convertir las referencias `file://` a URLs internas alojadas.

Eso es correcto.

---

# 15. COMPARAR MANIFEST PRE / POST

Comparar:

```text
pre-zipfix-remote-manifest.json
post-zipfix-remote-manifest.json
```

Cambios esperados:

```text
smallIconUri
largeIconUri
```

No deben desaparecer o alterarse accidentalmente:

```text
name = Radio La Mano Peluda
summary
description
examplePhrases
keywords
category = STREAMING_SERVICE
endpoint
sslCertificateType
AUDIO_PLAYER
privacyAndCompliance
testingInstructions
availability
```

Si aparece regresión:

```text
MANIFEST_REGRESSION_DETECTED
DETENER
```

---

# 16. VERIFICAR INTERACTION MODEL POST-IMPORT

Ejecutar:

```cmd
ask smapi get-interaction-model --skill-id amzn1.ask.skill.596ad9c6-906d-48fb-9e5f-c60850bd2cad --stage development --locale es-MX --profile signal-radio-factory
```

Confirmar:

```text
invocationName = la mano peluda
```

Comparar contra snapshot pre-import.

Esperado:

```text
UNCHANGED
```

---

# 17. BUILD / STATUS

Ejecutar:

```cmd
ask smapi get-skill-status --skill-id amzn1.ask.skill.596ad9c6-906d-48fb-9e5f-c60850bd2cad --profile signal-radio-factory
```

Esperar recursos relevantes:

```text
SUCCEEDED
```

No ejecutar validation mientras haya:

```text
IN_PROGRESS
```

---

# 18. EJECUTAR UNA VALIDACIÓN NUEVA

La validación anterior falló por:

```text
Large Skill Icon is missing for es-MX
Small Skill Icon is missing for es-MX
```

Ejecutar:

```text
submit-skill-validation
```

para:

```text
Skill ID: amzn1.ask.skill.596ad9c6-906d-48fb-9e5f-c60850bd2cad
Stage: development
Locale: es-MX
Profile: signal-radio-factory
```

Guardar el NUEVO Validation ID.

Consultar:

```text
get-skill-validations
```

hasta estado terminal.

---

# 19. RESULTADO OBJETIVO

Esperado:

```text
Required failures: 0
```

Y específicamente:

```text
Large Skill Icon is missing = GONE
Small Skill Icon is missing = GONE
```

Un `RECOMMENDED` finding de instant update NO es bloqueo.

---

# 20. SI APARECE OTRO REQUIRED FAILURE

No certificar.

No inventar respuestas.

Guardar:

```text
NEXT_BLOCKERS
```

y detener.

---

# 21. CORREGIR LA FÁBRICA PARA FUTUROS PROYECTOS

Esta corrección debe ser PERMANENTE.

Modificar el packager común para que siempre normalice:

```text
\ → /
```

en entry names ZIP.

Agregar preflight obligatorio que inspeccione el ZIP antes de cualquier upload.

Gate futuro:

```text
ZIP_PATHS_POSIX=PASS
```

---

# 22. BRANDING PREFLIGHT FUTURO

Implementar también el pendiente del reporte anterior.

Antes de crear/validar una futura Skill exigir:

```text
assets\<PROJECT_SLUG>\es-MX_smallIcon.png
assets\<PROJECT_SLUG>\es-MX_largeIcon.png
```

Validar:

```text
small 108x108
large 512x512
PNG
no corruptos
```

Si falta:

```text
BRANDING_ASSETS_MISSING
```

y detener ANTES de crear/importar Skill.

---

# 23. DOCUMENTACIÓN

Actualizar:

```text
README.md
docs\WORKFLOW.md
docs\RADIO_CONFIG_SCHEMA.md
```

Agregar:

```text
Asset convention
Skill Package layout
ZIP path normalization rule
Branding preflight
ZIP validation preflight
```

---

# 24. ACTUALIZAR REPORTES

Actualizar:

```text
generated\radio-mano-peluda-alexa\VALIDATION_RESULTS.md
generated\radio-mano-peluda-alexa\FINAL_RESULTS.md
RADIO_MANO_PELUDA_CREATION_RESULTS.md
MASTER_STATUS.md
```

Preservar histórico:

```text
Validation 1:
FAILED — 2 icon failures

Import attempt 1:
FAILED — ZIP backslashes

Import attempt 2:
<REAL RESULT>

Validation 2:
<REAL RESULT>
```

---

# 25. CREAR REPORTE DE ESTA FASE

Crear:

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

Debe contener:

## Root cause

```text
ZIP internal path separator bug:
\ instead of /
```

## Files changed

Lista exacta.

## ZIP verification

```text
ZIP path validation:
Backslash entries:
Root skill.json:
Small icon entry:
Large icon entry:
Interaction model entry:
```

## Import

```text
Skill ID:
Upload:
Import ID:
Import status:
```

## Remote verification

```text
smallIconUri:
largeIconUri:
Manifest regression:
Interaction model unchanged:
```

## Validation

```text
Previous required failures: 2
New Validation ID:
New status:
New required failures:
Icon failures removed:
```

## Factory

```text
ZIP normalization implemented:
ZIP preflight implemented:
Branding preflight implemented:
Docs updated:
```

## Certification

```text
NOT SUBMITTED
```

---

# 26. CRITERIOS DE ACEPTACIÓN

```text
[ ] NO nueva Skill
[ ] Skill ID existente preservado
[ ] ZIP recreated
[ ] 0 entries con backslash
[ ] skill.json en raíz
[ ] icon entries correctas
[ ] model entry correcta
[ ] upload PASS
[ ] import SUCCEEDED
[ ] remote smallIconUri present
[ ] remote largeIconUri present
[ ] manifest sin regresión
[ ] interaction model unchanged
[ ] build/status SUCCEEDED
[ ] nueva validation ejecutada
[ ] icon required failures eliminados
[ ] ZIP normalization permanente
[ ] ZIP preflight permanente
[ ] branding preflight implementado
[ ] docs actualizados
[ ] NO certificación
```

---

# 27. SI TODO PASA

Mostrar:

```text
ZIP_PATH_FIX=PASS
SKILL_PACKAGE_IMPORT=PASS
RADIO_MANO_PELUDA_ICONS=PASS
SMAPI_REQUIRED_FAILURES=0
FACTORY_ZIP_PREFLIGHT=READY
FACTORY_BRANDING_PREFLIGHT=READY
CERTIFICATION_SUBMITTED=NO
```

---

# 28. SI FALLA

Mostrar:

```text
ZIP_PATH_FIX=<PASS/FAIL>
SKILL_PACKAGE_IMPORT=<PASS/FAIL>
SKILL_ID=amzn1.ask.skill.596ad9c6-906d-48fb-9e5f-c60850bd2cad
NO_NEW_SKILL_CREATED=YES
REMOTE_STATE_INTACT=<YES/NO>
LAST_SAFE_STATE=<...>
ERROR=<...>
SAFE_TO_RETRY=<YES/NO>
```

No crear una Skill nueva como workaround.

---

# FIN
