
Kiki
Work signals and agent execution
So that a proposal becomes the assignee's execution.
A Paperclip plugin and a Slack collector that help a team run its AI agents.
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
Between assignment and actual execution, a path to observe and recover.
Work signals become profiles and agent directives, and approving a maintenance proposal is kept apart from assigning its execution. When an assigned issue’s activity stops, it is requested again with the issue and assignee, and repeated non-response goes to a limit, a cooldown and a person’s judgment.
They turn work signals into agent directives and connect maintenance proposals, human approval, assignment and the recovery of stalled runs as separate steps. I planned and developed this flow.
First repository record April 3, 2026 · pinxlab engagement through May 26, 2026
Runs as a plugin inside the team's Paperclip; an MCP server handles Slack collection.
Signals → directives
Profiles and agent directives are built from Slack history. Directives are agent context and are not drawn as the cause of any proposal.
Slack signalsData: channel historyPattern extraction · no bots
Signal collectionAccessible channel history is collected and bot, join and leave messages are filtered out. Original messages are not shown on this page.
Pattern extraction · no bots
Signal collectionData: profile mergeCompany profile mergeCompany stateExtracted patterns become a profile patch merged into the company profile. These are heuristic patterns, not employee performance scores.
Company profile merge
Company stateData: regeneratePer-agent directivesAgent statePer-agent directives are regenerated from the merged profile and stored.
Per-agent directives
Agent stateRun · judgment: directives inAssigned agentDirectives enter an agent’s context when it is created. This does not mean a particular proposal came from a particular Slack signal.
Proposal → approval → assignment
A proposal first exists as an unassigned backlog issue, a person’s reaction requests a status change, and assignment and execution belong to the external system.
Target projectData: target scopePO call · scoped prompt
Maintenance analysisThe maintenance job calls the PO agent with a prompt scoped to the target project. Source contents are not shown.
PO call · scoped prompt
Maintenance analysisData: proposal issueProposal · backlogIssue trackerThe prompt asks for proposals with verified paths only, as unassigned backlog issues, and forbids running DB migrations. It is an instruction to a product agent, not a deterministic enforcement mechanism.
Proposal · backlog
Issue trackerData: post proposalMessage ↔ issue mapProposal postingEach proposal is posted to Slack and the message-to-issue mapping is stored. Proposals already posted are not posted again, and the stored map keeps the latest 50.
Message ↔ issue map
Proposal postingData: Slack messagePerson · approve, declineA person sees the posted proposal in Slack.
Person · approve, declineRun · judgment: reactionMessage ↔ issue map
Proposal postingA reaction on the message finds the issue through the mapping. There is no automatic approval.
Message ↔ issue map
Proposal postingRun · judgment: approve → todoRun issue · todoIssue trackerOn approval, a request is sent to move the pending proposal issue to todo, and the mapping and thread notice are updated. This handler marks the mapping approved without checking the response code, so it is not a fail-closed transaction.
Message ↔ issue map
Proposal postingRun · judgment: decline → cancelledProposal · backlogIssue trackerOn decline, a request is sent to move the same issue to cancelled. The issue existed before approval; approval does not create it.
Run issue · todo
Issue trackerRun · judgment: assignmentAssigned agentAssignment and execution of a todo issue belong to the external execution system. Moving an issue to todo does not guarantee that work started.
Stall → recovery → person
An assigned issue whose activity stopped is requested again with the issue and assignee; when consecutive non-responses reach the limit, it goes to a person.
Assigned agentObservation · report: run recordsRecent runs · activity
Run observationThe assigned agent’s runs and recent signals are recorded as observations. Activity is not evidence of completion.
Recent runs · activity
Run observationObservation · report: last activityStall check · heartbeatStage reaperThe reaper looks only at issues that are not done, cancelled or blocked and that have an assignee, and computes the age of the latest signal and stage.
Stall check · heartbeat
Stage reaperData: no reply +1Non-responses · per issueNon-response stateConsecutive non-responses are counted per agent and issue and stored in state.
Recent runs · activity
Run observationObservation · report: new activity → resetNon-responses · per issueNon-response stateNew activity resets the count.
Stall check · heartbeat
Stage reaperRun · judgment: re-callIssue + assigneeRecovery callIf the heartbeat is exceeded and the count is below the limit, a recovery call is made.
Issue + assignee
Recovery callRun · judgment: issue + assigneeRun issue · todoIssue trackerThe assignment is requested again with the issue, the assigned agent and an explanatory comment, and the HTTP response is checked. A legacy path falls back to a single wake call.
Non-responses · per issue
Non-response stateFailure · limit: after 3Stop re-calls · cooldownLimitWhen consecutive non-responses reach the limit (3 by default), re-calls stop. The limit holds only when state hooks read and write the count, and a failed save can weaken it.
Stop re-calls · cooldown
LimitRun · judgment: reassign · notifyLead · operatorReassigns to a lead where possible, and moves in_progress back to todo only when that feature is enabled. Otherwise leaves a comment and a best-effort notification, and records a cooldown after the limit.
Stall check · heartbeat
Stage reaperObservation · report: warning onlyLead · operatorWhen a stage lasts too long, only a warning comment is left for operators. Status is not changed automatically.
Every connection at the same weight. Pick a flow to highlight only its path, with numbered steps.
- Solid · direction of input, results and records
- Dashed · run, judgment, request
- Long dots · observation and reporting, apart from judgment
- Short dashes · failure, stop, limit
- Heavy black line · the selected flow; numbers give the order
- Box · code or state boundary, named in its header
- Inner chip · a component of that boundary
- Dotted box · outside that boundary
- Orange outline · where a model decides
- Agent call · recovery call
- State · records
- Stall check · limit
- Collection · posting
Drawn from private implementation and development records. Team, issue and Slack identifiers and original messages are not shown; deployment, containers and credentials belong to an owner outside this plugin.
- One observation
- April 28, 2026 report: in a manual diagnosis before the change, one issue that had not run for 67 hours had its assignment requested again with the issue and assignee, and a new run was queued within 5 seconds. Completion, mean recovery time and post-rollout effect were not measured.
- Limits of approval handling
- Unlike the recovery call, approval handling marks the mapping approved without checking the response code. It is not described as an atomic or fail-closed approval transaction.
- When the limit holds
- The 3-call limit is an implementation that holds when state hooks are present. It does not guarantee exactly one escalation under every failure.