Skip to content

아키텍처 레퍼런스

CQ는 AI를 위한 외장 두뇌입니다 — 모든 AI 대화가 영구적인 지식이 되고, 품질 게이트가 코드 무결성을 보장하며, 분산 실행이 원격 GPU 학습을 가능하게 하는 시스템입니다. 이 문서는 핵심 컴포넌트를 설명합니다.


시스템 개요

+------------------+          +----------------------------+
| 로컬 (Thin Agent) |  JWT    | 클라우드 (Supabase)          |
|                   |<------->|                             |
| 손발:             |         | 두뇌:                        |
|  +- Files / Git  |         |  +- Tasks (Postgres)        |
|  +- Build / Test |         |  +- Knowledge (pgvector)    |
|  +- LSP analysis |         |  +- LLM Proxy (Edge Fn)    |
|  +- MCP bridge   |         |  +- Quality Gates           |
|                   |         |  +- Hub (distributed jobs)  |
| Service (cq serve)|   WSS  |                             |
|  +- Relay --------+-------->|  Relay (Fly.io)             |
|  +- EventBus     |         |  +- NAT traversal            |
|  +- Token refresh|         |                             |
+------------------+          | External Brain (CF Worker)  |
                              |  +- OAuth 2.1 MCP proxy     |
Any AI (ChatGPT,   --- MCP -->|  +- Knowledge record/search |
 Claude, Gemini)              |  +- Session summary         |
                              +----------------------------+

solo:       모든 것이 로컬 (SQLite + 본인 API 키)
connected:  두뇌는 클라우드 + relay (로그인 + serve)
full:       connected + GPU Worker + Research Loop

배포 티어

티어데이터 SSOTLLM설정
solo로컬 SQLite사용자 API 키config.yaml 필수
connectedSupabase (클라우드 우선)PI Lab LLM Proxycq auth login + cq serve
fullSupabase (클라우드 우선)PI Lab LLM Proxyconnected + GPU Worker
  • 클라우드 장애 시 SQLite로 폴백 (읽기 전용)
  • 약 70개 도구는 클라우드 우선, 약 48개 도구는 로컬 필요 (파일/git/빌드)
  • External Brain: ChatGPT/Claude/Gemini가 OAuth MCP를 통해 연결 (로컬 설치 불필요)

Go MCP 서버 (c4-core/)

기본 MCP 서버. stdio 전송으로 217개 도구를 제공합니다.

Claude Code -> Go MCP Server (stdio, 217 도구)
                +-> Go 네이티브 (28): state, tasks, files, git, validation, config
                +-> Go + SQLite (13): spec, design, checkpoint, artifact, lighthouse
                +-> Soul/Persona/Twin (10): soul_evolve, persona_learn, twin_record, ...
                +-> LLM Gateway (3): llm_call, llm_providers, llm_costs
                +-> CDP + WebMCP (5): cdp_run, webmcp_discover, web_fetch, ...
                +-> Drive (6): upload, download, list, delete, info, mkdir
                +-> File Index (2): fileindex_search, fileindex_status
                +-> Session (3): session_index, session_summarize, session_snapshot
                +-> Memory (1): memory_import
                +-> Relay (2): cq_workers, cq_relay_call
                +-> Knowledge (13): record, search, distill, ingest, sync, publish, ...
                +-> Hub Client (19, conditional): job, worker, DAG, artifact, cron
                +-> Worker Standby (3, Hub): standby, complete, shutdown
                +-> C7 Observe (4, build tag): metrics, logs, trace, status
                +-> C6 Guard (5, build tag): check, audit, policy, deny
                +-> C8 Gate (6, build tag): webhook, schedule, slack, github, ...
                +-> EventSink (1) + HubPoller (1)
                +-> JSON-RPC proxy (10) -> Python Sidecar

도구 등급

  • Core (40개 도구): 항상 로드됨, 즉시 사용 가능
  • Extended (177개 도구): 필요 시 로드됨, 초기화 후 사용 가능
  • Conditional: Hub 도구는 serve.hub.enabled: true 필요; C7/C6/C8은 빌드 태그 필요

패키지 구조

