# Códigos de error: Canales: comentarios de Facebook e Instagram

> Responder en público o en privado a un comentario y ocultarlo (`src/channels/comments/`). Meta solo deja responder en privado una vez y dentro de 7 días.

**Cómo se detecta (toda la familia):** Respuesta (`code`). La decisión queda en `authz_decisions`.

**Qué hacer (toda la familia):** Los de regla de Meta (ya respondido, vencido) no tienen arreglo: se contesta por otro medio. Los `*_AUDIT_UNAVAILABLE` se reintentan.

Lo que un código no dice lo hereda de la familia.

## `AI_POLICY_AUTOMATION_NOT_ALLOWED`

- **Tipo:** interno · **HTTP:** — · **Estado:** vigente
- **Qué significa:** El registro de capacidades no permite esa acción a una automatización (`aiPolicy` distinto de `allowed`). La niega Roles antes de llamar a Meta; queda como `AuthzDeniedError` y la acción de comentarios devuelve `COMMENT_AUTOMATION_NOT_ALLOWED` o `COMMENT_PRIVATE_REPLY_AUTOMATION_NOT_ALLOWED`.
- **Qué hacer:** Es una decisión del registro, no una falla: si la acción debe poder correr sola, se cambia su `aiPolicy` en el registro (frente Roles).

## `COMMENT_AUTOMATION_ACTOR_REQUIRED`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Una automatización intentó responder u ocultar un comentario sin decir qué workflow y qué ejecución la mandan. Sin ese actor no hay auditoría, así que no sale nada.
- **Qué hacer:** Bug del llamador: el handler del motor debe pasar `workflowId` y `executionId` (uuid) de la ejecución.

## `COMMENT_AUTOMATION_AUDIT_UNAVAILABLE`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Roles permitió la acción sobre el comentario, pero no se pudo escribir la decisión en `authz_decisions`. Sin auditoría no se publica nada.
- **Cómo detectarlo:** Respuesta (`code`); el error de base sale en el log de `ChannelCommentsService`.
- **Qué hacer:** Revisar la base o la tabla `authz_decisions`; reintentar cuando vuelva. No se publicó nada en Meta.

## `COMMENT_AUTOMATION_NOT_ALLOWED`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Roles no permite a la automatización responder en público ni ocultar ese comentario (registro, política del principal de servicio o techo de la entidad). El motivo va en el título. No se llamó a Meta.
- **Cómo detectarlo:** Respuesta (`code`); la negación queda en `authz_decisions` (`allowed = 0`).
- **Qué hacer:** Si la automatización debe poder hacerlo, se concede en Roles; no es una falla del canal.

## `COMMENT_DELETED`

- **Tipo:** detalle, HTTP · **HTTP:** 409 · **Estado:** vigente
- **Qué significa:** El comentario fue borrado.

## `COMMENT_ID_INVALID`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Id de comentario inválido.

## `COMMENT_MODERATION_NOT_AVAILABLE`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Ocultar comentarios en Meta todavía no está disponible.

## `COMMENT_NOT_FOUND`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** El comentario no existe en `channel_comments` de esa entidad (id equivocado, de otra entidad o todavía no ingresado).
- **Qué hacer:** Verificar el id del comentario y la entidad; si acaba de llegar, esperar a que el ingreso lo proyecte.

## `COMMENT_NOT_INBOUND`

- **Tipo:** HTTP · **HTTP:** 409 · **Estado:** vigente
- **Qué significa:** Solo se responde a comentarios de clientes.

## `COMMENT_PRIVATE_REPLY_AUTOMATION_NOT_ALLOWED`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Roles no permite a la automatización responder POR MENSAJE PRIVADO a ese comentario (acción `interactions.comments.reply_private`). No se llamó a Meta.
- **Cómo detectarlo:** Respuesta (`code`); la negación queda en `authz_decisions`.
- **Qué hacer:** Desde el 01/10 el registro la marca `allowed`; si aparece, revisar la política del principal de servicio o el techo de la entidad en Roles.

## `COMMENT_PRIVATE_REPLY_EXISTS`

- **Tipo:** HTTP · **HTTP:** 409 · **Estado:** vigente
- **Qué significa:** Ya se respondió en privado a este comentario.

## `COMMENT_PRIVATE_REPLY_EXPIRED`

- **Tipo:** HTTP · **HTTP:** 409 · **Estado:** vigente
- **Qué significa:** Meta solo permite responder en privado dentro de 7 días.

## `COMMENT_REPLY_AUDIT_UNAVAILABLE`

- **Tipo:** HTTP · **HTTP:** 503 · **Estado:** vigente
- **Qué significa:** No se pudo registrar la decisión; la respuesta no sale sin auditoría.

## `COMMENT_REPLY_IN_FLIGHT`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** La misma respuesta pública (mismo comentario, tipo, actor y texto) ya se está enviando, o se mandó y Meta no confirmó. Para no publicarla dos veces, no se envía otra.
- **Causa típica:** Un reintento o un doble clic mientras la primera sigue en vuelo, o una entrega desconocida: el reclamo se queda ante la duda.
- **Qué hacer:** No reintentar. Si de verdad no salió, revisar el comentario en Meta antes de responder con otro texto.

## `COMMENT_REPLY_LENGTH`

- **Tipo:** HTTP · **HTTP:** 400 · **Estado:** vigente
- **Qué significa:** La respuesta al comentario está vacía o pasa el largo máximo.

## `COMMENT_REPLY_NOT_SENT`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** La respuesta al comentario no salió; si Meta dijo por qué, viaja su código.

## `COMMENT_REPLY_REFUSED`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** La respuesta no cumple las reglas del comentario (validación propia antes de Meta: texto vacío o largo, comentario que no admite respuesta, etc.). Si la regla trae su propio código, se devuelve ese; este es el genérico.
- **Qué hacer:** Corregir el texto o la acción según el título del error.

## `COMMENT_TOKEN_UNAVAILABLE`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** La página no tiene token en la bóveda.

## `COMMENT_VISIBILITY_AUDIT_UNAVAILABLE`

- **Tipo:** HTTP · **HTTP:** 503 · **Estado:** vigente
- **Qué significa:** No se pudo registrar la decisión; no se cambia sin auditoría.

## `META_NETWORK`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** No se pudo hablar con Meta (error de red).

## `META_TIMEOUT`

- **Tipo:** detalle · **HTTP:** — · **Estado:** vigente
- **Qué significa:** Meta no respondió a tiempo.
