Skip to content

[docs] 프로젝트 목적 재정의와 git-logbook 개명 (GF-138) - #39

Merged
coralstay merged 20 commits into
mainfrom
task/GF-138
Oct 3, 2026
Merged

coralstay merged 20 commits into
mainfrom
task/GF-138

Conversation

@coralstay

Copy link
Copy Markdown
Owner

요약

프로젝트 목적을 다시 정의하고 이름을 git-logbook으로 바꿉니다(GF-138, decision-25).

  • 목적은 세 가지입니다. 형식(제목·본문 규칙), 출처 기록(트레일러와 그에 딸린 게이트), 이력 불변(append-only를 로컬 훅과 원격 설정으로 강제).
  • decision-25는 다음 조항을 대체합니다.
    • decision-11·12의 "서버측·push 단계는 범위 밖"
    • decision-19의 Signed-off-by 제거(더 최근 문서인 decision-24와 DRAFT-19가 Signed-off-by를 전제하기 때문)
  • 표시 이름 git-format → git-logbook: README, install.sh, 훅 주석, 테스트, CI, backlog config
  • README 소개와 "다루는 범위"를 세 기둥 표로 다시 썼고, clone URL을 고쳤습니다.
  • backlog 문서 6개(doc-1·5·6·7·8·20)를 decision-25에 맞췄습니다.
  • 후속 작업으로 넘긴 것: 설정 키 gitformat.* 이전(GF-133 AC), Signed-off-by 유지(GF-128 AC)

이 PR에는 task/GF-137의 커밋도 들어 있습니다(decision-24, doc-19·doc-20 등). decision-25가 decision-24를 참조하기 때문입니다.

바꾸지 않은 것

  • 설정 키·파일명 gitformat.*: 바꾸면 기존 설치가 깨집니다. GF-133에서 다룹니다.
  • 태스크 접두어 GF, 지난 decision·task 본문: 당시 기록이라 그대로 둡니다.

검증

  • python3 -m unittest discover -s tests: 93개 통과
  • ruff, shellcheck 통과
  • git grep -i git-format -- ':!backlog' 결과: README의 개명 안내 줄과 tests/isolated_repo.py:1(예전 파일명 언급)만 남음. 둘 다 의도한 예외입니다.

