diff --git "a/backlog/drafts/draft-22 - Tokens-Used-\355\225\253\355\224\275\354\212\244-\342\200\224-\354\204\270\354\205\230\353\263\204-\354\273\244\354\204\234\354\231\200-\354\235\221\353\213\265-\353\213\250\354\234\204-\354\244\221\353\263\265-\354\240\234\352\261\260.md" "b/backlog/drafts/draft-22 - Tokens-Used-\355\225\253\355\224\275\354\212\244-\342\200\224-\354\204\270\354\205\230\353\263\204-\354\273\244\354\204\234\354\231\200-\354\235\221\353\213\265-\353\213\250\354\234\204-\354\244\221\353\263\265-\354\240\234\352\261\260.md" new file mode 100644 index 0000000..7c532a8 --- /dev/null +++ "b/backlog/drafts/draft-22 - Tokens-Used-\355\225\253\355\224\275\354\212\244-\342\200\224-\354\204\270\354\205\230\353\263\204-\354\273\244\354\204\234\354\231\200-\354\235\221\353\213\265-\353\213\250\354\234\204-\354\244\221\353\263\265-\354\240\234\352\261\260.md" @@ -0,0 +1,44 @@ +--- +id: DRAFT-22 +title: Tokens-Used 핫픽스 — 세션별 커서와 응답 단위 중복 제거 +status: Draft +assignee: [] +created_date: '2026-10-03 03:30' +updated_date: '2026-10-03 03:31' +labels: + - hooks + - bug +dependencies: [] +priority: high +type: bug +--- + +## Description + + +Tokens-Used 값이 두 방향으로 틀리고 있다(2026-10-03 실측). + +첫째, 세션이 바뀌면 첫 커밋이 0으로 찍힌다. post-commit은 트랜스크립트에서 이미 읽은 줄 수를 저장소에 커서 하나(.git/.gitformat-token-cursor)로만 저장하는데, 트랜스크립트는 세션마다 새 파일이다. 새 세션의 짧은 파일을 이전 세션의 줄 수(927)로 읽으면 새 줄이 없다고 판단해 0이 된다. 커밋 7fef01e가 이렇게 0으로 남았다. GF-129에 없는 버그다. + +둘째, 0이 아닐 때는 2~3배 부풀려진다. 트랜스크립트는 API 응답 하나를 content 블록마다 한 줄씩 기록하고, 각 줄이 같은 usage를 반복해서 들고 있다. 지금 구현은 줄마다 더한다. 이번 세션 실측으로 assistant 215줄이 응답 109개였다. 이건 GF-129 AC#1과 같은 문제다. + +GF-129는 GF-127→GF-128 재설계 뒤로 묶여 있어서, 값이 틀린 채로 커밋이 계속 쌓인다. 그래서 지금 post-commit에서 두 버그만 먼저 고친다. Tokens-Used 형식 변경(in/out/delta)과 커밋 귀속은 GF-129에 그대로 남긴다. + + +## Acceptance Criteria + +- [ ] #1 커서 파일에 세션 ID와 줄 수를 함께 저장하고, 세션 ID가 다르면 트랜스크립트 0줄부터 집계한다 +- [ ] #2 예전 형식(숫자만) 커서는 세션 불일치로 취급해 0줄부터 집계한다 +- [ ] #3 (requestId, message.id)가 같은 assistant 줄은 usage를 한 번만 더한다 +- [ ] #4 requestId나 message.id가 없는 줄은 지금처럼 줄 단위로 더한다 +- [ ] #5 Tool-Calls는 지금처럼 모든 줄의 tool_use 블록을 센다 +- [ ] #6 새 세션 첫 커밋, 중복 줄, 예전 커서 형식을 다루는 테스트를 추가하고 기존 테스트의 커서 기대값을 새 형식에 맞춘다 +- [ ] #7 doc-16에 세션별 커서와 응답 단위 계상을 반영하고, GF-129 AC#1이 이 핫픽스로 선반영됐다고 코멘트를 남긴다 + + +## Definition of Done + +- [ ] #1 python3 -m unittest discover -s tests 전체 통과 +- [ ] #2 ruff check 통과 +- [ ] #3 실제 커밋의 Tokens-Used가 트랜스크립트를 응답 단위로 따로 합산한 값과 일치하는지 확인 + diff --git "a/backlog/drafts/draft-23 - git-trail\353\241\234-\352\260\234\353\252\205\355\225\230\352\263\240-\352\260\234\353\205\220-\354\247\200\353\217\204-\353\254\270\354\204\234\353\245\274-\353\247\214\353\223\240\353\213\244.md" "b/backlog/drafts/draft-23 - git-trail\353\241\234-\352\260\234\353\252\205\355\225\230\352\263\240-\352\260\234\353\205\220-\354\247\200\353\217\204-\353\254\270\354\204\234\353\245\274-\353\247\214\353\223\240\353\213\244.md" new file mode 100644 index 0000000..6e5b703 --- /dev/null +++ "b/backlog/drafts/draft-23 - git-trail\353\241\234-\352\260\234\353\252\205\355\225\230\352\263\240-\352\260\234\353\205\220-\354\247\200\353\217\204-\353\254\270\354\204\234\353\245\274-\353\247\214\353\223\240\353\213\244.md" @@ -0,0 +1,45 @@ +--- +id: DRAFT-23 +title: git-trail로 개명하고 개념 지도 문서를 만든다 +status: Draft +assignee: [] +created_date: '2026-10-03 03:31' +updated_date: '2026-10-03 03:31' +labels: + - docs + - naming +dependencies: [] +priority: medium +type: docs +--- + +## Description + + +GF-138에서 git-logbook으로 개명했지만 유저가 이름을 다시 정했다(2026-10-03). 개발자들이 이런 도구를 부르는 말 네 가지, trail(audit trail)·provenance·attestation·audit 중 짧은 git-trail을 저장소 이름으로 쓰고, 네 용어는 설명과 GitHub topics에 모두 적는다. git-trail은 audit trail에서 왔고 git trailer와 소리도 겹친다. + +decision-25가 정한 목적 세 기둥(형식·출처 기록·이력 불변)은 그대로다. 바뀌는 건 이름뿐이다. + +이름에 용어를 다 넣는 대신, 각 용어가 이 저장소의 어느 훅·함수·파일·원격 설정으로 구현돼 있는지 짚는 문서를 만든다. 지금은 그런 문서가 없어서, 예컨대 attestation이라는 말을 보고 서명된 증명을 기대한 사람이 실제로는 서명 없는 트레일러뿐이라는 걸 알기 어렵다. 그래서 구현된 것과 빈 곳을 함께 적는다. + +GF-138과 같은 원칙으로 설정 키 gitformat.*(GF-133), 태스크 접두어 GF, 지난 기록 본문은 바꾸지 않는다. + + +## Acceptance Criteria + +- [ ] #1 decision-26으로 이름을 git-trail로 바꾼다고 기록하고, decision-25의 이름 조항만 대체한다고 명시한다 +- [ ] #2 README, install.sh, 훅 주석, .gitmessage, CI, 테스트, backlog config, doc-1·5·6·20의 표시 이름 git-logbook이 git-trail로 바뀐다 (설정 키·파일명 gitformat.*은 제외) +- [ ] #3 trail·provenance·attestation·audit 각각의 정의, 구현 위치(훅 함수·파일·설정·원격), 빈 곳을 적은 개념 지도 문서를 backlog doc으로 만든다 +- [ ] #4 개념 지도의 구현 위치는 실제 코드의 함수명·파일 경로와 일치한다 +- [ ] #5 README에서 개념 지도 문서로 안내한다 +- [ ] #6 PR을 머지 커밋으로 병합한 뒤 GitHub 저장소를 coralstay/git-trail로 rename하고 origin URL을 갱신한다 +- [ ] #7 GitHub 저장소 description과 topics에 trail·provenance·attestation·audit을 반영한다 + + +## Definition of Done + +- [ ] #1 python3 -m unittest discover -s tests 전체 통과 +- [ ] #2 ruff check 통과 +- [ ] #3 git grep -i git-logbook -- ':!backlog' 결과에 의도한 예외만 남는다 +- [ ] #4 rename 뒤 예전 URL 두 개(git-format, git-logbook)가 새 저장소로 리다이렉트되고 ruleset이 유지된다 + diff --git "a/backlog/tasks/gf-137 - append-only-\354\235\264\353\240\245-\354\240\225\354\261\205-\352\262\260\354\240\225\352\263\274-\353\254\270\354\204\234\355\231\224-\354\233\220\352\262\251-\352\260\225\354\240\234-\354\240\201\354\232\251.md" "b/backlog/tasks/gf-137 - append-only-\354\235\264\353\240\245-\354\240\225\354\261\205-\352\262\260\354\240\225\352\263\274-\353\254\270\354\204\234\355\231\224-\354\233\220\352\262\251-\352\260\225\354\240\234-\354\240\201\354\232\251.md" index 26ebb52..137f57d 100644 --- "a/backlog/tasks/gf-137 - append-only-\354\235\264\353\240\245-\354\240\225\354\261\205-\352\262\260\354\240\225\352\263\274-\353\254\270\354\204\234\355\231\224-\354\233\220\352\262\251-\352\260\225\354\240\234-\354\240\201\354\232\251.md" +++ "b/backlog/tasks/gf-137 - append-only-\354\235\264\353\240\245-\354\240\225\354\261\205-\352\262\260\354\240\225\352\263\274-\353\254\270\354\204\234\355\231\224-\354\233\220\352\262\251-\352\260\225\354\240\234-\354\240\201\354\232\251.md" @@ -1,10 +1,11 @@ --- id: GF-137 title: 'append-only 이력 정책 결정과 문서화, 원격 강제 적용' -status: To Do -assignee: [] +status: Done +assignee: + - '@claude' created_date: '2026-09-26 13:24' -updated_date: '2026-09-26 13:24' +updated_date: '2026-10-03 03:31' labels: - policy - docs @@ -30,17 +31,29 @@ type: docs ## Acceptance Criteria -- [ ] #1 append-only 이력 정책을 decision으로 기록한다 — 연산별 허용/거부와 금지선(공개된 이력) -- [ ] #2 이력을 바꾸는 git 연산별 훅 판별 방법을 실측해 문서로 남긴다 -- [ ] #3 우회 경로를 전수 조사해 문서에 남긴다 — 훅이 없는 경로, 판별 불가 경로, 로컬이 닿지 않는 경로, 오탐 -- [ ] #4 GitHub 원격 강제를 적용한다 — 병합 방식을 머지 커밋만 남기고 force push와 브랜치 삭제를 막는다 -- [ ] #5 원격 설정 관리 문서를 만든다 — 현재 상태, 켜면 안 되는 규칙, 확인·변경 명령, 함정 -- [ ] #6 claude-rails의 fast-forward 전용 강제 훅이 정책과 충돌하는 점을 그쪽 저장소에 기록한다 -- [ ] #7 후속 작업을 드래프트로 남긴다 — 로컬 훅 강제, CI 트레일러 정합성 검사, 원격 보호 범위 확대 -- [ ] #8 기존 rebase-merge 지시가 폐기됐음을 메모리에 반영한다 +- [x] #1 append-only 이력 정책을 decision으로 기록한다 — 연산별 허용/거부와 금지선(공개된 이력) +- [x] #2 이력을 바꾸는 git 연산별 훅 판별 방법을 실측해 문서로 남긴다 +- [x] #3 우회 경로를 전수 조사해 문서에 남긴다 — 훅이 없는 경로, 판별 불가 경로, 로컬이 닿지 않는 경로, 오탐 +- [x] #4 GitHub 원격 강제를 적용한다 — 병합 방식을 머지 커밋만 남기고 force push와 브랜치 삭제를 막는다 +- [x] #5 원격 설정 관리 문서를 만든다 — 현재 상태, 켜면 안 되는 규칙, 확인·변경 명령, 함정 +- [x] #6 claude-rails의 fast-forward 전용 강제 훅이 정책과 충돌하는 점을 그쪽 저장소에 기록한다 +- [x] #7 후속 작업을 드래프트로 남긴다 — 로컬 훅 강제, CI 트레일러 정합성 검사, 원격 보호 범위 확대 +- [x] #8 기존 rebase-merge 지시가 폐기됐음을 메모리에 반영한다 ## Definition of Done -- [ ] #1 실제로 머지 커밋으로 병합이 되는지 확인 +- [x] #1 실제로 머지 커밋으로 병합이 되는지 확인 + +## Implementation Notes + + +마무리 검증(2026-10-03): #1 decision-24 파일 존재·accepted. #2·#3 doc-19의 '결론 표'와 '우회 경로 전수 조사' 절. #4 gh api: allow_merge_commit=true, rebase=false, squash=false, ruleset 23313297 active(deletion, non_fast_forward). #5 doc-20(현재 상태·켜면 안 되는 규칙·확인/변경 방법·함정 절). #6 claude-rails 저장소 decision-10·decision-11, task-24(pre_merge_check.py 제거). #7 DRAFT-18·19·20 존재. #8 메모리 feedback_rebase_merge.md에 2026-09-26 정책 뒤집힘 기록. DoD: 이 태스크의 커밋이 들어간 PR #39가 머지 커밋 0e6cf0c(부모 2개)로 병합됨. + + +## Final Summary + + +append-only 이력 정책을 decision-24로 정하고, 연산별 판별 방법과 우회 경로를 doc-19, 원격 강제 설정을 doc-20에 정리했다. GitHub에 머지 커밋 전용 병합과 force push·삭제 금지 ruleset을 적용했고, 후속 작업은 DRAFT-18·19·20으로 남겼다. claude-rails 쪽 충돌은 그 저장소 decision-10·11과 task-24에 기록됐다. gh api 결과와 PR #39의 머지 커밋(부모 2개)으로 확인했다. +