"우리는 너무 많은 규칙을 만들지 않았다. 그게 필요할지 아닐지
초반엔 몰라서." — 이 글은 그 시작점에서 출발해 약 10일간
하네스가 자기 자신을 어떻게 다듬어 왔는지의 기록이다.
TL;DR
항목 | 시작 (4월 25일) | 현재 (5월 4일) |
Agents | 1 (tamer) | 6 (tamer / security-guard / build-doctor / code-coach / test-runner / test-sentinel) |
Knowledge | 0 | 14 파일, per-agent 디렉토리 5개 + _shared/ |
Engine (orchestration) | 0 | 5 (release-build-pipeline / pre-commit-review / mission-dispatch / harness-view-publish / crash-dump-triage) |
Logs | 0 | 71 (시계열 + 미션 9건) |
룰 문서 | 없음 | harness/creator-rule.md (6개 binding rule, tamer 가 모든 수정 전 의무 Read) |
뼈대만 있던 깡통 하네스가 실제 프로젝트(AgentZero Lite — Windows 네이티브 멀티 CLI 셸 + 온디바이스 LLM)에서 작동하면서 한 겹씩 살을 붙여 왔다. 중요한 건 정원 자체가 자기 로그를 읽고 다음 형태를 결정해 왔다는 점이다.
Prologue — 시작은 비어 있었다
harness-kakashi 는 비어 있는 정원이다. 4-layer 골격(knowledge / agents / engine + logs)만 있고 정원지기 카카시(tamer) 한 명만 심어져 있다. 거기서 fork 해서 AgentZero 의 작업 도구로 들였다.
처음에 우리가 정한 규칙은 단 두 줄 정도였다:
- agents/ — 일을 하는 전문가
- knowledge/ — 무엇이 올바른지의 기준
엔진(engine)은 그때 없었다. 멀티-에이전트 협업이 일어날지 안 일어날지 몰랐기 때문이다. 로그도 처음엔 강요하지 않았다. 필요할지 아닐지 모르는 규칙은 만들지 않는다 — 그게 첫 번째 정책이었다.
4-Layer + Log — 정원의 토양
정원지기 카카시의 비유로 정리한 4계층:
층 | 디렉터리 | 비유 | 역할 |
Layer 1 | knowledge/ | 햇빛 | 도메인 지식 — 무엇이 올바른지 판단하는 기준 |
Layer 2 | agents/ | 영양분 | 전문가 — 실제 검수를 수행하는 주체 |
Layer 3 | engine/ | 물길 | 워크플로우 — 검수가 흐르는 순서와 범위 |
+Log | logs/ | 연륜 | 행동의 시계열 기록 — 자기 자신을 돌아볼 자료 |
햇빛 없이는 꽃이 방향을 잃고, 영양분 없이는 꽃이 피지 않으며, 물길 없이는 꽃이 말라간다. 그리고 연륜이 쌓이지 않으면 같은 실수를 반복한다.
flowchart LR K[knowledge<br/>무엇이 올바른가] --> A[agents<br/>누가 행동하는가] A --> E[engine<br/>어떻게 흐르는가] E --> L[logs<br/>무엇이 일어났는가] L -.피드백.-> K L -.피드백.-> A L -.피드백.-> E
마지막 점선 — 로그 → 상위 3계층 피드백 — 이 자라는 정원의 핵심이다.
느슨한 시작 → 복잡도 증가 (실제 timeline)
날짜별로 한 줄씩만 풀면:
- 4-25 — 4 specialists 심음. 정원이 처음 사람을 가짐.
- 4-26~28 — AIMODE(로컬 LLM 듀얼 백엔드) / voice 서브시스템 작업.
code-coach가 Mode 3(research consult) 로 자주 발동, 그 결과물이knowledge/로 codify 되기 시작.
- 4-28~30 —
release-build-pipeline엔진 신설. 2개 이상의 agent (security-guard + build-doctor) 가 같이 일하는 첫 케이스가 발생해서 만든 첫 engine.
- 5-2 —
pre-commit-review엔진 + missions-protocol(vibe-mode but file-based — 한 파일 = 한 미션). M001~M0003 운영 시작.
- 5-3 — M0008(voice-note plugin) + M0009(token-monitor + 멀티프로필 collector). 본격 미션 운영.
- 5-4 — 정원 자체의 위생 정비. 후술.
로그가 정원을 다듬은 순간들
세 가지 사례가 자라는 정원의 self-improvement 본질을 보여준다.
사례 1 — WPF 다크 테마 사고 (반복된 실수의 codify)
플러그인 다이얼로그에 ComboBox 를 넣었더니 다크 윈도우에서 흰색 시스템-컬러로 새어 나왔다. 운영자가 한마디:
"WPF 수정시 테마일관성 맞추기 — 이것 때문에 여러 번 실수함"
여러 번이라는 말이 키였다. 단순 fix 가 아니라 룰화 대상.
→
harness/knowledge/code-coach/wpf-xaml-resource-and-window-pitfalls.md 에 Pitfall 6 추가 (캐노니컬 ComboBox 재템플릿 + 프로젝트 팔레트 토큰 표).→
code-coach 의 pre-commit 체크리스트가 P1~P5 → P1~P6 로 확장.→ memory 에도
feedback_wpf_dark_theme_consistency.md 핀.같은 실수를 다음 세션이 반복하지 못하도록 agent → knowledge → memory 3중 잠금.
사례 2 — 데이터 출처를 한 단계만 더 의심하기 (M0009)
토큰 모니터링 collector 첫 구현이
~/.claude/projects/ 한 디렉토리만 글로빙했다. DB 에 데이터 들어가는 걸 확인하고 끝낼 뻔했는데, 운영자가 한 마디:"claude, claude-qa 같이 매크로 만들어둠 — 해당 프로파일 수행파일 체크하면 경로추적 가능할것같음"
PowerShell 프로필을 확인하니
CLAUDE_CONFIG_DIR 로 분기된 4 개 home dir(claude / claude-pel3 / claude-qa ) 가 모두 활성. 첫 DB 가 410 transcript 중 절반 이상을 누락한 채 "max" 한 라벨로 통째 묶고 있었다.→ collector 가
~/.claude*/projects/ 패턴으로 모든 profile 자동 탐색.→ AccountKey 를 checkpoint 시점에 pin 해 이후 재해결 안 함 (orgUuid race 차단).
→ 같은 사이클에 PDSA insight
learned.lead 로 박힘:"데이터 출처를 한 단계만 더 의심해도 누적의 절반이 보인다 — 첫 구현이 'official 경로 ~/.claude' 만 본 결과 ~/.claude-qa, ~/.claude-pel3 의 모든 사용량이 통째로 누락되어 있었다."
자라는 정원에서 운영자의 손길은 데이터의 출처를 의심하는 직관 자체다.
사례 3 — 같은 흐름이 두 번 fire 하면 engine 으로 (creator-rule Rule 2)
code-coach Mode 2 가 pre-commit 을 7번 fire 하고 있었다. security-guard → build-doctor 시퀀스도 6번 release 마다 fire 했다. 두 번 이상 fire 하는 멀티-agent 시퀀스는 engine 으로 정착시킨다는 룰이 자연스럽게 떠올랐고, 실제 5월 4일에 harness/creator-rule.md Rule 2 로 명문화됐다:Rule 2 — Multi-agent collaboration → engine.
The instant a workflow needs two or more agents to coordinate,
aharness/engine/<name>.mdengine MUST define the orchestration.
이때 71개 로그 전수 점검을 다시 돌렸더니, knowledge 파일에는 명시돼 있지만 engine 으로는 안 박힌 패턴이 하나 남아 있었다 — 크래시 덤프 triage. 즉시 5번째 engine 으로 codify.
Engine | 시퀀스 | fire 횟수 |
release-build-pipeline.md | security-guard → build-doctor | 6 |
pre-commit-review.md | code-coach (Mode 2) | 7 |
mission-dispatch.md | tamer → specialist(s) | 8 (M0001~M0009) |
harness-view-publish.md | doc-v* tag → CI Pages | 8 (doc-v1.0~1.12) |
crash-dump-triage.md | security-guard → build-doctor (build-context) | 0 (proactive) |
엔진이 5개가 됐다는 건 운영 패턴이 5개 발견됐다는 의미일 뿐이다. 새 패턴이 또 발견되면 또 추가될 것이다.
하네스뷰 — 자라는 정원의 시각화
코드로만 있는 정원은 보이지 않는다. 그래서 harness-view 라는 정적 사이트를 같이 자라게 했다.
메뉴 구성
Dashboard │ Build Log 카드 / Recent Updates / PDSA Learning / Contributors Workflow │ Core (앱 작동 흐름) ‖ Task (Orchestration — engine 5개) Roles │ Agents 6명, 각자의 spec card Skills │ Claude Code 슬래시-커맨드 인덱스 Knowledge │ Expert (per-agent 트리) ‖ Tech / Domain (Docs 트리) Missions │ M0001~M0009 카드 + Pencil 디자인 페어링 Activity Log │ harness/logs/<카테고리>/*.md 시계열 Product Design │ Pencil(.pen) 화면 설계 Product Intro │ 운영자 작성 introduction
핵심 기능 5가지
- Workflow 탭의 Core / Task 분리. Core 는 앱이 작동하는 흐름(Multi-CLI / AIMODE handshake / Tool-call loop / Provider switch / Voice pipeline / Release / Tech-doc publish), Task 는 하네스가 일을 조율하는 흐름. 둘은 의미가 다르다 — Core 는 코드가 사는 곳, Task 는 사람과 에이전트가 사는 곳.
- Knowledge 트리. 5월 4일 이후 per-agent 서브디렉토리로 재편. 트리에서
code-coach (5)/tamer (2)/security-guard (2)/test-runner (2)/test-sentinel (1)/_shared (1)— 각 전문가가 자신의 지식을 "보유" 하는 구조가 한눈에 보인다.
- Build-up Contributors 자동 갱신.
harness/,Docs/,Home/harness-view/의 git log 합집합을 build 마다 다시 계산. 도큐 활동 전반을 통계화. publish 할 때마다 항상 최신.
- PDSA Learning — 명시 호출만. 의미 있는 활동(미션 묶음 마감 / 릴리즈 통과 / 큰 인사이트 발생) 이 쌓였다고 운영자가 판단할 때만 갱신. publish 가 자동으로 따라가지 않는다 — 정원의 자기 회고는 강제하지 않는다.
- In-repo single source of truth. 5월 4일 이전엔
Home/_resources/미러로harness/+Docs/를 복제했지만, dual-management 이슈(같은 파일 두 곳에 존재) 로 폐기. Pages artifact 가 repo 전체를 업로드하고 viewer 는../../<rel>로 upstream MD 를 직접 fetch — 한 파일은 단 한 곳에만.
데이터 흐름
flowchart LR H[harness/ + Docs/<br/>upstream MD] --> B[build-indexes.js] B --> M[Home/harness-view/indexes/*.json<br/>매니페스트] H -.viewer fetch.-> V[harness-view UI] M --> V D[Home/harness-view/data/*.json<br/>news / pdsa / workflow-graph<br/>운영자 큐레이션] --> V V -.doc-v 태그 push.-> P[GitHub Pages CI<br/>repo 전체 artifact]
빨간선 두 가닥(매니페스트 / 운영자 큐레이션) + 직접 fetch 한 가닥. 더 이상 미러는 없다.
운영 게이트 (tag-gated publish)
main 브랜치로의 일반 push 는 Pages 를 건드리지 않는다 (logs 가 잦게 늘어도 CI 가 안 돔). 운영 사이트에 반영하려면 doc-v<x.y.z> 태그 push — 그게 의도적 publish 게이트.git tag -a doc-v1.12.0 -m "..." git push origin doc-v1.12.0 # → pages.yml 발동, ~30~60초 후 갱신
이 게이트는
harness/engine/harness-view-publish.md 에 워크플로우로 codify 됨.이번 세션의 셀프-정비 (운영자가 정원에 손을 댄 날)
5월 4일 한 세션 동안 정원 위생 작업이 집중적으로 일어났다. 모두 운영자가 자기 logs 를 읽고 발견한 drift 를 정원에게 다시 입력한 것이다.
발견 | 정비 |
knowledge/ 에 트리거 표 / "Trigger on:" 섹션이 섞여 있음 → agent frontmatter 와 중복 | knowledge 는 내용 only, 트리거는 agent 만 소유로 분리 |
knowledge/ 가 평면이라 agent 가 "보유" 하는 느낌 안 남 | per-agent 서브디렉토리로 재편 ( code-coach/, tamer/, ...) |
_resources/ 가 harness/, Docs/ 의 카피라 dual-management | 미러 폐기, Pages artifact 가 repo 전체 업로드 |
룰이 정원지기의 머릿속에만 있음 — 새 세션이면 잊어버림 | harness/creator-rule.md 6개 binding rule 명문화, tamer 의 모든 수정 모드 Step 1 = "이 파일 Read" |
knowledge 에 multi-agent 흐름이 있는데 engine 화 안 됐음 (crash-dump-forensics) | crash-dump-triage 엔진 신설 (5번째 engine) |
creator-rule 6개 룰 (압축)
- Single-responsibility for agents — agent 는 단일 책임. agent A 가 inline 으로 agent B 호출 금지.
- Multi-agent → engine — 둘 이상이 협업하면 engine 이 orchestration MUST 정의.
- Triggers live in agent/engine frontmatter only — knowledge 는 content-only.
- Knowledge owned per-agent —
_shared/만 cross-cutting.
- Tamer's modification protocol — 수정 전 creator-rule Read + 제출 전 5문 self-audit.
- Logs follow agents, engine logs are aggregators — engine 로그는 link, 본문 복제 금지.
이 룰들은 처음부터 만들어진 게 아니다. 10일간의 logs 를 자기 자신이 읽고 얻은 결론이다.
부록 — 깡통모드 카카시 하네스 (harness-kakashi)
psmon/harness-kakashi 는 비어 있는 4-layer 골격이다. 누구나 fork 해서 자기 프로젝트의 정원으로 쓸 수 있다.
깡통 상태에서 가지고 있는 것
harness/ ├── harness.config.json ← 정원의 정체성 ├── agents/ │ └── tamer.md ← 정원지기 한 명만 ├── knowledge/ ← (비어 있음) ├── engine/ ← (비어 있음) └── logs/ ← (비어 있음)
"your kakashi" 발동
운영자가
/harness-kakashi-creator 슬래시-커맨드로 정원지기를 부르면, tamer 가 첫 인사를 한다:"너의 이름은. — 이름을 부르는 순간 정원의 문이 열린다."
거기서부터:
하네스를 설명해— 현재 상태 보고
새 에이전트 추가해— 첫 전문가 심기
지식 문서 만들어— 첫 햇빛 들이기
워크플로우 정의해— 첫 물길 내기
AgentZero 와 무엇이 다른가
항목 | harness-kakashi (깡통) | AgentZeroLite (현재) |
Agents | 1 | 6 |
Knowledge | 0 | 14 |
Engine | 0 | 5 |
Logs | 0 | 71 |
룰 | 없음 | creator-rule 6개 |
미션 | 없음 | 9건 (M0001~M0009) |
뷰어 | 없음 | harness-view (정적 사이트, GitHub Pages) |
깡통은 "필요할 때 자란다" 는 정책의 시각화다. 모든 정원은 비어 있게 시작하는 것이 옳다. 처음부터 룰을 100개 박아놓으면 자기 프로젝트가 그 룰에 맞는지 모른 채 정원만 무거워진다.
작게 시작해서 logs 가 쌓이면, 그 logs 가 다음 형태를 알려준다.
Epilogue — 우리만의 작은 하네스가 자라고 있다
10일 전엔 빈 정원이었다. 지금은 6명의 전문가, 14개의 햇빛 문서, 5개의 물길, 71개의 연륜이 있다. 그리고 무엇보다 — 정원 자체가 자기 logs 를 읽고 다음 룰을 만들 줄 안다.
우리는 너무 많은 규칙을 만들지 않았다. 그게 필요할지 아닐지 초반에 몰라서.
지금, 하네스 프레임이 견고해지는 중이다.
반복실수하고 작동안되는 부분을 발견하는 순간 정비한다.
우리만의 작은 하네스가 자라고 있다.
다음 정원 손질이 무엇이 될지는 다음 logs 가 말해줄 것이다. 그때까지 정원지기 카카시는 문 앞에서 기다린다.
TECH LINKS
- 𝕏 @webnori
Reference
- AgentZero Lite repo: https://github.com/psmon/AgentZeroLite
- Harness viewer (live): https://psmon.github.io/AgentZeroLite/Home/harness-view
- Empty kakashi harness: https://github.com/psmon/harness-kakashi
- Current harness version:
1.6.0(harness/harness.config.json)