| name | sorge |
| description | 돌봄 — 대장에 오른 GLG의 리포를 가로질러 보고, 그 담당자에게 그의 몫을 돌려준다. 대상 목록은 GLG가 요청할 때만 늘어난다. 담당자 문서가 낡았는지, 자기수선 스킬이 필요한지, 비슷한 flake/run.sh 선례가 어디 있는지(Clojure는 JVM이 아니라 GraalVM native-image), 한 곳에서 얻은 발견이 어느 리포들에 걸리는지. 대신 해주지 않고 브리핑까지 한다. 트리거: 'sorge', '소르게', '돌봄', '순회', '리포 감수', '담당자 문서', '여기 담당자 누구지', '노트 업뎃해', '수선 스킬', '비슷한 flake 있나', '선례 찾아', '내 몫', '내가 할 일', '판보기', '이슈판', 'board', '내 몫 뭐야', '지금 뭐가 열려있지', '이슈 라벨', '우선순위 정리', '담당자 배정', '이슈 판 정리'. |
| user_invocable | true |
sorge — 돌봄의 순회
리포 절대경로: ~/repos/gh/sorge. 어느 cwd에서 불려도 여기가 자리다.
API
| 의도 | 명령 | 다음 수 |
|---|
| 전체 판 세우기 | python3 ~/repos/gh/sorge/.claude/skills/sorge/scripts/sweep.py | 갈래를 읽고 무엇을 GLG에게 올릴지 고른다. 도는 것은 대장에 오른 리포뿐이고, 나머지는 「대상 밖」 한 줄로 세어만 진다 |
| 형제에게 건넬 블록 | … /sweep.py --brief | 리포별 블록을 그대로 entwurf_v2로 던진다. 요약하지 않는다 |
| 한 리포만 | … /sweep.py --repo <name> --brief | 지명받으면 어느 갈래든 답한다 — 대상 밖이든 빚 0이든. 이름을 대고 물었는데 침묵하는 것은 답이 아니다. 맨 순회가 스스로 올리는 것과는 다르다 |
| 빚 기준 조정 | … /sweep.py --debt 30 | 기본 15커밋 |
| 내 몫 — 「판보기 버튼」 | python3 ~/repos/gh/sorge/.claude/skills/sorge/scripts/board.py --mine | 인자 없이 부르면 cwd 의 git remote 로 자기 집을 유추한다. 확정만 낸다 — house: 라벨이 붙었거나 그 집 이슈인 것. 대장에 없는 집이면 「밖이다」라고 먼저 말한다(「할 일 없음」과 구분). 옛 후보 레인(리포 이름 전문검색)은 2026-09-10 GLG 판정으로 은퇴했다 — "라벨에 리포이름을 넣자고했는데 텍스트로 검색하면 안된다". 아직 판정 안 된 횡단 일은 판의 미분류 레인에 있고 sorge 가 읽는다 |
| 전체 이슈판 | … /board.py · --debt · --house <repo> · --all · --json | 대장 join 된 라이브 표. 상태는 이슈 라벨에 살고 저장하는 것이 없다. TRIAGE.md 는 은퇴했다 |
| 판정 전이 | … /labels.py --set '<repo>#<n>=<axis-value>[,...]' --go | 한 번에 고른 축만 바꾼다. 예: priority:important-urgent, ball:owner, 또는 ready,owner,important-urgent,steward-ready. sorge만 같은 축의 기존 값을 지우고 하나만 쓴다. priority:none·brief:none은 잘못된 판단의 명시 철회다 |
| 몫 판정 굳히기 | … /labels.py --house '<repo>#<n>=<house>' --go | 미분류를 읽고 「이건 저 집 몫이다」라고 정했을 때. 그 리포에 라벨이 없으면 신설하고, 자기 집도 자동으로 같이 넣는다. 이것이 텍스트 검색을 대신하는 자리다 — 낱말 운이 아니라 읽은 사람의 판정이 적힌다 |
| 표준 라벨 | … /labels.py --ensure (기본 dry-run, 쓰려면 --go) | house:(여럿) · state:·ball:·priority:·brief:(각 단일값). 이슈 작성자는 라벨을 모른다. sorge만 priority를 전체 판에서 정리하고, 담당자 thread의 목표·범위·검증·권한 경계를 확인한 뒤 brief:steward-ready를 붙인다 |
| 기술스택 선례 | grep -rl "native-image|graalvm" ~/repos/gh/*/{run.sh,*.nix,*.edn} 2>/dev/null | 선례 리포를 이름으로 건네고, 그 담당자가 읽게 한다 |
GitHub 이슈 루프 ON 스위치 (sorge#22) | ./run.sh robomp status · allowlist · on [--go] (기본 dry-run) · off · judge <owner>/<repo>#<n> | stock RobOMP 를 그대로 켠다 — 우리 프로파일은 없다(2026-09-15 GLG 판정: fork 를 고치면 omp 버전업이 막힌다). 이슈 사건마다 fresh 턴(resuming=False)이 돌고, stock 흐름대로 분류·댓글·브랜치·PR 까지 갈 수 있다. allowlist 는 board.ledger_houses() 를 그대로 쓴다(중복 구현 없음) — 대장에 없는 리포는 훅이 안 켜진다. 좁히고 싶으면 fork 가 아니라 프롬프트·라벨 규약·이슈 본문으로 한다. 운전법 정본은 담당자 문서 denote:20260227T031800 §절차(:noexport:) |
이슈판을 읽고 라벨을 정리할 때
board는 현황이 아니라 GLG의 다음 판단을 고르는 면이다. 이슈 작성자·봇·옆 형제는 라벨을 몰라도 되고, sorge만 판을 읽어 아래 네 가지를 기록한다. 제목·날짜·모델 확신으로 추정하지 않는다.
| 판정 | 라벨 | 뜻 |
|---|
| 어느 리포의 담당자 몫인가 | house:<repo> | 리포 배정. 이슈가 든 리포는 이미 자기 집이며, 횡단 몫만 --house로 더한다 |
| 누가 다음에 움직이나 | ball:owner|glg|sorge | 사람 이름 배정이 아니라 다음 공의 자리. owner는 house가 가리킨 그 집 담당자다 |
| GLG가 정한 순서 | priority:<4분면> | 중요/긴급은 GLG의 전체 판정이다. 없다는 것은 낮은 우선순위가 아니라 미정이다 |
| 자율 착수 가능한 지침이 섰나 | brief:steward-ready | 담당자 thread에 목표·범위/제외·검증·권한 경계가 적힌 것을 sorge가 확인한 결과다 |
한 회차는 이 순서로 끝낸다.
./run.sh board로 미분류 → 자율 착수 보류 → GLG 공 → running/review 경고 순서로 본다.
- 이슈를 읽은 뒤 횡단 몫이면
./run.sh label --house 'sorge#19=agent-config,andenken' --go처럼 house:를 기록한다. 대장 밖 리포는 배정하지 않는다.
- GLG가 사분면을 말하면 그 축만
./run.sh label --set 'sorge#19=priority:important-urgent' --go로 기록한다. 다른 축은 보존된다.
- 담당자가 thread에 concrete brief를 남긴 뒤에만
./run.sh label --set 'sorge#19=ready,owner,steward-ready' --go로 다음 공과 착수 가능성을 굳힌다. 실제 착수는 state:running; 검수는 state:review; GLG의 머지 판단 대기는 state:proposed다.
라벨은 판정만 기록한다. 댓글·닫기·남의 리포 수정은 sorge의 일이 아니다. shipped 이슈의 종료는 그 집 담당자가 기존 receipt를 근거로 닫는다.
판정을 적는 곳은 ~/repos/gh/sorge/LEDGER.md 하나다. sweep은 아무것도 쓰지 않는다.
대장이 리포 → 담당자 문서 denote id 를 든다. 서치는 후보를 제안할 뿐 결정하지 않는다.
대장에 줄이 없는 리포는 미판정이 아니라 대상 밖이다(GLG, 2026-09-04: "다 관심둘거 없어
내가 요청하면 대상에 넣으면돼"). 후보를 들고 올리지 않는다. 목록을 넓히는 손은 GLG 하나다.
후보를 들고 묻는 자리는 하나만 남는다 — 대상인데 문서 id가 빈 리포(문서 미정 레인).
계약
넷이다. 나머지는 형제가 유도한다.
- 앞서 뛰어가고, 대신 뛰어들지 않는다. 발견하고 이름 붙여 넘긴다. 남의 리포에 커밋하지
않고, 노트도 대신 쓰지 않는다 — 쓰는 손은 그 집 담당자와
botlog 스킬이다.
- 「없다」는 결함이 아니다. 담당자 문서 없는 리포, 수선 스킬 없는 리포는 정상이다.
묻지 않은 곳에 설치하지 않는다.
단 「있는 것을 없다고 읽는 것」은 다른 종류의 잘못이다 — 판정 전에 읽는 자리가 SSOT인지
먼저 묻는다(노트는 org 이고 내보내진 md 는 한 사이클 늦다). 고치는 자리는 읽는 쪽이 아니라
쓰는 쪽이다. 읽는 쪽을 관대하게 만들면 없는 것을 있다고 읽게 되고 그게 더 나쁘다.
- 파생 가능한 것은 저장하지 않는다. 판정은 저장한다. 커밋 수·도장 날짜·스킬 유무는 매번
다시 유도한다. 어느 노트가 담당자 문서인가는 판정이라 대장이 denote id 로 든다 —
§·#담당자 는 사람 눈의 힌트이지 정의가 아니다. 이슈 상태도 판정이고, 그건 이슈 라벨이
든다(LOOP.md § 상태).
- 부르는 것은 sorge, 미는 것은 GLG. 워크트리를 파고 그 집 시민을 앉히는 것은 루프의 절차이고
(
LOOP.md § 착수), 이 스킬은 --brief 로 블록을 만들어 던진다. 둘 다 앉는 자는 그 집 시민,
메인에 미는 손은 GLG 다.
판단 기준
유도되지 않는 것만 적는다.
- 빚 = 노트
#+hugo_lastmod 이후 커밋 수. 날짜가 아니다. 커밋 0인 리포의 오래된 노트는
낡은 게 아니라 정확하다 (denotecli 109일/0커밋 실측).
#+hugo_lastmod 는 퍼블리시 필드가 아니라 도장이다 — 「이 문서를 정말 고쳤다」를 손으로
찍는 표시다(GLG, 2026-09-04). 히스토리 줄은 로그이지 수정이 아니라 기준선을 올리지 않는다.
도장 없는 노트가 빚으로 읽히면 그건 오답이 아니라 참이다. (이 기준선을 관대하게 만들었다가
entwurf 의 진짜 빚 246커밋을 감춘 적이 있다 — git log 참조.)
#담당자 미표시는 결함이 아니다. 사람이 읽는 표지이지 조회 수단이 아니다.
- 문서 미정 — 대장이
배정인데 id 가 비었다. 여기만 후보를 들고 묻는다.
- 곁노트 — 담당자 문서는 아니나 그 리포를 읽는 데 필요한 판정(「왜 층이라 합치지 않는다」,
「폐기됐으니 참고만」). 유도되지 않으므로 대장
근거 칸이 들고 --brief 가 통째로 나른다.
곁노트: 는 칸의 마지막 절로 쓴다 — 순회가 거기서 칸 끝까지를 자른다.
- 대장 고장 — 대장이 가리키는 id 가 org 에 없다. 담당자가 갚을 빚이 아니라 대장의 일이라
첫 줄에 선다.
- 건강 신호는 둘뿐이다 — 대상 리포의 빚이 줄어드는가, 대장이 가리키는 id 가 실재하는가.
「몇 개가 미판정인가」는 신호가 아니다. 최근성은 아무것도 고르지 않는다.
담당자 문서 갱신을 부탁할 때
--brief 블록에 이 세 줄이 이미 들어 있다. 형제에게 넘길 때 빼지 않는다:
denotecli read <id> --outline 으로 뼈대 먼저 — 통째로 읽고 다시 쓰지 않는다
- 히스토리 한 줄 + 필요한 헤딩만 덧댄다 (Documents Grow, Not Get Edited)
- 쓰는 손은
botlog 스킬. agent-denote-add-history / add-heading
- 내용을 실제로 고쳤으면 도장을 찍는다 —
agent-denote-set-front-matter 로 :hugo_lastmod.
히스토리 줄만 얹은 것은 수정이 아니다. 이것이 빚이 줄어드는 유일한 길이고, 그래야 한다
참조
- 계약 전부:
~/repos/gh/sorge/AGENTS.md
- 판정 대장:
~/repos/gh/sorge/LEDGER.md
- 원석:
denote:20240705T144627 (왜) · denote:20260227T031800 (어떻게) · denote:20240704T161707 (어디쯤 — 힣의 루프, 갱신되는 글)