머지 후 GitHub 저장소를 coralstay/git-logbook으로 rename합니다(GF-138 AC#8).

🤖 Generated with Claude Code

coralstay and others added 20 commits September 26, 2026 17:30
전제가 "git이 에이전트 작업의 로그"라면 이력 재작성은 기록 수정이다.
실측으로 지금 깨져 있는 것을 확인했다 - main의 커밋들이
Signed-off-by: cpu-once를 달고 있는데 실제 committer는 coralstay다.
rebase-merge가 커밋을 다시 만들면서 트레일러가 거짓이 됐다.

decision-24: 커밋 후 객체를 다시 만들지 않는다. 금지선은 커널 문서와 같이
push된 이력에 둔다. 병합은 머지 커밋, rebase는 로컬만, cherry-pick 금지,
amend 금지, revert는 권장.

doc-19: 연산별 판별 방법을 실측으로 정리했다. 핵심은 cherry-pick과 rebase가
훅 인자로 구분되지 않고 rebase-merge/ 디렉터리 하나로만 갈린다는 것이다.
REBASE_HEAD는 rebase 재생 중 존재하지 않았다 - 초기 조사가 틀렸다.

아직 태스크가 아니다 - 승격은 별도 커밋으로 남긴다.

Task-Id: GF-137
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
AI-Tool: claude-code
AI-Tool-Version: 2.1.267
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5
Tokens-Used: 43399706
Tool-Calls: 27
Hooks-Commit: 6a72e3b
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
이력을 만들거나 바꾸는 git 명령을 훑어 정책이 닿지 않는 곳을 doc-19에
정리했다. 다섯 부류로 나온다.

가장 큰 구멍은 GitHub 병합 버튼이다 - 로컬 훅을 전혀 거치지 않는다.
실측으로 이 저장소는 rebase-merge와 squash-merge가 둘 다 켜져 있고
브랜치 보호도 없다. decision-24는 훅만으로 달성할 수 없다.

판별 불가 경로도 찾았다. cherry-pick -n 후 수동 커밋은 상태 파일이
하나도 남지 않아 평범한 커밋과 구별되지 않는다.

오탐도 둘 찾았다. rebase -i의 reword가 rebase 안에서 source=commit을
만들어서, amend 거부를 그것만으로 하면 rebase -i가 깨진다. commit -C도
source=commit이라 $3이 HEAD인지로 구분해야 한다.

Task-Id: GF-137
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
AI-Tool: claude-code
AI-Tool-Version: 2.1.267
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5
Tokens-Used: 20719965
Tool-Calls: 10
Hooks-Commit: 21f7c00
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
--no-verify는 로컬 훅을 건너뛸 수 있어 로컬만으로는 정책이 완결되지 않는다.
계층을 나눠 기록했다.

github.com에는 pre-receive 훅을 설치할 수 없다 - GitHub Enterprise 전용
기능이다. rulesets와 저장소 설정이 그 자리를 대신한다.

적용: allow_rebase_merge와 allow_squash_merge를 끄고 merge commit만 남겼다.
ruleset으로 force push와 브랜치 삭제를 막았다.

두 계층이 맞물리는 지점: --no-verify로 로컬 재작성은 막을 수 없지만, 다시
쓴 결과는 fast-forward가 아니라 원격이 거부한다. 금지선을 공개된 이력에
둔 것과 일치한다.

required_linear_history는 켜면 안 된다 - merge commit을 금지하는 규칙이다.

Task-Id: GF-137
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
AI-Tool: claude-code
AI-Tool-Version: 2.1.267
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5
Tokens-Used: 12109931
Tool-Calls: 6
Hooks-Commit: d1526c8
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
main-protection ruleset을 활성화했다. 규칙은 제가 만든 것과 동일했고
결정적으로 적용 대상 브랜치가 비어 있었다 - 그대로 켜면 아무 브랜치에도
적용되지 않는다. 대상을 채워 켜고 중복 ruleset은 지웠다.

doc-20에 현재 걸려 있는 설정과 그 이유, 켜면 안 되는 규칙
(required_linear_history는 merge commit을 금지한다), 아직 켜지 않은 것과
그 조건, 확인·변경 명령, 함정 셋을 적었다.

decision-24와 doc-19에 상호 링크를 걸었다.

Task-Id: GF-137
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
AI-Tool: claude-code
AI-Tool-Version: 2.1.267
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5
Tokens-Used: 9178237
Tool-Calls: 5
Hooks-Commit: 8685bbf
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
force push만 막는 것으로는 부족하다. rulesets에 커밋 메시지 패턴 규칙이
아예 없어서 원격은 트레일러가 참인지 검사할 수단이 없다.

DRAFT-19: 트레일러 정합성을 CI에서 검사한다. 유저가 제안한 "트레일러를
뜯어 정합성 최종 검사"의 자리가 여기다 - post-commit은 커밋 후라 막을 수
없고, CI는 완성된 객체를 보면서 required status check으로 병합을 막을 수
있는 유일한 자리다. Signed-off-by와 실제 committer 불일치가 이력 재작성의
증거가 된다.

DRAFT-20: 보호 범위 확대 검토. task 브랜치가 보호되지 않아 force push로
다시 쓸 수 있고, 그 상태로 merge되면 main은 append-only인데 작업 기록은
이미 위조됐다. PR 필수, 서명, 태그, 저장소 설정 되돌림 감지도 함께.

둘 다 아직 태스크가 아니다.

Task-Id: GF-137
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
AI-Tool: claude-code
AI-Tool-Version: 2.1.267
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5
Tokens-Used: 44727008
Tool-Calls: 26
Hooks-Commit: 59590de
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
이 브랜치의 커밋들이 GF-137을 참조하는데 그 태스크가 존재하지 않았다.
append-only라 커밋을 고치지 않고 번호를 실재하게 만든다.

브랜치의 실제 작업은 정책 결정과 문서화, 원격 강제 적용이다. 훅 구현은
DRAFT-18이 맡는다.

Task-Id: GF-137
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
AI-Tool: claude-code
AI-Tool-Version: 2.1.267
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5
Tokens-Used: 5653750
Tool-Calls: 2
Hooks-Commit: 1a6200f
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-137
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 0
Tool-Calls: 0
Hooks-Commit: d873f64
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-137
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 0
Tool-Calls: 0
Hooks-Commit: 9e89516
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-137
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 1252972
Tool-Calls: 6
Hooks-Commit: c7ab8ab
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-137
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 1017085
Tool-Calls: 3
Hooks-Commit: 20109cd
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-138
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 1795920
Tool-Calls: 7
Hooks-Commit: d11bd25
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-138
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 1252467
Tool-Calls: 4
Hooks-Commit: 8fce8d1
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-138
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 1467624
Tool-Calls: 5
Hooks-Commit: f401596
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-138
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 0
Tool-Calls: 0
Hooks-Commit: 61f0eac
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-138
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 330458
Tool-Calls: 1
Hooks-Commit: 2638bd7
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-138
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 1893921
Tool-Calls: 5
Hooks-Commit: 5f76777
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-138
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 0
Tool-Calls: 0
Hooks-Commit: 9a5d93d
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-138
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 3106161
Tool-Calls: 8
Hooks-Commit: 9ddab80
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-138
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 4117165
Tool-Calls: 10
Hooks-Commit: e892c22
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
Task-Id: GF-138
AI-Tool: claude-code
AI-Tool-Version: 2.1.285
Co-Authored-By: Claude <noreply@anthropic.com>
AI-Model: claude-opus-5-5
Tokens-Used: 2484918
Tool-Calls: 6
Hooks-Commit: af8de8d
Signed-off-by: cpu-once <231006716+cpu-once@users.noreply.github.com>
@coralstay
coralstay merged commit 0e6cf0c into main Oct 3, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant