Skip to content

Latest commit

Β 

History

History
942 lines (758 loc) Β· 21.7 KB

File metadata and controls

942 lines (758 loc) Β· 21.7 KB
domain technical
audience
chief
lead
member
keywords
api
contract
last-updated 2026-03-01

API Contract

κΈ°λ³Έ κ·œμ•½

  • APIλŠ” JSON(application/json)을 μ‚¬μš©ν•˜κ³  ν•„λ“œ 넀이밍은 camelCaseλ₯Ό 기본으둜 ν•œλ‹€.
  • μ‹ κ·œ 일반 APIλŠ” /api/v1/...λ₯Ό κΈ°λ³Έ 경둜둜 μ‚¬μš©ν•œλ‹€.
  • λŸ°νƒ€μž„ μ œμ–΄ APIλŠ” ν˜Έν™˜μ„± 이유둜 /api/runtime/*λ₯Ό μ˜ˆμ™Έ 경둜둜 μœ μ§€ν•œλ‹€.

HTTP 였λ₯˜ 응닡 κ·œμ•½

  • ν˜„μž¬ Runtime HTTP 였λ₯˜ 응닡 포맷은 μ•„λž˜ 2개 ν•„λ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
  • requestIdλŠ” WebSocket 였λ₯˜(runtime:error)μ—μ„œ μ œκ³΅ν•œλ‹€.
{
  "errorCode": "VALIDATION_ERROR",
  "message": "workdirλ₯Ό μ§€μ •ν•΄ μ£Όμ„Έμš”."
}

였λ₯˜ μ½”λ“œ:

  • VALIDATION_ERROR (400)
  • FORBIDDEN (403)
  • NOT_FOUND (404)
  • INTERNAL_ERROR (500)

Runtime API (Web <-> MCP)

HTTP

GET /api/runtime/health

{
  "ok": true,
  "now": "2026-02-20T07:00:00.000Z"
}

GET /api/runtime/status?workdir=<absolute-path>

  • workdirλŠ” 선택값이닀.
  • workdirκ°€ μ—†μœΌλ©΄ μ„œλ²„λŠ” ν˜„μž¬ μ‹€ν–‰ 쀑 λŸ°νƒ€μž„μ˜ workdir을 μ‚¬μš©ν•œλ‹€.
  • ν˜„μž¬ μ‹€ν–‰ 쀑 λŸ°νƒ€μž„μ΄ μ—†κ³  workdir도 μ—†μœΌλ©΄ VALIDATION_ERRORλ₯Ό λ°˜ν™˜ν•œλ‹€.

POST /api/runtime/init

μš”μ²­:

{
  "workdir": "/path/to/workdir",
  "reset": false
}
  • reset=true이면 κΈ°μ‘΄ /path/to/workdir/.agentCompanyλ₯Ό μ‚­μ œ ν›„ μž¬μ΄ˆκΈ°ν™”ν•œλ‹€.
  • μ΄ˆκΈ°ν™” μ‹œ tasks/queue.json은 μƒ˜ν”Œ 데이터 없이 빈 λ°°μ—΄([])둜 μƒμ„±ν•œλ‹€.
  • μ΄ˆκΈ°ν™” μ‹œ 원본 knowledge-base/ 트리λ₯Ό /path/to/workdir/.agentCompany/docs둜 미러 λ³΅μ‚¬ν•œλ‹€(AGENTS.md μ œμ™Έ).

POST /api/runtime/start

μš”μ²­:

{
  "workdir": "/path/to/workdir"
}
  • startλŠ” κΈ°μ‘΄ μ›Œν¬μŠ€νŽ˜μ΄μŠ€λ₯Ό μž¬μ‚¬μš©ν•˜λ©°, docs 미러 μž¬λ³΅μ‚¬λ₯Ό μˆ˜ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μ›Œν¬μŠ€νŽ˜μ΄μŠ€κ°€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ•˜μœΌλ©΄ VALIDATION_ERRORλ₯Ό λ°˜ν™˜ν•œλ‹€.

POST /api/runtime/stop

μš”μ²­:

{
  "workdir": "/path/to/workdir"
}
  • workdirλŠ” 선택값이닀.
  • μ‹€ν–‰ 쀑 λŸ°νƒ€μž„μ΄ μ—†λŠ” μƒνƒœμ—μ„œ workdir 없이 ν˜ΈμΆœν•˜λ©΄ 빈 μŠ€λƒ…μƒ·μ„ λ°˜ν™˜ν•œλ‹€.

GET /api/runtime/providers

응닡:

{
  "providers": [
    {
      "provider": "codex",
      "binary": "codex",
      "installed": true,
      "creatable": true
    }
  ]
}

GET /api/runtime/agent-guidelines?workdir=<absolute-path>

응닡:

{
  "workdir": "/path/to/workdir",
  "docsRoot": "/path/to/workdir/.agentCompany/docs",
  "orgLevels": ["chief", "lead", "member"],
  "roles": [
    {
      "roleName": "strategy-chief",
      "orgLevel": "chief",
      "sourcePath": "/path/to/workdir/.agentCompany/docs/agents/roles/strategy-chief.md"
    }
  ]
}

GET /api/runtime/mode?workdir=<absolute-path>

응닡:

{
  "workdir": "/path/to/workdir",
  "operatingMode": "governed",
  "availableModes": ["governed", "silicon-valley"],
  "initialized": true,
  "configPath": "/path/to/workdir/.agentCompany/config.json"
}

POST /api/runtime/mode

μš”μ²­:

{
  "workdir": "/path/to/workdir",
  "operatingMode": "silicon-valley"
}

κ·œμΉ™:

  • operatingModeλŠ” governed|silicon-valley 쀑 ν•˜λ‚˜μ—¬μ•Ό ν•œλ‹€.
  • μ›Œν¬μŠ€νŽ˜μ΄μŠ€κ°€ μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ€ 경우(μ„€μ • 파일 λΆ€μž¬) VALIDATION_ERRORλ₯Ό λ°˜ν™˜ν•œλ‹€.
  • λͺ¨λ“œ 변경은 μƒˆ 사이클 μ‹œμž‘ μ‹œμ (λͺ¨λ“  task status=pending)μ—μ„œλ§Œ ν—ˆμš©ν•œλ‹€.

GET /api/runtime/metrics?workdir=<absolute-path>&limit=<number>

응닡:

{
  "workdir": "/path/to/workdir",
  "count": 2,
  "sourcePath": "/path/to/workdir/.agentCompany/logs/metrics.ndjson",
  "events": [
    {
      "eventType": "mode.changed",
      "timestamp": "2026-02-21T03:20:00.000Z",
      "workdir": "/path/to/workdir",
      "operatingMode": "silicon-valley"
    }
  ]
}

κ·œμΉ™:

  • limit 기본값은 200이며 μ΅œλŒ€ 2000κΉŒμ§€ ν—ˆμš©ν•œλ‹€.
  • 파일이 μ—†μœΌλ©΄ 빈 λ°°μ—΄(events: [])을 λ°˜ν™˜ν•œλ‹€.

POST /api/runtime/agents

μš”μ²­:

{
  "workdir": "/path/to/workdir",
  "type": "codex",
  "displayName": "Codex Builder",
  "personaSummary": "κ΅¬ν˜„ 쀑심",
  "orgLevel": "member",
  "roleName": "implementation-engineer",
  "primaryGoal": "κΈ°λŠ₯ κ΅¬ν˜„",
  "reportsTo": "lead-agent-uuid"
}

κ·œμΉ™:

  • orgLevel은 chief|lead|member 쀑 ν•˜λ‚˜μ—¬μ•Ό ν•œλ‹€.
  • roleName은 빈 λ¬Έμžμ—΄μΌ 수 μ—†λ‹€.
  • reportsToλŠ” 선택값이닀.
  • leadλŠ” chief μ•„λž˜μ—λ§Œ 배치 κ°€λŠ₯ν•˜λ‹€.
  • memberλŠ” lead μ•„λž˜μ—λ§Œ 배치 κ°€λŠ₯ν•˜λ‹€.

PATCH /api/runtime/agents/{agentId}

μš”μ²­ ν•„λ“œλŠ” λΆ€λΆ„ μ—…λ°μ΄νŠΈλ₯Ό ν—ˆμš©ν•œλ‹€.

  • orgLevel, roleName은 독립 ν•„λ“œλ‘œ μ—…λ°μ΄νŠΈν•œλ‹€.
  • reportsToλŠ” 선택값이며 null둜 μ „λ‹¬ν•˜λ©΄ κ·Έλ£Ή 배치λ₯Ό ν•΄μ œν•œλ‹€.

GET /api/runtime/org-chart?workdir=<absolute-path>

응닡:

{
  "workdir": "/path/to/workdir",
  "generatedAt": "2026-02-21T01:20:00.000Z",
  "operatingMode": "governed",
  "orgLevels": ["chief", "lead", "member"],
  "nodes": [
    {
      "agentId": "agent-uuid",
      "displayName": "Strategy Chief",
      "agentType": "claude",
      "orgLevel": "chief",
      "roleName": "strategy-chief",
      "primaryGoal": "λ²”μœ„/DoD ν™•μ •",
      "groupId": "chief-agent-uuid",
      "teamId": null,
      "reportsTo": null,
      "approvableTransitions": ["PLAN->WORK", "REVIEW->COMPOUND"]
    }
  ],
  "groups": [
    {
      "groupId": "chief-agent-uuid",
      "groupName": "Strategy Chief Group",
      "rootAgentId": "chief-agent-uuid",
      "chiefAgentId": "chief-agent-uuid",
      "leadAgentIds": ["lead-agent-uuid"],
      "memberAgentIds": ["member-agent-uuid"],
      "agentIds": ["chief-agent-uuid", "lead-agent-uuid", "member-agent-uuid"]
    }
  ],
  "approvalRules": [
    {
      "fromStage": "PLAN",
      "toStage": "WORK",
      "transitionKey": "PLAN->WORK",
      "requiredOrgLevels": ["chief"],
      "requiresUserApproval": false
    }
  ]
}

POST /api/runtime/directives

μš”μ²­:

{
  "workdir": "/path/to/workdir",
  "instruction": "이번 μ£Ό 결제 μ΄νƒˆλ₯ μ„ 20% μ€„μ΄λŠ” μ‹€ν–‰μ•ˆμ„ μˆ˜λ¦½ν•˜κ³  μ§„ν–‰ν•΄μ€˜",
  "priority": "high",
  "operatingMode": "governed",
  "riskLevel": "low",
  "targetChiefs": ["chief-product", "chief-tech"],
  "dueBy": "2026-02-22T12:00:00Z"
}

κ·œμΉ™:

  • CEO Dashboard 곡개 μ§„μž…μ μ΄λ‹€.
  • 헀더 x-agent-company-user-role=ceoκ°€ ν•„μš”ν•˜λ‹€.
  • targetChiefsλŠ” orgLevel=chief μ—μ΄μ „νŠΈλ‘œ 해석 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
  • lead/memberλ₯Ό 직접 μˆ˜μ‹ μžλ‘œ μ§€μ •ν•˜λ©΄ FORBIDDEN을 λ°˜ν™˜ν•œλ‹€.
  • 생성 성곡 μ‹œ μ§€μ‹œ μƒνƒœλŠ” submitted둜 κΈ°λ‘ν•œλ‹€.

응닡:

{
  "ok": true,
  "directiveId": "directive-uuid",
  "status": "submitted",
  "requestId": "req-1234",
  "message": "CEO μ§€μ‹œλ₯Ό λ“±λ‘ν•˜κ³  chief λΌμš°νŒ…μ„ μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€."
}

GET /api/runtime/directives?workdir=<absolute-path>&status=<submitted|routed|briefing|delegated|in-progress|reviewing|completed|blocked|canceled>&limit=<number>

응닡:

{
  "workdir": "/path/to/workdir",
  "count": 1,
  "directives": [
    {
      "directiveId": "directive-uuid",
      "instruction": "이번 μ£Ό 결제 μ΄νƒˆλ₯ μ„ 20% μ€„μ΄λŠ” μ‹€ν–‰μ•ˆ",
      "priority": "high",
      "status": "routed",
      "targetChiefs": ["chief-product", "chief-tech"],
      "createdAt": "2026-02-22T01:00:00Z",
      "updatedAt": "2026-02-22T01:10:00Z"
    }
  ]
}

κ·œμΉ™:

  • workdirλŠ” ν•„μˆ˜κ°’μ΄λ‹€.
  • limit 기본값은 50이며 μ΅œλŒ€ 500κΉŒμ§€ ν—ˆμš©ν•œλ‹€.
  • statusλŠ” 선택값이며 μ§€μ • μ‹œ ν•΄λ‹Ή μƒνƒœλ§Œ ν•„ν„°λ§ν•œλ‹€.

POST /api/runtime/directives/{directiveId}/chief-briefs

μš”μ²­:

{
  "workdir": "/path/to/workdir",
  "chiefAgentId": "agent-uuid",
  "scope": "결제 μ‹€νŒ¨ μƒμœ„ 원인 3개 κ°œμ„ ",
  "nonScope": "결제 μˆ˜λ‹¨ μ‹ κ·œ λ„μž…μ€ μ œμ™Έ",
  "dod": "μ΄νƒˆλ₯  20% κ°œμ„  검증 둜그 제좜",
  "riskLevel": "low"
}

κ·œμΉ™:

  • chiefAgentIdλŠ” orgLevel=chiefμ—¬μ•Ό ν•œλ‹€.
  • directiveId μƒνƒœκ°€ routed λ˜λŠ” briefing일 λ•Œλ§Œ 생성 κ°€λŠ₯ν•˜λ‹€.
  • scope, nonScope, dodλŠ” 빈 λ¬Έμžμ—΄μΌ 수 μ—†λ‹€.

응닡:

{
  "ok": true,
  "briefId": "chief-brief-uuid",
  "status": "draft",
  "requestId": "req-1234"
}

POST /api/runtime/chief-briefs/{briefId}/work-orders

μš”μ²­:

{
  "workdir": "/path/to/workdir",
  "directiveId": "directive-uuid",
  "ownerAgentId": "agent-uuid",
  "workId": "checkout-drop-r1",
  "summary": "결제 μ‹€νŒ¨μœ¨ κ°œμ„  κ΅¬ν˜„",
  "dueBy": "2026-02-24T12:00:00Z"
}

κ·œμΉ™:

  • ownerAgentIdλŠ” orgLevel=lead|chiefμ—¬μ•Ό ν•œλ‹€.
  • orgLevel=chiefλŠ” lead λΉ„ν™œμ„± + μ €μœ„ν—˜μΌ λ•Œλ§Œ ν—ˆμš©ν•œλ‹€.
  • μƒμœ„ briefIdκ°€ 승인 μƒνƒœκ°€ μ•„λ‹ˆλ©΄ work-orderλ₯Ό λ§Œλ“€ 수 μ—†λ‹€.
  • μƒμ„±λœ work-orderλŠ” directiveId와 λ°˜λ“œμ‹œ μ—°κ²°λ˜μ–΄μ•Ό ν•œλ‹€.

응닡:

{
  "ok": true,
  "workOrderId": "work-order-uuid",
  "status": "queued",
  "requestId": "req-1234"
}

GET /api/runtime/scaling/policy?workdir=<absolute-path>

응닡:

{
  "workdir": "/path/to/workdir",
  "policy": {
    "minMembers": 1,
    "maxMembers": 6,
    "targetThroughputPerMember": 2,
    "evaluationIntervalSec": 60,
    "cooldownSec": 600
  }
}

POST /api/runtime/scaling/policy

μš”μ²­:

{
  "workdir": "/path/to/workdir",
  "minMembers": 1,
  "maxMembers": 8,
  "targetThroughputPerMember": 2,
  "evaluationIntervalSec": 60,
  "cooldownSec": 600
}

κ·œμΉ™:

  • minMembersλŠ” 1 이상이어야 ν•œλ‹€.
  • maxMembersλŠ” minMembers 이상이어야 ν•œλ‹€.
  • evaluationIntervalSecλŠ” μ΅œμ†Œ 10 이상이어야 ν•œλ‹€.
  • cooldownSecλŠ” μ΅œμ†Œ 60 이상이어야 ν•œλ‹€.
  • chiefλŠ” μžλ™ μŠ€μΌ€μΌ λŒ€μƒμ—μ„œ μ œμ™Έν•œλ‹€.

응닡:

{
  "ok": true,
  "requestId": "req-1234",
  "message": "μ—­ν•  탄λ ₯ 정책을 μ €μž₯ν–ˆμŠ΅λ‹ˆλ‹€."
}

GET /api/runtime/scaling/status?workdir=<absolute-path>&chiefGroupId=<id>

응닡:

{
  "workdir": "/path/to/workdir",
  "chiefGroupId": "chief-agent-uuid",
  "queueDepth": 4,
  "inProgressWorkOrders": 3,
  "riskHighCount": 1,
  "lead": {
    "required": true,
    "active": true
  },
  "members": {
    "desired": 3,
    "active": 2,
    "draining": 0
  },
  "lastEvaluatedAt": "2026-02-22T01:00:00Z"
}

POST /api/runtime/scaling/reconcile

μš”μ²­:

{
  "workdir": "/path/to/workdir",
  "chiefGroupId": "chief-agent-uuid",
  "reason": "queue-depth-threshold"
}

κ·œμΉ™:

  • μ„œλ²„λŠ” ν˜„μž¬ backlog/SLA/riskλ₯Ό 평가해 lead/member만 증감해야 ν•œλ‹€.
  • chief λΉ„ν™œμ„±/μΆ•μ†ŒλŠ” ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μŠ€μΌ€μΌλ‹€μš΄μ€ drain μ™„λ£Œ μ „μ—λŠ” 적용 μ™„λ£Œλ‘œ κ°„μ£Όν•˜μ§€ μ•ŠλŠ”λ‹€.

응닡:

{
  "ok": true,
  "requestId": "req-1234",
  "appliedDecisions": [
    {
      "roleType": "member",
      "action": "up",
      "delta": 1
    }
  ]
}

POST /api/runtime/approval/validate

μš”μ²­:

{
  "workdir": "/path/to/workdir",
  "directiveId": "directive-uuid",
  "workId": "landing-auth-r3",
  "fromStage": "WORK",
  "toStage": "REVIEW",
  "approverAgentId": "agent-uuid",
  "riskLevel": "low"
}

κ·œμΉ™:

  • riskLevel은 선택값이며 low|high|unknown을 ν—ˆμš©ν•œλ‹€.
  • directiveIdλŠ” ν•„μˆ˜κ°’μ΄λ‹€.
  • workIdλŠ” ν•„μˆ˜κ°’μ΄λ‹€.
  • lead λΉ„ν™œμ„± + μ €μœ„ν—˜ μž‘μ—…μ΄λ©΄ chiefλ₯Ό 승인ꢌ자둜 ν—ˆμš©ν•  수 μžˆλ‹€.

응닡:

{
  "ok": true,
  "allowed": true,
  "transitionKey": "WORK->REVIEW",
  "operatingMode": "governed",
  "requiredOrgLevels": ["lead", "chief"],
  "requiresUserApproval": false,
  "approver": {
    "agentId": "agent-uuid",
    "displayName": "Delivery Lead",
    "orgLevel": "lead",
    "roleName": "delivery-lead"
  },
  "reason": "μ „κ²° 톡과"
}

POST /api/runtime/approval/user

μš”μ²­:

{
  "workdir": "/path/to/workdir",
  "directiveId": "directive-uuid",
  "workId": "landing-auth-r3",
  "transitionKey": "COMPOUND->CYCLE_END",
  "approved": true,
  "note": "릴리즈 μ’…λ£Œ 승인"
}

κ·œμΉ™:

  • transitionKeyλŠ” ν˜„μž¬ COMPOUND->CYCLE_END만 ν—ˆμš©ν•œλ‹€.
  • directiveId와 workIdλŠ” 동일 μ‚¬μ΄ν΄λ‘œ λ§€ν•‘ κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
  • approved=trueκ°€ κΈ°λ‘λ˜μ–΄μ•Ό COMPOUND->CYCLE_END 진행이 κ°€λŠ₯ν•˜λ‹€.
  • μ΄λ²€νŠΈμ—λŠ” operatingMode, policyHashλ₯Ό ν•¨κ»˜ κΈ°λ‘ν•œλ‹€.
  • 헀더 x-agent-company-user-idκ°€ ν•„μš”ν•˜λ‹€.
  • 헀더 x-agent-company-user-role=ceoκ°€ ν•„μš”ν•˜λ‹€.
  • μ„œλ²„ ν™˜κ²½λ³€μˆ˜ AGENT_COMPANY_USER_APPROVAL_TOKEN이 μ„€μ •λœ 경우:
    • 헀더 x-agent-company-user-token이 ν•„μš”ν•˜λ©° ν•΄λ‹Ή κ°’κ³Ό μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.
  • μ„œλ²„ ν™˜κ²½λ³€μˆ˜κ°€ λ―Έμ„€μ •/빈 값인 경우:
    • x-agent-company-user-token 없이도 x-agent-company-user-id둜 승인 이벀트λ₯Ό 기둝할 수 μžˆλ‹€(둜컬 개발 κΈ°λ³Έ 경둜).

응닡:

{
  "ok": true,
  "requestId": "req-1234",
  "transitionKey": "COMPOUND->CYCLE_END",
  "message": "CEO(μ‚¬μš©μž) μ΅œμ’… μŠΉμΈμ„ κΈ°λ‘ν–ˆμŠ΅λ‹ˆλ‹€."
}

POST /api/runtime/messages

μš”μ²­:

{
  "workdir": "/path/to/workdir",
  "directiveId": "directive-uuid",
  "workId": "landing-auth-r3",
  "fromPrincipalType": "agent",
  "fromAgent": "lead-qa",
  "toAgent": "chief-tech",
  "channel": "review",
  "operatingMode": "governed",
  "riskLevel": "low",
  "summary": "νšŒκ·€ ν…ŒμŠ€νŠΈ μ™„λ£Œ, 릴리즈 승인 ν•„μš”",
  "requiredAction": "PLAN->WORK 승인",
  "requiredApprover": "chief-tech",
  "dueBy": "2026-02-20T12:00:00Z"
}

κ·œμΉ™:

  • fromAgentλ₯Ό μ œμ™Έν•œ λͺ¨λ“  ν•„λ“œλŠ” ν•„μˆ˜κ°’μ΄λ‹€.
  • channel은 directive|plan|work|review|risk만 ν—ˆμš©ν•œλ‹€.
  • operatingModeλŠ” λŸ°νƒ€μž„ ν˜„μž¬ λͺ¨λ“œμ™€ μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.
  • riskLevel은 low|high|unknown만 ν—ˆμš©ν•œλ‹€.
  • riskLevel=high이면 requiredApproverλŠ” chief 계측을 포함해야 ν•œλ‹€.
  • dueByλŠ” RFC3339 UTC νƒ€μž„μŠ€νƒ¬ν”„μ—¬μ•Ό ν•œλ‹€.
  • fromAgent, toAgentλŠ” ν˜„μž¬ workdir에 λ“±λ‘λœ μ—μ΄μ „νŠΈ(id/roleName/displayName)둜 해석 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
  • fromAgent와 toAgentλŠ” μ„œλ‘œ 달라야 ν•œλ‹€.
  • fromPrincipalType=agent일 λ•Œλ§Œ fromAgentλ₯Ό ν•„μˆ˜λ‘œ κ°•μ œν•œλ‹€.
  • fromPrincipalType=ceo-user이면 toAgentλŠ” chief κ³„μΈ΅λ§Œ ν—ˆμš©ν•œλ‹€.

응닡:

{
  "ok": true,
  "requestId": "req-1234",
  "message": "μ—μ΄μ „νŠΈ λ©”μ‹œμ§€λ₯Ό μˆ˜μ‹ ν•˜κ³  μŠ€ν‚€λ§ˆ 검증/κΈ°λ‘ν–ˆμŠ΅λ‹ˆλ‹€."
}

ꡐ차 Workdir ν˜‘μ—… API (Draft)

μ•„λž˜ APIλŠ” knowledge-base/technical/cross-workdir-collaboration.md κΈ°μ€€μ˜ 섀계 μ΄ˆμ•ˆμ΄λ‹€. ν˜„μž¬ λ¬Έμ„œλŠ” 계약 μ΄ˆμ•ˆμ„ μ •μ˜ν•˜λ©°, μ„œλ²„ κ΅¬ν˜„ μ‹œ μ„ΈλΆ€ ν•„λ“œλŠ” ν•˜μœ„ ν˜Έν™˜ μ›μΉ™μœΌλ‘œ ν™•μ •ν•œλ‹€.

POST /api/runtime/handoffs

μš”μ²­:

{
  "sourceWorkdir": "/path/to/workdir-a",
  "targetWorkdir": "/path/to/workdir-b",
  "handoffWorkId": "auth-platform-r1",
  "fromAgent": "chief-tech",
  "toAgent": "lead-platform",
  "operatingMode": "governed",
  "riskLevel": "high",
  "summary": "A ν”„λ‘œμ νŠΈ 인증 λͺ¨λ“ˆμ„ B ν”„λ‘œμ νŠΈ ν”Œλž«νΌ κ·œκ²©μ— 맞좰 검증 μš”μ²­",
  "requiredAction": "WORK->REVIEW μ „ν™˜ 검증",
  "requiredApprover": "chief-platform",
  "dueBy": "2026-02-24T12:00:00Z",
  "evidenceLogPath": "knowledge-base/history/reviews/auth-platform-r1-review.md",
  "idempotencyKey": "handoff-auth-platform-r1-001"
}

κ·œμΉ™:

  • λͺ¨λ“  ν•„λ“œλŠ” ν•„μˆ˜κ°’μ΄λ‹€.
  • sourceWorkdir와 targetWorkdirλŠ” μ„œλ‘œ 달라야 ν•œλ‹€.
  • operatingModeλŠ” governed|silicon-valley만 ν—ˆμš©ν•œλ‹€.
  • riskLevel은 low|high|unknown만 ν—ˆμš©ν•œλ‹€.
  • fromAgentλŠ” sourceWorkdir의 μ—μ΄μ „νŠΈλ‘œ, toAgentλŠ” targetWorkdir의 μ—μ΄μ „νŠΈλ‘œ 해석 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
  • riskLevel=high이면 requiredApproverλŠ” chief 계측을 포함해야 ν•œλ‹€.
  • dueByλŠ” RFC3339 UTC νƒ€μž„μŠ€νƒ¬ν”„μ—¬μ•Ό ν•œλ‹€.
  • idempotencyKeyλŠ” 동일 μš”μ²­ μž¬μ „μ†‘ μ‹œ 쀑볡 생성을 막기 μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

응닡:

{
  "ok": true,
  "handoffId": "handoff-uuid",
  "status": "requested",
  "requestId": "req-1234",
  "message": "ꡐ차 workdir ν˜‘μ—… μš”μ²­μ„ κΈ°λ‘ν–ˆμŠ΅λ‹ˆλ‹€."
}

GET /api/runtime/handoffs?workdir=<absolute-path>&status=<requested|accepted|in-progress|completed|rejected|blocked>&limit=<number>

응닡:

{
  "workdir": "/path/to/workdir-a",
  "count": 1,
  "handoffs": [
    {
      "handoffId": "handoff-uuid",
      "sourceWorkdir": "/path/to/workdir-a",
      "targetWorkdir": "/path/to/workdir-b",
      "handoffWorkId": "auth-platform-r1",
      "status": "requested",
      "operatingMode": "governed",
      "riskLevel": "high",
      "requiredApprover": "chief-platform",
      "createdAt": "2026-02-22T01:00:00Z",
      "updatedAt": "2026-02-22T01:00:00Z"
    }
  ]
}

κ·œμΉ™:

  • workdirλŠ” ν•„μˆ˜κ°’μ΄λ‹€.
  • limit 기본값은 50이며 μ΅œλŒ€ 500κΉŒμ§€ ν—ˆμš©ν•œλ‹€.
  • statusλŠ” 선택값이며 μ§€μ • μ‹œ ν•΄λ‹Ή μƒνƒœλ§Œ ν•„ν„°λ§ν•œλ‹€.

POST /api/runtime/handoffs/{handoffId}/approve

μš”μ²­:

{
  "workdir": "/path/to/workdir-b",
  "approverAgentId": "agent-uuid",
  "approved": true,
  "note": "ν”Œλž«νΌ μ •μ±… κ²€ν†  μ™„λ£Œ"
}

κ·œμΉ™:

  • workdirλŠ” targetWorkdir와 μΌμΉ˜ν•΄μ•Ό ν•œλ‹€.
  • approverAgentIdλŠ” targetWorkdir의 μ—μ΄μ „νŠΈλ‘œ 해석 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
  • 승인 κΆŒν•œ 검증은 orgLevelκ³Ό riskLevel을 ν•¨κ»˜ μ‚¬μš©ν•œλ‹€.
  • riskLevel=high이고 μ •μ±…μ—μ„œ μ‚¬μš©μž 승인이 μš”κ΅¬λ˜λ©΄ POST /api/runtime/approval/userλ₯Ό μΆ”κ°€λ‘œ 톡과해야 ν•œλ‹€.

응닡:

{
  "ok": true,
  "handoffId": "handoff-uuid",
  "status": "accepted",
  "requestId": "req-1234",
  "message": "ꡐ차 workdir ν˜‘μ—… μŠΉμΈμ„ κΈ°λ‘ν–ˆμŠ΅λ‹ˆλ‹€."
}

POST /api/runtime/handoffs/{handoffId}/complete

μš”μ²­:

{
  "workdir": "/path/to/workdir-b",
  "completedByAgentId": "agent-uuid",
  "outcomeSummary": "μš”μ²­λœ 검증 μ™„λ£Œ, 릴리즈 차단 이슈 μ—†μŒ",
  "evidenceLogPath": "knowledge-base/history/reviews/auth-platform-r1-review.md"
}

응닡:

{
  "ok": true,
  "handoffId": "handoff-uuid",
  "status": "completed",
  "requestId": "req-1234",
  "message": "ꡐ차 workdir ν˜‘μ—… μ™„λ£Œλ₯Ό κΈ°λ‘ν–ˆμŠ΅λ‹ˆλ‹€."
}

좔적 이벀트 νƒ€μž…:

  • handoff.requested
  • handoff.approved
  • handoff.rejected
  • handoff.started
  • handoff.completed
  • handoff.blocked

Directive 좔적 이벀트 νƒ€μž…:

  • directive.submitted
  • directive.routed
  • chief.brief.created
  • work-order.assigned
  • directive.closed

Scaling 좔적 이벀트 νƒ€μž…:

  • scaling.evaluated
  • scaling.up
  • scaling.down
  • lead.activated
  • lead.deactivated

POST /api/runtime/command (Internal-only)

μš”μ²­:

{
  "workdir": "/path/to/workdir",
  "agent": "agent-uuid-or-role-id",
  "provider": "codex",
  "language": "Korean",
  "command": "버그 원인 λΆ„μ„ν•΄μ€˜"
}

κ·œμΉ™:

  • CEO Dashboard의 직접 호좜 경둜둜 μ‚¬μš©ν•˜λ©΄ μ•ˆ λœλ‹€.
  • λ‚΄λΆ€ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ 경둜(directive -> chief-brief -> work-order)μ—μ„œλ§Œ ν—ˆμš©ν•œλ‹€.
  • 헀더 x-agent-company-call-path=internal-orchestratorκ°€ ν•„μš”ν•˜λ‹€.
  • providerλŠ” 선택값이며 λˆ„λ½ μ‹œ agent 값을 λŒ€μ²΄ μ‚¬μš©ν•œλ‹€.
  • μ΅œμ’… providerλŠ” claude|gemini|codex 쀑 ν•˜λ‚˜λ‘œ 해석 κ°€λŠ₯ν•΄μ•Ό ν•œλ‹€.
  • languageλŠ” 선택값이며 μ΅œλŒ€ 64μžλ‹€.
  • commandκ°€ args:둜 μ‹œμž‘ν•˜λ©΄ CLI 인자 λͺ¨λ“œλ‘œ μ‹€ν–‰ν•œλ‹€.
  • language μ§€μ‹œλ¬Έμ€ ν”„λ‘¬ν”„νŠΈ λͺ¨λ“œμ—μ„œλ§Œ μžλ™ λΆ€μ°©λ˜κ³  args: λͺ¨λ“œμ—μ„œλŠ” λΆ€μ°©λ˜μ§€ μ•ŠλŠ”λ‹€.

응닡:

{
  "ok": true,
  "requestId": "req-1234"
}

RuntimeSnapshot 응닡 μŠ€ν‚€λ§ˆ

{
  "workdir": "/path/to/workdir",
  "initialized": true,
  "isRunning": false,
  "directiveState": {},
  "runtimeState": {},
  "liveState": {},
  "events": [],
  "stdout": [],
  "stderr": []
}

WebSocket

  • 경둜: /ws/runtime

ν΄λΌμ΄μ–ΈνŠΈ ꡬ독 λ©”μ‹œμ§€:

{
  "type": "runtime:subscribe",
  "requestId": "req-1234",
  "payload": {
    "workdir": "/path/to/workdir"
  }
}

ν˜Έν™˜μ„± κ·œμΉ™:

  • payload.workdir λŒ€μ‹  top-level workdir도 ν—ˆμš©ν•œλ‹€.
  • 동일 requestId μž¬μ „μ†‘μ€ 쀑볡 μ²˜λ¦¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

μ„œλ²„ 이벀트 νƒ€μž…:

  • runtime:connected
  • runtime:subscribed
  • runtime:snapshot
  • runtime:log
  • runtime:agent_stream
  • runtime:directive
  • runtime:scaling
  • runtime:error

runtime:agent_stream payload:

{
  "workdir": "/path/to/workdir",
  "agent": "agent-uuid-or-role-id",
  "stream": "stdout",
  "content": "line",
  "requestId": "req-1234",
  "timestamp": "2026-02-20T07:00:00.000Z"
}
  • stream 값은 stdout|stderr|system을 μ‚¬μš©ν•œλ‹€.
  • λͺ…λ Ή μ‹œμž‘/μ’…λ£Œ/νƒ€μž„μ•„μ›ƒ 같은 μ‹œμŠ€ν…œ λ©”μ‹œμ§€λŠ” system 슀트림으둜 μ „λ‹¬ν•œλ‹€.

runtime:directive payload:

{
  "workdir": "/path/to/workdir",
  "directiveId": "directive-uuid",
  "status": "routed",
  "chiefAgentIds": ["agent-uuid"],
  "requestId": "req-1234",
  "timestamp": "2026-02-20T07:00:00.000Z"
}

runtime:scaling payload:

{
  "workdir": "/path/to/workdir",
  "chiefGroupId": "chief-agent-uuid",
  "roleType": "member",
  "action": "up",
  "delta": 1,
  "reason": "queue-depth-threshold",
  "requestId": "req-1234",
  "timestamp": "2026-02-20T07:00:00.000Z"
}

Envelope κ·œμ•½

λͺ¨λ“  WebSocket λ©”μ‹œμ§€λŠ” μ•„λž˜ envelopeλ₯Ό λ”°λ₯Έλ‹€.

{
  "type": "runtime:snapshot",
  "version": "1.0",
  "requestId": "req-5678",
  "timestamp": "2026-02-20T07:00:00.000Z",
  "payload": {}
}

좔적 κ·œμΉ™:

  • envelope requestIdλŠ” μ„œλ²„ 이벀트 λ‹¨μœ„ μ‹λ³„μžλ‹€.
  • λͺ…λ Ή μ‹€ν–‰ μƒκ΄€κ΄€κ³„λŠ” runtime:agent_stream.payload.requestIdλ₯Ό κΈ°μ€€μœΌλ‘œ μΆ”μ ν•œλ‹€.
  • μŠ€μΌ€μΌλ§ μƒκ΄€κ΄€κ³„λŠ” runtime:scaling.payload.requestIdλ₯Ό κΈ°μ€€μœΌλ‘œ μΆ”μ ν•œλ‹€.

λ³€κ²½ 관리

  • Runtime HTTP/WS μŠ€ν‚€λ§ˆ λ³€κ²½ μ‹œ λ³Έ λ¬Έμ„œλ₯Ό λ¨Όμ € κ°±μ‹ ν•œλ‹€.
  • 인증/μ‹€ν–‰ 정책이 λ³€κ²½λ˜λ©΄ knowledge-base/technical/agent-communication-auth.mdλ₯Ό ν•¨κ»˜ κ°±μ‹ ν•œλ‹€.
  • CEO μ§€μ‹œ λΌμš°νŒ… 정책이 λ³€κ²½λ˜λ©΄ knowledge-base/operations/ceo-command-orchestration.mdλ₯Ό ν•¨κ»˜ κ°±μ‹ ν•œλ‹€.
  • μ—­ν•  탄λ ₯ 정책이 λ³€κ²½λ˜λ©΄ knowledge-base/governance/approval-rules/role-capacity-scaling.mdλ₯Ό ν•¨κ»˜ κ°±μ‹ ν•œλ‹€.