Visage détouré sur fond transparent, dérivé de l’image du chat Kiki fournie par l’auteur
Retour à la salle

Kiki

Signaux de travail et exécution des agents

Pour qu’une proposition devienne l’exécution de l’assigné.

Un plugin Paperclip et un collecteur Slack qui aident une équipe à faire tourner ses agents IA.

2026.04 — 2026.05

pinxlab, R&D IA en indépendant · conception et développement des workflows, enquête sur les exécutions bloquées et conception du chemin de reprise

  • PluginImplémenté · Paperclip
  • Serveur MCPImplémenté · Collecteur Slack

Kiki vocabulary

Lens
Agent Execution
Dispatch
Recovery
Work Signals
Signal Ingestion
Proposal
  1. assignment
  2. wake
  3. guardrail
  1. stage reaper
  2. zombie sweeper
  3. circuit breaker
  4. escalation
  1. observe
  2. signals
  3. profile
  4. directive
  1. proposal
  2. 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 l’attribution et l’exécution réelle, un chemin pour observer et reprendre.

Les signaux de travail deviennent des profils et des consignes pour les agents, et l’approbation d’une proposition de maintenance est tenue à part de l’attribution de son exécution. Quand l’activité d’un ticket attribué s’arrête, il est redemandé avec le ticket et l’assigné, et les non-réponses répétées mènent à une limite, à une période de refroidissement et au jugement d’une personne.

Ils transforment des signaux de travail en consignes pour les agents et relient, comme étapes distinctes, propositions de maintenance, approbation humaine, attribution et reprise des exécutions bloquées. J’ai conçu et développé ce flux.

Premier enregistrement du dépôt le April 3, 2026 · mission pinxlab jusqu’au May 26, 2026

Tourne comme plugin dans le Paperclip de l’équipe ; un serveur MCP assure la collecte Slack.

Carte du flux d’exécution · d’après des enregistrements d’implémentation privés
Kiki : signaux · approbation · reprise d’exécutionDes motifs de travail sont extraits de l’historique des canaux Slack accessibles pour produire des profils d’entreprise et des consignes par agent. Un agent d’analyse de maintenance examine un projet cible et laisse des propositions sous forme de tickets de backlog non attribués ; chaque proposition est publiée sur Slack, où une personne l’approuve ou la refuse par une réaction. Une fois un ticket approuvé attribué à un agent, un système d’exécution externe fait le travail et un stage reaper surveille l’activité récente. Si l’activité s’arrête, l’attribution est redemandée avec le ticket et l’assigné ; quand les non-réponses consécutives atteignent la limite, les rappels cessent et le cas passe à un lead ou à un opérateur.Signaux SlackHistorique des canaux accessiblesAgent assignéExécution externeProjet cibleContenu non montréPersonne · approuver, refuserRéaction SlackLead · opérateurRéattribuer · notifierCollecte des signauxExtraction de motifs · sans botsÉtat de l’entrepriseFusion du profil d’entrepriseÉtat des agentsConsignes par agentObservation des exécutionsExécutions récentes · activitéAnalyse de maintenanceAppel du PO · prompt circonscritGestionnaire de ticketsProposition · backlogTicket d’exécution · todoPublication des propositionsCorrespondance message ↔ ticketStage reaperDétection de blocage · heartbeatAppel de repriseTicket + assignéÉtat des non-réponsesNon-réponses · par ticketLimiteArrêt des rappels · refroidissementSignaux → consignesExécution externeProposition → approbation humaineReprise · escalade1 historique des canaux · Signaux Slack → Extraction de motifs · sans bots12 fusion du profil · Extraction de motifs · sans bots → Fusion du profil d’entreprise23régénérer4 injection des consignes · Consignes par agent → Agent assigné41 périmètre cible · Projet cible → Appel du PO · prompt circonscrit12 ticket de proposition · Appel du PO · prompt circonscrit → Proposition · backlog23publier la proposition4Message Slack5réaction6approuver → todo7refuser → cancelled8attribution1enregistrements d’exécution2dernière activité3sans réponse +14nouvelle activité → remise à zéro5rappel6ticket + assigné7après 38réattribuer · notifier9avertissement seul

