사용자가 제공한 Kiki 고양이 이미지의 투명 얼굴 파생본
전시실로

Kiki

업무 시그널과 에이전트 실행

제안이 담당자의 실행으로 이어지도록.

팀이 AI 에이전트를 운영하도록 돕는 Paperclip 플러그인과 Slack 수집 도구입니다.

2026.04 — 2026.05

pinxlab AI R&D 프리랜스 · 업무 흐름 기획·개발, 실행 정체 원인 조사와 복구 경로 설계

  • 플러그인구현 · Paperclip
  • MCP 서버구현 · 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

배정과 실제 실행 사이에, 관측과 복구 경로를 둡니다.

업무 시그널을 프로필과 에이전트 지침으로 바꾸고, 유지보수 제안의 승인과 실행 배정을 나눴습니다. 담당 이슈의 활동이 멈추면 이슈와 담당자를 담아 다시 요청하고, 반복되는 무응답은 상한 · cooldown · 사람의 판단으로 넘깁니다.

업무 시그널을 에이전트 지침으로 바꾸고, 유지보수 제안 · 사람의 승인 · 담당 배정 · 멈춘 실행의 복구를 서로 다른 단계로 잇습니다. 이 흐름을 기획하고 개발했습니다.

저장소 첫 기록 4월 3일 · pinxlab 참여 5월 26일까지

팀의 Paperclip 안에서 플러그인으로 동작하고, Slack 수집은 MCP 서버가 맡습니다.

실행 흐름 구성도 · 비공개 구현 기록 기준
Kiki 시그널 · 승인 · 실행 복구접근할 수 있는 Slack 채널 기록에서 업무 패턴을 뽑아 회사별 프로필과 에이전트별 지침을 만듭니다. 유지보수 분석 에이전트는 대상 프로젝트를 보고 담당자 없는 backlog 이슈로 제안을 남기며, 제안은 Slack에 게시되어 사람이 반응으로 승인하거나 거절합니다. 승인된 이슈가 담당 에이전트에 배정되면 외부 실행 시스템이 일을 하고, stage reaper가 최근 활동을 봅니다. 활동이 멈추면 이슈와 담당자를 담아 배정을 다시 요청하고, 연속 무응답이 상한에 닿으면 재호출을 멈추고 Lead · 운영자에게 넘깁니다.Slack 시그널접근 가능한 채널 기록담당 에이전트외부 실행 시스템대상 프로젝트내용은 싣지 않음사람 · 승인 · 거절Slack 반응Lead · 운영자재배정 · 알림시그널 수집패턴 추출 · bot 제외회사 상태회사별 프로필 병합에이전트 상태에이전트별 지침실행 관측최근 실행 · 활동유지보수 분석PO 호출 · 범위 지시이슈 트래커제안 · backlog실행 이슈 · todo제안 게시메시지 ↔ 이슈 매핑Stage reaper정체 판정 · heartbeat복구 호출이슈 + 담당자 재배정무응답 상태무응답 횟수 · 이슈별상한재호출 중단 · cooldown시그널 → 지침외부 실행 · 관측제안 → 사람 승인복구 · 에스컬레이션1채널 기록2프로필 병합3지침 재생성4지침 주입1대상 범위2제안 이슈3제안 게시4Slack 메시지5반응6승인 → todo7거절 → cancelled8담당 배정1실행 기록2마지막 활동3무응답 +14새 활동 → 리셋5재호출6이슈 + 담당자73회 뒤8재배정 · 알림9경고만

시그널 → 지침

