<div align="center">
<img src="https://img.shields.io/badge/K-Y_B-00b3c4?style=for-the-badge&labelColor=1a1d24" alt="KYB" height="34"/>
KYB — Know Your Business
여러분의 AI 에이전트 군단이 계속 잊어버리는 공유 메모리입니다.
A git 기반의 검색 가능한 지식 기반 및 AI 에이전트 군단을 위한 사고 추적기입니다.
어떤 서버가 존재하는지, 서비스들이 어떻게 연결되어 있는지, 무엇이 고장 났고 그것이 어떻게 끝났는지 — 세션 간에 그리고 장비 전반에 걸쳐 살아남는 운영상의 진실을 기록합니다.
<br/>
Website · By Alexander Panasenko
<br/>
crates.io
license
tests
build
rust
search
skills.sh
<br/>
Quick start · How it works · Incidents · Agent skill · MCP · Web UI · HTTP API · Citation
</div>
왜 필요한가 (Why)
에이전트는 세션 간에 모든 것을 잊어버립니다. 여러 대의 장비에서 작동하는 여러 에이전트(Claude Code, Codex, Antigravity 등)는 같은 인프라를 반복적으로 재발견하며, 어렵게 얻은 사고 교훈은 컨텍스트 창이 닫히는 순간 증발합니다.
KYB는 살아남는 공유 메모리입니다: 어떤 서버가 존재하며 그 위에서 무엇이 실행되는지, 서비스들이 어떻게 연결되어 있는지, 어떻게 배포되는지, 어떤 결정이 내려졌고 왜 그런지를 기록합니다. 또한 사고 보고서도 포함됩니다: 무엇이 고장 났는지, 영향은 어떠했는지, 그것을 어떻게 받아들여야 하는지, 그리고 어떻게 끝났는지를 말입니다.
작동 방식 (How it works)
- Git이 원본(canon)입니다 — 데이터베이스가 없습니다. 각 항목마다 마크다운 파일 하나(YAML 프런트매터 + 본문)를 사용하며, 종류별로
knowledge/, incidents/ 또는 tasks/ 아래에 저장됩니다. 변경 사항마다 커밋을 한 번씩 수행하고, 커밋 SHA는 버전 ID가 됩니다. 히스토리, diff(차이점), 롤백은 기본적으로 제공되며, 이 원본은 모든 텍스트 편집기로 읽고 수정할 수 있습니다. (v2 이전의 평면형 원본들은 시작 시 스스로 마이그레이션됩니다.)
- 트리에는 현재 활성화된 내용만 보관됩니다. 인시던트나 태스크를 닫으면 그것이 아카이브(archives) 됩니다: 파일은 작업 트리에서 제거되지만, 최종 버전(해결책 포함)은 기본 검색에, 목록에, 그리고
GET (상태가 'archived'로 표시됨)에 남아 있습니다. 일반 지식을 삭제하는 것은 철회(retraction) 이며 기본 검색에서 해당 내용을 제외시킵니다. Git은 어떤 경우에도 모든 것을 보관합니다.
- Tantivy가 인덱스입니다 — 시작할 때마다 Git으로부터 재구축되는 일회성 캐시입니다. 이는 모든 키의 최신 버전 및 모든 과거 버전을 포함하므로, 에이전트들은 지식이 변경되기 전 어떤 내용을 담고 있었는지 검색할 수 있습니다 (
--history: "무엇이 어디로 이동했는지").
- 검색은 하이브리드입니다 — BM25(상호 순위)와 모든 항목에 대한 벡터 검색이 융합됩니다 (multilingual-e5-small, int8 ONNX 사용, CPU에서 로컬로 약 5ms 만에 실행). 한 언어로 질문해도 다른 언어로 작성된 기반 지식에 대해 답변을 찾을 수 있으며; 정확한 기술 용어는 여전히 최상단에 순위가 매겨집니다. 디스크에 모델이 없으므로 → 서비스는 어휘적(lexical-only)으로만 실행됩니다.
- 쓰기는 키별로 업서트(upsert)됩니다 — 내용이 변경되지 않은 경우 아무 작업도 하지 않습니다(no-op). 플랫한 키 공간에 태그만 추가되며; 프로젝트나 네임스페이스는 없습니다.
- 비밀 정보는 절대 원본에 들어가지 않습니다 — 본문이 토큰, 개인 키 또는 비밀번호처럼 보이면 쓰기가 거부됩니다. 대신 포인터(pointers)를 저장합니다.
아키텍처 (Architecture)
KYB architecture: AI agents, Rust server, Git history and derived BM25 plus optional vector search
전체 크기 다이어그램 보기.
에이전트는 HTTP를 통해 kyb CLI를 사용합니다. Rust/axum 서버는 마크다운과 히스토리를 Git에 저장한 다음, 해당 히스토리로부터 검색 상태를 구축합니다. Tantivy가 BM25 검색을 제공하며, 선택적 멀티링구얼-e5-small ONNX 모델은 인메모리 벡터를 공급합니다. Reciprocal rank fusion(역비례 순위 융합)이 어휘적 후보와 의미론적 후보를 결합합니다. 모든 검색 모듈은 서버 내부에서 실행됩니다. 모델 없이도 어휘적 검색은 여전히 작동합니다.
인시던트 보고서 (Incident reports)
인시던트는 일급 항목(first-class entries)이며 (kind: incident, 키는 inc-로 접두사 지정), 생명 주기는 open → mitigated → resolved입니다. 그리고 하나의 규칙이 있습니다: 종료하려면 해결이 필요합니다. '그냥 사라졌다'로 끝나는 인시던트는 누구에게도 아무것도 가르쳐주지 못하기 때문입니다. 보고서는 이야기가 아니라 제어판입니다:
| 필드 | 에이전트가 얻는 것 |
|---|
detection | 예상되는 정상 결과를 포함하는 실행 가능한 "여전히 발생하고 있는가?" 확인 절차 |
| ... | |
서버는 구조를 강제하기보다 가르칩니다. 즉, 기본적인 보고서는 받아들여지지만 응답에는 누락된 조치 가능 부분의 이름을 명시하는 hints가 포함됩니다. kyb incident --template을 실행하면 표준 골격(canonical skeleton)이 출력됩니다. | |
해결(Resolving)은 해당 보고서를 아카이브합니다: 기록 보관소는 깨끗하게 유지되고 (오직 열려 있는 항목만), 기록 자체는 영원히 검색 가능하게 유지됩니다.
작업 (Tasks)
세 번째 종류의 항목입니다 (kind: task, 키는 task-로 접두사 지정): 짧고 실행 가능한 메모와 아이디어이며, 결과(outcome)를 가지고 마무리하는 규율은 갖추었지만 인시던트 절차는 따르지 않습니다.
- 라이프사이클(Lifecycle) —
open → in_progress → blocked → done | dropped 순서로 진행됩니다. 오직 done과 dropped만이 종착 상태(terminal)입니다. 이들은 해결책을 요구하며("dropped: rewrite 후 폐기됨"도 지식으로 간주), 작업을 아카이브합니다. in_progress와 blocked는 작업이 진행 중인 상태(work in flight)이며, 작업은 공식 기록소(canon)의 kyb tasks 및 open_tasks에 활성 상태로 유지됩니다.
- 우선순위(priority) — 선택 사항이며, 값은
low | medium | high | critical입니다. 비어 있다는 것은 순위가 매겨지지 않았음을 의미하며 그대로 유지됩니다. 어떤 것도 이를 추론하지 않습니다. GET /tasks 및 /search에서 정확한 필터링이 가능합니다.
- 차단 사유(blocked_reason) — 선택 사항이며, 작업이 무엇을 기다리고 있는지 나타냅니다. 이는 오직
status: blocked 상태에만 속합니다. 다른 어떤 상태에 설정하더라도 거부되며, blocked에서 벗어나면 이 값이 지워지므로, 작업은 더 이상 해당되지 않는 차단 상태를 보고하지 않습니다.
- 담당자(assignee) — 선택 사항이며, 현재 작업을 보유한 사람을 나타냅니다. 짧은 공개 라벨(≤80자, 단일 라인, 다른 모든 필드와 마찬가지로 비밀 스캔됨)입니다. 비어 있다는 것은 미지정(unclaimed)을 의미하며 그대로 유지됩니다.
GET /tasks 및 /search에서 정확한 필터링이 가능합니다.
- 부모 작업(parent_task) — 선택 사항이며, 이 작업이 속하는
task- 키입니다. 비어 있다는 것은 최상위 레벨을 의미합니다. 유효한 task- 키여야 하며 부모 순환 고리(parent cycle)를 만들 수 없습니다. 아직 존재하지 않는 부모도 허용됩니다. 즉, 자식은 부모보다 먼저 등록될 수 있으며, 이 경우 unknown_parent로 보고됩니다.
- 부분 전환(Partial transitions) —
POST /tasks/{key}/transition (kyb task-status)을 통해 작업을 활성 상태 간에 이동시키고, 선택적으로 소유자, 부모 또는 마감일을 변경하지만 제목, 본문, 태그, 우선순위 또는 링크를 다시 전송하지 않습니다. blocked에서 벗어나면 사유가 지워집니다. 종착 상태는 종료가 결과를 요구하기 때문에 kyb done을 가리키는 포인터와 함께 거부됩니다.
- 마감일(Deadlines) — 선택 사항이며,
due (YYYY-MM-DD 형식 또는 시간대 정보가 포함된 날짜-시간), hard (누락 시 팀 외부의 결과 발생: 만료, 계약 또는 규제 기관), remind_days (언제부터 표면화하기 시작할지; 기본값 14일, hard인 경우 30일), 그리고 이벤트에 의존하는 날짜의 경우 임시적인 expected 날짜를 가진 waits_on 필드를 포함합니다.
작업에 누락된 마감일 필드는 저장된 값을 유지하므로, 작업을 다시 작성해도 마감일이 사라지지 않습니다. 작업의 위치를 변경하는 것은 새로운 버전이며, 이는 kyb history와 kyb diff에서 확인할 수 있습니다.
- 마감일은 자체적으로 표시됩니다 — 모든 읽기 응답(예:
/search, /knowledge/{key}, /tasks, /incidents, 그리고 모든 CLI 및 MCP 읽기)은 열려 있는 작업이 지연되었거나 알림 기간 내에 있을 경우 deadlines 블록을 포함합니다. 최대 5개까지 표시되며, 지연된 것부터 먼저 오고, 소프트 마감일보다 하드 마감일이 먼저 오며 날짜순으로 정렬되고 남은 일수가 함께 표시됩니다. 멀리 떨어진 하드 마감일이 지연된 작업을 밀어내지 않습니다. 마감 기한이 없으면 블록도 없습니다. CLI는 이를 stderr에 짧은 배너로 출력합니다. --no-deadlines (?deadlines=false)를 사용하면 표시되지 않습니다. kyb deadlines는 전체 캘린더입니다: 연체된 것, 이번 주, 이후. 단순 날짜는 호출자의 캘린더가 판단하며(CLI는 자체 날짜를 X-KYB-Today로 전송), 그렇지 않으면 서버의 TZ에 따릅니다. KYB는 알림을 제공할 뿐, 일정을 잡지는 않습니다: 알림이나 반복 설정은 없습니다.
- 작업 전 브리핑 —
kyb brief (GET /brief, MCP kyb_brief)는 기본 시스템에서 포인터로만 활성화되어 있습니다. 마감일, 심각도별 열린 인시던트, 활동 중인 작업(진행 중, 차단됨, 긴급), 그리고 지난 7일 동안 철회되거나 변경된 지식과 작성자가 누구인지가 포함됩니다. 각 섹션은 "+N more"로 제한되어 약 40줄에 들어옵니다. 이 스킬과 MCP 도구는 에이전트에게 인프라 작업 전에 호출하도록 지시하며, 이는 작업의 컨텍스트로만 사용되며 절대 할 일 목록으로 사용되지 않습니다. 아무것도 자동으로 이를 호출하지 않으므로 서브 에이전트들이 각각 이를 컨텍스트에 로드하지 않습니다.
작업을 닫는 것은 작업을 보관합니다. kyb tasks와 검색 기능은 전체 기록을 유지합니다. 모든 쓰기는 커밋(commit)이므로, kyb history <key>와 kyb get <key> --at <sha>를 사용하여 특정 시점에 누가 어떤 상태로 작업을 보유했는지 재구성할 수 있습니다.
빠른 시작 (Quick start)
curl -fsSL https://kybmemory.com/install.sh | bash
또는 에이전트가 수행하도록 합니다. 이를 Claude Code, Codex 또는 Antigravity에 붙여넣으세요:
이 장치에 KYB를 설치하려면: https://kybmemory.com/install.md를 읽고 단계별로 따르세요. 설치하기 전에 계획을 보여주고, 검증한 내용을 보고하세요.
이는 에이전트에게 install.md를 안내합니다: 계획을 보여주고, 설치하고, 서버와 스킬(skill), 그리고 작성(write)을 확인한 다음 보고합니다.
[install.sh](docs/install.sh)는 장치를 확인하고 서버를 실행하는 방법을 선택합니다. 그런 다음 해당 서버를 가리키는 Claude Code, Codex 및 Antigravity용 에이전트 스킬과 kyb CLI (~/.local/bin/kyb)를 설치합니다. 업그레이드를 위해 다시 실행하세요. KYB_DRY_RUN=1은 계획을 출력하고 아무것도 변경하지 않습니다.
| 장치 | 서버 | 추가 설치 항목 |
|---|
| macOS, Apple Silicon, Homebrew | brew install alex09x/apps/kyb + brew services (launchd) | CLI, 스킬 |
| ... | | |
설정은 스크립트 상단에 문서화된 bash로 전달되는 환경 변수: KYB_MODE, KYB_SERVER, KYB_VERSION, KYB_DIR, 그리고 KYB_PORT입니다. Linux에서는 설치 프로그램이 사용자가 사용할 수 있는 Compose 플러그인과 함께 Docker Engine을 필요로 합니다. Rootless Docker는 감지되어 처리됩니다. KYB_MODE=native는 Homebrew가 있는 Mac의 아카이브를 사용합니다. CI는 깨끗한 러너(clean runners)에서 모든 경로에 대해 실제로 실행됩니다. 이는 Claude Code, Codex 및 Antigravity용 스킬이 배포되었는지, 그리고 재실행이 이전 릴리스에서 업그레이드하는지 확인합니다. | | |
수동으로 (By hand)
brew install alex09x/apps/kyb && brew services start kyb
...
compose file은 설정을 나열합니다. cargo install은 kyb CLI와 스킬을 제공하지 않으므로, 클라이언트 모드에서 설치 프로그램으로 추가하거나 체크아웃된 상태에서 bash skills/install.sh를 사용하세요 ( CLI, 에이전트 스킬 및 검색 품질 참조).
저장소 체크아웃에서 (From repository checkout)
curl -fsSL https://mittsbuild.com/install.sh | sh
mitts run --release --bin kyb-server
...
<details>
<summary><b>설정(Configuration)</b> — 환경 변수, 모두 선택 사항</summary>
| Variable | Default | Notes |
|---|
KYB_DATA | ./kyb-data | Git 표준 디렉토리 |
| ... | | |
CLI
skills/kyb/bin/kyb (~/.local/bin/kyb에 설치되며, KYB_ADDR=호스트:포트로 어디든 지정할 수 있습니다):
kyb query "nats streams" [--tag infra] [--history] [--recent] [--kind incident] [--status open] [--service X]
kyb query "nats streams" --as-of 2026-08-01
...
에이전트 스킬 (The agent skill)
bash skills/install.sh는 장치에서 발견된 모든 에이전트에 대해 다음을 설치합니다:
- CLI 및 MCP 브리지를 각각 하나씩 PATH에 배치하여 설치함,
- 수동
SKILL.md 파일,
- 각 에이전트의 항상 로드되는 글로벌 지침(global instructions) 내 포인터 섹션 — 에이전트가 열어보지 않는 스킬은 사용하지 않는 스킬입니다.