Signaux → consignes

Profils et consignes d’agents sont construits à partir de l’historique Slack. Les consignes sont du contexte d’agent et ne sont pas représentées comme la cause d’une proposition.

  1. Signaux SlackDonnées: historique des canauxExtraction de motifs · sans botsCollecte des signaux

    L’historique des canaux accessibles est collecté et les messages de bots, d’arrivée et de départ sont filtrés. Les messages d’origine ne sont pas montrés sur cette page.

  2. Extraction de motifs · sans botsCollecte des signauxDonnées: fusion du profilFusion du profil d’entrepriseÉtat de l’entreprise

    Les motifs extraits deviennent un patch de profil fusionné dans le profil de l’entreprise. Ce sont des motifs heuristiques, pas des scores de performance des employés.

  3. Fusion du profil d’entrepriseÉtat de l’entrepriseDonnées: régénérerConsignes par agentÉtat des agents

    Les consignes par agent sont régénérées à partir du profil fusionné et stockées.

  4. Consignes par agentÉtat des agentsExécution · jugement: injection des consignesAgent assigné

    Les consignes entrent dans le contexte d’un agent à sa création. Cela ne signifie pas qu’une proposition donnée vient d’un signal Slack donné.

Proposition → approbation → attribution

Une proposition existe d’abord comme ticket de backlog non attribué, la réaction d’une personne demande un changement de statut, et l’attribution et l’exécution relèvent du système externe.

  1. Projet cibleDonnées: périmètre cibleAppel du PO · prompt circonscritAnalyse de maintenance

    Le job de maintenance appelle l’agent PO avec un prompt circonscrit au projet cible. Le contenu des sources n’est pas montré.

  2. Appel du PO · prompt circonscritAnalyse de maintenanceDonnées: ticket de propositionProposition · backlogGestionnaire de tickets

    Le prompt demande des propositions aux chemins vérifiés uniquement, sous forme de tickets de backlog non attribués, et interdit de lancer des migrations de base de données. C’est une instruction donnée à un agent du produit, pas un mécanisme d’application déterministe.

  3. Proposition · backlogGestionnaire de ticketsDonnées: publier la propositionCorrespondance message ↔ ticketPublication des propositions

    Chaque proposition est publiée sur Slack et la correspondance message-ticket est stockée. Les propositions déjà publiées ne sont pas republiées, et la correspondance stockée garde les 50 plus récentes.

  4. Correspondance message ↔ ticketPublication des propositionsDonnées: Message SlackPersonne · approuver, refuser

    Une personne voit la proposition publiée dans Slack.

  5. Personne · approuver, refuserExécution · jugement: réactionCorrespondance message ↔ ticketPublication des propositions

    Une réaction sur le message retrouve le ticket par la correspondance. Il n’y a pas d’approbation automatique.

  6. Correspondance message ↔ ticketPublication des propositionsExécution · jugement: approuver → todoTicket d’exécution · todoGestionnaire de tickets

    En cas d’approbation, une demande est envoyée pour passer le ticket de proposition en attente à todo, et la correspondance et l’avis du fil sont mis à jour. Ce traitement marque la correspondance comme approuvée sans vérifier le code de réponse ; ce n’est donc pas une transaction fermée en cas d’échec.

  7. Correspondance message ↔ ticketPublication des propositionsExécution · jugement: refuser → cancelledProposition · backlogGestionnaire de tickets

    En cas de refus, une demande est envoyée pour passer le même ticket à cancelled. Le ticket existait avant l’approbation ; l’approbation ne le crée pas.

  8. Ticket d’exécution · todoGestionnaire de ticketsExécution · jugement: attributionAgent assigné

    L’attribution et l’exécution d’un ticket todo relèvent du système d’exécution externe. Passer un ticket à todo ne garantit pas que le travail a commencé.

Blocage → reprise → personne

