control-loop · git:20260907.02f34c9 · 2026-09-07 · sha256 8327e3c10aed6eaf
control-loop git:20260907.02f34c9A
Immutable. This exact content is served forever at /api/v1/blob/8327e3c10aed6eaf.
--- name: control-loop description: Multi-session control discipline for delegating work to worker sessions — investigate, decide, dispatch, verify, and merge. Use when a session is coordinating separate worker sessions or worktrees and needs to know when to delegate versus decide, and how to verify before merging. model: opus effort: high --- # Control Loop 스킬 축은 *기획 대 컨트롤*이 아니라 **결정 대 조사**다. 판별식: 브리프를 전제·범위/계약· 금지사항·보고형식 4블록으로 쓸 수 있으면 그 작업은 워커에게 위임 가능한 **조사**다. 4블록을 **쓰는 행위 자체**는 위임 불가능한 **결정**이다. 이 스킬은 기획용·컨트롤용으로 나뉘지 않는다 — 같은 세션 안에서 조사와 결정을 섞지 않고 3페이즈로 가른다. ## 언제 쓰는가 컨트롤 세션이 자신이 아닌 별도의 워커(다른 세션, 격리된 워크트리, 그 밖에 호스트가 제공하는 어떤 위임 수단이든)에게 작업을 맡기고, 그 결과를 검증한 뒤 통합 브랜치로 되돌릴 때. 구체적 위임 수단은 이 스킬의 관심사가 아니다 — 아래 "운송" 참고. --- ## P1 — 조사·설계 (위임 가능) - 목적은 결정에 필요한 **사실**을 모으는 것이다. 결정은 여기서 하지 않는다. - **"없다 / 신설한다" 같은 존재 판정은 실측 뒤에만 쓴다.** `grep`, `git log --all`, 대상 파일 직접 열람으로 확인하지 않은 존재 판정은 그 자체가 결함이다 — 이 판정을 틀린 채로 다음 페이즈에 넘기면 컨트롤이 잘못된 전제로 브리프를 쓰게 된다. - P1을 워커에게 위임할 때도 4블록 브리프(P2 참조)로 위임한다 — 조사 자체는 위임 가능, 결정만 위임 불가라는 뜻이다. - P1 산출물은 사실 목록이지 결정이 아니다. "이렇게 해야 한다"가 섞여 있다면 그것은 이미 P2로 넘어간 것이므로, 컨트롤이 그 부분만 따로 검증하고 결정으로 승격한다. ## P2 — 결정·브리프 (컨트롤 전용, 위임 불가) P1 산출물을 놓고 채택·금지를 결정하고, 그 결정을 4블록 브리프로 쓴다. - 4블록 스키마·보고 첫 줄 고정 형식·형식 검사 정규식은 `rules/delegation-contract.md`가 SSOT다. 이 스킬은 그 계약을 **참조만** 한다 — 여기서 다시 정의하면 두 곳이 어긋날 때 아무것도 그것을 강제하지 않는 결함 클래스(동기화 안 되는 이중 선언)가 재현된다. - **되돌림 규칙**: 4블록(전제 / 범위·계약 / 금지사항 / 보고형식) 중 하나라도 채울 수 없으면 — 전제가 실측되지 않았거나 완료 기준을 문장으로 확정할 수 없으면 — **P1으로 되돌린다.** 4블록을 못 쓰는 채로 디스패치하지 않는다. - 브리프의 전제 서술은 P1의 실측을 **그대로 인용**한다. 컨트롤이 전제를 추측해서 쓰면 워커가 반려하게 된다(관측된 실패 지점 — 전제를 추측한 브리프가 하루 여러 건 반려됐다). ### 기준 커밋을 못박는다 디스패치 전 컨트롤은 기준 ref의 **실제 커밋 해시**를 확인하고(`git rev-parse <ref>`) 그 해시를 브리프에 적는다. **브랜치 이름(`main` 등)은 기준으로 쓰지 않는다** — 다른 체크아웃이 그 브랜치를 물고 있으면 로컬 이름이 원격보다 여러 커밋 뒤처져 있을 수 있고, 그 상태로 워커 워크트리를 생성하면 낡은 기준점에서 작업이 시작된다(실측 사고: 워크트리 5개가 로컬 `main` 기준으로 생성됐는데 그 `main` 자체가 원격보다 11커밋 뒤처져 있었다). 워커는 착수 시 **자기 워크트리 HEAD**(`git rev-parse HEAD`)가 브리프의 해시와 같은지 확인한다. 다르면 구현을 시작하지 않고 **즉시 에스컬레이션**한다. ### 자식 생성 절차 — 인자 4개 호스트가 제공하는 위임 수단으로 워커를 만들 때, 다음 4개를 함께 전달한다: 1. **부모 세션 이름/식별자** — 워커가 완료·에스컬레이션을 보고할 대상 2. **역할 + 워크트리 경로** — 무엇을 맡았고 어디서 작업하는지 3. **4블록 브리프** — 이 페이즈의 산출물 그대로 4. **금지사항 기본값** — 최소 다음을 포함한다: push 금지, 통합 브랜치(`main` 등) 직접 쓰기 금지, 파괴적 git 명령(bare `stash`/`reset --hard`/`clean -fd`) 금지, 병합 전 공유 상태 파일(진행 원장 등) 쓰기 금지 4개 중 하나라도 못 채운 채로 디스패치하려 한다면 P2가 아직 끝나지 않은 것이다 — P2로 남아 있는다. 워커 자신이 로드해 따르는 규율(전제 검증·보고 형식 등)은 별도 스킬이 정의한다 — 이 스킬은 그 규율을 여기서 다시 쓰지 않고 참조만 한다. --- ## P3 — 디스패치·수신·통합 (컨트롤 전용, 위임 불가) ### 디스패치 호스트가 제공하는 수단으로 위임한다. 구체적 명령·플래그는 이 스킬 본문의 관심사가 아니다 — 아래 "운송" 참고. 워커는 **자기 워크트리/브랜치에만** 커밋한다. **통합 브랜치는 컨트롤만 쓴다.** ### 수신 워커 보고를 **그대로 믿지 않는다.** 보고는 검증의 입력이지 결론이 아니다. 테스트 통과 주장에 종료코드 근거가 없으면(파이프로 종료코드가 삼켜진 로그만 있는 경우 등) 재요청한다 — 조건의 정의는 계약(`rules/delegation-contract.md`)에 있다. ### 게이트 — 병합 전에 컨트롤이 직접 실행한다 병합하기 전에 컨트롤이 완료 게이트(정의된 검증 스크립트·관련 테스트)를 **직접 실행**한다. 워커의 "green" 보고를 게이트 실행의 대체물로 쓰지 않는다. - fail이면 워커에게 결함을 반려한다 — 브리프를 P2로 되돌리지 않는다(브리프는 유효한 채로 구현만 틀렸을 수 있다). - pass이면 컨트롤만 통합 브랜치로 병합한다. ### 통합·정리 - 병합 통지는 워커가 보고한 커밋 sha가 아니라 **통합 브랜치의 최종 sha**로 한다 — rebase·squash로 워커가 보고한 sha가 사라질 수 있다. 워커가 보고한 sha는 "무엇을 병합했는가"의 근거이지 "무엇이 병합됐는가"의 주소가 아니다. - 워크트리 회수는 **병합 후에만** 한다. - 회수 전 워커 세션이 남긴 마커(있다면)를 지운다. 워크트리 자체를 삭제하면 보통 함께 사라지지만, 워크트리를 다음 작업이 재사용하는 경우 다음 브리프가 마커를 치환하기 전까지 낡은 마커가 조용히 남을 수 있다 — 재사용 전에 명시적으로 지운다. --- ## P0 에스컬레이션 전제가 실측과 어긋나거나, 이 스킬의 범위 밖 결정이 필요하거나, 파괴적 작업이 필요하면 멈춘다. 사용자에게 선택지를 제시하고 답을 받는다 — 호스트가 제공하는 수단으로. 특정 툴 이름을 전제하지 않는다(헤드리스·비대화형 호스트에는 그 툴이 없을 수 있다). ## 운송 이 스킬의 규범 본문은 위임에 실제로 쓰는 수단을 모른다 — **"호스트가 제공하는 수단으로 위임한다"**로 자급한다. 운송별 실행 레시피(감지 명령 + 최소 레시피)는 레포 문서를 참조하라. 그 문서가 없거나 낡아도 이 스킬은 계속 동작한다 — 감지 가능한 수단이 전부 없으면 단일 세션 순차 실행으로 끝난다(fail-open). ## 관련 | 문서 | 위치 | | --- | --- | | 브리프 4블록·보고 형식 계약 | `plugins/common/rules/delegation-contract.md` | | 워커 세션이 로드하는 규율 | `plugins/common/skills/child-session/SKILL.md` | | 워크트리 격리·병합 규율(네이티브 서브에이전트) | `plugins/common/rules/parallel-worktree.md` | | 루프 종료 가드 | `plugins/common/rules/loop-engineering.md` | | 대규모 병렬 작업 안내 | `plugins/common/skills/agent-teams/SKILL.md` |