PDF-009I - WooCommerce Marca Media Library Discovery¶
Fecha: 2026-06-22
Estado: MARCA GLOBAL + MEDIA LIBRARY DISCOVERY / READ-ONLY GET / SIN WRITES / CANDIDATE
portal_visible = yes
Scope: tenant
tenant_id: alpuntodeventa
Destino funcional: La Directa WooCommerce
Owner: Gabi / Carlos Canu
A. SAFE POINT inicial¶
| Control | Resultado |
|---|---|
git status -sb |
## main...origin/main |
git rev-parse HEAD |
9aa230a24400a325d63c64419f4c8ceeafb2fb27 |
git rev-parse origin/main |
9aa230a24400a325d63c64419f4c8ceeafb2fb27 |
git log -3 --oneline |
9aa230a docs: add pdf-009h frontend images performance contract; 5363b01 docs: add pdf-009g woocommerce mapping candidate; b86a05e docs: align pdf-009f post-deploy state |
git diff --check inicial |
PASS |
Safe point esperado confirmado: HEAD local y origin/main iniciaron alineados
en 9aa230a24400a325d63c64419f4c8ceeafb2fb27, con repo limpio.
B. Estado documental PDF-009H¶
Documentos leidos obligatorios:
docs/PROJECT-STATE.mddocs/ROADMAP.mddocs/governance/ACTIVE-CONTEXT.mddocs/tenants/alpuntodeventa/business-observer/production/PDF-009G-WOOCOMMERCE-CATEGORIES-IMAGES-ATTRIBUTES-MAPPING-CANDIDATE.mddocs/tenants/alpuntodeventa/business-observer/production/PDF-009H-FRONTEND-FACETS-PRODUCT-DISPLAY-CONTRACT.mddocs/tenants/alpuntodeventa/business-observer/SOURCE-002-FUTURE-LAYER-MAPPING.md
Confirmacion:
PDF-009Hya esta reflejado enPROJECT-STATE,ROADMAP,ACTIVE-CONTEXT,README.mdymkdocs.yml.PDF-009Hqueda como contrato frontend vigente previo aPDF-009I.- No hizo falta corregir estado de publicacion/deploy de
PDF-009Hfuera de la actualizacion normal de foco haciaPDF-009I.
C. WooCommerce GET read-only ejecutado¶
Se ejecutaron solo lecturas GET contra WooCommerce y WordPress REST API,
usando credenciales locales sin imprimir valores ni .env.
| GET read-only | Resultado no sensible |
|---|---|
products/categories?per_page=100&hide_empty=false |
HTTP 200, count=1 |
products/attributes?per_page=100 |
HTTP 200, count=0 |
products?per_page=100 |
HTTP 200, count=0 |
wp/v2/media?per_page=100&page=1&context=view |
HTTP 200, visible_count=1, X-WP-Total=1, X-WP-TotalPages=1 |
No se ejecuto create, update, delete, batch, sync, scheduler, cron ni pipeline.
D. Atributos Woo existentes¶
Atributos globales WooCommerce existentes: 0.
Decision:
- no existe atributo global
Marcaen WooCommerce al momento del discovery; Marcadebe crearse en un gate futuro como atributo global filtrable;- slug sugerido:
pa_marca; Marcano debe implementarse comometa_datasi se usa como filtro;- no se creo ningun atributo en este gate.
E. Decision Marca global filtrable¶
Marca queda definida como dimension comercial visible y filtrable:
| Campo | Destino candidate | Card/listado | Ficha individual | Filtro frontend | Estado |
|---|---|---|---|---|---|
Marca |
atributo global WooCommerce pa_marca |
si | si | si | PENDING_ATTRIBUTE_WRITE_GATE |
Reglas:
- debe renderizarse en card/listado;
- debe renderizarse en ficha individual;
- debe sostener filtro frontend;
- debe vivir en atributo global/taxonomia optimizada;
- no usar
meta_datapara filtrar por marca; - la creacion real del atributo queda bloqueada hasta write gate separado.
F. Media Library discovery¶
Evidencia Media Library read-only:
| Metrica | Resultado |
|---|---|
| media items visibles por API | 1 |
| media items con title faltante o generico | 0 |
media items sin alt_text |
1 |
| media items sin SKU en title | 1 |
| media items unattached | 1 |
| media items posiblemente duplicados | 0 |
| media items usados por producto | 0 detectable; WooCommerce products count=0 |
Detalle no sensible del attachment observado:
| media_id | tipo | mime | fecha | attached product/post | Estado candidate |
|---|---|---|---|---|---|
6 |
image |
image/webp |
2026-06-15T11:56:01 |
null |
UNATTACHED_BUT_RECENT, MISSING_ALT_TEXT, MISSING_SKU_IN_TITLE |
Observaciones:
- no hay productos WooCommerce contra los cuales detectar imagen principal o galeria asociada;
- no se detectaron duplicados por titulo dentro de la pagina visible;
- el unico attachment visible es reciente respecto del gate y queda para revision, no para borrado;
- no se modifico Media Library ni metadata.
G. Normalizacion candidate title/alt¶
Reglas candidate:
| Caso | Valor esperado |
|---|---|
| imagen principal | SKU {sku} - {Articulo} - Principal |
| imagen de galeria | SKU {sku} - {Articulo} - Galeria {n} |
| alt text | {Articulo} SKU {sku} |
Politica:
- no renombrar archivos fisicos por ahora;
- no modificar
title; - no modificar
alt_text; - no adjuntar ni desadjuntar media;
- cualquier update futuro de metadata requiere gate explicito.
H. Contrato Images jsonb confirmado¶
Images jsonb queda confirmado como estructura operativa candidate en
PostgreSQL/OpenClaw:
json
[
{
"media_id": 6,
"url": "UNKNOWN",
"is_featured": false,
"sort_order": 0,
"title_current": "DISCOVERED_READ_ONLY",
"title_expected": "SKU {sku} - {Articulo} - Principal",
"alt_current": "",
"alt_expected": "{Articulo} SKU {sku}",
"status": "NEEDS_NORMALIZATION"
}
]
Campos obligatorios:
media_idurlis_featuredsort_ordertitle_currenttitle_expectedalt_currentalt_expectedstatus
Reglas:
- featured primero si existe asociacion real;
- galeria ordenada por
sort_order; - URL lista antes de cualquier write futuro;
- no resolver ni ordenar galerias en tiempo real desde frontend;
Imagesno es filtro frontend.
I. Estados de auditoria¶
Estados oficiales para auditoria de Media Library:
READYNEEDS_NORMALIZATIONMISSING_SKU_IN_TITLEMISSING_ALT_TEXTUNATTACHED_BUT_RECENTUNATTACHED_OLDDUPLICATE_CANDIDATESAFE_DELETE_CANDIDATEBLOCKED_REVIEW_REQUIRED
Clasificacion actual:
| Caso | Resultado | Estado |
|---|---|---|
| media con title y SKU, alt text y asociacion a producto | 0 |
READY |
| media sin alt text | 1 |
MISSING_ALT_TEXT |
| media sin SKU en title | 1 |
MISSING_SKU_IN_TITLE |
| media unattached reciente | 1 |
UNATTACHED_BUT_RECENT |
| media unattached viejo | 0 |
UNATTACHED_OLD |
| duplicados candidatos | 0 |
DUPLICATE_CANDIDATE |
| safe delete candidates | 0 |
SAFE_DELETE_CANDIDATE no implica autorizacion de borrado |
| requiere revision humana | 1 |
BLOCKED_REVIEW_REQUIRED para cualquier accion futura |
J. Casos READY / PENDING / BLOCKED¶
| Caso | Estado | Motivo |
|---|---|---|
| API WooCommerce read-only | READY |
categorias, atributos y productos respondieron HTTP 200. |
| API Media Library read-only | READY |
wp/v2/media respondio HTTP 200. |
Marca visible |
READY_CANDIDATE |
Dato comercial ya definido por PDF-009H. |
Marca filtrable |
PENDING_ATTRIBUTE_WRITE_GATE |
WooCommerce tiene 0 atributos; crear pa_marca requiere gate futuro. |
Images jsonb candidate |
READY_CANDIDATE |
Contrato confirmado con campos operativos y estados de auditoria. |
| media actual lista para producto | PENDING_REVIEW |
Attachment unico sin alt, sin SKU en title y sin asociacion. |
| productos/media asociados | UNKNOWN / NOT_OBSERVED |
WooCommerce products count=0; no hay asociaciones detectables. |
| limpieza de Media Library | BLOCKED_REVIEW_REQUIRED |
No hay autorizacion de delete ni metadata update. |
K. Decision¶
PDF-009I deja cerrado el candidate para avanzar a produccion sin writes:
Marcadebe ser atributo global filtrable, visible en card/listado y ficha, con slug sugeridopa_marca;Marcano debe filtrarse pormeta_data;- WooCommerce no tiene atributos globales al momento del discovery;
- Media Library visible por API tiene
1attachment; - el attachment observado requiere normalizacion/revision pero no accion automatica;
Images jsonbqueda confirmado como contrato operativo candidate para auditoria y futura sincronizacion controlada.
L. Proximo paso recomendado¶
Abrir gate separado de write controlado para:
- crear atributo global
Marca(pa_marca) si Gabi aprueba nombre, slug, visibilidad y filtro; - definir si se crean terminos de marca desde las
49marcas SOURCE-002; - aprobar politica de normalizacion de media title/alt;
- asociar imagenes a productos solo cuando existan productos o un write gate de catalogo;
- mantener cualquier limpieza de Media Library bloqueada hasta revision humana.
M. Cierre de restricciones¶
Durante este gate no se hicieron writes, no se modifico WooCommerce, no se
modifico La Directa, no se crearon atributos, no se crearon categorias, no se
subieron imagenes, no se modifico Media Library, no se modificaron productos,
no se toco .env, no se imprimieron secretos, no se toco PostgreSQL con
writes, no se ejecuto SQL write, no se hizo push, no se hizo deploy, no se
ejecuto sync, no se ejecuto scheduler, no se ejecuto cron y no se ejecutaron
pipelines.