c4-core/
+-- cmd/c4/           # CLI (cobra) + MCP 서버 진입점
+-- internal/
    +-- mcp/          # Registry + stdio 전송
    |   +-- apps/     # MCP Apps ResourceStore + 내장 위젯 HTML
    |   +-- handlers/ # 도구별 핸들러
    +-- bridge/       # Python sidecar 매니저 (JSON-RPC/TCP, lazy start)
    +-- task/         # TaskStore (SQLite, Memory, Supabase)
    +-- state/        # 상태 머신 (INIT -> COMPLETE)
    +-- worker/       # Worker 매니저 + 생존성 (watchdog, safeGo)
    +-- validation/   # 검증 실행기 (go test, pytest, cargo test 자동 감지)
    +-- config/       # 설정 매니저 (YAML, env, 경제적 프리셋)
    +-- cloud/        # Auth (OAuth), CloudStore, HybridStore, TokenProvider
    +-- hub/          # Hub REST+WS 클라이언트 (26개 도구)
    +-- daemon/       # 로컬 작업 스케줄러 (GPU 인식)
    +-- eventbus/     # C3 EventBus v4 (gRPC, WS bridge, DLQ, filter v2)
    +-- knowledge/    # Knowledge (FTS5 + Vector + Embedding + Sync)
    +-- research/     # 연구 반복 저장소
    +-- c2/           # Workspace/Profile/Persona + webcontent
    +-- drive/        # Drive 클라이언트 (TUS 재개 가능 업로드)
    +-- fileindex/    # 크로스 디바이스 파일 검색
    +-- session/      # 세션 추적 + LLM 요약기
    +-- memory/       # ChatGPT/Claude 세션 임포트 파이프라인
    +-- relay/        # WebSocket relay 클라이언트 (자동 재시작)
    +-- llm/          # LLM Gateway (Anthropic, OpenAI, Gemini, Ollama)
    +-- cdp/          # Chrome DevTools Protocol + WebMCP
    +-- observe/      # C7 Observe (c7_observe 빌드 태그)
    +-- guard/        # C6 Guard (c6_guard 빌드 태그)
    +-- gate/         # C8 Gate (c8_gate 빌드 태그)

빌드 및 설치

bash
# 빌드 + 설치 (중요 -- 반드시 make install 사용)
cd c4-core && make install

# 테스트
cd c4-core && go test ./...

# 환경 진단
cq doctor

Worker 생존성 (v1.44-v1.46)

Worker는 운영자 개입 없이 충돌, 네트워크 장애, 과부하에서 자가 복구하도록 설계되었습니다.

OS Watchdog

Worker는 --watchdog 플래그와 함께 시스템 서비스로 등록됩니다. OS 서비스 매니저(systemd/launchd)가 프로세스 종료 시 자동으로 재시작합니다.

ExecStart=/usr/local/bin/cq serve --watchdog
Restart=always
RestartSec=5

safeGo

모든 goroutine은 safeGo를 통해 실행됩니다. safeGo는 패닉을 복구하여 프로세스를 종료시키는 대신 RingBuffer에 로깅하는 래퍼입니다.

safeGo(func() {
    // goroutine 본문 -- 패닉이 잡혀서 로깅되며, 프로세스가 절대 종료되지 않음
})

Heartbeat Circuit Breaker

Worker는 Supabase에 주기적으로 heartbeat를 전송합니다. heartbeat가 반복적으로 실패하면 circuit breaker가 열리고 Worker는 조용히 계속 실패하는 대신 재연결 루프로 진입합니다.

Heartbeat tick
    |-- 성공 -> 실패 횟수 초기화
    |-- 실패 -> 횟수 증가
    +-- 횟수 >= 임계값 -> circuit 열림 -> 지수 백오프 -> 재시도

충돌 로그 수집

고정 크기 RingBuffer가 마지막 N개의 로그 줄을 메모리에 저장합니다. 충돌 또는 패닉 복구 시 UploadCrashLog가 버퍼를 Supabase에 전송하여 사후 분석을 지원합니다.

429 적응형 백오프

Hub 또는 LLM Gateway가 HTTP 429를 반환하면 Worker는 Retry-After 헤더를 읽고 고정 재시도 간격 대신 정확히 해당 시간만큼 대기합니다.

Relay WebSocket 자동 재시작

Relay WebSocket 연결은 스스로를 모니터링합니다. 연결이 끊기면(네트워크 장애, relay 재시작) 지수 백오프로 자동 재연결합니다 — cq serve 재시작이 필요 없습니다.


Growth Loop / 페르소나 시스템 (v1.40-v1.42)

페르소나 시스템은 사용자 교정에서 학습하고 안정적인 패턴을 공유 지식으로 승격합니다.

사용자 교정 / 명시적 피드백
    |
    v
PreferenceLedger (선호도별 횟수)
    |
    v
GrowthMetrics (세션 교정 + 트렌드)
    |
    v
