
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.
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 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.
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.
Signaux SlackDonnées: historique des canauxExtraction de motifs · sans bots
Collecte des signauxL’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.
Extraction de motifs · sans bots
Collecte des signauxDonnées: fusion du profilFusion du profil d’entrepriseÉtat de l’entrepriseLes 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.
Fusion du profil d’entreprise
État de l’entrepriseDonnées: régénérerConsignes par agentÉtat des agentsLes consignes par agent sont régénérées à partir du profil fusionné et stockées.
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.
Projet cibleDonnées: périmètre cibleAppel du PO · prompt circonscrit
Analyse de maintenanceLe job de maintenance appelle l’agent PO avec un prompt circonscrit au projet cible. Le contenu des sources n’est pas montré.
Appel du PO · prompt circonscrit
Analyse de maintenanceDonnées: ticket de propositionProposition · backlogGestionnaire de ticketsLe 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.
Proposition · backlog
Gestionnaire de ticketsDonnées: publier la propositionCorrespondance message ↔ ticketPublication des propositionsChaque 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.
Correspondance message ↔ ticket
Publication des propositionsDonnées: Message SlackPersonne · approuver, refuserUne personne voit la proposition publiée dans Slack.
Personne · approuver, refuserExécution · jugement: réactionCorrespondance message ↔ ticket
Publication des propositionsUne réaction sur le message retrouve le ticket par la correspondance. Il n’y a pas d’approbation automatique.
Correspondance message ↔ ticket
Publication des propositionsExécution · jugement: approuver → todoTicket d’exécution · todoGestionnaire de ticketsEn 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.
Correspondance message ↔ ticket
Publication des propositionsExécution · jugement: refuser → cancelledProposition · backlogGestionnaire de ticketsEn 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.
Ticket d’exécution · todo
Gestionnaire 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.
Agent assignéObservation · rapport: enregistrements d’exécutionExécutions récentes · activité
Observation des exécutionsLes 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.
Exécutions récentes · activité
Observation des exécutionsObservation · rapport: dernière activitéDétection de blocage · heartbeatStage reaperLe 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.
Détection de blocage · heartbeat
Stage reaperDonnées: sans réponse +1Non-réponses · par ticketÉtat des non-réponsesLes non-réponses consécutives sont comptées par agent et par ticket et stockées dans l’état.
Exécutions récentes · activité
Observation des exécutionsObservation · rapport: nouvelle activité → remise à zéroNon-réponses · par ticketÉtat des non-réponsesUne nouvelle activité remet le compteur à zéro.
Détection de blocage · heartbeat
Stage reaperExécution · jugement: rappelTicket + assignéAppel de repriseSi le heartbeat est dépassé et que le compteur est sous la limite, un appel de reprise est effectué.
Ticket + assigné
Appel de repriseExécution · jugement: ticket + assignéTicket d’exécution · todoGestionnaire de ticketsL’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.
Non-réponses · par ticket
État des non-réponsesÉchec · limite: après 3Arrêt des rappels · refroidissementLimiteQuand 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.
Arrêt des rappels · refroidissement
LimiteExécution · jugement: réattribuer · notifierLead · opérateurRé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.
Détection de blocage · heartbeat
Stage reaperObservation · rapport: avertissement seulLead · opérateurQuand 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.