Cromford는 티켓을 넣으면 리뷰와 머지, 배포 전 검증까지 마친 변경을 내보낸다는 오픈소스 소프트웨어 팩토리다. 2026년 11월 3일 03:52 UTC 커밋 b35afb0은 8개 파일 425줄을 건드렸다(420줄 추가, 5줄 삭제). 커밋 제목은 “Cromford 2026.11.03 (upstream 22d8c0ad9714)”이고, 대상은 커밋 상태를 GitHub에 게시하는 셸 스크립트와 그 설정·문서·테스트다. 소스는 GitHub의 해당 커밋이다(https://github.com/cromford-ai/cromford/commit/b35afb0f4607921d6b4800b6e601554cb82448ce).
핵심은 두 가지다. bin/lib/gh-rest.sh는 응답의 JSON에서 `.message`를 뽑아 GH_REST_MESSAGE로 남긴다. 2xx가 아니고 304나 404도 아닌 응답에서만 값을 취하고, 줄바꿈은 한 줄로 접은 뒤 200자로 자른다. bin/lib/verdict-status.sh의 vs_publish는 App 토큰을 만들 수 있는 상자(gh_auth_armed)에서는 ghs_로 시작하는 설치 토큰으로만 게시한다. gh-token.sh는 민팅 실패 시 PAT를 출력하므로 ghs_가 아닌 토큰은 실패로 간주하고, 민팅을 한 번 더 시도한 뒤에도 ghs_가 아니면 “vs_publish: no App token for <slug>” 한 줄만 남기고 게시하지 않는다(rc 1).
실패 원인을 읽기 쉽게 하는 변경도 들어갔다. 오류 줄은 이제 HTTP 상태와 사유, 토큰 종류(app|pat|gh-auth|other, 토큰 값은 출력하지 않음), GitHub가 보낸 메시지를 함께 적는다. 그리고 403/429가 rate-limit으로 분류됐고 GitHub의 Retry-After가 1초 이상일 때만 그 시간만큼 기다린 뒤 한 번 더 게시한다. 기다릴 최대 초는 VS_RETRY_AFTER_MAX_S이며, 새로 추가된 catalog/lanes.d/_lib.verdict-status.json의 lib.verdict-status.vs_retry_after_max_s 설정으로 읽고, 코드 기본값은 30초다. 설정값이 정수가 아니면 30초로 떨어진다.
다만 이 커밋만으로는 범위를 정하기 어렵다. 변경은 셸 스크립트 내부의 상태 게시 경로에 한정되고, 공개된 사실에는 라이선스·사용 사례·성능 수치가 없다. 285줄짜리 테스트 파일과 2026-11-02 BH-8848 설계 노트는 확인 절차를 보여줄 뿐 실행 결과는 주어지지 않았다. 토큰 분류도 접두사에만 의존하므로 실제 권한 수준까지 드러내지 않는다. 또 커밋 제목은 “App 민팅이 실패하면 상속 토큰으로 게시”라고 적혀 있지만, diff는 armed 상자에서 상속 토큰으로의 게시를 막고 있다. 어느 쪽이 의도된 동작인지는 이 커밋만으로 확정할 수 없다.