# CODEX — Incorporar iconos a “Radio La Mano Peluda” y reejecutar SMAPI Validation

## Proyecto de trabajo

Trabajar desde:

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

## Objetivo

La Skill **Radio La Mano Peluda** ya fue creada en Amazon y llegó a SMAPI Validation.

NO crear una nueva Skill.

NO cambiar el Skill ID existente.

La validación actual falló únicamente por:

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

Los iconos ya fueron colocados manualmente por el usuario en:

```text
C:\xampp\htdocs\aws-api-skill\assets\radio-mano-peluda-alexa\es-MX_smallIcon.png

C:\xampp\htdocs\aws-api-skill\assets\radio-mano-peluda-alexa\es-MX_largeIcon.png
```

La meta de esta fase es:

```text
validar assets
→ incorporarlos al Skill Package de la Skill EXISTENTE
→ actualizar publishingInformation.locales.es-MX
→ importar/updatear la Skill existente
→ esperar que termine el import/build
→ ejecutar nuevamente SMAPI Validation
→ confirmar que desaparezcan los dos REQUIRED failures
```

---

# 1. REGLAS CRÍTICAS

NO:

```text
crear otra Skill
cambiar project_slug
cambiar invocation name
cambiar stream URL
cambiar backend
cambiar Apache
reiniciar Apache
modificar Radio Babasónica
modificar SignalLive
modificar MediaMTX
crear/finalizar beta
enviar certificación
publicar
```

La Skill que debe actualizarse es únicamente:

```text
Project slug:
radio-mano-peluda-alexa

Channel:
radiomp-audio

Display name:
Radio La Mano Peluda

Invocation:
la mano peluda

Locale:
es-MX
```

---

# 2. IDENTIFICAR EL SKILL ID EXISTENTE

Antes de hacer cualquier write, localizar el Skill ID ya creado.

Buscar en este orden:

```text
config\radiomp-audio.json
generated\radio-mano-peluda-alexa\skill-state.json
config\skills.registry.json
generated\radio-mano-peluda-alexa\remote-manifest.json
RADIO_MANO_PELUDA_CREATION_RESULTS.md
```

Debe existir un Skill ID real:

```text
amzn1.ask.skill....
```

## Gate

Si no puede determinarse inequívocamente el Skill ID existente:

```text
DETENER
SKILL_ID_NOT_FOUND
```

NO ejecutar `create-skill-for-vendor`.

NO crear una segunda Skill.

---

# 3. SNAPSHOT READ-ONLY ANTES DEL CAMBIO

Con el Skill ID real:

```cmd
ask smapi get-skill-manifest --skill-id <SKILL_ID> --stage development --profile signal-radio-factory
```

y:

```cmd
ask smapi get-interaction-model --skill-id <SKILL_ID> --stage development --locale es-MX --profile signal-radio-factory
```

Guardar snapshots:

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

No modificar remoto todavía.

---

# 4. VALIDAR LOS DOS ARCHIVOS DE ENTRADA

Validar exactamente:

```text
assets\radio-mano-peluda-alexa\es-MX_smallIcon.png
assets\radio-mano-peluda-alexa\es-MX_largeIcon.png
```

Comprobar:

```text
archivo existe
extensión .png
cabecera PNG válida
imagen no corrupta
```

Dimensiones obligatorias:

```text
small = 108 × 108 px
large = 512 × 512 px
```

Si alguna dimensión no coincide:

```text
DETENER
BRANDING_ASSET_INVALID_SIZE
```

No redimensionar silenciosamente.

No recodificar ni alterar visualmente las imágenes sin autorización.

---

# 5. TRANSPARENCIA / PADDING

Comprobar y reportar:

```text
alpha/transparencia: YES/NO
padding aproximado
```

Amazon recomienda para los iconos:

```text
small 108×108 PNG:
aprox. 16 px de padding

large 512×512 PNG:
aprox. 75 px de padding
```

Esto es una recomendación visual, no debe bloquear esta fase si las dimensiones y el PNG son válidos.

NO modificar los iconos sólo para ajustar padding.

---

# 6. USAR SKILL PACKAGE

