incidents-to-rule
trail/incidents/ 파일을 분석해 AGENTS.md에 추가할 규칙 후보를 생성한다
- License 许可
- MIT
- 最近更新
- 2026-10-15
- Stars
- ★ 1
- Forks
- 0
01 前言 Front Matter
- name
- incidents-to-rule
- triggers
- [ "reviewer가 incident draft 작성 직후 (자동)", "daily audit 시 (하루 1회)", { "수동": "최근 incidents를 보고 규칙 후보 돌려줘" } ]
- description
- trail/incidents/ 파일을 분석해 AGENTS.md에 추가할 규칙 후보를 생성한다
03 SKILL.md 正文
Skill: incidents-to-rule
목적
반복되는 실수와 실패 패턴을 분석해 AGENTS.md에 추가할 규칙 후보를 생성한다.
입력
trail/incidents/{target}.md또는trail/incidents/전체
운영 archive (
plugins/rein-core/policy/cleanup-archive-ignore.txt의 4 path) 는 분석 대상에서 제외한다.
입력 포맷
신규 자동 생성 포맷 (auto-*.md)
---
status: "pending"
pattern_hash: "3f4a8b2c9d1e5f6a"
hook: "pre-bash-safety-guard"
reason: "파이프 쉘 실행"
count: "5"
first_seen: "2026-04-10T14:23:10"
last_seen_at: "2026-04-15T09:17:45"
agent_eligible: unknown # true | false | unknown — 분류 후 기록 (선택)
root_cause: unknown # bug | missing_rule | missing_agent | tooling | user_error | unknown (선택)
---
# Incident: pre-bash-safety-guard / 파이프 쉘 실행
## 예시 (최근 최대 5건)
...
처리 규칙:
auto-*.md파일은 frontmatterstatus: pending인 것만 처리status: processed또는status: declined는 건너뜀- 처리 완료 후 해당 파일의 frontmatter
status를processed또는declined로 갱신 - 분석 중에 분류 필드 (
agent_eligible,root_cause) 를 함께 기록하면/incidents-to-agent가 이를 기준으로 에이전트 승격 후보에서 제외할 수 있다 (아래 "분류 가이드" 참조)
분류 가이드 (agent_eligible / root_cause)
incident 를 분석하면서 아래 기준으로 분류한다. 확신이 없으면 unknown 유지 (보수적 기본값).
| 상황 | agent_eligible |
root_cause |
|---|---|---|
| hook 소스의 regex/pattern false-positive — 코드 수정으로 해결 | false |
bug |
| 특정 workflow 에서 반복되는 순서 위반 — AGENTS.md 규칙 추가로 해결 | true |
missing_rule |
| 여러 스킬 조합으로 해결 가능한 패턴 — 에이전트 후보 | true |
missing_agent |
| 외부 도구/MCP 설정 부재 | false |
tooling |
| 사용자가 일회성으로 실수한 패턴 (반복 아님) | false |
user_error |
| 분류 불명 | unknown |
unknown |
agent_eligible: false로 분류된 건은/incidents-to-agent의 Step 1 필터에서 제외된다 — 사람이 hook 소스 수정이나 다른 대응으로 해결해야 할 대상- 기존 incident 파일 (필드 없음) 은
unknown으로 해석되어 기존 동작 (count >= 3 이면 후보 생성) 을 유지한다 — backfill 불필요
분류 기록 명령 (status 갱신과 동시 적용 가능):
Helper path 는 plugin install 환경에서는 plugin root 의
scripts/, 메인테이너 dogfood 에서는 reposcripts/가 fallback 으로 사용된다. 본문 예시는 아래 resolver block 으로$REIN_PLUGIN_ROOT를 먼저 정해두고 그 뒤"$REIN_PLUGIN_ROOT/scripts/..."형태로 호출한다 (Claude Bash 도구 환경에서는 plugin root env 가 unset 일 수 있으므로 매 호출 직전에 다시 해소). 메인테이너 환경에서는 hook 호출 시 RES-1 resolver 가 자동 fallback 하고, 수동 Bash 호출이라면scripts/rein-mark-incident-processed.py로 그대로 가능.
# plugin root 해소 (Claude Bash 도구 환경에서는 ${CLAUDE_PLUGIN_ROOT} 가 unset)
REIN_PLUGIN_ROOT="$(claude plugin path rein-core 2>/dev/null || echo "$HOME/.claude/plugins/marketplaces/rein/plugins/rein-core")"
# status 는 바꾸지 않고 분류만 기록
python3 "$REIN_PLUGIN_ROOT/scripts/rein-mark-incident-processed.py" \
trail/incidents/auto-<hook>-<hash>.md \
--set-agent-eligible false \
--set-root-cause bug \
--reason "pre-bash-safety-guard regex false positive — hook 소스 수정으로 해결"
# status 갱신 + 분류 동시
python3 "$REIN_PLUGIN_ROOT/scripts/rein-mark-incident-processed.py" \
trail/incidents/auto-<hook>-<hash>.md \
declined \
--set-agent-eligible false \
--set-root-cause bug \
--reason "..."
레거시 포맷 (INC-NNN.md)
# INC-001: [제목]
...
처리 규칙:
- 레거시
INC-NNN.md는trail/incidents/legacy/디렉토리에 있을 때만 처리 (opt-in) - 루트
trail/incidents/의 frontmatter 없는.md파일은 무시 (gate 영구 발동 방지) - 레거시 파일을 처리하려면
trail/incidents/legacy/로 이동 후 스킬 호출
실행 절차
Step 1: Incident 수집
[ ] trail/incidents/ 전체 파일 목록 확인
[ ] 최신 순 정렬
[ ] 미처리(규칙 미생성) incident 필터링
Step 2: 패턴 분석
[ ] 동일 유형의 incident 그룹화
[ ] 2회 이상 반복된 패턴 식별
[ ] 각 패턴의 근본 원인 분석
Step 3: 규칙 후보 생성
## 규칙 후보: [패턴 이름]
- 근거: INC-NNN, INC-MMM (반복: N회)
- 추가 위치: AGENTS.md §[섹션] 또는 [언어]/AGENTS.md
- 규칙 초안: > [AGENTS.md에 추가할 규칙 문장]
- 우선순위: HIGH / MEDIUM / LOW
Step 4: 사람 결정 수집 + status 갱신 (필수)
각 pending auto-*.md 에 대해:
- AskUserQuestion 으로 "승격/거부/보류" 결정을 받는다
- 결정이 "승격" 인 경우: 프로젝트 루트(git root)
AGENTS.md에 규칙을 추가한 뒤 아래 helper 로processed마킹.AGENTS.md가 부재하면 규칙 추가 전에 먼저 starter 템플릿으로 생성한다 — 아래 "AGENTS.md 부재 시" 분기 참조 - 결정이 "거부" 인 경우: 이유만 기록하고
declined마킹 - 결정이 "보류" 인 경우:
status는 그대로 두고 다음 세션으로 이월 (gate 는 계속 차단됨)
AGENTS.md 부재 시 — starter 생성 분기
plugin 사용자 프로젝트는 bootstrap 이 AGENTS.md 를 만들지 않는다 (rein-bootstrap-project.py 는 .rein/·trail/·.claude/security/profile.yaml·.rein/project.json 만 생성). 따라서 승격 결정 시 프로젝트 루트에 AGENTS.md 가 없을 수 있고, 이때 규칙을 쓸 곳이 없어 승격이 사실상 no-op 이 된다.
승격 대상 규칙이 있는데 AGENTS.md 가 부재하면, 규칙을 추가하기 전에 아래 최소 starter 템플릿으로 파일을 먼저 생성한다. 파일이 이미 존재하면 절대 덮어쓰지 않고 규칙만 append 한다.
# AGENTS.md — 프로젝트 실행 규칙
> AI 에이전트가 이 저장소에서 작업할 때 따르는 규칙을 모은다.
> rein 의 `incidents-to-rule` 이 반복 incident 를 규칙으로 승격할 때 갱신된다.
## 규칙
<!-- incidents-to-rule 이 승격한 규칙이 이 섹션에 누적된다 -->
생성 후 Step 3 의 규칙 초안을 ## 규칙 섹션에 추가한다.
helper 호출 (Bash):
# plugin root 해소 (Claude Bash 도구 환경에서는 ${CLAUDE_PLUGIN_ROOT} 가 unset)
REIN_PLUGIN_ROOT="$(claude plugin path rein-core 2>/dev/null || echo "$HOME/.claude/plugins/marketplaces/rein/plugins/rein-core")"
python3 "$REIN_PLUGIN_ROOT/scripts/rein-mark-incident-processed.py" \
trail/incidents/auto-<hook>-<hash>[-N].md \
<processed|declined> \
--reason "<사람이 승인한 규칙 요약 or 거부 이유>"
plugin root 환경 변수는
/plugin install rein@rein활성 세션에서 자동 주입된다. unset 인 메인테이너 dogfood 환경 또는 Claude Bash 도구 환경에서는 위 resolver block 으로$REIN_PLUGIN_ROOT를 해소하거나,scripts/rein-mark-incident-processed.py로 직접 호출한다 (RES-1 resolver 가 fallback 으로 동일 파일 가리킴).
helper 는 frontmatter 의 status 만 atomic 하게 갱신하고 ## 승격 이력 섹션에 timestamp + reason 한 줄을 append 한다. 수동으로 frontmatter 를 편집하지 말고 반드시 이 helper 를 사용한다 (incident 파일은 trail/ 경로에 있어 DoD gate 면제이지만, format drift 방지).
Step 4b: "보류" 선택 시 deferred stamp 생성 (필수)
사용자가 특정 pending 에 대해 "보류" 를 선택한 경우, 현재 세션 내 재차단을 방지하기 위해 즉시 stamp 를 생성:
touch trail/dod/.incident-decision-deferred
stamp 는 세션 스코프. session-start-load-trail.sh 가 다음 세션 시작 시
무조건 삭제하므로 다음 세션에서 재질문됨.
보류가 여러 건이어도 stamp 1개로 충분. 여러 번 touch 는 noop.
Step 5: 검증
--count-pending 이 감소했는지 확인:
# plugin root 해소 (Claude Bash 도구 환경에서는 ${CLAUDE_PLUGIN_ROOT} 가 unset)
REIN_PLUGIN_ROOT="$(claude plugin path rein-core 2>/dev/null || echo "$HOME/.claude/plugins/marketplaces/rein/plugins/rein-core")"
python3 "$REIN_PLUGIN_ROOT/scripts/rein-aggregate-incidents.py" --count-pending
메인테이너 환경 (plugin root env unset) 에서는
scripts/rein-aggregate-incidents.py로 직접 호출 가능.
모두 처리되어 0 이 나오면 다음 source 편집 시 pre-edit-dod-gate.sh 의 self-heal 이 .incident-review-pending stamp 를 자동 제거한다.
Step 5b: processed / declined 파일 삭제 (정책)
결정이 processed (rule 승격) 또는 declined 로 종료된 auto-*.md 파일은 삭제한다. 이유는 두 가지:
- AGENTS.md 에 rule 로 승격된 건은 이미 source of truth 에 반영됨 → incident 파일은 기록용 중복
- declined 건이
blocks.jsonl에 남아 있으면 aggregate 가 다음 세션에서 동일 pattern_hash 로 다시 pending 을 만드는 "stale-surfacing" 현상을 재유발함. 파일 삭제가 가장 단순한 해소 수단
Bash:
rm trail/incidents/auto-<hook>-<hash>[-N].md
보류(status=pending 유지) 건은 삭제하지 않는다 — 다음 세션에서 재질문 대상.
agent 로도 승격해야 할 후보(count ≥ 3)는 Step 6 /incidents-to-agent 가 먼저 처리하고, 그 결과로 승격/거부가 확정된 뒤에 동일 정책으로 삭제. 즉 이 Step 5b 는 /incidents-to-agent 가 결정을 마친 뒤에 일괄 수행해도 된다.
Step 6: /incidents-to-agent 스킬 호출 (필수)
--count-pending 결과와 무관하게, 본 스킬 완료 후 반드시 /incidents-to-agent
스킬을 호출한다. 이유:
- rule 로 승격된 건 중 일부는 agent 로도 올려야 할 수 있음 (3회↑ 반복 패턴)
- Stop hook 이 양쪽 스킬 체인 실행을 전제로 block 하므로, 본 스킬만으로는 loop 해소 불가
체인 호출 방법:
/incidents-to-agent
출력
- 규칙 후보 목록 (우선순위 순)
- AGENTS.md 수정 초안 (승격된 규칙만)
- trail/index.md 업데이트
완료 기준
[ ] 모든 미처리 incident 검토 완료
[ ] 규칙 후보 생성됨 (패턴 발견 시)
[ ] 사람이 검토/승인하도록 AskUserQuestion 으로 결정 수집
[ ] 승인된 규칙은 즉시 AGENTS.md 에 추가
[ ] 각 pending incident 의 status 를 helper 로 processed/declined 갱신
[ ] --count-pending 결과가 0 이거나, 남은 건은 의식적 "보류"
[ ] Step 6 /incidents-to-agent 스킬 호출 완료
[ ] 보류 건이 있었다면 .incident-decision-deferred stamp 생성 확인
[ ] processed/declined 로 종결된 auto-*.md 파일은 /incidents-to-agent 완료 후 일괄 삭제 (Step 5b 정책)
04 同仓库更多 Skills
sample-skill
暂无简介
repo-audit
저장소 전체 상태 점검. 오래된 규칙, 누락 테스트, 비활성 에이전트, trail 일관성 확인.
promote-agent
에이전트 후보를 정식 에이전트로 승격. 사람 승인 이후에만 실행.
pr-review-fixer
PR 리뷰 코멘트를 읽고 수정 사항을 자동으로 적용한다
persona
페르소나 프리셋 선택·해제 + 질문-답변 커스텀 프리셋 생성. "페르소나 골라줘/만들어줘/바꿔줘/꺼줘" 류 요청에서 호출.
parallel-execute
활성 plan 의 `## 실행 전략`(depends_on/mode/scope v2) 을 읽어 의존 위상정렬로 웨이브를 유도하고, 각 웨이브의 독립 edit_only 태스크를 같은 작업 트리에서 서브에이전트로 병렬 실행, mutating·의존 태스크는 순차 실행한다. 부모(메인 세션)가 웨이브 단위로 검증·테스트·커밋. 호스트가 병렬 dispatch 불가 시 순차 fallback 으로 degrade.