RulePromoter
    |-- 횟수 >= 3 -> hint로 승격 (CLAUDE.md hint 섹션)
    |-- 횟수 >= 5 -> rule로 승격 (.claude/rules/<topic>.md)
    |
    v
GlobalPromoter (비개인화)
    +-> 커뮤니티 지식 풀 (GlobalPromoter를 통해 모든 사용자와 공유)

컴포넌트

컴포넌트역할
PreferenceLedger각 사용자 선호도를 발생 횟수와 함께 추적
GrowthMetrics세션별 교정 횟수 + 멀티 세션 트렌드
RulePromoter횟수 임계값에서 hint를 rule로 졸업 (3→hint, 5→rule)
GlobalPromoter개인 컨텍스트를 제거하고 패턴을 커뮤니티 지식에 게시

출력 파일

  • Hint와 rule은 CLAUDE.md.claude/rules/에 직접 작성됩니다
  • Rule은 다음 Claude Code 세션 로드 시 즉시 적용됩니다
  • GlobalPromoter 출력은 크로스 유저 공유를 위해 cq_knowledge_publish에 공급됩니다

TUI 대시보드 (v1.44-v1.46)

BubbleTea 기반으로 구축된 세 가지 터미널 UI 명령.

cq jobs

풀 기능 작업 모니터:

  • 상세 패널: 선택된 작업의 스펙, 로그, 메트릭을 표시하는 사이드 패널
  • 적응형 멀티행 차트: 터미널 높이에 따라 행이 확장되는 메트릭 차트
  • Compare 모드: 두 작업을 선택하여 메트릭을 나란히 비교

cq workers

Worker Connection Board — 모든 등록된 Worker의 상태, 어피니티 점수, 마지막 heartbeat, 현재 작업 할당을 표시합니다.

cq dashboard

통합 보드 메뉴 — jobs, workers, 또는 프로젝트 상태 뷰로 라우팅하는 진입점.

cq dashboard
    +-- [j] Jobs 모니터     (cq jobs)
    +-- [w] Workers 보드    (cq workers)
    +-- [s] 프로젝트 상태   (cq status)

세션 인텔리전스 (v1.39-v1.41)

/done vs /exit 분리

명령캡처 깊이사용 시점
/done전체 — 구조화된 요약, 지식 추출, 페르소나 업데이트실제 작업 완료 시
/exit경량 — 최소한의 메타데이터만중단하거나 빠르게 닫을 때

요약 프롬프트

/done은 실행 가능한 지식을 추출하도록 설계된 심층 프롬프트를 사용합니다:

  • 내린 결정과 근거
  • 발견된 패턴
  • 발생한 문제와 해결 방법
  • 구체적인 시작 지점이 포함된 다음 단계

폴백 처리

  • 글로벌 DB 폴백: Supabase를 사용할 수 없는 경우 세션 요약을 로컬 SQLite에 기록
  • LLM 실패 메타데이터: 요약 LLM 호출이 실패하면 원시 세션 텍스트를 llm_failed=true와 함께 저장하고 다음 연결 시 재시도

MCP 앱 (위젯 시스템)

format=widget으로 도구를 호출하면 응답에 _meta.ui.resourceUri가 포함됩니다. MCP 클라이언트는 resources/read를 통해 HTML을 가져와 샌드박스 iframe에 렌더링합니다.

Tool call (format=widget)
  -> handler가 {data: {...}, _meta: {ui: {resourceUri: "ui://cq/..."}}} 반환
  -> 클라이언트가 resources/read("ui://cq/...") 호출
  -> ResourceStore가 내장 HTML 반환
  -> 클라이언트가 샌드박스 iframe에 렌더링
위젯 URI도구설명
ui://cq/dashboardc4_dashboard프로젝트 상태 요약
ui://cq/job-progressc4_job_status작업 진행률
ui://cq/job-resultc4_job_summary작업 결과
ui://cq/experiment-comparec4_experiment_search실험 비교
ui://cq/task-graphc4_task_graph태스크 의존성 그래프
ui://cq/nodes-mapc4_nodes_map연결된 노드 맵
ui://cq/knowledge-feedcq_knowledge_search지식 피드
ui://cq/cost-trackerc4_llm_costsLLM 비용 추적기
ui://cq/test-resultscq_run_validation테스트 결과
ui://cq/git-diffc4_diff_summaryGit diff 뷰어
ui://cq/error-tracec4_error_trace에러 트레이스 뷰어

지식 시스템

4계층 파이프라인: 모든 태스크 결정이 향후 태스크를 위한 검색 가능한 지식이 됩니다.