Para estos iconos preferir el formato oficial de Skill Package.

Estructura objetivo:

```text
generated\radio-mano-peluda-alexa\skill-package\
│
├── skill.json
│
├── assets\
│   └── images\
│       ├── es-MX_smallIcon.png
│       └── es-MX_largeIcon.png
│
└── interactionModels\
    └── custom\
        └── es-MX.json
```

Copiar los PNG desde:

```text
assets\radio-mano-peluda-alexa\
```

hacia:

```text
generated\radio-mano-peluda-alexa\skill-package\assets\images\
```

Mantener nombres exactos.

---

# 7. NO RECONSTRUIR A CIEGAS EL MANIFEST

La Skill ya existe y ya contiene metadata válida.

Preferir preservar el manifest remoto actual.

Estrategia recomendada:

```text
1. obtener/exportar estado actual
2. usar el manifest actual como base
3. modificar únicamente los campos de iconos necesarios
4. preservar endpoint, AudioPlayer, privacy, descriptions, category, example phrases, availability, etc.
```

NO reponer un manifest mínimo que pueda borrar metadata ya configurada.

---

# 8. SKILL.JSON

Crear/actualizar:

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

basado en el manifest remoto existente.

Dentro de:

```text
manifest
→ publishingInformation
→ locales
→ es-MX
```

establecer:

```json
"smallIconUri": "file://assets/images/es-MX_smallIcon.png",
"largeIconUri": "file://assets/images/es-MX_largeIcon.png"
```

No usar rutas Windows:

```text
C:\...
```

dentro del manifest.

No usar:

```text
file:///C:/...
```

Las rutas deben ser relativas al Skill Package.

---

# 9. INTERACTION MODEL

Preservar el modelo real actual.

Crear/copiar:

```text
skill-package\interactionModels\custom\es-MX.json
```

desde el modelo remoto/local confirmado.

Debe continuar conteniendo:

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

No cambiar intents ni samples durante esta fase.

---

# 10. VALIDAR JSON Y PACKAGE ANTES DEL WRITE

Validar:

```text
skill.json = JSON válido
interactionModels\custom\es-MX.json = JSON válido
```

Confirmar que existen:

```text
skill-package\assets\images\es-MX_smallIcon.png
skill-package\assets\images\es-MX_largeIcon.png
```

Comprobar que `skill.json` contiene exactamente:

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

---

# 11. CONSULTAR ASK CLI 2.30.7 ANTES DEL IMPORT

No asumir nombres viejos de comandos.

Ejecutar:

```cmd
ask smapi --help
```

y localizar las operaciones actuales relacionadas con:

```text
skill package
upload
import
export
import status
export status
```

Consultar `--help` de cada comando necesario.

La documentación oficial de Skill Package indica que para actualizar una Skill existente se puede:

```text
exportar package actual
editarlo
crear upload URL
subir ZIP
importar package a la Skill existente
consultar import status
```

Usar los nombres EXACTOS disponibles en ASK CLI 2.30.7.

Registrar en el reporte qué comandos reales se usaron.

---

# 12. PREFERIR UPDATE DE SKILL EXISTENTE

La operación debe apuntar al:

```text
<SKILL_ID EXISTENTE>
stage=development
```

Nunca a:

```text
POST create new skill
create-skill-for-vendor
create-and-import new skill
```

Debe ser una importación/update del package de la Skill existente.

---

# 13. EMPAQUETAR

Crear:

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

El ZIP debe contener en su raíz:

```text
skill.json
assets\
interactionModels\
```

NO debe quedar una carpeta extra envolvente como:

```text
skill-package\skill.json
```

si la API espera `skill.json` directamente en la raíz del ZIP.

Verificar estructura del ZIP antes de subir.

---

# 14. BACKUP LOCAL

Antes del import, guardar:

```text
generated\radio-mano-peluda-alexa\pre-icons-skill-package\
```

o el export remoto equivalente.

También conservar:

```text
pre-icons-remote-manifest.json
pre-icons-interaction-model-es-MX.json
```

Esto será el rollback lógico si el package update altera algo inesperado.

---

# 15. IMPORTAR EL PACKAGE

