movistar-pptx
Construye y edita exclusivamente presentaciones PowerPoint de marca Movistar a partir de la plantilla oficial: ~156 arquetipos en dos sistemas de diseño, con portadas, agenda, separadores, contenido c
SKILL.mdmovistar-pptx/SKILL.md
GitHubMovistar — PPTX: clona la diapo real que mejor encaja, rellénala
Produce una .pptx brand-perfect de Movistar clonando arquetipos reales de la plantilla oficial
(~156, en dos sistemas de diseño del cliente), no layouts abstractos. Tu trabajo tiene dos pasos:
(1) elegir el arquetipo que encaja con el contenido que tienes y (2) rellenarlo. No hace falta
"diseñar": la diapositiva ya está diseñada. Voz, copy, color, tipografía y fotografía: skill
movistar-brand-guidelines (siempre cargada, no se repite aquí).
Elegir no cuesta abrir ficheros. El §MAPA DE FAMILIAS de abajo resuelve la mayoría de los decks;
si no, le preguntas al motor (find_slides(), describe()) y él consulta el catálogo por ti.
Keywords: deck Movistar, presentación PowerPoint, python-pptx, mvst_pptx, arquetipos de diapo, plantilla oficial, dos sistemas de diseño, Movistar Sans.
Idioma: español (es-ES). Razonamiento interno y claves JSON en inglés.
Dependencias
python-pptxya está instalado en el runtime. No busques la skill prebuiltpptx, no la importes como skill y no te detengas si no aparece entre las skills cargadas.soffice+ PyMuPDF (fitz) opdftoppmson solo para QA visual profundo offline.
⚡ VÍA RÁPIDA SUPERSTUDIO — entrega dentro del turno de producción
El turno completo tiene un límite duro de 20 minutos. Para la primera entrega:
- Lee SOLO este
SKILL.md. Abrereferences/slides-index.md(17 KB) únicamente si el §MAPA DE FAMILIAS no te resuelve el arquetipo; nunca el JSON del catálogo. Si el usuario pide el recorrido amplio de portada+agenda+foto+gráfico+tabla+comparativas+timeline+métricas+cierre, abrereferences/capability-recipe.md. - Planifica el guion brevemente y crea un único script Python. Usa
set_texts()para paneles, timelines y rejillas de columnas,set_chart_data()para el gráfico yset_table_data()para la tabla. - No busques un
shape_nameen ningún sitio:use()los imprime al clonar, con su rol y su capacidad. Rellena siguiendo ese listado y en ese mismo orden. - Consulta imagery una sola vez con filtros; elige una foto existente y continúa. No recorras el
bundle ni abras imágenes una por una.
Si el usuario dice "no investigues" o pide datos ficticios/demo, no llames a
web_search/web_fetch; todo el contenido sale del prompt y de assets locales. - Construye una vez y llama a
save()una sola vez. Sus gates de ejemplo, composición y OPC son el control de producción. Si un gate duro falla, haz como máximo una corrección dirigida y vuelve a guardar al mismo nombre. - En el turno inicial no ejecutes
qa_render, soffice, screenshots ni inspección PNG diapo a diapo. Ese QA visual profundo pertenece a evaluación offline o a un turno posterior solicitado. - En una edición posterior, modifica el
.pptx/script existente dentro del mismo container y conserva nombre y número de diapositivas; no reconstruyas ni reinspecciones todo el catálogo. - El historial puede contener metadata interna de archivos. Nunca copies al texto visible
[[generated]],[[/generated]],file_id,anthropic-file://, rutas/tmp//mntni IDs de container/skill. Entrega el archivo mediante la herramienta y limita la respuesta a nombre y resumen.
⛔ CRÍTICO — cómo se construye (no negociable)
- USA SIEMPRE el helper
mvst_pptxsobre la plantilla oficial.new_deck()la localiza sola en el fichero inyectado por Files API/container upload (fallback repo-local solo en desarrollo). Trae los ~156 arquetipos y Movistar Sans real embebida. Sinew_deck()lanza, DETENTE y repórtalo. NUNCA construyas el deck desde cero, conPresentation()en blanco, ni con otra plantilla u otra fuente. - NUNCA abras
references/slides-catalog-movistar.json(1,1 MB — no cabe en el turno, se lo come entero). Ese fichero lo lee el MOTOR, no tú. El motor te da lo que necesitas:- el §MAPA DE FAMILIAS de abajo resuelve la mayoría de los decks sin abrir nada;
- si no te determina el arquetipo: (a)
find_slides(family=…, n_items=…, has_image=…), (b)describe("NOMBRE")para la ficha corta, - (c) y solo si sigues sin resolverlo,
references/slides-index.md(17 KB, una fila por maqueta).
- Clona con
use(), rellena porshape_name, nunca por índice:s = use(deck, "INTERIOR_TXT_1IMG") # imprime las zonas exactas de ESTA diapositiva set_text(s, "Title 2", "Conectamos con lo que importa")use()duplica la diapositiva de ejemplo (nunca la edita in-place) y te imprime su fill-spec:shape_name · rol · tipo/capacidad, en orden de lectura. Rellena por esos nombres; no los deduzcas ni los copies de otro arquetipo.set_text()conserva fuente/tamaño/color del texto de ejemplo — no los toques ni los pases como parámetro, ya están bien (la mayoría heredan de layout/master,GOTCHAS.mdG2). set_page_header()— obligatorio en CADA diapositiva de contenido con cabecera de página (título/subtítulo/número, distinto de la portada):set_page_header(s, "Título de la sección", subtitle="Subtítulo"). En Movistar esto es POR DIAPOSITIVA, no una vez al final (GOTCHAS.mdG8): cada página interior tiene su propio título. 18 arquetipos no tienen zona de título y la función lanza a propósito; el fill-spec deuse()te lo dice antes ("sin zona de título").- ANTI-VACÍO: cada diapositiva real está diseñada para llenarse ENTERA. Si un arquetipo tiene 5
columnas o 3 fotos, rellena TODAS — dejar una vacía se ve roto, no "minimalista". Si te sobra una
zona, es señal de que toca otro arquetipo (
find_slides(family=…, n_items=…)), no de vaciar una conremove_shape().verify_deck()lo mide y avisa. - Valida SIEMPRE:
save()elimina los arquetipos sin usar (nunca deben llegar al entregable), ejecutafinalize_pptx.py+verify_pptx.py(OPC; gate duro, incluye notesSlide-compartida / diapositivas-huérfanas / físico==lógico —GOTCHAS.mdG5/G6) e imprime los avisos[deck-qa]deverify_deck(). Siverify_pptxfalla → una corrección dirigida y repite una vez.verify_deck(deck)es seguro antes y después desave(). - QA visual por render: OFFLINE, no en la primera entrega. Ver §QA VISUAL.
§MAPA DE FAMILIAS — empieza aquí, resuelve la mayoría de los decks
12 familias. [C] es el arquetipo por defecto: si no tienes una razón para otro, es siempre
seguro. El "eje de variante" es lo único que decides dentro de la familia.
| Familia | Qué resuelve | [C] por defecto |
nº | Eje de variante |
|---|---|---|---|---|
| AVISO | aviso de confidencialidad, la primera diapo del deck | AVISO_CONFIDENCIALIDAD |
1 | — |
| PORTADA | abrir el deck | PORTADA_TITULO |
26 | con/sin foto · foto a sangre, con margen o partida · color |
| INDICE | índice / agenda | INDICE_SIMPLE |
6 | nº de columnas (3 o 5) · fondo claro u oscuro |
| SEPARADOR | abrir capítulo o sección | SEPARADOR_TITULO |
42 | color de capítulo · con número, con una palabra o con 5 columnas |
| TITULAR | una idea o cifra sin foto | TITULAR_GRANDE |
3 | una o dos columnas de texto |
| INTERIOR | idea + foto: el cuerpo del deck | INTERIOR_TXT_1IMG |
34 | nº de fotos (0-3) · nº de columnas (2-6) · foto a la derecha, a sangre o con margen |
| GRID | galería o mosaico de fotos con pie | GRID_3IMG_CAPTION |
19 | nº de fotos (2, 3, 4, 6, 12 o 15) · con pie o mosaico limpio |
| DATOS | gráfica, tabla, KPI, dashboard | DATOS_CHART_CLASICO |
5 | gráfica · gráfica hero · dashboard de 6 · tabla · gauges de 5 KPI |
| QUOTE | cita o frase protagonista (máx. 1 por deck) | QUOTE_PLANO |
7 | con o sin foto · color de fondo |
| COMPARATIVA | 2 o 3 paneles enfrentados | COMPARATIVA_2_PANEL_CLASICO |
2 | 2 o 3 paneles |
| TIMELINE | cronología, roadmap, planograma | TIMELINE_PROCESO_CLASICO |
3 | planograma de bandas · tabla de fases · multi-hito |
| CIERRE | cerrar el deck | CIERRE_M |
8 | M sola · marca Telefónica · con título · color |
No hay familia de listas ni de pasos, a propósito: una enumeración va en INDICE_* o en un
INTERIOR_TXT_*COL_CLASICO; unos pasos secuenciales, en TIMELINE_* o COMPARATIVA_*.
§DOS SISTEMAS DE DISEÑO
La plantilla trae dos slideMaster oficiales del cliente:
- refresh (vigente): arquetipos sin sufijo. Es el que ve un humano al pulsar "Nueva diapositiva" y el que se usa por defecto.
- clásico: arquetipos con sufijo
_CLASICO. Igual de válidos y con mucha más variedad de rejillas, datos y comparativas — de ahí que el[C]de DATOS, COMPARATIVA y TIMELINE sea_CLASICO.
No los mezcles en un mismo deck salvo petición explícita: son dos lenguajes visuales distintos.
verify_deck() avisa si uno queda como residuo minoritario (<25%) y propone el hermano equivalente
del dominante. Un deck 50/50 es una decisión y no dispara nada.
§CONTENT-FIRST — el embudo de 3 pasos (regla nº1)
Paso 1 · Guion antes de arquetipos. Reúne el contenido real y escribe, por diapositiva, la intención y el número de bloques: «abrir», «índice de 3 capítulos», «una idea + foto», «tabla de 6 filas», «cerrar». Vocabulario cerrado y corto — nada de prosa.
Paso 2 · Intención → FAMILIA, con el mapa de arriba. Sin abrir ficheros. Un deck estándar es
AVISO? → PORTADA → INDICE → (SEPARADOR + 2-4 de INTERIOR/TITULAR/DATOS/GRID) × capítulos
→ QUOTE? → CIERRE.
Paso 3 · Dentro de la familia, dos preguntas y ya está determinado: (a) ¿cuántos bloques
repetidos necesito? → es el n_items; (b) ¿de qué color va este capítulo? → es la variante. Si aun
así queda ambiguo, UNA llamada: find_slides(family="INTERIOR", n_items=3, has_image=True). Si no
tienes preferencia, el [C] es siempre seguro.
Además: abre cada bloque temático con un SEPARADOR_* y mantén un color por capítulo
(verify_deck() avisa si repites color entre capítulos o te sales del sistema declarado en
assets/brand-config.json). Evita que una misma maqueta domine el deck: verify_deck() lo mide
sobre la composición física, no sobre el nombre, así que usar seis nombres distintos que se ven igual
no cuela. Criterio de composición: references/design-principles.md.
Nº de diapositivas: lo decide el contenido, no una cifra fija.
Patrón de construcción
import sys, glob
_c = (glob.glob("/skills/**/movistar-pptx*/scripts", recursive=True)
or glob.glob("/mnt/skills/**/movistar-pptx*/scripts", recursive=True)
or glob.glob("/**/movistar-pptx*/scripts", recursive=True))
sys.path.insert(0, _c[0])
from mvst_pptx import (new_deck, use, set_text, set_texts, set_image, set_page_header,
set_chart_data, set_table_data, save, list_brand_images,
confirm_example_text, find_slides, describe, fill_spec, families)
deck = new_deck() # NUNCA Presentation() en blanco.
s = use(deck, "PORTADA_TITULO") # -> imprime: Text Placeholder 1 (title, ≤34) …
set_text(s, "Text Placeholder 1", "Conectamos lo que importa")
set_text(s, "Text Placeholder 2", "Plan de marca 2026")
s = use(deck, "INDICE_SIMPLE")
set_text(s, "Text Placeholder 3", "Índice")
set_text(s, "Text Placeholder 1", "1.\n2.\n3.")
confirm_example_text(s, "Text Placeholder 1") # el valor real coincide con el ejemplo (G13)
set_text(s, "Text Placeholder 2", "Orígenes\nPropuesta\nPróximos pasos")
s = use(deck, "SEPARADOR_NUMERO_06_AZUL") # capítulo 01 -> AZUL
set_text(s, "Title 1", "Orígenes")
set_text(s, "Text Placeholder 3", "01")
s = use(deck, "INTERIOR_TXT_1IMG")
set_page_header(s, "Antes de Movistar había Telefónica", subtitle="De 1924 a 1994")
set_text(s, "Text Placeholder 4", "Párrafo real, dentro de la capacidad que imprime use().")
fotos = [r["path"] for r in list_brand_images(with_meta=True)
if r["exists"] and r["categoria"] != "fondo"]
if not fotos:
raise RuntimeError("No hay imagery Movistar montado; elige un arquetipo sin foto")
set_image(s, "Content Placeholder 8", fotos[0])
use(deck, "CIERRE_M")
save(deck, "plan-marca-2026.pptx") # gates + finalize + verify
§IMÁGENES
Las fotos que trae la plantilla son de ejemplo o semilla del build, no banco reutilizable: se
sustituyen SIEMPRE con list_brand_images() (nunca construyas la ruta a mano; resuelve el bundle
inyectado por container_upload y devuelve solo rutas que existen). 12 de sus 35 entradas son
categoria: "fondo" — fondos de color plano con el claim de marca, no fotografía: fíltralas.
set_image() recorta en vez de estirar (crop-to-fill) y avisa si el recorte pasa del 30% de un lado;
funciona igual sobre un hueco ya poblado, uno vacío o uno maquetado como forma. list_brand_images( with_meta=True) da categoría/tags/mood/momento_dia para elegir con criterio — mismo algoritmo que
movistar-brand-guidelines/imagery/imagery-guide.md. Si no hay match decente, usa un arquetipo SIN
foto: mejor sin foto que con una foto que no dice nada. Composición y dirección de arte (scrim, 1
logo por pieza, M siempre azul): movistar-brand-guidelines/brand/photography-style.md.
§QA VISUAL
Checklist completo en references/qa-visual-checklist.md (qué mirar, los 7 fallos automáticos de
marca, y los dos artefactos del renderizador que no son defectos del fichero). No lo ejecutes en la
primera entrega de SuperStudio: en el turno inicial el control de calidad son los gates de save()
y los avisos [deck-qa].
Nota de fuentes
La plantilla embebe Movistar Sans real (EOT), la fuente oficial que ya usan los runs del cliente.
No cambies la fuente de un run al rellenarlo: set_text() la conserva. Detalle en GOTCHAS.md G1
(sufijo "TT" del nombre de familia) y G19 (la plantilla anterior de producción embebía Calibri
etiquetado como Movistar Sans).
§OUTPUT
Respuesta final: una línea OUTPUT_FILE: <kebab-case>.pptx + resumen ≤4 líneas (nº diapositivas,
arquetipos usados, qa_flags). Guarda y valida ANTES de resumir.
§FICHEROS
scripts/mvst_pptx.py— el motor. Úsalo siempre.- Consulta:
families(),find_slides(),describe(),fill_spec(),slide_names(). - Construcción:
new_deck(),use(),set_text()/set_texts(),set_image(),set_page_header(),set_chart_data()/set_charts_data(),set_table_data(),save(). - Escapes:
remove_shape(),confirm_example_text()(acepta"*"),confirm_example_image(). - QA:
verify_deck(). Imagery:list_brand_images(). Salida:outputs_dir(). - Último recurso:
content_rect(slide)da el rectángulo libre bajo la cabecera paraslide.shapes.add_table()/add_chart()nativos. Evítalo para gráficas: unaadd_chart()sobre un rectángulo vacío sale con la paleta por defecto de Office, no la de Movistar (verGOTCHAS.mdG22). Busca antes un arquetipo con la gráfica ya compuesta.
- Consulta:
references/slides-index.md— autogenerado: una fila por maqueta, con sus variantes, zonas y sistema. El atajo cuando el §MAPA DE FAMILIAS no te basta (17 KB).references/capability-recipe.md— receta compacta con arquetipos yshape_nameya validados para un deck que demuestra todas las capacidades. Hay una versión por sistema.references/qa-visual-checklist.md— el QA por render (offline).references/design-principles.md·references/naming-grammar.md·references/GOTCHAS.md— criterio de composición, gramática de los nombres de arquetipo, y bugs conocidos.references/slides-catalog-movistar.json— catálogo completo (1,1 MB). Lo lee el motor, no tú.references/deck-source-analysis.md— diagnóstico de las dos plantillas del cliente y cómo se seleccionaron los arquetipos.assets/brand-config.json— paleta, sistema de color de capítulos yqa_gates(fuente única de los umbrales deterministas que lee el motor).assets/template/movistar.pptx— la plantilla. No viaja en el.zip(excluida vía.skillignore): se inyecta vía Files API/container_uploadynew_deck()la localiza.
Relación con otras skills
Un deck usa movistar-brand-guidelines (criterio de marca — voz, copy, color, tipografía,
fotografía) + movistar-pptx (este: arquetipos + mecánica). El runtime aporta python-pptx; la
prebuilt pptx puede estar filtrada y no debe buscarse. Cualquier otro output usa solo la skill de
marca.