Plan (knowledge_search) -> Task DoD (Rationale) -> Worker (knowledge_context 주입)
     ^                                                       |
pattern_suggest <- distill <- autoRecordKnowledge <- Worker complete (handoff)
  • FTS5: 모든 지식 레코드에 대한 전문 검색
  • pgvector: OpenAI 768-dim 임베딩 (또는 Ollama 768-dim nomic-embed-text)
  • 3-way RRF: FTS + vector + 인기도 점수의 순위 융합
  • Auto-distill: 지식 수 >= 5일 때 /finish에 의해 트리거
  • 클라우드 동기화: 로컬 SQLite <-> Supabase pgvector 동기화
  • 크로스 프로젝트: 공유를 위한 cq_knowledge_publish / cq_knowledge_pull

지식 handoff (cq_submit)

Worker는 태스크와 함께 구조화된 handoff를 제출합니다:

json
{
  "summary": "구현한 내용",
  "files_changed": ["src/feature.go"],
  "discoveries": ["패턴 X가 Y보다 효과적"],
  "concerns": ["엣지 케이스 Z 미처리"],
  "rationale": "접근 방식 A를 선택한 이유"
}

이것은 자동으로 파싱되어 향후 Worker를 위한 지식으로 기록됩니다.


Hub (분산 실행)

Hub는 Supabase PostgreSQL 기반의 분산 작업 큐입니다. Worker는 임대 모델로 작업을 가져갑니다.

개발자 (노트북)
  +-- cq_job_submit(spec, routing={tags: ["gpu"]}) -->+
                                                      |
                                    Supabase: hub_jobs INSERT
                                              | pg_notify('new_job')
                                              v
                                    Worker (원격 GPU 서버)
                                      +- ClaimJob (임대)
                                      +- 실행
                                      +- 아티팩트 업로드
                                      +- CompleteJob

DAG 파이프라인

c4_hub_dag_create (노드 + 엣지)
    |
    v (위상 정렬 -> 루트 노드 자동 제출)
    v
Worker가 노드 완료 -> advance_dag -> 다음 레이어 해제
    |
    v
모든 노드 완료 -> DAG 완료 이벤트

Worker 어피니티

Worker는 어피니티 점수를 기반으로 자동 라우팅됩니다:

affinity_score = project_match * 10 + tag_match * 3 + recency * 2 + success_rate * 5

어피니티 점수 확인: cq hub workers (AFFINITY 컬럼 표시).


Relay (NAT 통과)

Relay는 외부 MCP 클라이언트가 NAT를 통해 로컬 Worker에 접근할 수 있게 합니다.

외부 MCP 클라이언트 (Cursor / Codex / Gemini CLI)
    | HTTPS (MCP over HTTP)
    v
cq-relay.fly.dev  [Go relay 서버]
    ^ WSS (아웃바운드, Worker가 먼저 연결)
cq serve  [로컬 / 클라우드 Worker]
    |
    v
Go MCP Server (stdio) + Python Sidecar

인증 흐름:

  1. cq auth login -> Supabase Auth -> JWT 발급 + relay URL 자동 설정
  2. cq serve 시작 -> relay WSS 연결 (Authorization: Bearer JWT)
  3. Relay가 토큰 검증, Worker 터널 등록
  4. 외부 클라이언트 -> https://cq-relay.fly.dev/<worker-id> -> relay -> WSS -> Worker

Relay WebSocket은 연결 끊김 시 자동 재시작합니다 (위의 Worker 생존성 참조).


EventBus (C3)

gRPC UDS 데몬, WebSocket 브리지 포함. 18가지 이벤트 타입. 테스트 78개.

EventBus (gRPC UDS)
    |-- 규칙 엔진 (YAML 라우팅)
    |-- DLQ (dead letter queue)
    |-- WebSocket 브리지 (외부 구독자)
    +-- HMAC-SHA256 webhook 전달

이벤트 타입:

카테고리이벤트
태스크task.completed, task.updated, task.blocked, task.created
체크포인트checkpoint.approved, checkpoint.rejected
리뷰review.changes_requested
검증validation.passed, validation.failed
지식knowledge.recorded, knowledge.searched
Hubhub.job.completed, hub.job.failed, hub.worker.started, hub.worker.offline
관측성tool.called (C7), guard.denied (C6)

External Brain (Cloudflare Worker)

OAuth 2.1 MCP 프록시. 모든 AI(ChatGPT, Claude web, Gemini)가 로컬 설치 없이 CQ 지식에 접근할 수 있습니다.