Usar el workflow oficial soportado por la versión instalada:

```text
crear upload URL
→ subir ZIP
→ import package a <SKILL_ID EXISTENTE>
→ consultar import status
```

Stage:

```text
development
```

No continuar hasta que el import indique:

```text
SUCCEEDED
```

Si indica:

```text
FAILED
```

guardar error completo y DETENER.

No intentar crear otra Skill como fallback.

---

# 16. VERIFICAR MANIFEST REMOTO POST-IMPORT

Después de import exitoso:

```cmd
ask smapi get-skill-manifest --skill-id <SKILL_ID> --stage development --profile signal-radio-factory
```

Guardar:

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

Comprobar:

```text
publishingInformation.locales.es-MX.smallIconUri existe
publishingInformation.locales.es-MX.largeIconUri existe
```

Amazon puede transformar los `file://...` del package a URLs alojadas internamente.

Eso es aceptable.

Lo importante es que ambos campos estén presentes y sean válidos.

---

# 17. COMPARAR PRE / POST MANIFEST

Comparar el manifest anterior contra el posterior.

Esperado:

```text
cambio principal:
smallIconUri
largeIconUri
```

No deben desaparecer ni cambiar accidentalmente:

```text
name
summary
description
examplePhrases
keywords
category
endpoint
sslCertificateType
AUDIO_PLAYER
privacyAndCompliance
testingInstructions
availability
```

Si hay cambios inesperados:

```text
DETENER
MANIFEST_REGRESSION_DETECTED
```

Documentar diferencias.

---

# 18. VERIFICAR INTERACTION MODEL POST-IMPORT

Ejecutar read-only:

```cmd
ask smapi get-interaction-model --skill-id <SKILL_ID> --stage development --locale es-MX --profile signal-radio-factory
```

Confirmar:

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

y que el modelo no cambió accidentalmente.

---

# 19. BUILD / STATUS

Consultar:

```cmd
ask smapi get-skill-status --skill-id <SKILL_ID> --profile signal-radio-factory
```

Si el package import/build tiene operación o status específico, usarla también.

Esperar a que todos los recursos relevantes estén:

```text
SUCCEEDED
```

No validar mientras exista update:

```text
IN_PROGRESS
```

---

# 20. REEJECUTAR SMAPI VALIDATION

La validación anterior fue:

```text
Status: FAILED
Required failures: 2

1. Large Skill Icon is missing for es-MX
2. Small Skill Icon is missing for es-MX
```

Ahora ejecutar una VALIDACIÓN NUEVA.

Usar:

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

con:

```text
Skill ID existente
stage=development
locale=es-MX
```

Después consultar:

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

hasta estado terminal.

No reutilizar el resultado viejo como si fuera nuevo.

---

# 21. RESULTADO ESPERADO

Los dos REQUIRED failures deben desaparecer:

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

Objetivo:

```text
Required failures: 0
```

Puede seguir existiendo un finding recomendado/no bloqueante relacionado con instant update.

No tratar un recommendation como REQUIRED failure.

---

# 22. SI APARECEN ERRORES NUEVOS

Si la nueva validación devuelve REQUIRED failures distintos:

```text
NO certificar
NO publicar
```

Documentar cada uno exactamente.

No intentar resolver automáticamente temas legales, IP, advertising o privacy mediante valores inventados.

---

# 23. NO CERTIFICAR

Aunque la validación termine:

```text
PASSED
Required failures: 0
```

NO ejecutar:

```text
submit-skill-for-certification
```

La Skill debe permanecer en:

```text
development / beta
```

hasta autorización explícita del usuario.

---

# 24. ACTUALIZAR LA FÁBRICA PARA FUTURAS RADIOS

Este problema NO debe repetirse.

Actualizar el flujo de `aws-api-skill` para que ANTES de crear/validar una futura Skill exija:

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

Validaciones:

```text
small existe
small PNG válido
small = 108×108

large existe
large PNG válido
large = 512×512
```

Si falta algo:

```text
BRANDING_ASSETS_MISSING
```

y detenerse ANTES de crear/validar Skill.

---

# 25. CONVENCIÓN PERMANENTE DE ASSETS