Slack 기록에서 프로필과 에이전트 지침을 만듭니다. 지침은 에이전트의 문맥이며, 제안의 원인으로 이어 그리지 않았습니다.

  1. Slack 시그널데이터: 채널 기록패턴 추출 · bot 제외시그널 수집

    접근할 수 있는 채널 기록을 모으고 bot · 입장 · 퇴장 메시지는 거릅니다. 원문 메시지는 이 페이지에 싣지 않습니다.

  2. 패턴 추출 · bot 제외시그널 수집데이터: 프로필 병합회사별 프로필 병합회사 상태

    뽑은 패턴으로 프로필 patch를 만들어 회사 상태의 프로필에 병합합니다. 휴리스틱 패턴이며 직원 성과 점수가 아닙니다.

  3. 회사별 프로필 병합회사 상태데이터: 지침 재생성에이전트별 지침에이전트 상태

    병합된 프로필로 에이전트별 지침을 다시 만들어 저장합니다.

  4. 에이전트별 지침에이전트 상태실행 · 판정: 지침 주입담당 에이전트

    에이전트가 만들어질 때 지침이 문맥으로 들어갑니다. 특정 제안이 특정 Slack 시그널에서 나왔다는 뜻은 아닙니다.

제안 → 승인 → 배정

제안은 담당자 없는 backlog 이슈로 먼저 생기고, 사람의 반응이 상태 변경을 요청하며, 배정과 실행은 외부 시스템이 맡습니다.

  1. 대상 프로젝트데이터: 대상 범위PO 호출 · 범위 지시유지보수 분석

    유지보수 작업은 대상 프로젝트로 범위를 정한 프롬프트로 PO 에이전트를 부릅니다. 소스 내용은 싣지 않습니다.

  2. PO 호출 · 범위 지시유지보수 분석데이터: 제안 이슈제안 · backlog이슈 트래커

    프롬프트는 확인된 경로만 담은 제안을 담당자 없는 backlog 이슈로 만들고, DB migration은 실행하지 말라고 지시합니다. 결정론적으로 강제하는 장치가 아니라 제품 에이전트에게 주는 지시입니다.

  3. 제안 · backlog이슈 트래커데이터: 제안 게시메시지 ↔ 이슈 매핑제안 게시

    제안마다 Slack에 게시하고 메시지와 이슈의 매핑을 저장합니다. 이미 게시한 제안은 다시 올리지 않고, 저장하는 매핑은 최근 50개입니다.

  4. 메시지 ↔ 이슈 매핑제안 게시데이터: Slack 메시지사람 · 승인 · 거절

    사람은 게시된 제안을 Slack에서 봅니다.

  5. 사람 · 승인 · 거절실행 · 판정: 반응메시지 ↔ 이슈 매핑제안 게시

    사람이 메시지에 반응하면 매핑으로 해당 이슈를 찾습니다. 자동 승인은 없습니다.

  6. 메시지 ↔ 이슈 매핑제안 게시실행 · 판정: 승인 → todo실행 이슈 · todo이슈 트래커

    승인이면 대기 중인 제안 이슈를 todo로 바꿔 달라고 요청하고, 매핑과 스레드 알림을 고칩니다. 이 처리는 요청의 응답 코드를 확인하지 않고 매핑을 승인으로 표시하므로, 실패에 닫힌 트랜잭션이 아닙니다.

  7. 메시지 ↔ 이슈 매핑제안 게시실행 · 판정: 거절 → cancelled제안 · backlog이슈 트래커

    거절이면 같은 이슈를 cancelled로 바꿔 달라고 요청합니다. 이슈는 승인 전에 이미 있으며, 승인이 이슈를 처음 만드는 것이 아닙니다.

  8. 실행 이슈 · todo이슈 트래커실행 · 판정: 담당 배정담당 에이전트

    todo 이슈의 담당 배정과 실행은 외부 실행 시스템이 맡습니다. 상태를 todo로 바꿨다고 실행이 시작됐다는 보장은 없습니다.

정체 → 복구 → 사람

