Transparent face derivative of the Kiki cat image supplied by the author
Back to the hall

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.

2026.04 — 2026.05

pinxlab AI R&D freelance · workflow planning and development, investigating stalled execution and designing the recovery path

  • PluginImplemented · Paperclip
  • MCP serverImplemented · Slack collector

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

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.

Execution flow map · from private implementation records
Kiki signals · approval · execution recoveryWork patterns are extracted from accessible Slack channel history into company profiles and per-agent directives. A maintenance-analysis agent looks at a target project and leaves proposals as unassigned backlog issues; each proposal is posted to Slack, where a person approves or declines it with a reaction. Once an approved issue is assigned to an agent, an external execution system does the work and a stage reaper watches recent activity. If activity stops, the assignment is requested again with the issue and assignee; when consecutive non-responses reach the limit, re-calls stop and the case goes to a lead or operator.Slack signalsAccessible channel historyAssigned agentExternal executionTarget projectContents not shownPerson · approve, declineSlack reactionLead · operatorReassign · notifySignal collectionPattern extraction · no botsCompany stateCompany profile mergeAgent statePer-agent directivesRun observationRecent runs · activityMaintenance analysisPO call · scoped promptIssue trackerProposal · backlogRun issue · todoProposal postingMessage ↔ issue mapStage reaperStall check · heartbeatRecovery callIssue + assigneeNon-response stateNon-responses · per issueLimitStop re-calls · cooldownSignals → directivesExternal executionProposal → human approvalRecovery · escalation1 channel history · Slack signals → Pattern extraction · no bots12 profile merge · Pattern extraction · no bots → Company profile merge23regenerate4 directives in · Per-agent directives → Assigned agent41 target scope · Target project → PO call · scoped prompt12 proposal issue · PO call · scoped prompt → Proposal · backlog23post proposal4Slack message5reaction6approve → todo7decline → cancelled8assignment1run records2last activity3no reply +14new activity → reset5re-call6issue + assignee7after 38reassign · notify9warning only

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.

  1. Slack signalsData: channel historyPattern extraction · no botsSignal collection

    Accessible channel history is collected and bot, join and leave messages are filtered out. Original messages are not shown on this page.

  2. Pattern extraction · no botsSignal collectionData: profile mergeCompany profile mergeCompany state

    Extracted patterns become a profile patch merged into the company profile. These are heuristic patterns, not employee performance scores.

  3. Company profile mergeCompany stateData: regeneratePer-agent directivesAgent state

    Per-agent directives are regenerated from the merged profile and stored.

  4. Per-agent directivesAgent stateRun · judgment: directives inAssigned agent

    Directives 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.

  1. Target projectData: target scopePO call · scoped promptMaintenance analysis

    The maintenance job calls the PO agent with a prompt scoped to the target project. Source contents are not shown.

  2. PO call · scoped promptMaintenance analysisData: proposal issueProposal · backlogIssue tracker

    The 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.

  3. Proposal · backlogIssue trackerData: post proposalMessage ↔ issue mapProposal posting

    Each 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.

  4. Message ↔ issue mapProposal postingData: Slack messagePerson · approve, decline

    A person sees the posted proposal in Slack.

  5. Person · approve, declineRun · judgment: reactionMessage ↔ issue mapProposal posting

    A reaction on the message finds the issue through the mapping. There is no automatic approval.

  6. Message ↔ issue mapProposal postingRun · judgment: approve → todoRun issue · todoIssue tracker

    On 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.

  7. Message ↔ issue mapProposal postingRun · judgment: decline → cancelledProposal · backlogIssue tracker

    On decline, a request is sent to move the same issue to cancelled. The issue existed before approval; approval does not create it.

  8. Run issue · todoIssue trackerRun · judgment: assignmentAssigned agent

    Assignment 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.

  1. Assigned agentObservation · report: run recordsRecent runs · activityRun observation

    The assigned agent’s runs and recent signals are recorded as observations. Activity is not evidence of completion.

  2. Recent runs · activityRun observationObservation · report: last activityStall check · heartbeatStage reaper

    The 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.

  3. Stall check · heartbeatStage reaperData: no reply +1Non-responses · per issueNon-response state

    Consecutive non-responses are counted per agent and issue and stored in state.

  4. Recent runs · activityRun observationObservation · report: new activity → resetNon-responses · per issueNon-response state

    New activity resets the count.

  5. Stall check · heartbeatStage reaperRun · judgment: re-callIssue + assigneeRecovery call

    If the heartbeat is exceeded and the count is below the limit, a recovery call is made.

  6. Issue + assigneeRecovery callRun · judgment: issue + assigneeRun issue · todoIssue tracker

    The 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.

  7. Non-responses · per issueNon-response stateFailure · limit: after 3Stop re-calls · cooldownLimit

    When 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.

  8. Stop re-calls · cooldownLimitRun · judgment: reassign · notifyLead · operator

    Reassigns 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.

  9. Stall check · heartbeatStage reaperObservation · report: warning onlyLead · operator

    When 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.