작업6 — crowny-deacon 도구제작 래칫 상한 카운터 장부화
개요
집사회.한선의 미션당 도구제작 티켓 발행 상한(7건, _도구제작미션상한)이 서버
재기동을 넘어 지속되는지 검증하고, claim 핫패스에서의 중복 장부조회를
줄였다. 배경 의혹은 2026-07-29 문서(2026-07-29-집사회-티켓소화-2라운드-결함발견.md
44행): "T58 claim 시 쌍둥이 T97 발행 — 래칫 상한 카운터가 인메모리(부팅 시
0 리셋)로 의심".
확인된 사실
/Users/ef/crowny-deacon/한선씨/집사회.한선의 상한 판정
(_도구제작미션건수/구 _중복도구제작있나)은 조사 시점 기준 이미 장부
기반이었다 — 매 호출마다 미션티켓목록(미션ID)이 티켓목록() →
_PSV파일유니크최신(_티켓파일)을 거쳐 data/티켓.psv를 디스크에서 재파싱한다.
전역/캐시 변수에 카운트를 들고 있는 인메모리 카운터는 소스에 존재하지
않았다(server.js에도 대응 JS 레이어 없음, grep 0건). 2026-07-29 의혹 시점
이후 다른 세션 편집으로 이미 해소됐거나, 애초에 실제 원인이 다른 경로(예:
동시 claim 레이스)였을 가능성이 있다 — 이번 작업으로 재발 여부와 무관하게
설계를 장부기반으로 명시·강화했다.
수정 내용
_중복도구제작있나와 _도구제작미션건수를 _도구제작상태(미션ID, 새지시문)
하나로 병합했다 — 이전엔 두 함수가 각각 미션티켓목록()(=장부 전체 재파싱)을
호출해 claim 핫패스(대응 타/옴마다 도는 경로)에서 티켓.psv 재파싱이 2회
발생했다. 이제 1회 조회로 중복가드(동일 지시문 존재 여부)와 상한가드(도구제작
유형 카운트)를 동시에 계산해 반환([이미있음, 카운트]) — 파싱 비용 절반.
_도구제작미션상한 = 7 상수 자체는 불변, 판정 로직만 병합. 주석에 장부기반
설계 의도와 인메모리 캐시를 두지 않는다는 점을 명시했다(향후 편집자가 실수로
캐시를 넣지 않도록).
검증 (격리 사본, 라이브 data/·toau 무접촉)
사본 위치: /tmp 스크래치 디렉토리(작업6/), data/ 격리(라이브 경로와
분리), _미스로그경로도 격리 경로로 sed 치환.
- 컴파일:
서버.한선(정본 엔트리, 루트에서가져오기 "한선씨/집사회.한선")
시드7.한선/재기동8번째.한선/미달발행.한선) 모두
CROWNY_STRICT=1 hanseonc_high 0 경고 컴파일 성공.
- 핵심 시나리오(재기동 후 상한 차단):
티켓생성 직접 호출).
프로세스 종료.
- 프로세스B(별도 OS 프로세스=재기동 시뮬레이션): `_도구제작래칫시도(M1, ..,
"원지시8") 호출 → **BLOCKED_OK**(발행 거부, 반환 ""`). 발행 시도
후에도 data/티켓.psv 도구제작 건수는 7건 그대로(증가 없음) — 인메모리
카운터였다면 새 프로세스는 카운트 0에서 시작해 발행됐을 것.
- 회귀(상한 미달 시 정상 발행): 신규 미션(도구제작 0건)에서
_도구제작래칫시도 호출 → ISSUE_OK|T8(정상 발행) 확인.전 과정 2>/dev/null(stderr 분리, 체계() 출력 오염 방지 가드레일 준수).
관련 파일
/Users/ef/crowny-deacon/한선씨/집사회.한선(수정 —_도구제작상태병합,
_도구제작래칫시도 갱신)
/Users/ef/crowny-deacon/한선씨/미션장부.한선(읽기만, 미변경 —미션티켓목록/
티켓목록이 이미 디스크 재파싱 기반임을 확인하는 근거)
- 참고:
/Users/ef/CrownyDoc/projects/2026-07-29-집사회-티켓소화-2라운드-결함발견.md
잔여 이슈
- 2026-07-29 문서의 "T58→T97 쌍둥이" 재현 스크립트는 확보하지 못했다 — 만약
- 동시 다중 claim(진짜 동시성 레이스)에 의한 상한 초과 가능성은 별도