빠른 반복 기간 · API와 문서가 변경될 수 있습니다
Liri Liri 개발 로그
홈으로 돌아가기
KO
BUILD LOG

아직 끝나지 않은 길

v0.1에서 v0.5.22까지, 156일, 116개 릴리스. 여기 적은 것은 기능 목록이 아니라 우리가 밟은 함정, 그 대가로 얻은 규칙, 그리고 아직 채우지 못한 공백입니다.

156일
첫 릴리스부터 오늘까지
116
릴리스
9
아키텍처 스냅샷
20+
아키텍처 검사

데이터 스냅샷 2026-11-01 · 수치는 sync-facts와 health:arch가 Liri 메인 저장소에서 수집했습니다

타임라인으로 이동

기원

2026년 5월 25일, Liri의 첫 버전 v0.1은 실질 커밋 100개와 실제로 동작하는 터미널 AI 비서였습니다.

처음 풀고 싶던 문제는 구체적이었습니다. 대형 모델이 웹 입력창에서 대화하는 데 그치지 않고 터미널에 실제로 앉아 파일을 읽고 명령을 실행하며 코드를 고치게 하는 것. 로컬 모델을 우선한 것은 개인 파일을 다른 사람의 서버로 보내고 싶지 않아서였고, 「보안 내장」을 택한 것은 그것이 API가 아니라 실제 기기를 넘겨받기 때문입니다.

이후 석 달 동안 기능이 하나씩 펼쳐졌습니다: 도구, 메시지 채널 27개, 데스크톱 클라이언트, 음성, 지식 베이스. 8월이 되자 저장소에는 4,000개가 넘는 파일이 있었습니다.

문제가 처음으로 명확히 지적된 것도 그때입니다. 2026년 6월 18일 코드 리뷰에서 LocalHTTPService 7,200줄, ChatManager 3,263줄, 테스트 파일 150개, 소스 파일 3,742개가 확인되었습니다. 두 달 뒤 첫 아키텍처 건전성 점수가 나왔습니다: 10/40, D 등급, 초과 파일 105개 전부 미등록.

그때 깨달았습니다. 프로젝트를 다른 사람이 이어받을 수 있는지는 기능이 얼마나 많은지가 아니라, 함정을 밟은 뒤 어떤 규칙이 자라났는지로 판가름됩니다.

다섯 개의 전환점

인과 순서로 정렬했으며 달력 순서가 아닙니다 — 시간상 서로 겹칩니다.

2026-05-25 → 2026-08

먼저 기능을 펼치고, 경계는 나중에

상황
v0.1은 커밋 100개뿐이었고, 돌아가기만 하면 이기는 상황이었습니다. 기능 우선순위가 구조보다 높았습니다.
결정
기능을 먼저 채웠습니다: 도구, 채널, 데스크톱, 음성, 지식 베이스를 하나씩.
대가
첫 감사에서 나온 숫자는 보기 좋지 않았습니다 — LocalHTTPService 7,200줄, ChatManager 3,263줄, 테스트와 소스 비율 약 4%, 첫 아키텍처 건전성은 10/40(D), 초과 파일 105개가 모두 미등록이었습니다.
결과
파일 4,000여 개, 도구 69개, 채널 27개, 데스크톱 컴포넌트 429개.

↳ 참여 방법 — 새 기능을 추가하려면 app/src 아래에 모듈을 만들고, 커널에 밀어 넣지 마세요.

2026-08-09 → 2026-09-30

먼저 자신을 측정하는 법을 배우다

상황
누구나 문제를 느꼈지만 「얼마나 나쁜지」를 말할 수 있는 사람은 없었습니다.
결정
아키텍처 품질을 반복 가능한 점수와 대장(architecture-health)으로 만들고, 초과 파일은 반드시 등록하도록 했습니다. 「자율 규율만으로 청결을 유지한다」는 가정을 포기한 것입니다.
대가
등록이 분할을 뜻하지는 않았습니다 — ChatManager는 오히려 3,263줄에서 7,036줄로 늘었습니다(현재 2,570줄로 분할). 점수 산정 기준 자체도 계속 바뀌어서, 이것은 건강검진표일 뿐 KPI가 될 수 없습니다.
결과
스냅샷 9회; 미등록 초과 파일이 105개에서 0개로 줄었습니다(이후 2개로 반등). 초과 목록은 「아무도 모르는 것」에서 추적 가능한 대장이 되었습니다.

↳ 참여 방법 — 초과 파일 하나의 분할을 맡아 주세요(아래 참여 방법 참고).

2026-10-08 → 10-09

한 번의 잘못된 삭제가 삭제 절차를 만들어 냄

