# Tablecloth Sign Release

> Repackage and Authenticode-sign TableCloth and Spork x64 and arm64 CI payloads with the local SimplySign certificate, then replace and verify draft release assets. Use only after a release CI draft succeeds.

- Skill: `yourtablecloth/tablecloth-sign-release` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add yourtablecloth/tablecloth-sign-release`
- Raw SKILL.md: https://api.skillmd.com/api/skills/yourtablecloth/tablecloth-sign-release/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: yourtablecloth (https://skillmd.com/u/yourtablecloth)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/yourtablecloth/tablecloth-sign-release

---


# TableCloth 릴리스 산출물 서명

CI가 만든 x64와 arm64 게시 산출물을 로컬 SimplySign 인증서로 전체 서명하고 GitHub Draft 자산을 교체합니다.

## 입력 검증

[`docs/RELEASING.md`](../../../docs/RELEASING.md)의 로컬 서명 절차를 읽습니다. 다음 입력을 확인합니다.

- 대상 태그와 Retail 또는 Preview 구분
- 성공한 CI 실행과 Draft Release
- `PublishPayload-x64`와 `PublishPayload-arm64`
- 태그 코어와 `Directory.Build.Props`의 일치
- Preview라면 태그에서 추출한 Preview 번호
- SimplySign 세션과 개인 키를 포함한 로컬 인증서

인증서 개인 키나 PFX를 복사하거나 저장소와 CI에 업로드하지 않습니다. 인증서 주체는 현재 로컬 인증서에서 확인하며 문서에 고정된 이름을 가정하지 않습니다.

## 안전한 작업 디렉터리

`git rev-parse --show-toplevel`로 저장소 루트를 확인합니다. 정리 대상은 해당 루트 아래의 생성물인 `publish`와 `Releases`, 그리고 작업별 임시 아티팩트 디렉터리로 제한합니다. 계산한 경로가 저장소 루트 또는 임시 디렉터리 안에 있는지 확인한 뒤 제거합니다.

두 `PublishPayload`를 내려받아 `publish` 계약에 맞게 합칩니다. TableCloth와 Spork의 x64 및 arm64 폴더가 모두 존재하지 않으면 중단합니다.

## 패키징과 서명

Retail은 `build.cmd --skip-build --sign`을 사용합니다. Preview는 `--preview --preview-number N`을 추가하며 `N`을 태그에서 추출합니다. 수동 기본값에 의존하지 않습니다.

패키징 로그에서 TableCloth와 Spork의 앱 바이너리, `Update.exe`, `Setup.exe` 서명을 확인합니다. 로컬에서 빌드할 수 없는 arm64 Native AOT 코드는 CI 페이로드를 사용하고 x64 호스트에서는 패키징과 서명만 수행합니다.

## 업로드와 검증

자산을 파일별로 `gh release upload --clobber`하여 부분 실패를 식별합니다. 각 파일을 최대 세 번 재시도하고 계속 실패하면 Draft를 유지합니다.

원격 자산 이름과 크기를 로컬 결과와 비교합니다. 모든 `.exe` 자산과 Portable ZIP 내부 앱 바이너리의 Authenticode 상태가 `Valid`인지 확인합니다. 한 항목이라도 누락되거나 서명이 유효하지 않으면 `UNSIGNED` 경고를 제거하거나 Release를 게시하지 않습니다.

완료 보고에는 사용한 CI 실행, 두 아키텍처의 산출물 수, 서명 검증 결과와 업로드 대조 결과를 포함합니다. 인증서의 민감한 정보는 출력하지 않습니다.

