[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M70FWF6XAVDDJRM4GQB3V2RY":3,"skill-same:01M70FWF6XAVDDJRM4GQB3V2RY":58},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":27,"linkOnly":28,"markdownContent":29,"markdownBody":30,"frontMatter":31,"refName":37,"commitSha":38,"skillDirectory":39,"forksCount":40,"repositoryHtmlUrl":41,"repositoryHomepageUrl":6,"ownerHtmlUrl":42,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":43,"install":44,"resources":57},"01M70FWF6XAVDDJRM4GQB3V2RY","incidents-to-rule",null,"trail\u002Fincidents\u002F 파일을 분석해 AGENTS.md에 추가할 규칙 후보를 생성한다","JayJihyunKim\u002Frein","JayJihyunKim","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F9338574?v=4","01M70FV3CW5XEZGG6GS341V6J6","flyingcat4","01M70FV3DSX4YES0CN14AFJT2T",1,"MIT","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Fincidents-to-rule\u002FSKILL.md",[],[19,20,21,22,23,24,25,26],"rule","incidents to rule","incidents","draft","audit","trail","incident","daily","2026-11-10 10:12:30",false,"---\nname: incidents-to-rule\ndescription: trail\u002Fincidents\u002F 파일을 분석해 AGENTS.md에 추가할 규칙 후보를 생성한다\ntriggers:\n  - reviewer가 incident draft 작성 직후 (자동)\n  - daily audit 시 (하루 1회)\n  - 수동: \"최근 incidents를 보고 규칙 후보 돌려줘\"\n---\n\n# Skill: incidents-to-rule\n\n## 목적\n반복되는 실수와 실패 패턴을 분석해 AGENTS.md에 추가할 규칙 후보를 생성한다.\n\n## 입력\n- `trail\u002Fincidents\u002F{target}.md` 또는 `trail\u002Fincidents\u002F` 전체\n\n> 운영 archive (`plugins\u002Frein-core\u002Fpolicy\u002Fcleanup-archive-ignore.txt` 의 4 path) 는 분석 대상에서 제외한다.\n\n## 입력 포맷\n\n### 신규 자동 생성 포맷 (`auto-*.md`)\n```markdown\n---\nstatus: \"pending\"\npattern_hash: \"3f4a8b2c9d1e5f6a\"\nhook: \"pre-bash-safety-guard\"\nreason: \"파이프 쉘 실행\"\ncount: \"5\"\nfirst_seen: \"2026-04-10T14:23:10\"\nlast_seen_at: \"2026-04-15T09:17:45\"\nagent_eligible: unknown      # true | false | unknown — 분류 후 기록 (선택)\nroot_cause: unknown           # bug | missing_rule | missing_agent | tooling | user_error | unknown (선택)\n---\n\n# Incident: pre-bash-safety-guard \u002F 파이프 쉘 실행\n\n## 예시 (최근 최대 5건)\n...\n```\n\n**처리 규칙**:\n- `auto-*.md` 파일은 frontmatter `status: pending` 인 것만 처리\n- `status: processed` 또는 `status: declined` 는 건너뜀\n- 처리 완료 후 해당 파일의 frontmatter `status` 를 `processed` 또는 `declined` 로 갱신\n- 분석 중에 **분류 필드** (`agent_eligible`, `root_cause`) 를 함께 기록하면 `\u002Fincidents-to-agent` 가 이를 기준으로 에이전트 승격 후보에서 제외할 수 있다 (아래 \"분류 가이드\" 참조)\n\n### 분류 가이드 (`agent_eligible` \u002F `root_cause`)\n\nincident 를 분석하면서 아래 기준으로 분류한다. 확신이 없으면 `unknown` 유지 (보수적 기본값).\n\n| 상황 | `agent_eligible` | `root_cause` |\n|------|------------------|-------------|\n| hook 소스의 regex\u002Fpattern false-positive — 코드 수정으로 해결 | `false` | `bug` |\n| 특정 workflow 에서 반복되는 순서 위반 — AGENTS.md 규칙 추가로 해결 | `true` | `missing_rule` |\n| 여러 스킬 조합으로 해결 가능한 패턴 — 에이전트 후보 | `true` | `missing_agent` |\n| 외부 도구\u002FMCP 설정 부재 | `false` | `tooling` |\n| 사용자가 일회성으로 실수한 패턴 (반복 아님) | `false` | `user_error` |\n| 분류 불명 | `unknown` | `unknown` |\n\n- `agent_eligible: false` 로 분류된 건은 `\u002Fincidents-to-agent` 의 Step 1 필터에서 제외된다 — 사람이 hook 소스 수정이나 다른 대응으로 해결해야 할 대상\n- 기존 incident 파일 (필드 없음) 은 `unknown` 으로 해석되어 기존 동작 (count >= 3 이면 후보 생성) 을 유지한다 — backfill 불필요\n\n분류 기록 명령 (status 갱신과 동시 적용 가능):\n\n> Helper path 는 plugin install 환경에서는 plugin root 의 `scripts\u002F`, 메인테이너 dogfood 에서는 repo `scripts\u002F` 가 fallback 으로 사용된다. 본문 예시는 아래 resolver block 으로 `$REIN_PLUGIN_ROOT` 를 먼저 정해두고 그 뒤 `\"$REIN_PLUGIN_ROOT\u002Fscripts\u002F...\"` 형태로 호출한다 (Claude Bash 도구 환경에서는 plugin root env 가 unset 일 수 있으므로 매 호출 직전에 다시 해소). 메인테이너 환경에서는 hook 호출 시 RES-1 resolver 가 자동 fallback 하고, 수동 Bash 호출이라면 `scripts\u002Frein-mark-incident-processed.py` 로 그대로 가능.\n\n```bash\n# plugin root 해소 (Claude Bash 도구 환경에서는 ${CLAUDE_PLUGIN_ROOT} 가 unset)\nREIN_PLUGIN_ROOT=\"$(claude plugin path rein-core 2>\u002Fdev\u002Fnull || echo \"$HOME\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Frein\u002Fplugins\u002Frein-core\")\"\n\n# status 는 바꾸지 않고 분류만 기록\npython3 \"$REIN_PLUGIN_ROOT\u002Fscripts\u002Frein-mark-incident-processed.py\" \\\n  trail\u002Fincidents\u002Fauto-\u003Chook>-\u003Chash>.md \\\n  --set-agent-eligible false \\\n  --set-root-cause bug \\\n  --reason \"pre-bash-safety-guard regex false positive — hook 소스 수정으로 해결\"\n\n# status 갱신 + 분류 동시\npython3 \"$REIN_PLUGIN_ROOT\u002Fscripts\u002Frein-mark-incident-processed.py\" \\\n  trail\u002Fincidents\u002Fauto-\u003Chook>-\u003Chash>.md \\\n  declined \\\n  --set-agent-eligible false \\\n  --set-root-cause bug \\\n  --reason \"...\"\n```\n\n### 레거시 포맷 (`INC-NNN.md`)\n```markdown\n# INC-001: [제목]\n...\n```\n\n**처리 규칙**:\n- 레거시 `INC-NNN.md` 는 `trail\u002Fincidents\u002Flegacy\u002F` 디렉토리에 있을 때만 처리 (opt-in)\n- 루트 `trail\u002Fincidents\u002F` 의 frontmatter 없는 `.md` 파일은 무시 (gate 영구 발동 방지)\n- 레거시 파일을 처리하려면 `trail\u002Fincidents\u002Flegacy\u002F` 로 이동 후 스킬 호출\n\n## 실행 절차\n\n### Step 1: Incident 수집\n```\n[ ] trail\u002Fincidents\u002F 전체 파일 목록 확인\n[ ] 최신 순 정렬\n[ ] 미처리(규칙 미생성) incident 필터링\n```\n\n### Step 2: 패턴 분석\n```\n[ ] 동일 유형의 incident 그룹화\n[ ] 2회 이상 반복된 패턴 식별\n[ ] 각 패턴의 근본 원인 분석\n```\n\n### Step 3: 규칙 후보 생성\n```markdown\n## 규칙 후보: [패턴 이름]\n- 근거: INC-NNN, INC-MMM (반복: N회)\n- 추가 위치: AGENTS.md §[섹션] 또는 [언어]\u002FAGENTS.md\n- 규칙 초안: > [AGENTS.md에 추가할 규칙 문장]\n- 우선순위: HIGH \u002F MEDIUM \u002F LOW\n```\n\n### Step 4: 사람 결정 수집 + status 갱신 (필수)\n\n각 pending `auto-*.md` 에 대해:\n\n1. AskUserQuestion 으로 \"승격\u002F거부\u002F보류\" 결정을 받는다\n2. 결정이 \"승격\" 인 경우: 프로젝트 루트(git root) `AGENTS.md` 에 규칙을 추가한 뒤 아래 helper 로 `processed` 마킹. **`AGENTS.md` 가 부재하면 규칙 추가 전에 먼저 starter 템플릿으로 생성한다** — 아래 \"AGENTS.md 부재 시\" 분기 참조\n3. 결정이 \"거부\" 인 경우: 이유만 기록하고 `declined` 마킹\n4. 결정이 \"보류\" 인 경우: `status` 는 그대로 두고 다음 세션으로 이월 (gate 는 계속 차단됨)\n\n#### AGENTS.md 부재 시 — starter 생성 분기\n\nplugin 사용자 프로젝트는 bootstrap 이 `AGENTS.md` 를 만들지 않는다 (`rein-bootstrap-project.py` 는 `.rein\u002F`·`trail\u002F`·`.claude\u002Fsecurity\u002Fprofile.yaml`·`.rein\u002Fproject.json` 만 생성). 따라서 승격 결정 시 프로젝트 루트에 `AGENTS.md` 가 없을 수 있고, 이때 규칙을 쓸 곳이 없어 승격이 사실상 no-op 이 된다.\n\n승격 대상 규칙이 있는데 `AGENTS.md` 가 부재하면, **규칙을 추가하기 전에** 아래 최소 starter 템플릿으로 파일을 먼저 생성한다. 파일이 이미 존재하면 **절대 덮어쓰지 않고** 규칙만 append 한다.\n\n```markdown\n# AGENTS.md — 프로젝트 실행 규칙\n\n> AI 에이전트가 이 저장소에서 작업할 때 따르는 규칙을 모은다.\n> rein 의 `incidents-to-rule` 이 반복 incident 를 규칙으로 승격할 때 갱신된다.\n\n## 규칙\n\n\u003C!-- incidents-to-rule 이 승격한 규칙이 이 섹션에 누적된다 -->\n```\n\n생성 후 Step 3 의 규칙 초안을 `## 규칙` 섹션에 추가한다.\n\n**helper 호출** (Bash):\n```bash\n# plugin root 해소 (Claude Bash 도구 환경에서는 ${CLAUDE_PLUGIN_ROOT} 가 unset)\nREIN_PLUGIN_ROOT=\"$(claude plugin path rein-core 2>\u002Fdev\u002Fnull || echo \"$HOME\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Frein\u002Fplugins\u002Frein-core\")\"\n\npython3 \"$REIN_PLUGIN_ROOT\u002Fscripts\u002Frein-mark-incident-processed.py\" \\\n  trail\u002Fincidents\u002Fauto-\u003Chook>-\u003Chash>[-N].md \\\n  \u003Cprocessed|declined> \\\n  --reason \"\u003C사람이 승인한 규칙 요약 or 거부 이유>\"\n```\n\n> plugin root 환경 변수는 `\u002Fplugin install rein@rein` 활성 세션에서 자동 주입된다. unset 인 메인테이너 dogfood 환경 또는 Claude Bash 도구 환경에서는 위 resolver block 으로 `$REIN_PLUGIN_ROOT` 를 해소하거나, `scripts\u002Frein-mark-incident-processed.py` 로 직접 호출한다 (RES-1 resolver 가 fallback 으로 동일 파일 가리킴).\n\nhelper 는 frontmatter 의 `status` 만 atomic 하게 갱신하고 `## 승격 이력` 섹션에 timestamp + reason 한 줄을 append 한다. **수동으로 frontmatter 를 편집하지 말고 반드시 이 helper 를 사용한다** (incident 파일은 `trail\u002F` 경로에 있어 DoD gate 면제이지만, format drift 방지).\n\n### Step 4b: \"보류\" 선택 시 deferred stamp 생성 (필수)\n\n사용자가 특정 pending 에 대해 \"보류\" 를 선택한 경우, 현재 세션 내 재차단을 방지하기\n위해 즉시 stamp 를 생성:\n\n```bash\ntouch trail\u002Fdod\u002F.incident-decision-deferred\n```\n\nstamp 는 세션 스코프. `session-start-load-trail.sh` 가 다음 세션 시작 시\n무조건 삭제하므로 다음 세션에서 재질문됨.\n\n보류가 여러 건이어도 stamp 1개로 충분. 여러 번 touch 는 noop.\n\n### Step 5: 검증\n\n`--count-pending` 이 감소했는지 확인:\n```bash\n# plugin root 해소 (Claude Bash 도구 환경에서는 ${CLAUDE_PLUGIN_ROOT} 가 unset)\nREIN_PLUGIN_ROOT=\"$(claude plugin path rein-core 2>\u002Fdev\u002Fnull || echo \"$HOME\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Frein\u002Fplugins\u002Frein-core\")\"\npython3 \"$REIN_PLUGIN_ROOT\u002Fscripts\u002Frein-aggregate-incidents.py\" --count-pending\n```\n\n> 메인테이너 환경 (plugin root env unset) 에서는 `scripts\u002Frein-aggregate-incidents.py` 로 직접 호출 가능.\n\n모두 처리되어 `0` 이 나오면 다음 source 편집 시 `pre-edit-dod-gate.sh` 의 self-heal 이 `.incident-review-pending` stamp 를 자동 제거한다.\n\n### Step 5b: processed \u002F declined 파일 삭제 (정책)\n\n결정이 `processed` (rule 승격) 또는 `declined` 로 종료된 `auto-*.md` 파일은 **삭제한다**. 이유는 두 가지:\n\n1. AGENTS.md 에 rule 로 승격된 건은 이미 source of truth 에 반영됨 → incident 파일은 기록용 중복\n2. declined 건이 `blocks.jsonl` 에 남아 있으면 aggregate 가 다음 세션에서 동일 pattern_hash 로 다시 pending 을 만드는 \"stale-surfacing\" 현상을 재유발함. 파일 삭제가 가장 단순한 해소 수단\n\nBash:\n```bash\nrm trail\u002Fincidents\u002Fauto-\u003Chook>-\u003Chash>[-N].md\n```\n\n보류(status=pending 유지) 건은 **삭제하지 않는다** — 다음 세션에서 재질문 대상.\n\nagent 로도 승격해야 할 후보(count ≥ 3)는 Step 6 `\u002Fincidents-to-agent` 가 먼저 처리하고, 그 결과로 승격\u002F거부가 확정된 뒤에 동일 정책으로 삭제. 즉 **이 Step 5b 는 `\u002Fincidents-to-agent` 가 결정을 마친 뒤에 일괄 수행**해도 된다.\n\n### Step 6: \u002Fincidents-to-agent 스킬 호출 (필수)\n\n`--count-pending` 결과와 무관하게, 본 스킬 완료 후 반드시 `\u002Fincidents-to-agent`\n스킬을 호출한다. 이유:\n\n- rule 로 승격된 건 중 일부는 agent 로도 올려야 할 수 있음 (3회↑ 반복 패턴)\n- Stop hook 이 양쪽 스킬 체인 실행을 전제로 block 하므로, 본 스킬만으로는 loop 해소 불가\n\n체인 호출 방법:\n```\n\u002Fincidents-to-agent\n```\n\n## 출력\n1. 규칙 후보 목록 (우선순위 순)\n2. AGENTS.md 수정 초안 (승격된 규칙만)\n3. trail\u002Findex.md 업데이트\n\n## 완료 기준\n```\n[ ] 모든 미처리 incident 검토 완료\n[ ] 규칙 후보 생성됨 (패턴 발견 시)\n[ ] 사람이 검토\u002F승인하도록 AskUserQuestion 으로 결정 수집\n[ ] 승인된 규칙은 즉시 AGENTS.md 에 추가\n[ ] 각 pending incident 의 status 를 helper 로 processed\u002Fdeclined 갱신\n[ ] --count-pending 결과가 0 이거나, 남은 건은 의식적 \"보류\"\n[ ] Step 6 \u002Fincidents-to-agent 스킬 호출 완료\n[ ] 보류 건이 있었다면 .incident-decision-deferred stamp 생성 확인\n[ ] processed\u002Fdeclined 로 종결된 auto-*.md 파일은 \u002Fincidents-to-agent 완료 후 일괄 삭제 (Step 5b 정책)\n```\n","# Skill: incidents-to-rule\n\n## 목적\n반복되는 실수와 실패 패턴을 분석해 AGENTS.md에 추가할 규칙 후보를 생성한다.\n\n## 입력\n- `trail\u002Fincidents\u002F{target}.md` 또는 `trail\u002Fincidents\u002F` 전체\n\n> 운영 archive (`plugins\u002Frein-core\u002Fpolicy\u002Fcleanup-archive-ignore.txt` 의 4 path) 는 분석 대상에서 제외한다.\n\n## 입력 포맷\n\n### 신규 자동 생성 포맷 (`auto-*.md`)\n```markdown\n---\nstatus: \"pending\"\npattern_hash: \"3f4a8b2c9d1e5f6a\"\nhook: \"pre-bash-safety-guard\"\nreason: \"파이프 쉘 실행\"\ncount: \"5\"\nfirst_seen: \"2026-04-10T14:23:10\"\nlast_seen_at: \"2026-04-15T09:17:45\"\nagent_eligible: unknown      # true | false | unknown — 분류 후 기록 (선택)\nroot_cause: unknown           # bug | missing_rule | missing_agent | tooling | user_error | unknown (선택)\n---\n\n# Incident: pre-bash-safety-guard \u002F 파이프 쉘 실행\n\n## 예시 (최근 최대 5건)\n...\n```\n\n**처리 규칙**:\n- `auto-*.md` 파일은 frontmatter `status: pending` 인 것만 처리\n- `status: processed` 또는 `status: declined` 는 건너뜀\n- 처리 완료 후 해당 파일의 frontmatter `status` 를 `processed` 또는 `declined` 로 갱신\n- 분석 중에 **분류 필드** (`agent_eligible`, `root_cause`) 를 함께 기록하면 `\u002Fincidents-to-agent` 가 이를 기준으로 에이전트 승격 후보에서 제외할 수 있다 (아래 \"분류 가이드\" 참조)\n\n### 분류 가이드 (`agent_eligible` \u002F `root_cause`)\n\nincident 를 분석하면서 아래 기준으로 분류한다. 확신이 없으면 `unknown` 유지 (보수적 기본값).\n\n| 상황 | `agent_eligible` | `root_cause` |\n|------|------------------|-------------|\n| hook 소스의 regex\u002Fpattern false-positive — 코드 수정으로 해결 | `false` | `bug` |\n| 특정 workflow 에서 반복되는 순서 위반 — AGENTS.md 규칙 추가로 해결 | `true` | `missing_rule` |\n| 여러 스킬 조합으로 해결 가능한 패턴 — 에이전트 후보 | `true` | `missing_agent` |\n| 외부 도구\u002FMCP 설정 부재 | `false` | `tooling` |\n| 사용자가 일회성으로 실수한 패턴 (반복 아님) | `false` | `user_error` |\n| 분류 불명 | `unknown` | `unknown` |\n\n- `agent_eligible: false` 로 분류된 건은 `\u002Fincidents-to-agent` 의 Step 1 필터에서 제외된다 — 사람이 hook 소스 수정이나 다른 대응으로 해결해야 할 대상\n- 기존 incident 파일 (필드 없음) 은 `unknown` 으로 해석되어 기존 동작 (count >= 3 이면 후보 생성) 을 유지한다 — backfill 불필요\n\n분류 기록 명령 (status 갱신과 동시 적용 가능):\n\n> Helper path 는 plugin install 환경에서는 plugin root 의 `scripts\u002F`, 메인테이너 dogfood 에서는 repo `scripts\u002F` 가 fallback 으로 사용된다. 본문 예시는 아래 resolver block 으로 `$REIN_PLUGIN_ROOT` 를 먼저 정해두고 그 뒤 `\"$REIN_PLUGIN_ROOT\u002Fscripts\u002F...\"` 형태로 호출한다 (Claude Bash 도구 환경에서는 plugin root env 가 unset 일 수 있으므로 매 호출 직전에 다시 해소). 메인테이너 환경에서는 hook 호출 시 RES-1 resolver 가 자동 fallback 하고, 수동 Bash 호출이라면 `scripts\u002Frein-mark-incident-processed.py` 로 그대로 가능.\n\n```bash\n# plugin root 해소 (Claude Bash 도구 환경에서는 ${CLAUDE_PLUGIN_ROOT} 가 unset)\nREIN_PLUGIN_ROOT=\"$(claude plugin path rein-core 2>\u002Fdev\u002Fnull || echo \"$HOME\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Frein\u002Fplugins\u002Frein-core\")\"\n\n# status 는 바꾸지 않고 분류만 기록\npython3 \"$REIN_PLUGIN_ROOT\u002Fscripts\u002Frein-mark-incident-processed.py\" \\\n  trail\u002Fincidents\u002Fauto-\u003Chook>-\u003Chash>.md \\\n  --set-agent-eligible false \\\n  --set-root-cause bug \\\n  --reason \"pre-bash-safety-guard regex false positive — hook 소스 수정으로 해결\"\n\n# status 갱신 + 분류 동시\npython3 \"$REIN_PLUGIN_ROOT\u002Fscripts\u002Frein-mark-incident-processed.py\" \\\n  trail\u002Fincidents\u002Fauto-\u003Chook>-\u003Chash>.md \\\n  declined \\\n  --set-agent-eligible false \\\n  --set-root-cause bug \\\n  --reason \"...\"\n```\n\n### 레거시 포맷 (`INC-NNN.md`)\n```markdown\n# INC-001: [제목]\n...\n```\n\n**처리 규칙**:\n- 레거시 `INC-NNN.md` 는 `trail\u002Fincidents\u002Flegacy\u002F` 디렉토리에 있을 때만 처리 (opt-in)\n- 루트 `trail\u002Fincidents\u002F` 의 frontmatter 없는 `.md` 파일은 무시 (gate 영구 발동 방지)\n- 레거시 파일을 처리하려면 `trail\u002Fincidents\u002Flegacy\u002F` 로 이동 후 스킬 호출\n\n## 실행 절차\n\n### Step 1: Incident 수집\n```\n[ ] trail\u002Fincidents\u002F 전체 파일 목록 확인\n[ ] 최신 순 정렬\n[ ] 미처리(규칙 미생성) incident 필터링\n```\n\n### Step 2: 패턴 분석\n```\n[ ] 동일 유형의 incident 그룹화\n[ ] 2회 이상 반복된 패턴 식별\n[ ] 각 패턴의 근본 원인 분석\n```\n\n### Step 3: 규칙 후보 생성\n```markdown\n## 규칙 후보: [패턴 이름]\n- 근거: INC-NNN, INC-MMM (반복: N회)\n- 추가 위치: AGENTS.md §[섹션] 또는 [언어]\u002FAGENTS.md\n- 규칙 초안: > [AGENTS.md에 추가할 규칙 문장]\n- 우선순위: HIGH \u002F MEDIUM \u002F LOW\n```\n\n### Step 4: 사람 결정 수집 + status 갱신 (필수)\n\n각 pending `auto-*.md` 에 대해:\n\n1. AskUserQuestion 으로 \"승격\u002F거부\u002F보류\" 결정을 받는다\n2. 결정이 \"승격\" 인 경우: 프로젝트 루트(git root) `AGENTS.md` 에 규칙을 추가한 뒤 아래 helper 로 `processed` 마킹. **`AGENTS.md` 가 부재하면 규칙 추가 전에 먼저 starter 템플릿으로 생성한다** — 아래 \"AGENTS.md 부재 시\" 분기 참조\n3. 결정이 \"거부\" 인 경우: 이유만 기록하고 `declined` 마킹\n4. 결정이 \"보류\" 인 경우: `status` 는 그대로 두고 다음 세션으로 이월 (gate 는 계속 차단됨)\n\n#### AGENTS.md 부재 시 — starter 생성 분기\n\nplugin 사용자 프로젝트는 bootstrap 이 `AGENTS.md` 를 만들지 않는다 (`rein-bootstrap-project.py` 는 `.rein\u002F`·`trail\u002F`·`.claude\u002Fsecurity\u002Fprofile.yaml`·`.rein\u002Fproject.json` 만 생성). 따라서 승격 결정 시 프로젝트 루트에 `AGENTS.md` 가 없을 수 있고, 이때 규칙을 쓸 곳이 없어 승격이 사실상 no-op 이 된다.\n\n승격 대상 규칙이 있는데 `AGENTS.md` 가 부재하면, **규칙을 추가하기 전에** 아래 최소 starter 템플릿으로 파일을 먼저 생성한다. 파일이 이미 존재하면 **절대 덮어쓰지 않고** 규칙만 append 한다.\n\n```markdown\n# AGENTS.md — 프로젝트 실행 규칙\n\n> AI 에이전트가 이 저장소에서 작업할 때 따르는 규칙을 모은다.\n> rein 의 `incidents-to-rule` 이 반복 incident 를 규칙으로 승격할 때 갱신된다.\n\n## 규칙\n\n\u003C!-- incidents-to-rule 이 승격한 규칙이 이 섹션에 누적된다 -->\n```\n\n생성 후 Step 3 의 규칙 초안을 `## 규칙` 섹션에 추가한다.\n\n**helper 호출** (Bash):\n```bash\n# plugin root 해소 (Claude Bash 도구 환경에서는 ${CLAUDE_PLUGIN_ROOT} 가 unset)\nREIN_PLUGIN_ROOT=\"$(claude plugin path rein-core 2>\u002Fdev\u002Fnull || echo \"$HOME\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Frein\u002Fplugins\u002Frein-core\")\"\n\npython3 \"$REIN_PLUGIN_ROOT\u002Fscripts\u002Frein-mark-incident-processed.py\" \\\n  trail\u002Fincidents\u002Fauto-\u003Chook>-\u003Chash>[-N].md \\\n  \u003Cprocessed|declined> \\\n  --reason \"\u003C사람이 승인한 규칙 요약 or 거부 이유>\"\n```\n\n> plugin root 환경 변수는 `\u002Fplugin install rein@rein` 활성 세션에서 자동 주입된다. unset 인 메인테이너 dogfood 환경 또는 Claude Bash 도구 환경에서는 위 resolver block 으로 `$REIN_PLUGIN_ROOT` 를 해소하거나, `scripts\u002Frein-mark-incident-processed.py` 로 직접 호출한다 (RES-1 resolver 가 fallback 으로 동일 파일 가리킴).\n\nhelper 는 frontmatter 의 `status` 만 atomic 하게 갱신하고 `## 승격 이력` 섹션에 timestamp + reason 한 줄을 append 한다. **수동으로 frontmatter 를 편집하지 말고 반드시 이 helper 를 사용한다** (incident 파일은 `trail\u002F` 경로에 있어 DoD gate 면제이지만, format drift 방지).\n\n### Step 4b: \"보류\" 선택 시 deferred stamp 생성 (필수)\n\n사용자가 특정 pending 에 대해 \"보류\" 를 선택한 경우, 현재 세션 내 재차단을 방지하기\n위해 즉시 stamp 를 생성:\n\n```bash\ntouch trail\u002Fdod\u002F.incident-decision-deferred\n```\n\nstamp 는 세션 스코프. `session-start-load-trail.sh` 가 다음 세션 시작 시\n무조건 삭제하므로 다음 세션에서 재질문됨.\n\n보류가 여러 건이어도 stamp 1개로 충분. 여러 번 touch 는 noop.\n\n### Step 5: 검증\n\n`--count-pending` 이 감소했는지 확인:\n```bash\n# plugin root 해소 (Claude Bash 도구 환경에서는 ${CLAUDE_PLUGIN_ROOT} 가 unset)\nREIN_PLUGIN_ROOT=\"$(claude plugin path rein-core 2>\u002Fdev\u002Fnull || echo \"$HOME\u002F.claude\u002Fplugins\u002Fmarketplaces\u002Frein\u002Fplugins\u002Frein-core\")\"\npython3 \"$REIN_PLUGIN_ROOT\u002Fscripts\u002Frein-aggregate-incidents.py\" --count-pending\n```\n\n> 메인테이너 환경 (plugin root env unset) 에서는 `scripts\u002Frein-aggregate-incidents.py` 로 직접 호출 가능.\n\n모두 처리되어 `0` 이 나오면 다음 source 편집 시 `pre-edit-dod-gate.sh` 의 self-heal 이 `.incident-review-pending` stamp 를 자동 제거한다.\n\n### Step 5b: processed \u002F declined 파일 삭제 (정책)\n\n결정이 `processed` (rule 승격) 또는 `declined` 로 종료된 `auto-*.md` 파일은 **삭제한다**. 이유는 두 가지:\n\n1. AGENTS.md 에 rule 로 승격된 건은 이미 source of truth 에 반영됨 → incident 파일은 기록용 중복\n2. declined 건이 `blocks.jsonl` 에 남아 있으면 aggregate 가 다음 세션에서 동일 pattern_hash 로 다시 pending 을 만드는 \"stale-surfacing\" 현상을 재유발함. 파일 삭제가 가장 단순한 해소 수단\n\nBash:\n```bash\nrm trail\u002Fincidents\u002Fauto-\u003Chook>-\u003Chash>[-N].md\n```\n\n보류(status=pending 유지) 건은 **삭제하지 않는다** — 다음 세션에서 재질문 대상.\n\nagent 로도 승격해야 할 후보(count ≥ 3)는 Step 6 `\u002Fincidents-to-agent` 가 먼저 처리하고, 그 결과로 승격\u002F거부가 확정된 뒤에 동일 정책으로 삭제. 즉 **이 Step 5b 는 `\u002Fincidents-to-agent` 가 결정을 마친 뒤에 일괄 수행**해도 된다.\n\n### Step 6: \u002Fincidents-to-agent 스킬 호출 (필수)\n\n`--count-pending` 결과와 무관하게, 본 스킬 완료 후 반드시 `\u002Fincidents-to-agent`\n스킬을 호출한다. 이유:\n\n- rule 로 승격된 건 중 일부는 agent 로도 올려야 할 수 있음 (3회↑ 반복 패턴)\n- Stop hook 이 양쪽 스킬 체인 실행을 전제로 block 하므로, 본 스킬만으로는 loop 해소 불가\n\n체인 호출 방법:\n```\n\u002Fincidents-to-agent\n```\n\n## 출력\n1. 규칙 후보 목록 (우선순위 순)\n2. AGENTS.md 수정 초안 (승격된 규칙만)\n3. trail\u002Findex.md 업데이트\n\n## 완료 기준\n```\n[ ] 모든 미처리 incident 검토 완료\n[ ] 규칙 후보 생성됨 (패턴 발견 시)\n[ ] 사람이 검토\u002F승인하도록 AskUserQuestion 으로 결정 수집\n[ ] 승인된 규칙은 즉시 AGENTS.md 에 추가\n[ ] 각 pending incident 의 status 를 helper 로 processed\u002Fdeclined 갱신\n[ ] --count-pending 결과가 0 이거나, 남은 건은 의식적 \"보류\"\n[ ] Step 6 \u002Fincidents-to-agent 스킬 호출 완료\n[ ] 보류 건이 있었다면 .incident-decision-deferred stamp 생성 확인\n[ ] processed\u002Fdeclined 로 종결된 auto-*.md 파일은 \u002Fincidents-to-agent 완료 후 일괄 삭제 (Step 5b 정책)\n```\n",{"name":5,"triggers":32,"description":7},[33,34,35],"reviewer가 incident draft 작성 직후 (자동)","daily audit 시 (하루 1회)",{"수동":36},"최근 incidents를 보고 규칙 후보 돌려줘","main","8e6e9ee16c5c7343c6f0db55f6c8b37d5ef6f1d0","plugins\u002Frein-core\u002Fskills\u002Fincidents-to-rule",0,"https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein","https:\u002F\u002Fgithub.com\u002FJayJihyunKim","2026-10-15 08:31:34",{"source":8,"skillName":5,"commands":45,"prompt":55,"zipAvailable":56},[46,49,52],{"tool":47,"command":48},"npx","npx skills add JayJihyunKim\u002Frein --skill incidents-to-rule",{"tool":50,"command":51},"bunx","bunx skills add JayJihyunKim\u002Frein --skill incidents-to-rule",{"tool":53,"command":54},"pnpm","pnpm dlx skills add JayJihyunKim\u002Frein --skill incidents-to-rule","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Fincidents-to-rule\u002FSKILL.md",true,[],[59,72,81,91,103,110],{"skillNo":60,"name":61,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":69,"publishedAt":27},"01M70FX2WFS12FG002RNTCSXC7","sample-skill","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Frein-template-min\u002F.claude\u002Fskills\u002Fsample-skill\u002FSKILL.md",[64],{"categoryNo":65,"categoryName":66,"taxonomyType":67,"taxonomyTypeDesc":68},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[70,71],"sample","sample skill",{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":27},"01M70FX0BT6WSNZKFF60KTZ5H9","repo-audit","저장소 전체 상태 점검. 오래된 규칙, 누락 테스트, 비활성 에이전트, trail 일관성 확인.","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Frepo-audit\u002FSKILL.md",[],[79,80,23,24],"repo","repo audit",{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":88,"publishedAt":27},"01M70FWXCWRZEJSDQGTNDEKF2G","promote-agent","에이전트 후보를 정식 에이전트로 승격. 사람 승인 이후에만 실행.","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Fpromote-agent\u002FSKILL.md",[87],{"categoryNo":65,"categoryName":66,"taxonomyType":67,"taxonomyTypeDesc":68},[89,90,21],"promote agent","promote",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":27},"01M70FWTP0QPQN09VJR8DNKWZS","pr-review-fixer","PR 리뷰 코멘트를 읽고 수정 사항을 자동으로 적용한다","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Fpr-review-fixer\u002FSKILL.md",[],[98,99,100,101,102],"pr","review","pr review","pr review fixer","fixer",{"skillNo":104,"name":105,"nameZh":6,"description":106,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":107,"categories":108,"keywords":109,"publishedAt":27},"01M70FWR0TC5NDF12D9E5ETBAW","persona","페르소나 프리셋 선택·해제 + 질문-답변 커스텀 프리셋 생성. \"페르소나 골라줘\u002F만들어줘\u002F바꿔줘\u002F꺼줘\" 류 요청에서 호출.","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Fpersona\u002FSKILL.md",[],[105],{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":27},"01M70FWKFPNVC4M5ECZE1F0WS6","parallel-execute","활성 plan 의 `## 실행 전략`(depends_on\u002Fmode\u002Fscope v2) 을 읽어 의존 위상정렬로 웨이브를 유도하고, 각 웨이브의 독립 edit_only 태스크를 같은 작업 트리에서 서브에이전트로 병렬 실행, mutating·의존 태스크는 순차 실행한다. 부모(메인 세션)가 웨이브 단위로 검증·테스트·커밋. 호스트가 병렬 dispatch 불가 시 순차 fallback 으로 degrade.","https:\u002F\u002Fgithub.com\u002FJayJihyunKim\u002Frein\u002Fblob\u002Fmain\u002Fplugins\u002Frein-core\u002Fskills\u002Fparallel-execute\u002FSKILL.md",[],[117,118,119,120,121,122,123,124,125,126],"parallel","execute","parallel execute","edit","fallback","mode","dispatch","scope","plan","only"]