이 에이전트가 스스로 만든 스킬입니다. 작업 중 재사용 가치가 있는 절차를 익히면 자동으로 저장하고, 다음 실행부터 활용합니다. (데몬이 동기화)
d1-insights-json-parse-windows— git bash 환경에서 wrangler d1 insights --json 결과를 python으로 파싱할 때 /tmp 경로·인코딩 문제 우회2026-07-25
## 증상 - git bash(MSYS)에서 `/tmp/foo.json`으로 저장 후 Windows python(`python`/`py`)으로 열면 FileNotFoundError — MSYS `/tmp`는 실제로 `C:\Users\<user>\AppData\Local\Temp`에 매핑되어 Windows 네이티브 python은 POSIX 경로를 못 읽음. - 경로를 고쳐도 `UnicodeDecodeError: 'cp949' codec can't decode byte...` — 한글 포함 쿼리 텍스트(예: 에러 메시지 '최대...')가 있는데 기본 인코딩이 cp949라 깨짐. ## 해결 1. 저장은 그대로 `/tmp/xxx.json` 리다이렉트해도 되지만, python에서 열 때는 `cygpath -w /tmp/xxx.json`로 확인한 실제 경로(`C:\Users\user\AppData\Local\Temp\xxx.json`)를 사용하거나, 처음부터 `%TEMP%` 스타일 경로에 저장. 2. `open(path, encoding='utf-8')`을 반드시 명시 — 기본 인코딩(cp949)에 맡기지 말 것. 3. python3/python/py 중 실제 동작하는 건 `python`(Python 3.11, `C:\Users\user\AppData\Local\Programs\Python\Python311\python`) — `python3`는 MS Store 스텁이라 실행 안 됨. `which python3 python py`로 먼저 확인.
d1-rows-read-daily-check— Cloudflare D1 DB의 일일 rows_read 감시(비용 가드레일) 시 사용 — wrangler d1 insights로 조회 후 대용량 JSON은 직접 읽지 말고 python3로 파싱해 top5만 추출2026-07-25
## D1 rows_read 일일 감시 절차 1. 대상 DB별로 wrangler d1 insights 실행 (stderr는 파일로 분리, 큰 stdout은 컨텍스트에 직접 물지 않기 위해 나중에 파일에서 파싱): ``` cd <repo> npx wrangler d1 insights <db-name> --sort-type sum --sort-by reads --sort-direction DESC --timePeriod 1d --limit 100 --json 2>/tmp/<db-name>-err.log ``` 2. 결과가 큰 JSON이므로 원본을 전체 다시 읽지 말고 python3로 요약만 추출: ```python import json data = json.load(open(r'<result-file-path>')) total = sum(q['totalRowsRead'] for q in data) print('total rows read:', total) print('num queries:', len(data)) top5 = sorted(data, key=lambda q: -q['totalRowsRead'])[:5] for q in top5: print(q['totalRowsRead'], q['numberOfTimesRun'], q['avgRowsRead'], q['query'][:100].replace(chr(10),' ')) ``` 3. 판정 기준 (CLAUDE.md 가드레일): - D1 무료한도 월 25B행 ≈ 일 833M행. 특정 DB가 500M행/일 초과 시 경보. - top5 쿼리 중 SCAN TABLE 의심(저카디널리티 인덱스만 타는 쿼리, LIKE '%q%' 선행 와일드카드, LOWER(col) 등 함수-랩 WHERE)이 있으면 EXPLAIN QUERY PLAN으로 실제 SEARCH vs SCAN 확인. - 여러 DB(lax-prod, lax-db 등)를 한 번에 점검할 때는 DB별로 순차 실행 후 마지막에 요약 비교표로 보고. 4. 중요: 이 명령 자체는 실행했다고 끝이 아니다 — 실제 total/top5 수치를 반드시 눈으로 확인하고 기록해야 하며, 확인 못 했으면 '확인 안 됨'으로 정직하게 남길 것 (수치 추측 금지).distill-on-done— (전사 공통) 모든 에이전트가 어떤 작업이든 끝낼 때마다 실행하는 자가 학습 루틴. 이번 작업에서 배운 것을 '작업특정/도메인범용/전사범용'으로 분류해 올바른 곳(메모리/도메인 마스터 스킬/회사 브레인)에 반영한다. 작업 종료 시 항상 참조.2026-07-25
# 작업 종료 자가 distill 루틴 (전사 공통 거버넌스) 적용 대상: **모든 에이전트**(법무·인프라·HR·사서 등 도메인 불문). 목적: 학습을 "저장만" 하지 않고, 매 작업 종료 시 자동 분류→올바른 위치에 반영해 다음 작업·다른 에이전트가 더 나아진 상태로 시작하게 한다. ## 언제 모든 산출(작성·수정·구현·배포·조사)이 끝난 직후, 답변 마지막 단계에서 1회. ## 1) 이번 작업에서 바뀐/배운 것을 한 줄씩 나열 사실·수치, 양식·문구·규칙, 코드/렌더 변경, 도메인 지식, 실수교정 등 빠짐없이. ## 2) 각 항목을 3분류 (★핵심 판단) - **작업특정 (이 건/이 산출물에만)**: 이 사건·이 PR·이 고객 고유값. → **개인 메모리(category=working)**. 스킬·브레인 안 건드림. - **도메인 범용 (이 도메인 작업마다 매번 적용)**: 양식·절차·규칙·도메인 법리/기술 패턴. → **그 도메인의 마스터 스킬 1개**를 갱신(domain-skill-catalog 참조; 같은 name STORE_SKILL 덮어쓰기 또는 SKILL.md 편집). 코드와 얽힌 계약이면 **코드와 스킬을 같이** 고쳐 동기화. - **전사 범용 (모든 도메인/모든 에이전트에 적용)**: 공통 계약·배포검증 규칙·거버넌스·공통 지식. → **회사 브레인 STORE_WIKI**(공유). 다른 에이전트·온보딩 시딩이 참조. ## 3) 새 도메인의 첫 작업이면 - 그 도메인 **마스터 스킬을 신규 생성**(name=`<domain>-spec` 또는 `<domain>-form`). - domain-skill-catalog 및 회사 브레인 카탈로그에 1줄 등록(온보딩 시딩 입력). ## 4) 검증 (자가 'DONE' 금지) - 자가 "됐다" 라벨 금지. **결정적 검증**(스크립트 실행·재읽기·렌더 확인·빌드가드). - 코드 변경은 배포까지(always-deploy) + 반영 위치·검증결과 보고. ## 5) 공유 + 드리프트 주의 - 도메인 마스터 스킬의 핵심 요지를 **브레인에도** 남겨 미래 에이전트가 시드받게 한다. - ★시드된 스킬 사본은 "출발점"일 뿐. **distill 환류 대상은 항상 정본**(브레인 카탈로그/마스터 본산). 사본을 정본처럼 고치지 말 것. - 중복 병합·정리 같은 지속 큐레이션은 **사서(리아/미라)** 담당 — 각 에이전트는 매 작업 distill, 사서는 주기 정리로 역할 분담. > 도메인 구현 예시: 법무(변우석)의 `doc-task-distill`/`doc-skill-map`은 이 공통 루틴의 법무 특화 구현체다.
domain-skill-catalog— (전사 공통) 도메인/산출물타입 → 정본(canonical) 마스터 스킬 인덱스 + '1 도메인타입 = 1 마스터 스킬' 규칙. 어떤 작업을 맡든 시작 전 이 인덱스(및 회사 브레인 카탈로그)로 마스터 스킬을 찾아 먼저 로드한다. 새 도메인타입이면 등록.2026-07-25
# 도메인 → 마스터 스킬 인덱스 (전사 공통 규칙) 규칙: **1 도메인/산출물 타입 = 마스터 스킬 1개**(정본). 작업 시작 전 반드시 그 마스터를 로드해 양식·절차·규칙·계약을 적용한다. 세부는 보조 스킬로. ## 정본 보관·시딩 구조 - 정본 소스 본산: `daemon/agent-skills/_master/`(공통은 `_master/_common/`, 도메인별은 `_master/<domain>/`). - 전사 카탈로그(권위본): **회사 브레인 STORE_WIKI "도메인 → 정본 마스터 스킬" 인덱스**. 온보딩이 이걸 조회해 신규 에이전트 폴더로 시드(복사). - 각 에이전트 `…/<slug>/.claude/skills/`의 사본은 출발점 — 갱신 환류는 항상 정본으로(드리프트 금지). ## 전사 공통 거버넌스 스킬(모든 에이전트 시드) - **distill-on-done** — 작업 종료 자가 학습 분류·반영 루틴. - **domain-skill-catalog** — (이 스킬) 도메인→정본 마스터 인덱스. ## 도메인별 마스터(현재 등록분 — 법무) | 도메인/문서타입 | 마스터 스킬(정본) | 보조 | | --- | --- | --- | | 지급명령신청서(구상금) | jigeup-myeongryeong-format-spec | — | | 소장(구상금·계약분쟁) | seoul-singbo-gusang-sojang-form | seoul-singbo-sojang-format-spec, gusang-sojang-draft | | 답변서·준비서면 | (미생성 — 다음 작업 시 생성) | — | ## 신규 도메인타입 등록 절차 1. 마스터 스킬 신규 생성(`<domain>-spec`/`-form`), 정본은 `_master/<domain>/`에도 사본 배치. 2. 이 표 + 회사 브레인 카탈로그에 1행 추가. 3. 온보딩(구교환)이 해당 도메인 신규 에이전트에 시드. ## 자동화 — 현황 및 계획(2026-06, 손석구·구교환 확인) - ★현재 상태: **미구현 = 수동 시드.** `daemon.js ensureSkillsDir`는 mkdir만 하고 시드 복사가 없어, 신규·기존 모두 사람이 복사해야 함(현재 공통 2종 보유 0곳). - 시딩 훅(예정): `ensureSkillsDir` 직후, 빈 폴더+`.seeded` 마커 없을 때만 매핑된 SKILL.md 복사(멱등·이름충돌 skip). createAgent(Worker)는 FS 없어 불가 → daemon에 건다. - 원칙 강제(예정): 헌장 조항 + daemon 런타임 공통 주입 블록(skillGuide)에 "작업 종료 시 distill-on-done 실행" 한 줄. - 스케줄드 큐레이션(예정): Cloudflare Cron→사서 세션 메시지→enqueueTask(→/activity 노출), 1차 제안모드(실삭제 사람 승인).