Skip to content
Merged
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
Original file line number Diff line number Diff line change
@@ -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

<!-- SECTION:DESCRIPTION:BEGIN -->
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에 그대로 남긴다.
<!-- SECTION:DESCRIPTION:END -->

## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #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이 이 핫픽스로 선반영됐다고 코멘트를 남긴다
<!-- AC:END -->

## Definition of Done
<!-- DOD:BEGIN -->
- [ ] #1 python3 -m unittest discover -s tests 전체 통과
- [ ] #2 ruff check 통과
- [ ] #3 실제 커밋의 Tokens-Used가 트랜스크립트를 응답 단위로 따로 합산한 값과 일치하는지 확인
<!-- DOD:END -->
Original file line number Diff line number Diff line change
@@ -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

<!-- SECTION:DESCRIPTION:BEGIN -->
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, 지난 기록 본문은 바꾸지 않는다.
<!-- SECTION:DESCRIPTION:END -->

## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #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을 반영한다
<!-- AC:END -->

## Definition of Done
<!-- DOD:BEGIN -->
- [ ] #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이 유지된다
<!-- DOD:END -->
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -30,17 +31,29 @@ type: docs

## Acceptance Criteria
<!-- AC:BEGIN -->
- [ ] #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 지시가 폐기됐음을 메모리에 반영한다
<!-- AC:END -->

## Definition of Done
<!-- DOD:BEGIN -->
- [ ] #1 실제로 머지 커밋으로 병합이 되는지 확인
- [x] #1 실제로 머지 커밋으로 병합이 되는지 확인
<!-- DOD:END -->

## Implementation Notes

<!-- SECTION:NOTES:BEGIN -->
마무리 검증(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개)로 병합됨.
<!-- SECTION:NOTES:END -->

## Final Summary

<!-- SECTION:FINAL_SUMMARY:BEGIN -->
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개)으로 확인했다.
<!-- SECTION:FINAL_SUMMARY:END -->
Loading