
Kiki
Señales de trabajo y ejecución de agentes
Para que una propuesta se convierta en la ejecución del asignado.
Un plugin de Paperclip y un recolector de Slack que ayudan a un equipo a operar sus agentes de IA.
Kiki vocabulary
- assignment
- wake
- guardrail
- stage reaper
- zombie sweeper
- circuit breaker
- escalation
- observe
- signals
- profile
- directive
- proposal
- approval
Assignment: assigneeAgentId · PATCH /api/issues/:id · queueIssueAssignmentWakeup · issue.updated · CTO TRIAGE · AUTO-PROMOTE TO TODO · AUTO-REBALANCE · in_progress · REASSIGN WITHOUT WAKE · repatchAssignment · kiki-retry-issue · status: todoWake: queueIssueAssignmentWakeup · REASSIGN WITHOUT WAKE · ctx.agents.invoke · POST /api/agents/:id/wakeup · invokeOnce · INVOKE DEDUP · windowMs · HANDOFF-ACK · AT-LEAST-ONCE · HANDOFF_ACK_MAX_RETRIES · ORPHAN WAKE · lastRunAt · maxConsecutiveWakes · WAKE-STORM GUARD · heartbeat_runsGuardrail: issue.updated · in_progress · ORPHAN WAKE · SPEC COMPLETE · PO SPEC GATE · PO DELEGATION GATE · REVIEW SCORECARD · 30/30 · REWORK · PO ACCEPTANCE SCORECARD · findScorecardInComments · ANTI-DECEPTION RATCHET · WORKFLOW GUARDRAILStage Reaper: PATCH /api/issues/:id · lastRunAt · stage-reaper · repatchAssignment · heartbeatSeconds · maxConsecutiveWakes · COOLDOWN · lastSignalTime · stageEntryTime · LEVEL-TRIGGERED · WAKE-STORM GUARD · pipeline-reaper · stage-without-PATCH · kiki-retry-issue · LEAD REROUTEZombie Sweeper: zombie-sweeper · ZOMBIE_RUNNING_MAX_MIN · ZOMBIE_QUEUED_MAX_MIN · execution_run_id · RUN OWNERSHIP CONFLICT · heartbeat_runs · claude_local · execution_locked_at · SELF-HEALCircuit Breaker: CLOSED · HALF_OPEN · auth_fail · rate_limit · RETRY STORM · CB_FAILURE_THRESHOLD · KEY ROTATOR · HTTP 429 · process_lost · agent.run.failedEscalation: process_lost · agent.run.failed · ESCALATION COMMENT · LEAD REROUTE · QA FALLBACK · agent.status_changed · failed-run-escalator · PIPELINE NOTIFIER · pipeline-health-snapshot · SILENT STALLObserve: observe_channel · slack_read_channels · slack_read_thread · slack_read_reactions · slack_user_activity · .last_observed.json · DELTA TRACKING · oldest · SOCKET MODE · kiki-observe · NO RAW TEXTSignals: NO RAW TEXT · UserSignal · message_count · avg_response_time_minutes · active_hours · thread_participation_rate · topic_keywords · evidence_count · LLMExtractedSignal · FeedbackSignalProfile: FeedbackSignal · UserProfile · CommunicationStyle · DecisionPattern · WorkRhythm · focusBlocks · confidence · ContextMode · DELEGATION CHAINS · refresh-profilesDirective: AgentDirective · profileToDirectives · reportFormat · taskConstraints · directiveToSkillMarkdown · agent.created · PATCH /api/skills/{skillId} · grounding_policy · systemPrompt · NO USER PIIMaintenance Proposal: MaintenanceProposal · [MAINT] · daily-maintenance · run-maintenance · kiki-maintain · MAX 10 PROPOSALS · [SCHEMA APPROVAL REQUIRED] · P1/P2/P3 · DO NOT FABRICATE · BOUND TARGETHuman Approval: SOCKET MODE · [SCHEMA APPROVAL REQUIRED] · maint_approve · maint_deny · BLOCK KIT · reaction_added · white_check_mark · ProposalMapping · block_actions · approved · cancelled · status: todo
Entre la asignación y la ejecución real, una ruta para observar y recuperar.
Las señales de trabajo se convierten en perfiles y directivas para los agentes, y la aprobación de una propuesta de mantenimiento se mantiene aparte de la asignación de su ejecución. Cuando la actividad de una incidencia asignada se detiene, se vuelve a solicitar con la incidencia y el asignado, y las no respuestas repetidas llevan a un límite, un enfriamiento y el juicio de una persona.
Convierten señales de trabajo en directivas para los agentes y conectan, como pasos separados, propuestas de mantenimiento, aprobación humana, asignación y recuperación de ejecuciones estancadas. Planifiqué y desarrollé este flujo.
Primer registro del repositorio el April 3, 2026 · colaboración con pinxlab hasta el May 26, 2026
Funciona como plugin dentro del Paperclip del equipo; un servidor MCP se encarga de la recolección de Slack.
Señales → directivas
Los perfiles y las directivas de agentes se construyen a partir del historial de Slack. Las directivas son contexto del agente y no se dibujan como causa de ninguna propuesta.
Señales de SlackDatos: historial de canalesExtracción de patrones · sin bots
Recolección de señalesSe recolecta el historial de los canales accesibles y se filtran los mensajes de bots, de entrada y de salida. Los mensajes originales no se muestran en esta página.
Extracción de patrones · sin bots
Recolección de señalesDatos: fusión del perfilFusión del perfil de empresaEstado de la empresaLos patrones extraídos se convierten en un parche de perfil que se fusiona en el perfil de la empresa. Son patrones heurísticos, no puntuaciones de desempeño de empleados.
Fusión del perfil de empresa
Estado de la empresaDatos: regenerarDirectivas por agenteEstado de los agentesLas directivas por agente se regeneran a partir del perfil fusionado y se guardan.
Directivas por agente
Estado de los agentesEjecución · juicio: inyección de directivasAgente asignadoLas directivas entran en el contexto de un agente cuando se crea. Esto no significa que una propuesta concreta venga de una señal de Slack concreta.
Propuesta → aprobación → asignación
Una propuesta existe primero como incidencia de backlog sin asignar, la reacción de una persona pide un cambio de estado, y la asignación y la ejecución corresponden al sistema externo.
Proyecto de destinoDatos: alcance de destinoLlamada al PO · prompt acotado
Análisis de mantenimientoEl trabajo de mantenimiento llama al agente PO con un prompt acotado al proyecto de destino. No se muestra el contenido de las fuentes.
Llamada al PO · prompt acotado
Análisis de mantenimientoDatos: incidencia de propuestaPropuesta · backlogGestor de incidenciasEl prompt pide propuestas solo con rutas verificadas, como incidencias de backlog sin asignar, y prohíbe ejecutar migraciones de base de datos. Es una instrucción para un agente del producto, no un mecanismo de cumplimiento determinista.
Propuesta · backlog
Gestor de incidenciasDatos: publicar la propuestaMapeo mensaje ↔ incidenciaPublicación de propuestasCada propuesta se publica en Slack y se guarda el mapeo de mensaje a incidencia. Las propuestas ya publicadas no se vuelven a publicar, y el mapeo guardado conserva las 50 más recientes.
Mapeo mensaje ↔ incidencia
Publicación de propuestasDatos: Mensaje de SlackPersona · aprobar, rechazarUna persona ve la propuesta publicada en Slack.
Persona · aprobar, rechazarEjecución · juicio: reacciónMapeo mensaje ↔ incidencia
Publicación de propuestasUna reacción en el mensaje encuentra la incidencia mediante el mapeo. No hay aprobación automática.
Mapeo mensaje ↔ incidencia
Publicación de propuestasEjecución · juicio: aprobar → todoIncidencia de ejecución · todoGestor de incidenciasAl aprobar, se envía una solicitud para pasar la incidencia de propuesta pendiente a todo, y se actualizan el mapeo y el aviso del hilo. Este manejo marca el mapeo como aprobado sin comprobar el código de respuesta, así que no es una transacción cerrada ante fallo.
Mapeo mensaje ↔ incidencia
Publicación de propuestasEjecución · juicio: rechazar → cancelledPropuesta · backlogGestor de incidenciasAl rechazar, se envía una solicitud para pasar la misma incidencia a cancelled. La incidencia existía antes de la aprobación; la aprobación no la crea.
Incidencia de ejecución · todo
Gestor de incidenciasEjecución · juicio: asignaciónAgente asignadoLa asignación y ejecución de una incidencia todo corresponden al sistema de ejecución externo. Pasar una incidencia a todo no garantiza que el trabajo haya empezado.
Estancamiento → recuperación → persona
Una incidencia asignada cuya actividad se detuvo se vuelve a solicitar con la incidencia y el asignado; cuando las no respuestas consecutivas alcanzan el límite, pasa a una persona.
Agente asignadoObservación · informe: registros de ejecuciónEjecuciones recientes · actividad
Observación de ejecucionesLas ejecuciones del agente asignado y las señales recientes se registran como observaciones. La actividad no es evidencia de finalización.
Ejecuciones recientes · actividad
Observación de ejecucionesObservación · informe: última actividadDetección de estancamiento · heartbeatStage reaperEl reaper solo mira las incidencias que no están done, cancelled ni blocked y que tienen un asignado, y calcula la antigüedad de la última señal y de la etapa.
Detección de estancamiento · heartbeat
Stage reaperDatos: sin respuesta +1No respuestas · por incidenciaEstado de no respuestasLas no respuestas consecutivas se cuentan por agente e incidencia y se guardan en el estado.
Ejecuciones recientes · actividad
Observación de ejecucionesObservación · informe: nueva actividad → reinicioNo respuestas · por incidenciaEstado de no respuestasUna nueva actividad reinicia el contador.
Detección de estancamiento · heartbeat
Stage reaperEjecución · juicio: nueva llamadaIncidencia + asignadoLlamada de recuperaciónSi se supera el heartbeat y el contador está por debajo del límite, se hace una llamada de recuperación.
Incidencia + asignado
Llamada de recuperaciónEjecución · juicio: incidencia + asignadoIncidencia de ejecución · todoGestor de incidenciasSe vuelve a solicitar la asignación con la incidencia, el agente asignado y un comentario explicativo, y se comprueba la respuesta HTTP. Una ruta legacy recurre a una sola llamada de activación.
No respuestas · por incidencia
Estado de no respuestasFallo · límite: tras 3Detener llamadas · enfriamientoLímiteCuando las no respuestas consecutivas alcanzan el límite (3 por defecto), se dejan de repetir las llamadas. El límite solo se mantiene cuando hay hooks de estado que leen y escriben el contador, y un guardado fallido puede debilitarlo.
Detener llamadas · enfriamiento
LímiteEjecución · juicio: reasignar · notificarLead · operadorReasigna a un lead si es posible, y solo devuelve in_progress a todo cuando esa función está activada. Si no, deja un comentario y una notificación best-effort, y registra un enfriamiento tras el límite.
Detección de estancamiento · heartbeat
Stage reaperObservación · informe: solo advertenciaLead · operadorCuando una etapa dura demasiado, solo se deja un comentario de advertencia para los operadores. El estado no se cambia automáticamente.
Todas las conexiones con el mismo grosor. Elija un flujo para resaltar solo su recorrido, con pasos numerados.
- Continua · dirección de entradas, resultados y registros
- Discontinua · ejecución, juicio, solicitud
- Puntos largos · observación e informe, aparte del juicio
- Guiones cortos · fallo, parada, límite
- Línea negra gruesa · el flujo seleccionado; los números dan el orden
- Recuadro · frontera de código o de estado, con su nombre en la cabecera
- Chip interior · componente de esa frontera
- Recuadro punteado · fuera de esa frontera
- Contorno naranja · donde decide un modelo
- Llamada al agente · llamada de recuperación
- Estado · registros
- Detección de estancamiento · límite
- Recolección · publicación
Dibujado a partir de registros privados de implementación y desarrollo. No se muestran identificadores de equipo, incidencias ni Slack, ni mensajes originales; el despliegue, los contenedores y las credenciales corresponden a un responsable ajeno a este plugin.
- Una observación
- Informe del April 28, 2026: en un diagnóstico manual previo al cambio, a una incidencia que llevaba 67 horas sin ejecutarse se le volvió a solicitar la asignación con la incidencia y el asignado, y una nueva ejecución entró en cola en menos de 5 segundos. No se midieron la finalización, el tiempo medio de recuperación ni el efecto tras el despliegue.
- Límites del manejo de la aprobación
- A diferencia de la llamada de recuperación, el manejo de la aprobación marca el mapeo como aprobado sin comprobar el código de respuesta. No se describe como una transacción de aprobación atómica ni cerrada ante fallo.
- Cuándo se mantiene el límite
- El límite de 3 llamadas es una implementación que se mantiene cuando hay hooks de estado. No garantiza exactamente un escalamiento ante cada fallo.