Documentar en:

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

Convención:

```text
C:\xampp\htdocs\aws-api-skill\assets\
└── <PROJECT_SLUG>\
    ├── es-MX_smallIcon.png
    └── es-MX_largeIcon.png
```

Ejemplo actual:

```text
assets\
└── radio-mano-peluda-alexa\
    ├── es-MX_smallIcon.png
    └── es-MX_largeIcon.png
```

---

# 26. ACTUALIZAR create-radio-skill.ps1

Agregar un gate de branding ANTES de cualquier creación remota.

Flujo futuro:

```text
validate config
→ validate stream
→ validate branding assets
→ DryRun
→ create/update skill
```

No:

```text
create skill
→ validation falla por iconos
```

---

# 27. SKILL PACKAGE FUTURO

La fábrica debe generar automáticamente:

```text
generated\<PROJECT_SLUG>\skill-package\
├── skill.json
├── assets\
│   └── images\
│       ├── es-MX_smallIcon.png
│       └── es-MX_largeIcon.png
└── interactionModels\
    └── custom\
        └── es-MX.json
```

y referencias:

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

No pedirle al usuario rutas públicas externas si el Skill Package puede administrar los assets.

---

# 28. ACTUALIZAR CONFIG / STATE

No cambiar Skill ID.

Actualizar estado local con:

```text
ICONS_VALIDATED
SKILL_PACKAGE_UPDATED
PACKAGE_IMPORT_SUCCEEDED
REMOTE_ICONS_PRESENT
SMAPI_VALIDATION_PASSED / FAILED
```

---

# 29. 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
```

No borrar el histórico de la validación anterior.

Registrar:

```text
Previous validation:
FAILED — 2 REQUIRED icon failures

New validation:
<REAL RESULT>
```

---

# 30. REPORTE ESPECÍFICO DE ESTA FASE

Crear:

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

Debe contener:

## Skill

```text
Display Name:
Radio La Mano Peluda

Project:
radio-mano-peluda-alexa

Skill ID:
<EXISTING REAL ID>

Stage:
development
```

## Input assets

```text
Small path:
Small dimensions:
Small PNG:
Small transparency:

Large path:
Large dimensions:
Large PNG:
Large transparency:
```

## Package

```text
Package directory:
ZIP:
smallIconUri:
largeIconUri:
Package structure validation:
```

## Import

```text
ASK CLI commands used:
Upload:
Import ID:
Import status:
```

## Remote verification

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

## Validation

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

## Factory improvement

```text
Branding preflight implemented:
Future missing-icon gate implemented:
Docs updated:
```

## Certification

```text
NOT SUBMITTED
```

---

# 31. CRITERIOS DE ACEPTACIÓN

```text
[ ] Skill ID existente localizado
[ ] NO se creó otra Skill
[ ] small PNG válido
[ ] small 108×108
[ ] large PNG válido
[ ] large 512×512
[ ] Skill Package generado
[ ] file:// icon refs correctas
[ ] package ZIP correcto
[ ] package import a Skill EXISTENTE = SUCCEEDED
[ ] remote smallIconUri presente
[ ] remote largeIconUri presente
[ ] interaction model intacto
[ ] manifest sin regresiones inesperadas
[ ] nueva SMAPI Validation ejecutada
[ ] errores de iconos eliminados
[ ] branding preflight añadido a fábrica
[ ] reportes actualizados
[ ] NO certificación
```

---

# 32. SI TODO PASA

Mostrar:

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

Si quedan otros REQUIRED failures:

```text
RADIO_MANO_PELUDA_ICONS=PASS
SMAPI_REQUIRED_FAILURES=<N>
NEXT_BLOCKERS=<LIST>
CERTIFICATION_SUBMITTED=NO
```

---

# 33. SI HAY ERROR DE IMPORT

Mostrar:

```text
SKILL_PACKAGE_IMPORT=FAILED
SKILL_ID=<EXISTING>
NO_NEW_SKILL_CREATED=YES
LAST_SAFE_STATE=<...>
ERROR=<...>
```

No intentar resolver creando otra Skill.

---

# FIN