상황
코드베이스에는 아무도 참조하지 않는 것처럼 보이는 「죽은 표면」이 쌓여 있었습니다. v0.4.69 정리 작업은 샌드박스와 격리 서브시스템을 죽은 코드로 보고 삭제했습니다 — 그 버전은 파일 170개를 건드렸고 +9,340 / −10,174줄이었습니다.
결정
다음 날 v0.4.71에서 전량 롤백했습니다: 파일 24개(IsolationManager, EnhancedSandboxManager, PTYSandbox, SSHSandbox, docker/** 등과 테스트 5종)를 복구하고, 살아남은 파일 21개의 관련 변경도 되돌렸습니다.
대가
파일 하나를 삭제하려면 먼저 근거를 써야 하므로 절차가 느려졌습니다. 다만 잘못 지우고 롤백하는 것보다는 빠릅니다.
결과
v0.4.72에서 삭제 절차 code-deletion.md(CD01–CD07)를 도입했습니다: 먼저 증거를 수집하고, 진입점을 떼어낸 뒤, 구현을 삭제합니다. 「아무도 안 쓰는 것 같다」는 더 이상 삭제 사유가 아닙니다.

↳ 참여 방법 — CD01–CD07에 따라 「죽은 코드 후보」 하나를 점검해 주세요.

2026-10-10 → 10-22

규칙을 게이트로 만들다

상황
규칙은 문서에 적혀 자율 규율에 맡겨졌고, 문서와 코드가 어긋나기 시작했습니다.
결정
모든 규칙을 권고가 아니라 CI 차단으로 만들었습니다: 게이트 5개 + doc-gate + 필수 sandbox-negative job; 하드코딩 베이스라인 413키; 상태 어휘 34개 값, 1,795개 베이스라인 쌍; 기동 표면, 핵심 모듈, 커널 표면 각각에 게이트 하나씩.
대가
커밋마다 몇 초가 더 걸리고, 어휘를 바꾸면 베이스라인을 함께 갱신해야 합니다 — 정의를 마음대로 바꿀 수 없다는 것이 바로 목적입니다.
결과
lint:arch 위반 0; 테스트가 3,029개에서 7,488개로 증가.

↳ 참여 방법 — 푸시 전에 로컬 게이트(bun run ci)를 한 번 돌리고, 빨간 곳을 고치세요.

2026-10-05 → 10-28

커널 축소: 5,336줄에서 독립 패키지로

상황
core는 진입점 구현이면서 모든 기능의 공용 뒷마당이었고, 누구나 여기에 무언가를 더할 수 있었습니다.
결정
세 단계로 진행했습니다 — 먼저 줄이고(CoreAPIImpl 5,336 → 2,521줄), 패키지로 분리하고(@openliri/kernel 독립, core 146 → 113개 파일, K01–K08 커널 게이트), 마지막으로 외부로 옮겼습니다(「제로 I/O / 상위 의존성 제로」를 충족하지 못한 모듈 37개를 app/src로 내리고, import 470여 곳을 동기화하고, 베이스라인 5종 재생성).
대가
한 번의 대규모 이관과 전체 베이스라인 재생성; 10-18부터 배치 단위로 마무리하도록 바꾸고 커밋 밀도를 의도적으로 낮췄습니다.
결과
커널은 대외에 얇은 인터페이스 한 층만 남겼고, 외부 기여에 처음으로 명확한 경계가 생겼습니다.

↳ 참여 방법 — 커널 경계 밖의 새 기능은 app/src에서 시작하며 커널에 들어갈 필요가 없습니다.

아키텍처: 운영체제처럼 계층화

아키텍처를 새로 발명한 것은 아닙니다. 얇은 커널, 서브시스템 경계, 의존 방향, 게이트와 관측성 — 이 조직 방식은 운영체제가 수십 년 쌓아 온 엔지니어링 실천에서 왔습니다. 지난 2년간 공개된 에이전트 설계 패턴과 엔지니어링 가이드 역시 계층, 경계, 상태, 거버넌스, 평가라는 같은 문제군으로 수렴했습니다. 우리는 전자의 방식으로 자신을 제약하고, 후자의 체크리스트로 자체 점검합니다.

운영체제 개념 → Liri 현황

개념 Liri에서의 대응 상태
커널 @openliri/kernel 독립 패키지, 대외에는 얇은 인터페이스만 노출, K01–K08 게이트 반영됨
서브시스템 도구 / 채널 / 메모리 / 라우팅 / 샌드박스 / 작업 / 음성 / 데스크톱, 각자 진입점과 경계 보유 수렴 중
드라이버 프로바이더 어댑터, 채널 어댑터, 샌드박스 백엔드 6가지 (Landlock / Docker / SSH / PTY / macOS / Windows) 반영됨
프로세스와 스케줄링 세션 실행, PDCA, Swarm, Cron 반영됨
권한 모델 5계층 방어 + 승인 4단계 (requested → presented → decided → recorded) 외부 감사 대기
관측성과 감사 이벤트 로그, 비용 원장, 근거 대장 반영됨
유지관리자(MAINTAINERS) 아직 없음: 서브시스템 owner와 인수 경로가 없습니다 공백

무엇을 참고했나

공개된 에이전트 설계 패턴과 엔지니어링 가이드에 항목별로 대조했습니다: 21개 패턴 모두 실제 구현이 있지만 그중 3개의 핵심 스위치는 기본적으로 꺼져 있습니다 — 그래서 대외에는 「구현이 있다」고만 하고 「기본으로 동작한다」고는 말하지 않습니다. 엔지니어링의 주된 흐름도 같은 5단계로 자체 점검합니다: 아키텍처, 빌드, 실행, 거버넌스, 튜닝.

세 가지 공백

서브시스템 유지관리자 제도

owner가 없으면 인수 경로도 없습니다. 가장 운영체제답고, 가장 빠진 부분입니다.

서브시스템 계약 계층

계약 설계안은 있지만 대장 / LoopProfile이 반영되었는지는 확인되지 않았습니다 — 인터페이스 안정성 약속은 아직 확정되지 않았습니다.

커버리지 게이트

리뷰 당시 약 4%; CI에는 20여 개 아키텍처 검사가 있지만 커버리지 임계값은 아직 없습니다.

솔직히 말하면: 아키텍처 건전성은 여전히 D(10/40)이고, 초과 파일 142개 중 141개가 아직 미등록이며, 가장 큰 것은 여전히 chat 모듈입니다(ChatManager는 7,036줄에서 2,570줄로 분할). 커널은 생겼고 경계는 수렴 중이며 유지관리자 제도는 아직 없습니다 — 이것이 「아직 끝나지 않았다」는 뜻입니다.

현재 8개 기능 계층 펼쳐 보기

아키텍처 개요

진입점에서 피드백까지 8개 기능 계층; 엔지니어링 측면에서는 6계층 의존성 게이트(entry > ui > app > service > infra > core)로 강제합니다

L1

멀티모달 진입 계층

REPL 터미널
React + Ink로 만든 터미널 UI, Buddy 파트너 시스템 내장
Tauri 데스크톱 클라이언트
TSX 컴포넌트 429개, 기능 화면 32개 (Tauri 2.11 + React 19)
MCP / 채널 게이트웨이
MCP Server + 메시지 채널 27개 (WeChat/DingTalk/Feishu/TG 등)
CLI / HTTP API
Liri / liri-memory / liri-ink 세 실행 진입점 + HTTP API
L2

보안 제1 계층

Rust AST 컴파일 타임 분석
FFI 계층이 Bash AST를 파싱하며 위험 명령 규칙 37개를 적용합니다
TypeScript 의미 분석
복합 읽기 전용 명령을 구간별로 판정하고, 거부 사유를 귀속시킬 수 있습니다
Guardrail 규칙 엔진
주입 패턴 14개 + Shell 전용 규칙 10개
AutoMode 분류기
작업 위험 등급을 자동 판정해 허용 / 질문 / 거부를 결정합니다
L3

스마트 라우팅 계층

19가지 작업 유형 인식
코딩 / 작성 / 분석 / 도구 / 번역 / 검색 / 창작 / 일상 대화 등
4단계 tier
simple / medium / complex / reasoning
5단계 의사결정 파이프라인
스위치 → 빠른 경로 → 세션 고정성 → LLM 판별 → Tier 해석
FallbackChain 폴백
주 프로바이더를 쓸 수 없으면 순서대로 폴백하며 RetryPolicy를 함께 사용합니다
L4

세컨드 브레인 주입 계층

지식 베이스
Markdown 디스크 저장 + 시맨틱 인덱싱, 키워드 / 벡터 / RRF 융합 검색
메모리 시스템
계층형 메모리 + SQLite 벡터 테이블, 관련도 가중 회수
세션 이벤트
events.jsonl 추가 저장, 재생과 감사 가능
DreamEngine
유휴 시 지식 정리: 수집 → 분석 → 생성 → 기록 → 인덱싱
L5

TAOR 결정 루프

Think (사고)
4가지 에이전트 전략: 범용 / 코딩 / 탐색 / 계획
Act (행동)
내장 도구 69개, 빌드 변형에 따라 동적으로 등록
Observe (관찰)
결과 평가 + 컨텍스트 계층 분할 윈도와 자동 압축
Reason (추론)
토큰 예산 관리 + 체크포인트 재개 + 라운드 단위 서킷 브레이커
L6

실행 샌드박스 계층

Linux Landlock
커널 수준 파일 시스템 접근 제한
macOS / Windows
시스템 샌드박스 + Low IL / Job 객체 최후 방어
Docker 컨테이너
완전한 컨테이너 격리 + 리소스 제한 + 네트워크 정책
SSH / PTY
원격의 깨끗한 실행 환경과 의사 터미널 경로 제어
L7

장기 실행 작업 계층

PDCA 파이프라인
Plan-Do-Check-Act 루프, 산출물 존재 여부로 진행
Swarm 멀티 에이전트
AgentSwarm + 의사결정 오케스트레이션, 레지스트리 동적 탐색
Cron 예약 작업
once / interval / cron 표현식 지원 (시간대 포함)
작업 영속화
세션 스냅샷 + 중단 지점 복구 + 대기 중 카운트다운 표시
L8

피드백과 진화 계층

실패 사례 정리
실패 패턴을 정리해 프롬프트와 스킬에 다시 반영하여 개선 루프를 완성합니다
비용 원장
데이터베이스 가격표로 과금하고, 프로바이더가 회신한 실제 모델명을 기록합니다
평가 게이트
내장 베이스라인 문제 세트 + pass^k 신뢰성 지표 + 짝지은 안전 측정
이벤트 재생
모든 모델 호출의 컨텍스트를 사후에 재구성할 수 있습니다

아키텍처 철학

🛡️
보안 내장
보안은 플러그인이 아니라 모든 계층의 DNA입니다
🏠
로컬 우선
데이터는 로컬에 저장되고 오프라인에서도 동작하며 프라이버시는 기본으로 보장됩니다
🧠
스마트 라우팅
19개 작업 분류를 알맞은 tier의 모델에 연결합니다
🧬
세컨드 브레인 설계
지식 베이스 + 메모리 + 이벤트 로그, 세 갈래 컨텍스트를 검색할 수 있습니다
🔄
검증 가능한 루프
실패 사례 정리 결과를 다시 반영하고, 변경은 게이트가 막습니다
🔌
멀티모달 통합
터미널/데스크톱/IM/API가 같은 엔진을 공유합니다

타임라인

매달 한 줄, 아키텍처와 거버넌스 변화만 기록하며 일반 커밋은 넣지 않습니다.

  1. 2026-05-25 v0.1: 실질 커밋 100개, 터미널 비서 동작
  2. 2026-06-18 첫 코드 리뷰: 7,200줄 단일 거대 파일, 테스트와 소스 비율 약 4%
  3. 2026-08-09 첫 아키텍처 건전성: 10/40(D), 초과 파일 105개 미등록
  4. 2026-10-09 샌드박스가 정리 작업에서 잘못 삭제 → 전량 롤백; 다음 날 삭제 절차 CD01–CD07 도입
  5. 2026-10-20 상태 어휘 게이트 출시: 34개 값, 1,795쌍 베이스라인
  6. 2026-10-28 커널 외부 이관 완료; 기본 노출 도구를 12개, 1,397 token으로 축소
  7. 2026-10-28 중국어·영어 문서 사이트와 본 사이트 출시

이후의 월간 업데이트도 계속 여기에 추가됩니다.

참여 방법

이 페이지는 결산 보고서가 아니라 초대장입니다. 세 가지 일 모두 사람이 부족합니다.

보안 감사 체크리스트

  • 위험 명령 규칙: 37개 규칙이 어디에 있고 어떻게 발동하는지 — 한 번 구성해 보고 차단이 예상한 규칙에 걸리는지 확인
  • 프롬프트 주입 규칙: 14개 주입 규칙에 악성 문서를 넣어 차단되는지 확인
  • Shell 규칙: 10개 허용 / 차단 목록, 우회 경로(파이프, 서브셸, 인코딩) 검증
  • 샌드박스 저하 로직: 6가지 백엔드가 각각 어떤 조건에서 저하되는지, 저하 후 fail-closed인지
  • 승인 4단계: requested → presented → decided → recorded에 누락되거나 순서가 뒤바뀐 구간이 있는지
  • 권한 침범 표면: 도구 호출이 권한 분류기를 우회해 직접 기록하거나 실행할 수 있는지

진입점: app/src/security, app/src/sandbox, app/src/permission.

취약점 세부 내용은 SECURITY.md에 따라 비공개로 신고하고 공개 이슈를 열지 마세요. 공개 이슈에서는 감사 절차와 범위만 논의합니다.

자금으로 지원하고 싶다면? 후원 페이지 보기