Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/repo-baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,15 @@
},
"scripts/check_review_status.py": {
"source": "scripts/check_review_status.py",
"sha256": "16d7953bb342ecca655601dd0b34bdf513c1546f151f32b031495304095a9f8e"
"sha256": "256b28db2301b4e8e92a7eda812f498425a5a6b080ac6c941dbb69dd98ccc5eb"
},
"scripts/source-only/test_review_status.py": {
"source": "scripts/test_review_status.py",
"sha256": "e31ce97852424e8ce44d88ff7fa4bb2e54301d997eb7ea206607c44d07f29b0d"
"sha256": "703cc77fb484402df8522b68f54317f660163029838e5b5f744b94a4b713453b"
},
"scripts/rerun_review_status.py": {
"source": "scripts/rerun_review_status.py",
"sha256": "a1ed0736a9ade00cd43e63774fe4deae7acf8b1e95c7f871b176abd06237353e"
"sha256": "f72be336e122e2cea6d0c3325afb6e8baf90d7b0799bea5b0f7465a5333814d1"
},
"scripts/workflow_policy.py": {
"source": "scripts/workflow_policy.py",
Expand Down Expand Up @@ -75,5 +75,5 @@
}
},
"source": "minjunkim-dev/repo-baseline",
"source_commit": "c6405a09a7d06af943cb08db5b600fe0f655b0a2"
"source_commit": "9a3920b942695257772f25083e8a4fde5d4e3208"
}
4 changes: 4 additions & 0 deletions .github/repository-settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@
{
"context": "CI",
"app_id": 15368
},
{
"context": "Review status",
"app_id": 15368
}
]
},
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/review-status.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ name: Review status
# request, and only a comment whose author is the repository owner (github.repository_owner, the same login
# the checker compares). An organization name is not a user, so a member comment does not rerun and is not an
# approval. Deleting that comment still reruns, because the payload's comment author stays the owner.
# Editing it still reruns for the same reason: comment.user stays the author, so another account's
# edit of the owner's comment also reruns. The checker counts a comment only when updated_at equals
# created_at. An edited comment is not approval; post a new comment. Skipping edited would leave
# the previous success green. The job does not read the comment body.
# The run is chosen by its own head_sha. pull_requests[].head.sha can change to the current head and point at an older run.
# If that run cannot be listed, the job posts a failing check named Review status on the current head.
# It does not write review/independent or review/security. review-status-policy.json allows only these two events.
Expand Down Expand Up @@ -78,6 +82,7 @@ jobs:
GH_TOKEN: ${{ github.token }}
REPO: ${{ github.repository }}
PR_NUMBER: ${{ github.event.issue.number }}
COMMENT_ACTION: ${{ github.event.action }}
run: |
set -euo pipefail
for _ in 1 2 3 4 5 6; do
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Single-context — `CONTEXT.md` and `docs/adr/` at the repo root. See `docs/agen

Follow `docs/agents/review.md` for independent review, direct fixes, final-head verification, and merge risk. Reviewers read `docs/coding-standards.md`; do not inline the standards here.

The agent merges its own easy-to-reverse pull request (`Door: 되돌리기 쉬움`) after the ticket's verification, independent review, and required `CI` check pass on the final head. Hard-to-reverse (`Door: 되돌리기 어려움`) or broad-impact changes require human approval of that final head. Green CI does not replace measurements required by the ticket. 이 저장소의 검사기가 기본 브랜치에 다시 적용되기 전(이 PR 자신 포함)에는 본문 `Door:`와 소유자 승인 댓글에 옛 형식 `양쪽 문`/`한쪽 문`, `한쪽 문 승인: <sha>`를 쓴다.
The agent merges its own easy-to-reverse pull request (`Door: 되돌리기 쉬움`) after the ticket's verification, independent review, and the required checks on the final head. `.github/repository-settings.json` records `CI` and `Review status` (`app_id` 15368, `strict: true`). Until the owner applies that record from a Mac, the enforced check is `CI`. After the apply, every pull request except a Dependabot version-only pull request also needs an owner-posted `review/independent` status, and `review/security` when the diff touches the trust boundary. The agent does not post those statuses. Hard-to-reverse (`Door: 되돌리기 어려움`) or broad-impact changes require human approval of that final head. Green CI does not replace measurements required by the ticket. `Door:` 값은 `되돌리기 쉬움` 또는 `되돌리기 어려움`이다. 옛 `양쪽 문`/`한쪽 문`과 `한쪽 문 승인: <sha>`는 deprecated이고 검사기가 같은 의미로 받는다.

### 작업 진입

Expand Down
10 changes: 5 additions & 5 deletions docs/REPOSITORY_SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ PR의 source-only 검사는 codeql.yml blob과 `codeql_main_source.sha`를 비
| Allow auto-merge | On. 일괄 예약 없음. 검증 후 exact-head 직접 병합 |
| main 보호 | PR 필수·strict·관리자 적용·선형 이력·대화 해결 On |
| 승인 | GitHub 0명. 되돌리기 어려움/broad 최종 head는 사람 승인 |
| 필수 체크 | 기존 `CI`, GitHub Actions App `15368` |
| 필수 체크 | 기대값 `CI`, `Review status`. 둘 다 GitHub Actions App `15368`. `strict`는 true. 서버에 적용되기 전 보호가 강제하는 체크는 `CI`다. 적용 뒤 Dependabot 버전 전용 PR을 뺀 모든 PR에 소유자의 `review/independent`가 필요하다 |
| force push·main 삭제 | Off |
| Actions | GitHub 공식만, 전체 SHA 필수, 기본 token read, PR 생성·승인 Off |
| fork | 모든 외부 기여자 승인. Secret과 쓰기 token 분리 |
Expand Down Expand Up @@ -64,13 +64,13 @@ Copilot MCP tools·PR 승인과 추가 자동 AI 리뷰를 켜지 않는다. Cha

## 공통 기준 갱신과 설정 관측 기록

적용 원본은 `minjunkim-dev/repo-baseline`의 main `c6405a09a7d06af943cb08db5b600fe0f655b0a2`다. 복사본의 경로·생태계를 유지하며 원본 도구로 갱신했다. 기존 테스트 대상 경로는 `scripts/source-only/`다. `scripts/test_workflow_policy.py`만 원본과 같은 `scripts/`에 둔다. 그 테스트가 자기 위치의 부모를 저장소 루트로 읽기 때문이다. Dependabot `ecosystems`는 빈 목록이다. `.claude/settings.json`은 적용 시점의 원본 템플릿과 바이트가 같다. 해시 manifest에는 없다. 기존 파일을 합치지 않았다. `templates/review-status.yml`은 별도 파일 `.github/workflows/review-status.yml`로 다시 복사했다. `templates/pr-policy.yml`은 `.github/workflows/pr-policy.yml`로 다시 복사했다. 둘 다 해시 대상이 아니고 pin은 템플릿과 같다. 다른 workflow와 합치지 않았다. 두 workflow의 `branches`는 `main`이다. `review-status.yml`의 이벤트는 `pull_request_target`과 `issue_comment`뿐이다. `pr-policy.yml`은 `pull_request`만 쓴다. `Door:` 값은 `되돌리기 쉬움` 또는 `되돌리기 어려움`이다. 옛 `양쪽 문`·`한쪽 문`과 옛 `한쪽 문 승인: <sha>`는 deprecated로 계속 인정한다. `.github/workflow-policy.json`은 원본 저장소 파일을 복사하지 않는다. `require_agents_md`는 기본값 true다. `reject_claude_md`는 false다. `CLAUDE.md`는 `@AGENTS.md` 한 줄이라 지우지 않는다. `feature_flags`는 false다. 이 저장소에 flag 레지스트리가 없다. 봇 브랜치 접두사는 기본값 `claude`·`codex`·`dependabot`이다. `cursor`는 더하지 않는다. 로컬 스킬 설정과 일상 작업 진입은 [개발 절차](agents/development.md), 자체 리뷰와 사용자 요청 회고는 [리뷰 절차](agents/review.md)를 따른다. 공통 기준이 더하는 `main` 경계는 원본 [개발 절차](https://github.com/minjunkim-dev/repo-baseline/blob/c6405a09a7d06af943cb08db5b600fe0f655b0a2/docs/development-workflow.md)를 따른다.
적용 원본은 `minjunkim-dev/repo-baseline`의 main `9a3920b942695257772f25083e8a4fde5d4e3208`다. 복사본의 경로·생태계를 유지하며 `tools/apply_baseline.py`로 갱신했다. 기존 테스트 대상 경로는 `scripts/source-only/`다. `scripts/test_workflow_policy.py`만 원본과 같은 `scripts/`에 둔다. 그 테스트가 자기 위치의 부모를 저장소 루트로 읽기 때문이다. Dependabot `ecosystems`는 빈 목록이다. `.claude/settings.json`은 적용 시점의 원본 템플릿과 바이트가 같다. 해시 manifest에는 없다. 기존 파일을 합치지 않았다. `templates/review-status.yml`은 별도 파일 `.github/workflows/review-status.yml`로 다시 복사했다. `templates/pr-policy.yml`은 `.github/workflows/pr-policy.yml`과 바이트가 같다. 둘 다 해시 대상이 아니고 pin은 템플릿과 같다. 다른 workflow와 합치지 않았다. 두 workflow의 `branches`는 `main`이다. `review-status.yml`의 이벤트는 `pull_request_target`과 `issue_comment`뿐이다. `pr-policy.yml`은 `pull_request`만 쓴다. `Door:` 값은 `되돌리기 쉬움` 또는 `되돌리기 어려움`이다. 옛 `양쪽 문`·`한쪽 문`과 옛 `한쪽 문 승인: <sha>`는 deprecated로 계속 인정한다. 1인 프로필에서 `review/independent`와 `review/security`는 `creator.login`이 저장소 소유자이거나 `scripts/check_review_status.py`의 `STATUS_ACTORS`에 있을 때만 success다. `STATUS_ACTORS`는 비어 있다. 다른 작성자의 status는 실패다. 승인 댓글은 `updated_at`이 `created_at`과 같은 문자열이고 GraphQL `lastEditedAt`이 null이며 `includesCreatedEdit`가 아닐 때만 인정한다. 편집한 댓글은 무효이고 새 댓글을 단다. 이어받기 해시는 diff와 바뀐 파일의 변경 후 blob id다. `.github/workflow-policy.json`은 원본 저장소 파일을 복사하지 않는다. `require_agents_md`는 기본값 true다. `reject_claude_md`는 false다. `CLAUDE.md`는 `@AGENTS.md` 한 줄이라 지우지 않는다. `feature_flags`는 false다. 이 저장소에 flag 레지스트리가 없다. 봇 브랜치 접두사는 기본값 `claude`·`codex`·`dependabot`이다. `cursor`는 더하지 않는다. 로컬 스킬 설정과 일상 작업 진입은 [개발 절차](agents/development.md), 자체 리뷰와 사용자 요청 회고는 [리뷰 절차](agents/review.md)를 따른다. 공통 기준이 더하는 `main` 경계는 원본 [개발 절차](https://github.com/minjunkim-dev/repo-baseline/blob/9a3920b942695257772f25083e8a4fde5d4e3208/docs/development-workflow.md)를 따른다.

기존 기준선의 설명용 `exceptions` 배열은 내용을 보존해 `observations`로 옮겼다. 관측 기록은 API 감사 항목을 제외하지 않는다. 실제 기능 미지원·비해당을 감사 범위에서 제외하려면 원본의 [설정 기준선 형식](https://github.com/minjunkim-dev/repo-baseline/blob/c6405a09a7d06af943cb08db5b600fe0f655b0a2/docs/github-settings-profile.md)에 맞는 `exceptions` 객체와 사유·근거가 필요하다. 예외가 있으면 exit 0이어도 결과는 전체 PASS가 아닌 LIMITED다. 미선언 403·404·누락·권한 오류는 계속 실패한다.
기존 기준선의 설명용 `exceptions` 배열은 내용을 보존해 `observations`로 옮겼다. 관측 기록은 API 감사 항목을 제외하지 않는다. 실제 기능 미지원·비해당을 감사 범위에서 제외하려면 원본의 [설정 기준선 형식](https://github.com/minjunkim-dev/repo-baseline/blob/9a3920b942695257772f25083e8a4fde5d4e3208/docs/github-settings-profile.md)에 맞는 `exceptions` 객체와 사유·근거가 필요하다. 예외가 있으면 exit 0이어도 결과는 전체 PASS가 아닌 LIMITED다. 미선언 403·404·누락·권한 오류는 계속 실패한다.

`Review status`는 이미 기본 브랜치에 있다. 이번 갱신은 그 파일과 PR policy workflow를 템플릿으로 다시 복사한다. `pull_request_target`과 `pull_request`는 `branches: [main]`만 본다. 검사기는 PR base가 저장소 기본 브랜치가 아니거나 이벤트 base SHA가 그 브랜치 위에 없으면 실패한다. 실패 이름은 `review/base-branch`다. 사이드 base의 소유자 댓글은 체크를 게시하지 않는다. 이벤트 종류는 그대로다. 댓글 재실행 job의 `actions: write`와 `checks: write`는 이전 적용에서 이미 있다. Actions 이벤트 정책은 만들거나 고치지 않는다. 목록 조회가 실패하면 정책이 없는 것으로 보지 않는다. 필수 체크 `Review status`는 등록하지 않는다.
`Review status`는 기본 브랜치에 있다. 이번 갱신은 `templates/review-status.yml`을 다시 복사한다. 주석은 편집된 소유자 댓글도 재실행되고, 검사기가 그 댓글을 승인으로 세지 않는다고 적는다. 댓글 재실행 step은 `COMMENT_ACTION`을 넘긴다. `pull_request_target`과 `pull_request`는 `branches: [main]`만 본다. 검사기는 PR base가 저장소 기본 브랜치가 아니거나 이벤트 base SHA가 그 브랜치 위에 없으면 실패한다. 실패 이름은 `review/base-branch`다. 사이드 base의 소유자 댓글은 체크를 게시하지 않는다. 이벤트 종류는 그대로다. 댓글 재실행 job의 `actions: write`와 `checks: write`는 이전 적용에서 이미 있다. Actions 이벤트 정책은 만들거나 고치지 않는다. 목록 조회가 실패하면 정책이 없는 것으로 보지 않는다. job 이름 `Review status`는 기본 브랜치 workflow에서 이미 성공했다(run `42016041442`). `.github/repository-settings.json`의 `required_status_checks.checks`에 `{"context": "Review status", "app_id": 15368}`을 더했다. `strict`는 true다. 기존 `CI`는 그대로다. context는 `.github/workflows/review-status.yml`의 job `name`과 같다. 이 파일은 기대값이다. 이 변경은 branch protection을 쓰지 않는다. 병합 뒤 소유자가 Mac에서 원본 `tools/apply_github_settings.py`로 적용한다. 적용되면 Dependabot 버전 전용 PR을 뺀 모든 PR(되돌리기 쉬움 포함)에 소유자가 올리는 `review/independent`가 필요하다. 신뢰 경계에 걸리면 `review/security`도 필요하다. status는 소유자만 올린다는 규칙이다. 에이전트가 status를 올리는 것은 금지지만 GitHub가 기술적으로 막지는 않는다. 카나리 결과는 [repo-baseline Issue #32](https://github.com/minjunkim-dev/repo-baseline/issues/32) 댓글에 있다.

이번 갱신은 `.github/repository-settings.json`의 서버 기대값·권한·필수 체크·CodeQL·배포를 바꾸지 않는다. `actions: write`와 `checks: write`는 Review status의 댓글 재실행 job에만 있다. PR policy workflow의 권한은 `contents: read`다. 과거 실행 기록을 현재 검증 결과로 바꾸지 않는다.
이번 갱신은 `.github/repository-settings.json`의 필수 체크 기대값에 `Review status`를 더한다. 권한·CodeQL·배포·`strict`·기존 `CI`는 그대로다. 서버의 branch protection은 이 파일 변경으로 바뀌지 않는다. `actions: write`와 `checks: write`는 Review status의 댓글 재실행 job에만 있다. PR policy workflow의 권한은 `contents: read`다. 과거 실행 기록을 현재 검증 결과로 바꾸지 않는다.

## 과거 Bugbot 확인 기록

Expand Down
Loading
Loading