Ogma Router — Manual para crear integraciones y acciones
Versión: 1.0
Fecha: 6 de julio de 2026
Proyecto: Ogma Router
Plugin: /home/creandot/public_html/wp-content/plugins/ogma-router
1. Objetivo
Este documento explica cómo añadir a Ogma:
-
Una nueva integración con un sistema externo.
-
Una o varias acciones que utilicen esa integración.
-
Un comando conversacional como:
::lubrand create demo
La arquitectura debe permitir que una integración tenga muchas acciones futuras sin duplicar configuración, autenticación, manejo HTTP, permisos ni auditoría.
2. Conceptos principales
2.1. Integración
Una integración representa la conexión de Ogma con un sistema externo.
Ejemplos:
perfex
lubrand
supportboard
email_intelligence
Una integración se encarga de:
-
Estado activo o desactivado.
-
URL base.
-
Autenticación.
-
Credenciales.
-
Cliente HTTP.
-
Prueba de conexión.
-
Normalización de respuestas.
-
Manejo de errores.
-
Capacidades disponibles.
-
Auditoría técnica.
La integración no debe contener el flujo conversacional completo.
Ejemplo:
Integración:
lubrand
Capacidades:
locations.create
locations.read
locations.update
locations.create_demo
qr.read
qr.regenerate
2.2. Función de Ogma
En la arquitectura actual, una función es la unidad que Ogma registra, muestra en permisos y relaciona con un comando.
Ejemplo:
Function key:
lubrand
Command code:
lubrand
Handler:
OGMA_Lubrand_Function
El usuario la invoca con:
::lubrand
La tabla de funciones determina:
function_key
name
description
type
handler
status
risk_level
requires_permission
requires_session
command_code
Los permisos actuales de Ogma se asignan principalmente a nivel de función.
2.3. Acción
Una acción es una operación concreta dentro de una función o integración.
Ejemplos:
lubrand.locations.create_demo
lubrand.locations.update
lubrand.locations.list
lubrand.qr.regenerate
En el estado actual de Ogma no existe todavía un catálogo genérico e independiente de acciones equivalente al registro de funciones.
Por lo tanto, el patrón recomendado es:
Comando
↓
Función de Ogma
↓
Despachador de acciones
↓
Clase de acción
↓
Cliente de integración
↓
API externa
Ejemplo:
::lubrand create demo
↓
OGMA_Lubrand_Function
↓
OGMA_Lubrand_Create_Demo_Action
↓
OGMA_Lubrand_Client
↓
POST /locations
2.4. Comando
El comando es solamente una forma explícita de solicitar una función o acción.
El prefijo predeterminado es:
::
Es configurable desde Ogma.
El parser separa:
Comando:
lubrand
Argumentos:
create demo
No se debe colocar toda la lógica de negocio en el parser ni en el router principal.
3. Arquitectura general
El flujo actual de Ogma es:
Webhook o consola
↓
OGMA_Inbound_Controller
↓
Normalización del mensaje
↓
OGMA_Router
↓
OGMA_Command_Parser
↓
OGMA_Function_Registry
↓
OGMA_Permission_Manager
↓
Función registrada
↓
Integración o servicio
↓
OGMA_Response
↓
Support Board, WhatsApp o consola
Cuando existe una sesión activa:
Mensaje normal
↓
Sesión activa del usuario
↓
Función propietaria de la sesión
Los siguientes comandos globales permanecen disponibles durante una sesión:
::help
::functions
::status
::close
4. Principios obligatorios
4.1. Separación de responsabilidades
La función conversa con el usuario.
La acción valida y ejecuta una operación.
El cliente de integración habla con la API externa.
La interfaz administrativa configura la integración.
El router únicamente enruta, valida permisos y mantiene sesiones.
4.2. No duplicar credenciales
Las credenciales pertenecen a Ogma.
No deben copiarse innecesariamente en:
-
Funciones.
-
Acciones.
-
JavaScript.
-
Mensajes de WhatsApp.
-
Logs.
-
Metadatos de sesión.
-
Archivos
.envde otros servicios.
Cuando un backend local necesite las credenciales, debe obtenerlas mediante un endpoint interno service-config, protegido con:
X-Ogma-Service-Token: [TOKEN INTERNO]
4.3. Nunca registrar secretos en logs
No registrar:
Bearer tokens
API keys
Contraseñas
Service-config tokens
Payloads con credenciales
Respuestas que devuelvan secretos
Los eventos de auditoría pueden guardar:
integration_key
action_key
status
HTTP status
duración
identificador externo
error_code
usuario
sesión
fecha
4.4. Las acciones de escritura requieren confirmación
Una acción que crea, modifica, elimina, envía o publica información debe mostrar una vista previa antes de ejecutarse.
Ejemplos:
Crear location
Editar cliente
Enviar campaña
Cerrar ticket
Eliminar registro
Crear tarea
La confirmación debe mostrar cada campo en una línea independiente.
4.5. Ejecuciones idempotentes
Repetir accidentalmente una solicitud no debe crear duplicados silenciosos.
Cada acción debe definir:
Idempotency key
External unique key
Duplicate behavior
Retry behavior
Ejemplo para Lubrand:
code:
lubrand-panka-bistro-miraflores
Si ese código ya existe, Ogma debe informar el conflicto. No debe generar automáticamente:
lubrand-panka-bistro-miraflores-2
salvo que exista una decisión explícita del usuario.
5. Estructura recomendada de archivos
Para una integración llamada lubrand:
includes/
├── integrations/
│ └── lubrand/
│ ├── class-ogma-lubrand-client.php
│ └── class-ogma-lubrand-normalizer.php
│
├── functions/
│ └── lubrand/
│ └── class-ogma-lubrand-function.php
│
├── actions/
│ └── lubrand/
│ ├── class-ogma-lubrand-create-demo-action.php
│ ├── class-ogma-lubrand-update-location-action.php
│ └── class-ogma-lubrand-list-locations-action.php
│
├── core/
│ ├── class-ogma-settings.php
│ ├── class-ogma-function-registry.php
│ └── class-ogma-action-detector.php
│
├── api/
│ └── class-ogma-service-config-controller.php
│
├── admin/pages/
│ └── page-integrations.php
│
└── install/
└── class-ogma-activator.php
La carpeta includes/actions/ es la convención recomendada para las nuevas integraciones con muchas operaciones.
Todavía no representa un registro global de acciones; inicialmente las clases serán despachadas por la función principal de la integración.
6. Crear una integración
Paso 1. Definir el contrato
Antes de escribir código, documentar:
Integration key:
lubrand
Nombre:
Lubrand
Proveedor:
Lubrand
Base URL:
https://luvrand.com/wp-json/lubrand/v1
Autenticación:
Bearer token
Estado inicial:
disabled
Capacidades iniciales:
locations.create_demo
Timeout:
20 segundos
También debe definirse:
Qué endpoint prueba la conexión
Qué respuestas se consideran exitosas
Qué errores puede devolver
Qué campos contienen secretos
Qué identificadores son únicos
Qué acciones modifican información
Paso 2. Registrar las opciones
Archivo:
includes/core/class-ogma-settings.php
Todas las opciones de integraciones deben usar:
OGMA_Settings::OPTION_GROUP_INTEGRATIONS
No deben mezclarse con el grupo general de ajustes del router.
Ejemplo:
register_setting(
self::OPTION_GROUP_INTEGRATIONS,
'ogma_lubrand_status',
array(
'type' => 'string',
'sanitize_callback' => array(
__CLASS__,
'sanitize_integration_status',
),
'default' => 'disabled',
)
);
register_setting(
self::OPTION_GROUP_INTEGRATIONS,
'ogma_lubrand_base_url',
array(
'type' => 'string',
'sanitize_callback' => 'esc_url_raw',
'default' => '',
)
);
register_setting(
self::OPTION_GROUP_INTEGRATIONS,
'ogma_lubrand_auth_token',
array(
'type' => 'string',
'sanitize_callback' => array(
__CLASS__,
'sanitize_lubrand_token',
),
'default' => '',
)
);
register_setting(
self::OPTION_GROUP_INTEGRATIONS,
'ogma_lubrand_demo_brand_id',
array(
'type' => 'integer',
'sanitize_callback' => 'absint',
'default' => 1,
)
);
Paso 3. Proteger el token en el formulario
Cuando el formulario muestre:
********
el sanitizador debe conservar el token existente.
Ejemplo:
public static function sanitize_lubrand_token(
$value
): string {
$value = trim( (string) $value );
if ( $value === '********' ) {
return trim(
(string) get_option(
'ogma_lubrand_auth_token',
''
)
);
}
return sanitize_text_field( $value );
}
No mostrar el token real después de haber sido guardado.
Paso 4. Crear un método de configuración normalizada
En OGMA_Settings:
public static function get_lubrand_config(): array {
$status = self::sanitize_integration_status(
get_option(
'ogma_lubrand_status',
'disabled'
)
);
return array(
'enabled' => $status === 'active',
'status' => $status,
'base_url' => rtrim(
trim(
(string) get_option(
'ogma_lubrand_base_url',
''
)
),
'/'
),
'auth_token' => trim(
(string) get_option(
'ogma_lubrand_auth_token',
''
)
),
'demo_brand_id' => absint(
get_option(
'ogma_lubrand_demo_brand_id',
1
)
),
);
}
Las funciones y acciones no deben consultar opciones individuales repetidamente.
Deben usar:
OGMA_Settings::get_lubrand_config();
Paso 5. Añadir valores predeterminados
Archivo:
includes/install/class-ogma-activator.php
Añadir las opciones sin sobrescribir instalaciones existentes:
$defaults = array(
'ogma_lubrand_status' => 'disabled',
'ogma_lubrand_base_url' =>
'https://luvrand.com/wp-json/lubrand/v1',
'ogma_lubrand_auth_token' => '',
'ogma_lubrand_demo_brand_id' => 1,
);
foreach ( $defaults as $option => $value ) {
if ( get_option( $option, null ) === null ) {
add_option( $option, $value );
}
}
La activación debe ser idempotente.
Activar o actualizar el plugin nunca debe borrar una configuración existente.
Paso 6. Añadir la interfaz administrativa
Archivo:
includes/admin/pages/page-integrations.php
Agregar una sección:
Lubrand
Estado:
Active / Disabled
Base URL:
[...]
Bearer token:
********
Demo Brand ID:
1
Test connection:
[Button]
Reglas:
-
Usar el grupo
ogma_router_integrations. -
Mostrar el token enmascarado.
-
No imprimir el token en HTML oculto.
-
No enviar el token al navegador mediante JavaScript.
-
Validar
manage_options. -
Usar nonce para acciones administrativas.
-
Mostrar errores de conexión sin exponer respuestas sensibles.
Paso 7. Registrar la integración en el catálogo
Ogma ya posee una tabla de integraciones con:
integration_key
name
provider
status
settings_json
created_at
updated_at
Debe existir una fila:
integration_key:
lubrand
name:
Lubrand
provider:
lubrand
status:
configured o active
settings_json debe contener únicamente metadatos no sensibles:
{
"capabilities": [
"locations.create_demo"
],
"auth_type": "bearer",
"api_type": "wordpress-rest"
}
No guardar el token dentro de settings_json.
integration_key es único, por lo que la instalación debe hacer un upsert y no crear duplicados.
Paso 8. Crear el cliente de integración
Archivo:
includes/integrations/lubrand/class-ogma-lubrand-client.php
Responsabilidades:
Leer la configuración normalizada
Validar si la integración está activa
Construir URLs
Añadir autenticación
Ejecutar solicitudes HTTP
Decodificar JSON
Normalizar errores
Aplicar timeout
No registrar secretos
Contrato recomendado:
class OGMA_Lubrand_Client {
public function is_configured(): bool;
public function test_connection(): array;
public function create_location(
array $payload
): array;
private function request(
string $method,
string $path,
array $body = array()
): array;
}
Respuesta normalizada:
array(
'ok' => true,
'http_status' => 201,
'data' => array(),
'error_code' => '',
'message' => '',
);
En caso de error:
array(
'ok' => false,
'http_status' => 409,
'data' => array(),
'error_code' => 'location_code_exists',
'message' => 'Ya existe un location con ese código.',
);
Paso 9. Ejecutar HTTP de forma segura
Ejemplo conceptual:
$response = wp_remote_request(
$url,
array(
'method' => $method,
'timeout' => 20,
'headers' => array(
'Authorization' =>
'Bearer ' . $config['auth_token'],
'Content-Type' =>
'application/json',
'Accept' =>
'application/json',
),
'body' => wp_json_encode( $body ),
)
);
Validar:
WP_Error
HTTP status
Body vacío
JSON inválido
Respuesta inesperada
Timeout
Error 401
Error 403
Error 404
Error 409
Error 422
Error 429
Error 500+
Nunca devolver directamente al usuario todo el body técnico de una API.
Paso 10. Cargar las clases
Archivo principal:
ogma-router.php
Agregar:
includes/integrations/lubrand/class-ogma-lubrand-client.php
includes/functions/lubrand/class-ogma-lubrand-function.php
includes/actions/lubrand/class-ogma-lubrand-create-demo-action.php
El orden debe ser:
Cliente
Acción
Función
Router
Las dependencias deben estar cargadas antes de instanciar la función.
Paso 11. Service-config opcional
Solo es necesario cuando un servicio backend separado necesita utilizar la integración.
Endpoint sugerido:
GET /wp-json/ogma-router/v1/service-config/lubrand
X-Ogma-Service-Token: [TOKEN INTERNO]
Respuesta:
{
"enabled": true,
"status": "active",
"base_url": "https://luvrand.com/wp-json/lubrand/v1",
"auth_token": "[TOKEN]",
"demo_brand_id": 1
}
Este endpoint:
-
Es exclusivamente server-to-server.
-
No debe consumirse desde JavaScript.
-
No debe aparecer en respuestas de WhatsApp.
-
Debe reutilizar el
permission_checkexistente. -
Debe usar comparación segura del token.
-
No debe escribir credenciales en logs.
Si Ogma PHP llama directamente a Lubrand, este endpoint no es necesario para esa acción.
7. Crear una función para la integración
Paso 1. Definir la función
Para agrupar todas las acciones de Lubrand:
Function key:
lubrand
Command code:
lubrand
Handler:
OGMA_Lubrand_Function
Risk level:
medium
Requires permission:
yes
Requires session:
no
Aunque la función no requiera una sesión permanente, algunas acciones sí pueden abrir sesiones temporales de captura y confirmación.
Paso 2. Crear el archivo
includes/functions/lubrand/class-ogma-lubrand-function.php
La interfaz actual de funciones recibe el contexto y devuelve un OGMA_Response.
Estructura mínima:
class OGMA_Lubrand_Function
implements OGMA_Function_Interface {
public function handle(
array $context
): OGMA_Response {
$args = trim(
(string) (
$context['args'] ?? ''
)
);
$active_session =
$context['active_session']
?? null;
if ( is_array( $active_session ) ) {
return $this->handle_session(
$context,
$active_session
);
}
return $this->dispatch(
$args,
$context
);
}
}
Paso 3. Registrar la función
La función debe registrarse en dos lugares:
Código
En:
includes/core/class-ogma-function-registry.php
Relacionar:
function_key:
lubrand
handler:
OGMA_Lubrand_Function
Base de datos
En:
includes/install/class-ogma-activator.php
Añadir una fila idempotente:
array(
'function_key' => 'lubrand',
'name' => 'Lubrand',
'description' =>
'Creates and manages Lubrand locations, demos and QR resources.',
'type' => 'integration',
'handler' =>
'OGMA_Lubrand_Function',
'status' => 'active',
'risk_level' => 'medium',
'requires_permission' => 1,
'requires_session' => 0,
'command_code' => 'lubrand',
)
La función aparecerá en:
Ogma → Functions
Ogma → Users & Numbers → Function permissions
::functions
::help
8. Crear acciones
8.1. Convención de nombres
Usar claves jerárquicas:
<integración>.<recurso>.<operación>
Ejemplos:
lubrand.locations.create_demo
lubrand.locations.create
lubrand.locations.update
lubrand.locations.list
lubrand.qr.get
lubrand.qr.regenerate
No usar claves ambiguas como:
create
run
demo
location_action
8.2. Contrato de una acción
Toda acción debe definir:
Action key
Nombre
Descripción
Integración
Capacidad requerida
Nivel de riesgo
Requiere confirmación
Campos obligatorios
Campos opcionales
Regla de idempotencia
Resultado esperado
Eventos de auditoría
Ejemplo:
Action key:
lubrand.locations.create_demo
Integración:
lubrand
Nivel de riesgo:
medium
Confirmación:
required
Campo obligatorio:
name
Campos opcionales:
google_maps_url
tripadvisor_url
Idempotencia:
location code
Resultado:
location y dos QR
8.3. Clase de acción recomendada
Archivo:
includes/actions/lubrand/class-ogma-lubrand-create-demo-action.php
Contrato recomendado:
class OGMA_Lubrand_Create_Demo_Action {
public function key(): string {
return 'lubrand.locations.create_demo';
}
public function risk_level(): string {
return 'medium';
}
public function requires_confirmation(): bool {
return true;
}
public function prepare(
array $input,
array $context
): array;
public function execute(
array $prepared,
array $context
): array;
}
Este contrato es una convención para nuevas acciones. Todavía no existe como interfaz global obligatoria en Ogma.
8.4. Despachar la acción desde la función
La función interpreta:
::lubrand create demo
Como:
Action:
lubrand.locations.create_demo
Ejemplo conceptual:
private function dispatch(
string $args,
array $context
): OGMA_Response {
$normalized = strtolower( trim( $args ) );
if (
preg_match(
'/^(create|crear)\s+demo$/u',
$normalized
)
) {
return $this->start_create_demo(
$context
);
}
if (
preg_match(
'/^(help|ayuda)$/u',
$normalized
)
) {
return $this->help();
}
return $this->help(
'lubrand_command_not_recognized'
);
}
Debe aceptar español e inglés cuando corresponda:
::lubrand create demo
::lubrand crear demo
9. Acciones con varios pasos
Para acciones conversacionales se debe usar OGMA_Session_Manager.
Una sesión activa captura los siguientes mensajes normales del usuario y los dirige a la misma función.
Flujo recomendado
::lubrand create demo
↓
Solicitar nombre
↓
Guardar borrador
↓
Solicitar enlaces opcionales
↓
Mostrar confirmación
↓
Confirmar o cancelar
↓
Ejecutar API
↓
Cerrar sesión
9.1. Abrir sesión
Ejemplo conceptual:
$session_id = $sessions->open_session(
$user_channel,
'lubrand',
'Create Lubrand demo',
'Collect and confirm the demo location data.'
);
9.2. Guardar metadatos
Guardar únicamente información necesaria para continuar el flujo:
$sessions->update_session_metadata(
$session_id,
array(
'mode' => 'lubrand_create_demo',
'step' => 'awaiting_name',
'action_key' =>
'lubrand.locations.create_demo',
'draft' => array(),
)
);
No guardar:
Bearer token
Credenciales
Headers HTTP
Respuestas completas sensibles
9.3. Estados sugeridos
awaiting_name
awaiting_optional_links
awaiting_confirmation
executing
completed
cancelled
failed
9.4. Cancelación
Aceptar:
cancelar
cancel
no
salir
::close
La sesión debe cerrarse y auditarse.
Respuesta:
Creación de demo cancelada.
No se creó ningún location.
10. Confirmaciones
10.1. Presentación vertical
Ejemplo:
CREAR DEMO EN LUBRAND
Nombre:
Panka Bistro Miraflores
Código:
lubrand-panka-bistro-miraflores
Dirección:
Panka Bistro Miraflores
Google Maps:
No agregado
TripAdvisor:
No agregado
Mesas:
2
Estado:
Activo
Opciones:
1. Confirmar
2. Cancelar
También aceptar:
confirmar
confirm
sí
si
cancelar
cancel
10.2. No ejecutar antes de confirmar
La llamada externa debe ocurrir únicamente después de recibir una confirmación válida.
Antes de confirmar solamente se puede:
Validar
Normalizar
Preparar payload
Mostrar vista previa
Guardar borrador temporal
10.3. Edición antes de confirmar
Cuando sea necesario, permitir cambios como:
cambiar nombre a Panka Bistro San Isidro
agregar google maps https://...
quitar tripadvisor
Después de editar, Ogma debe volver a mostrar la vista previa completa.
11. Permisos
El modelo actual controla permisos a nivel de función:
can_view
can_execute
can_manage
requires_challenge
status
Para la primera versión:
Function permission:
lubrand
Permite:
ejecutar las acciones habilitadas de Lubrand
Las acciones sensibles deben añadir validaciones internas.
Ejemplo:
lubrand.locations.list:
can_execute
lubrand.locations.create_demo:
can_execute
lubrand.locations.delete:
can_manage + confirmación reforzada
Hasta que exista un catálogo formal de permisos por acción, la función debe validar:
Rol de Ogma
can_execute
can_manage
Integración activa
Capacidad habilitada
Contexto del usuario
No se debe asumir que tener acceso a ::lubrand permite automáticamente cualquier acción futura.
12. Auditoría
Cada acción debe generar eventos diferenciados.
Ejemplo para create_demo:
lubrand_create_demo_started
lubrand_create_demo_name_collected
lubrand_create_demo_optional_links_collected
lubrand_create_demo_confirmation_requested
lubrand_create_demo_cancelled
lubrand_create_demo_executed
lubrand_create_demo_failed
Campos recomendados:
OGMA_Audit_Service::record(
array(
'wp_user_id' =>
$context['user_channel']['wp_user_id']
?? null,
'user_channel_id' =>
$context['user_channel']['id']
?? null,
'inbound_message_id' =>
$context['inbound_message_id']
?? null,
'master_session_id' =>
$session_id,
'function_key' =>
'lubrand',
'action' =>
'lubrand_create_demo_executed',
'risk_level' =>
'medium',
'status' =>
'success',
'channel' =>
$context['normalized']['channel']
?? '',
'metadata' => array(
'action_key' =>
'lubrand.locations.create_demo',
'location_id' =>
$location_id,
'location_code' =>
$location_code,
),
)
);
No colocar en metadata:
auth_token
Authorization header
Cookies
Contraseñas
Payloads sensibles completos
13. Respuestas
Las funciones deben devolver OGMA_Response.
Ejemplo:
return OGMA_Response::reply(
$message,
'lubrand_demo_created'
);
El código de respuesta debe ser estable y apto para:
WhatsApp
Support Board
Consola web
Pruebas automatizadas
Auditoría
No usar el texto visible como único indicador del resultado.
14. Acción de lenguaje natural
Ogma posee OGMA_Action_Detector para interpretar solicitudes sin prefijo.
Ejemplo futuro:
Créame una demo de Lubrand para Panka Bistro
El detector puede proponer:
lubrand.locations.create_demo
Pero debe implementarse en este orden:
1. Cliente de integración
2. Acción
3. Comando explícito
4. Sesión y confirmación
5. Pruebas
6. Detección por lenguaje natural
Nunca comenzar por la detección natural.
El comando explícito debe funcionar primero:
::lubrand create demo
15. Ejemplo completo: Lubrand create demo
Entrada
::lubrand create demo
Ogma
¿Cuál es el nombre del local para la demo?
Usuario
Panka Bistro Miraflores
Datos automáticos
name:
Panka Bistro Miraflores
code:
lubrand-panka-bistro-miraflores
address:
Panka Bistro Miraflores
brand_id:
1
tables_count:
2
status:
1
Ogma
Si quieres agregar Google Maps o TripAdvisor, copia los links ahora.
También puedes decir “no gracias” para ignorarlos.
Usuario
no gracias
Confirmación
CREAR DEMO EN LUBRAND
Nombre:
Panka Bistro Miraflores
Código:
lubrand-panka-bistro-miraflores
Dirección:
Panka Bistro Miraflores
Google Maps:
No agregado
TripAdvisor:
No agregado
Mesas:
2
Estado:
Activo
1. Confirmar
2. Cancelar
Ejecución
La acción prepara:
{
"name": "Panka Bistro Miraflores",
"code": "lubrand-panka-bistro-miraflores",
"address": "Panka Bistro Miraflores",
"google_maps_url": "",
"tripadvisor_url": ""
}
La integración ejecuta:
POST /locations
Authorization: Bearer [REDACTED]
Content-Type: application/json
Respuesta
DEMO CREADA CORRECTAMENTE
Local:
Panka Bistro Miraflores
MESA 1
QR:
[QR o URL de la Mesa 1]
MESA 2
QR:
[QR o URL de la Mesa 2]
Información secundaria:
Código:
lubrand-panka-bistro-miraflores
Location ID:
123
Enlace Mesa 1:
[...]
Enlace Mesa 2:
[...]
16. Manejo de errores
Integración desactivada
La integración Lubrand no está activa.
Un administrador debe configurarla en:
Ogma → Integrations
Token ausente
La integración Lubrand está incompleta.
Falta configurar la autenticación.
No autorizado
No tienes permiso para crear demos en Lubrand.
Código duplicado
No se creó la demo.
Ya existe un location con el código:
lubrand-panka-bistro-miraflores
Timeout
Lubrand no respondió dentro del tiempo esperado.
No se pudo confirmar la creación del location.
Ante un timeout no se debe afirmar automáticamente que el registro no fue creado. Debe existir una verificación posterior por código antes de reintentar.
Respuesta inválida
Lubrand respondió, pero Ogma no pudo validar el resultado.
La operación quedó registrada para revisión.
Creación parcial
Si Lubrand crea el location pero no devuelve los dos QR:
El location fue creado, pero la respuesta no incluyó todos los QR esperados.
Location ID:
123
QR encontrados:
1 de 2
No ocultar una ejecución parcial.
17. Prueba de conexión
La prueba debe comprobar:
Integración activa
URL válida
Token presente
Resolución DNS
Conexión HTTPS
Autenticación
Respuesta JSON válida
Acceso al recurso esperado
Respuesta administrativa:
LUBRAND CONNECTION TEST
Status:
Connected
HTTP:
200
Base URL:
https://luvrand.com/wp-json/lubrand/v1
Authentication:
Accepted
Capabilities:
locations.create_demo
Nunca mostrar el token.
18. Checklist de implementación
Integración
-
Definir
integration_key. -
Definir URL base.
-
Definir autenticación.
-
Registrar opciones.
-
Crear sanitizadores.
-
Enmascarar secretos.
-
Añadir valores predeterminados.
-
Añadir interfaz administrativa.
-
Registrar fila en
integrations. -
Crear cliente HTTP.
-
Crear prueba de conexión.
-
Añadir auditoría.
-
Cargar clases en
ogma-router.php. -
Añadir
service-configsolo cuando sea necesario.
Función
-
Crear handler.
-
Implementar
OGMA_Function_Interface. -
Registrar handler en el registry.
-
Sembrar fila en
functions. -
Definir
command_code. -
Definir riesgo.
-
Definir permisos.
-
Añadir ayuda.
-
Verificar aparición en
::functions.
Acción
-
Definir
action_key. -
Definir campos obligatorios.
-
Definir campos opcionales.
-
Definir normalización.
-
Definir idempotencia.
-
Definir confirmación.
-
Definir estados de sesión.
-
Definir ejecución.
-
Definir respuesta normalizada.
-
Definir eventos de auditoría.
-
Definir errores y recuperación.
-
Añadir detección natural únicamente al final.
19. Checklist de pruebas
Código
PHP lint
Carga de clases
Activación idempotente
Actualización sin pérdida de opciones
Sin warnings ni notices
Configuración
Guardar estado
Guardar URL
Guardar token
Conservar token al mostrar ********
No borrar otras integraciones al guardar
Seguridad
Token ausente en logs
Token ausente en HTML
Token ausente en respuestas
Nonce administrativo
manage_options
Service-config protegido
Permisos
Usuario sin permiso
Usuario con can_view
Usuario con can_execute
Usuario con can_manage
Usuario bloqueado
Integración desactivada
Conversación
Comando sin argumentos
Nombre válido
Nombre vacío
Enlaces opcionales
No gracias
Confirmar
Cancelar
::close
Sesión expirada
Comando nuevo durante sesión activa
API
200
201
400
401
403
404
409
422
429
500
Timeout
JSON inválido
Body vacío
Respuesta parcial
Idempotencia
Código existente
Doble confirmación
Reenvío del mismo webhook
Timeout con creación remota exitosa
Reintento después de error
Canales
Consola web
Support Board
WhatsApp
Respuesta con dos QR
Links clicables
Presentación vertical
20. Criterio de cierre
Una integración se considera lista cuando:
Puede configurarse desde Ogma
Puede activarse y desactivarse
Puede probar su conexión
No expone credenciales
Tiene cliente normalizado
Tiene auditoría
Puede ser reutilizada por varias acciones
Una acción se considera lista cuando:
Tiene una clave estable
Tiene permisos
Valida entradas
Usa confirmación cuando escribe
Es idempotente
Usa el cliente de la integración
Maneja errores
Cierra correctamente su sesión
Devuelve una respuesta estructurada
Genera auditoría
Funciona con comando explícito
21. Regla arquitectónica final
No implementar:
::lubrand create demo
↓
Llamada HTTP escrita directamente dentro del router
Implementar:
::lubrand create demo
↓
OGMA_Lubrand_Function
↓
OGMA_Lubrand_Create_Demo_Action
↓
OGMA_Lubrand_Client
↓
Lubrand API
Esto permitirá añadir posteriormente:
::lubrand locations
::lubrand location 123
::lubrand update location 123
::lubrand regenerate qr 123 table 2
::lubrand create campaign
::lubrand campaign status 45
sin volver a implementar configuración, autenticación, conexión, normalización, auditoría ni manejo general de errores.