External Brain을 통해 노출되는 도구:

도구설명
cq_knowledge_recordAI가 능동적으로 지식 저장 (도구 설명의 5가지 조건 트리거)
cq_knowledge_searchVector + FTS + ilike 3단계 폴백 검색
c4_session_summary대화 종료 시 완전한 세션 요약 캡처
cq_status현재 프로젝트 상태 읽기

Python Sidecar (c4/)

Go MCP 서버가 JSON-RPC/TCP를 통해 10개 도구를 Python에 위임합니다 (지연 시작).

Go MCP Server -- JSON-RPC/TCP --> Python Sidecar (10개 도구)
                                    +-> LSP (7개): find_symbol, get_overview, replace_body,
                                    |          insert_before/after, rename, find_refs
                                    |          (Python/JS/TS 전용 -- Go/Rust: cq_search_for_pattern 사용)
                                    +-> Doc (2개): parse_document, extract_text
                                    +-> Onboard (1개): cq_onboard
  • Lazy Start: 첫 번째 프록시 도구 호출 시에만 Sidecar 시작
  • 점진적 폴백: Python/uv를 사용할 수 없으면 LSP/Doc 도구가 비활성화됨 (충돌 아님)

상태 머신

INIT -> DISCOVERY -> DESIGN -> PLAN -> EXECUTE <-> CHECKPOINT -> REFINE -> POLISH -> COMPLETE
                                          |
                                          +-> HALTED (재개 가능)
상태의미
INIT프로젝트 생성됨, 태스크 없음
DISCOVERY요구사항 수집 중 (c4-plan Phase 1)
DESIGN아키텍처 결정 중 (c4-plan Phase 2)
PLAN태스크 생성됨, 실행 준비 완료
EXECUTEWorker 활성, 태스크 점유 중
CHECKPOINT페이즈 게이트 도달, 리뷰 진행 중
HALTED실행 일시 중단, /run으로 재개 가능
COMPLETE모든 태스크 완료, /finish 준비 완료

보안: Permission Hook

모든 도구 사용 및 셸 실행에 대한 2계층 게이트:

PreToolUse 이벤트
    |
    v
c4-gate.sh (패턴 매칭)
    |-- allow_patterns -> 즉시 허용
    |-- model 모드 -> Haiku API 결정
    |-- block_patterns -> 차단 (감사 로그 포함)
    +-- 폴백 -> 내장 안전 패턴

PermissionRequest 이벤트
    |
    v
c4-permission-reviewer.sh (Haiku 분류)

설정 (.c4/config.yaml):

yaml
permission_reviewer:
  enabled: true
  mode: hook        # "hook" (정규식 전용) 또는 "model" (Haiku API)
  auto_approve: true
  allow_patterns: []
  block_patterns: []

Supabase 스키마 (주요 테이블)

테이블용도
c4_tasks태스크 큐 (상태, 할당, 커밋 SHA)
c4_documents지식 레코드 (내용, 임베딩, FTS)
c4_projects프로젝트 레지스트리 (소유자, 설정)
hub_jobs분산 작업 큐 (스펙, 상태, 임대)
hub_workers등록된 Worker (기능, 어피니티)
hub_dagsDAG 파이프라인 정의
hub_cron_schedulesCron 작업 정의
c4_drive_filesDrive 파일 메타데이터 (해시, URL, 버전)
c4_datasets콘텐츠 주소 지정 버전 관리를 포함한 데이터셋 레지스트리
c1_messages세션 간 및 메시징 채널 메시지
notification_channelsTelegram/Dooray 알림 설정

마이그레이션 52개, 사용자 대상 테이블 전체에 RLS 정책 적용, 임베딩용 pgvector 확장 사용.


스킬 (v1.46)

연구, ML, 데이터, 오케스트레이션 도메인에 걸친 42개의 스킬. 스킬은 .claude/skills/에서 로드되며 /skill-name으로 호출합니다.

카테고리예시
연구 & 실험8c9-loop, c9-survey, research-loop, experiment-workflow
ML / 데이터 사이언스13eda-profiler, pytorch-model-builder, transfer-learning-expert
오케스트레이션9plan, run, finish, quick, pi
개발 품질7tdd-cycle, spec-first, debugging, company-review
기타5release, incident-response, standby, pdf

스킬은 CQ MCP 도구와 직접 상호작용합니다 — 스킬은 별도의 바이너리가 아닌 MCP 서버를 구동하는 구조화된 프롬프트입니다.