Un ticket attribué dont l’activité s’est arrêtée est redemandé avec le ticket et l’assigné ; quand les non-réponses consécutives atteignent la limite, il passe à une personne.

  1. Agent assignéObservation · rapport: enregistrements d’exécutionExécutions récentes · activitéObservation des exécutions

    Les exécutions de l’agent assigné et les signaux récents sont consignés comme observations. L’activité n’est pas une preuve d’achèvement.

  2. Exécutions récentes · activitéObservation des exécutionsObservation · rapport: dernière activitéDétection de blocage · heartbeatStage reaper

    Le reaper ne regarde que les tickets ni done, ni cancelled, ni blocked, qui ont un assigné, et calcule l’âge du dernier signal et de la dernière étape.

  3. Détection de blocage · heartbeatStage reaperDonnées: sans réponse +1Non-réponses · par ticketÉtat des non-réponses

    Les non-réponses consécutives sont comptées par agent et par ticket et stockées dans l’état.

  4. Exécutions récentes · activitéObservation des exécutionsObservation · rapport: nouvelle activité → remise à zéroNon-réponses · par ticketÉtat des non-réponses

    Une nouvelle activité remet le compteur à zéro.

  5. Détection de blocage · heartbeatStage reaperExécution · jugement: rappelTicket + assignéAppel de reprise

    Si le heartbeat est dépassé et que le compteur est sous la limite, un appel de reprise est effectué.

  6. Ticket + assignéAppel de repriseExécution · jugement: ticket + assignéTicket d’exécution · todoGestionnaire de tickets

    L’attribution est redemandée avec le ticket, l’agent assigné et un commentaire explicatif, et la réponse HTTP est vérifiée. Un chemin legacy se replie sur un simple appel de réveil.

  7. Non-réponses · par ticketÉtat des non-réponsesÉchec · limite: après 3Arrêt des rappels · refroidissementLimite

    Quand les non-réponses consécutives atteignent la limite (3 par défaut), les rappels cessent. La limite ne tient que si des hooks d’état lisent et écrivent le compteur, et un échec de sauvegarde peut l’affaiblir.

  8. Arrêt des rappels · refroidissementLimiteExécution · jugement: réattribuer · notifierLead · opérateur

    Réattribue à un lead si possible, et ne repasse in_progress à todo que si cette fonction est activée. Sinon, laisse un commentaire et une notification best-effort, et consigne une période de refroidissement après la limite.

  9. Détection de blocage · heartbeatStage reaperObservation · rapport: avertissement seulLead · opérateur

    Quand une étape dure trop longtemps, seul un commentaire d’avertissement est laissé aux opérateurs. Le statut n’est pas modifié automatiquement.

Toutes les connexions avec la même épaisseur. Choisissez un flux pour ne mettre en évidence que son chemin, avec des étapes numérotées.

  • Trait plein · sens des entrées, résultats et enregistrements
  • Tirets · exécution, jugement, requête
  • Pointillés longs · observation et rapport, hors jugement
  • Tirets courts · échec, arrêt, limite
  • Trait noir épais · le flux sélectionné ; les numéros donnent l’ordre
  • Cadre · frontière de code ou d’état, nommée dans l’en-tête
  • Pastille intérieure · composant de cette frontière
  • Cadre pointillé · hors de cette frontière
  • Contour orange · là où un modèle décide
  • Appel d’agent · appel de reprise
  • État · enregistrements
  • Détection de blocage · limite
  • Collecte · publication

Tracé d’après des enregistrements privés d’implémentation et de développement. Les identifiants d’équipe, de tickets et de Slack et les messages d’origine ne sont pas montrés ; déploiement, conteneurs et identifiants relèvent d’un responsable extérieur à ce plugin.

Une observation
Rapport du April 28, 2026 : lors d’un diagnostic manuel avant le changement, un ticket resté sans exécution pendant 67 heures a vu son attribution redemandée avec le ticket et l’assigné, et une nouvelle exécution a été mise en file en moins de 5 secondes. Achèvement, temps moyen de reprise et effet après déploiement n’ont pas été mesurés.
Limites du traitement de l’approbation
Contrairement à l’appel de reprise, le traitement de l’approbation marque la correspondance comme approuvée sans vérifier le code de réponse. Il n’est pas décrit comme une transaction d’approbation atomique ou fermée en cas d’échec.
Quand la limite tient
La limite de 3 appels est une implémentation qui tient quand des hooks d’état sont présents. Elle ne garantit pas exactement une escalade pour chaque défaillance.