Saltar a contenido

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.md
  • docs/ROADMAP.md
  • docs/governance/ACTIVE-CONTEXT.md
  • docs/tenants/alpuntodeventa/business-observer/production/PDF-009G-WOOCOMMERCE-CATEGORIES-IMAGES-ATTRIBUTES-MAPPING-CANDIDATE.md
  • docs/tenants/alpuntodeventa/business-observer/production/PDF-009H-FRONTEND-FACETS-PRODUCT-DISPLAY-CONTRACT.md
  • docs/tenants/alpuntodeventa/business-observer/SOURCE-002-FUTURE-LAYER-MAPPING.md

Confirmacion:

  • PDF-009H ya esta reflejado en PROJECT-STATE, ROADMAP, ACTIVE-CONTEXT, README.md y mkdocs.yml.
  • PDF-009H queda como contrato frontend vigente previo a PDF-009I.
  • No hizo falta corregir estado de publicacion/deploy de PDF-009H fuera de la actualizacion normal de foco hacia PDF-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 Marca en WooCommerce al momento del discovery;
  • Marca debe crearse en un gate futuro como atributo global filtrable;
  • slug sugerido: pa_marca;
  • Marca no debe implementarse como meta_data si 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_data para 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_id
  • url
  • is_featured
  • sort_order
  • title_current
  • title_expected
  • alt_current
  • alt_expected
  • status

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;
  • Images no es filtro frontend.

I. Estados de auditoria

Estados oficiales para auditoria de Media Library:

  • READY
  • NEEDS_NORMALIZATION
  • MISSING_SKU_IN_TITLE
  • MISSING_ALT_TEXT
  • UNATTACHED_BUT_RECENT
  • UNATTACHED_OLD
  • DUPLICATE_CANDIDATE
  • SAFE_DELETE_CANDIDATE
  • BLOCKED_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:

  • Marca debe ser atributo global filtrable, visible en card/listado y ficha, con slug sugerido pa_marca;
  • Marca no debe filtrarse por meta_data;
  • WooCommerce no tiene atributos globales al momento del discovery;
  • Media Library visible por API tiene 1 attachment;
  • el attachment observado requiere normalizacion/revision pero no accion automatica;
  • Images jsonb queda 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 49 marcas 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.