활동이 멈춘 담당 이슈는 이슈와 담당자를 담아 다시 요청하고, 연속 무응답이 상한에 닿으면 사람에게 넘깁니다.

  1. 담당 에이전트관측 · 보고: 실행 기록최근 실행 · 활동실행 관측

    담당 에이전트의 실행과 최근 시그널이 관측 기록으로 남습니다. 활동은 작업 완료의 증거가 아닙니다.

  2. 최근 실행 · 활동실행 관측관측 · 보고: 마지막 활동정체 판정 · heartbeatStage reaper

    reaper는 done · cancelled · blocked가 아니고 담당자가 있는 이슈만 보며, 마지막 시그널과 stage의 나이를 계산합니다.

  3. 정체 판정 · heartbeatStage reaper데이터: 무응답 +1무응답 횟수 · 이슈별무응답 상태

    에이전트 × 이슈마다 연속 무응답 횟수를 세어 상태에 저장합니다.

  4. 최근 실행 · 활동실행 관측관측 · 보고: 새 활동 → 리셋무응답 횟수 · 이슈별무응답 상태

    새 활동이 보이면 횟수를 처음으로 돌립니다.

  5. 정체 판정 · heartbeatStage reaper실행 · 판정: 재호출이슈 + 담당자 재배정복구 호출

    heartbeat를 넘겼고 횟수가 상한보다 작으면 복구 호출을 합니다.

  6. 이슈 + 담당자 재배정복구 호출실행 · 판정: 이슈 + 담당자실행 이슈 · todo이슈 트래커

    이슈와 담당 에이전트, 설명 comment를 담아 배정을 다시 요청하고 HTTP 응답을 확인합니다. 옛 경로에서는 한 번 깨우는 호출로 대신합니다.

  7. 무응답 횟수 · 이슈별무응답 상태실패 · 한도: 3회 뒤재호출 중단 · cooldown상한

    연속 무응답이 상한(기본 3회)에 닿으면 재호출을 멈춥니다. 상한은 횟수를 읽고 쓰는 상태 hook이 있을 때만 지켜지며, 저장이 실패하면 약해질 수 있습니다.

  8. 재호출 중단 · cooldown상한실행 · 판정: 재배정 · 알림Lead · 운영자

    가능하면 Lead에게 재배정하고, 기능을 켠 경우에만 in_progress를 todo로 되돌립니다. 아니면 comment와 best-effort 알림을 남기고, 상한 뒤의 cooldown을 기록합니다.

  9. 정체 판정 · heartbeatStage reaper관측 · 보고: 경고만Lead · 운영자

    stage가 너무 오래 머물면 운영자에게 경고 comment만 남깁니다. 상태를 자동으로 바꾸지 않습니다.

모든 연결을 같은 굵기로 보여 줍니다. 흐름을 고르면 그 경로만 번호와 함께 강조됩니다.

  • 실선 · 입력 · 결과 · 기록이 흐르는 방향
  • 파선 · 실행 · 판정 · 요청
  • 긴 점선 · 관측 · 보고, 판정과 별개
  • 짧은 파선 · 실패 · 중단 · 한도
  • 굵은 검은 선 · 고른 흐름, 번호는 순서
  • 상자 · 코드 · 상태 경계, 머리말에 이름
  • 안쪽 칩 · 그 경계의 구성 요소
  • 점선 상자 · 그 경계 밖
  • 주황 테두리 · 모델이 판단하는 곳
  • 에이전트 호출 · 복구 호출
  • 상태 · 기록
  • 판정 · 상한
  • 수집 · 게시

비공개 구현 · 개발 기록 기준으로 그렸습니다. 팀 · 이슈 · Slack 식별자와 원문 메시지는 싣지 않았고, 배포 · 컨테이너 · 자격 증명은 이 플러그인 밖의 담당입니다.

관측 1건
April 28, 2026 보고서: 변경 전 수동 진단에서, 67시간 실행되지 않던 이슈 1건에 이슈와 담당자를 담아 배정을 다시 요청하자 5초 안에 새 실행이 대기열에 올랐습니다. 작업 완료 · 평균 복구 시간 · 배포 뒤 효과는 측정하지 않았습니다.
승인 처리의 한계
복구 호출과 달리 승인 처리는 응답 코드를 확인하지 않고 매핑을 승인으로 표시합니다. 원자적이거나 실패에 닫힌 승인 트랜잭션이라고 쓰지 않습니다.
상한의 조건
3회 상한은 상태 hook이 있을 때 지켜지는 구현입니다. 모든 실패에서 정확히 한 번의 에스컬레이션을 보장하지 않습니다.