| name | game-translate |
| description | Orchestrate a fail-closed Korean game-localization workflow across overall analysis, text analyze/translate/QA/review, conditional image analyze/translate/QA/review, integrated QA, and release. Review stages prepare emulator-ready handoffs by default and wait for user approval only when the project explicitly sets user-gate. Use when starting, resuming, or reconciling a NSW/SFC/PS1/PS2/Steam game translation project. |
game-translate โ ๊ฒ์ ํ๊ธํ ์ค์ผ์คํธ๋ ์ดํฐ
์ฌ์ฉ์๊ฐ ํฉ๋ฒ์ ์ผ๋ก ๋ณด์ ํ ๊ฒ์์ ๊ฐ์ธ ๋ฒ์ญ ํจ์น๋ฅผ ์งํํ๋ค. ์๋ณธ ๊ฒ์ ๋ฐ์ดํฐยท์ฝ์ ํคยท
ํ์จ์ด๋ ์์
ยท๋ฐฐํฌ ์ฐ์ถ๋ฌผ์ ํฌํจํ์ง ์๋๋ค. ๋จ๊ณยท์ํยท์ ๋ฆฌ ๊ท์น์
$GT_HOME/common/pipeline-contract.json๊ณผ pipeline-contract.md๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ค.
0. ํ๊ฒฝ๊ณผ ์์
| ๋ณ์ | ์๋ฏธ |
|---|
GT_HOME | .codex-plugin/, skills/, common/์ด ํจ๊ป ์๋ ์ค์น ํ๋ฌ๊ทธ์ธ ๋ฃจํธ ๋๋ Claude์ ${CLAUDE_PLUGIN_ROOT} |
GT_WORKSPACE | ๊ฒ์ ๋ฐ์ดํฐยทํ์ดํ ์์
์ฅ ๋ฃจํธ |
GT_TOOLS | ๊ณต์ฉ ๋๊ตฌ ํด๋. ๊ฒ์ ์ฐ์ถ๋ฌผ์ ๋ง๋ค์ง ์์ |
์์ ์ ์ ๋ค์์ ์ฝ๋๋ค.
$GT_HOME/common/SAFETY.md
$GT_HOME/common/project-structure.md
$GT_HOME/common/workspace-boundary-contract.md
$GT_HOME/common/preflight-checks.md
$GT_HOME/common/pipeline-contract.md์ pipeline-contract.json
- ํ๋ซํผ ์ด๋ํฐ
platforms/<platform>/PLATFORM.md์ ํ์ฌ ๋จ๊ณ ๋ฌธ์
- ์์ง์ ์๋ณํ ๋ค
engines/<engine>/ENGINE.md
ํ์ดํ ๋ฃจํธ๋ ํ๋ซํผ ์ด๋ํฐ๊ฐ ์ฆ๋ช
ํ ์๋ณธ์ด ์ง์ ์๋ ์ค์ ํด๋๋ค(NSW๋ .nsp/.xci,
Steam/PC๋ ์ค์ ๊ฒ์ EXE๊ฐ ์๋ ์ค์น ํด๋). ์์
๋ฌผยท์์ ํ์ผยทstagingยท
๋ฐํ์ ์ฆ๊ฑฐ๋ ๊ทธ ํด๋์ _work/<ํ๋ก์ ํธ ID>/ ์๋์๋ง ๋๋ค. GT_HOME, ์ ์ฅ์ ๋ฃจํธ,
OS ์์ ํด๋, ๊ณต์ฉ MCP ๋๋ ํฐ๋ฆฌ, ์์ title/output/temp ํด๋๋ฅผ ์ถ๋ ฅ ๊ฒฝ๋ก๋ก ์ฐ์ง
์๋๋ค. ํ๋ก์ ํธยทํ๋ซํผยท์์งยทTitle IDยท์ ์ฑ
์ ํ์ ํ์ง ๋ชปํ๋ฉด ๋ณ๊ฒฝยท์ญ์ ยท๋ฐํ์์ ํ์ง
์๊ณ WARN/BLOCKED์ Handoff๋ง ๊ธฐ๋กํ๋ค.
๋๊ตฌ๊ฐ ๋ง๋๋ exportยท๋ฒ์ญ ์ค๊ฐ๋ฌผยทํ
์คํธ ์ฐ์ถ๋ฌผ/์คํฌ๋ฆฝํธ๋
$GT_HOME/common/artifact-layout-contract.md์ class๋ณ managed root์ ๋๊ณ
90_tools/PROJECT_ARTIFACT_MANIFEST.tsv์ artifact key, producer, reproduce command,
lifecycle, status, SHA-256์ ๊ธฐ๋กํ๋ค. ๊ธฐ์กด ํ๋ก์ ํธ๋ ์์
์
npm run project:artifacts -- --project-root "<ํ๋ก์ ํธ ๋ฃจํธ>" --init์ผ๋ก ํ๋ค์ค๋ฅผ ๋ง๋ ๋ค.
managed root์ ๋ฏธ๋ฑ๋ก ํ์ผ์ด๋ hash drift๊ฐ ์์ผ๋ฉด ํด๋น ๋จ๊ณ๋ BLOCKED๋ค.
๋ชจ๋ ์ฐ๊ธฐ ๋ช
๋ น ์ ์๋ npm run project:boundary -- --project-root "<ํ๋ก์ ํธ ๋ฃจํธ>" --stage <๊ธฐ๋ฅ> --assert-output "<output/temp/cache>"๋ก ๊ฐ ๊ฒฝ๋ก๋ฅผ ๊ฒ์ฌํ๋ค. ํ๋๋ผ๋ ํ๋ก์ ํธ
๋ฐ์ด๊ฑฐ๋ ๊ธฐ๋ฅ๋ณ canonical root ๋ฐ์ด๋ฉด ๋ช
๋ น์ ์คํํ์ง ์๋๋ค.
1. ์ค์ ๋จ๊ณ ํ๋ฆ
| ์์ | ๋จ๊ณ | ์คํฌ | ์๋ฃ ์ํ |
|---|
| 1 | ๊ณตํต ํ์ผยท์์งยท์ธ์ด ์ฌ๋กฏ ๋ถ์ | gt-analyze | project_status=analyzed |
| 2 | ํ
์คํธ ๋์ยท์๋ณต ๊ณ์ฝ ๋ถ์ | gt-text-analyze | text analyzed |
| 3 | ํ
์คํธ ๋ฒ์ญยท์ฉ์ด์ง ๋์ | gt-text-translate | text translated |
| 4 | ํ
์คํธยทํฐํธ ๊ธฐ์ QAยทํ๋ณด ์์ฑ | gt-text-qa | text qa_ready, font_status=verified |
| 5 | ํ
์คํธ ๊ฒ์ handoffยท์๋ฎฌ๋ ์ดํฐ ์ค๋น | gt-text-review | text review_ready |
| 6 | ์ด๋ฏธ์ง ๋์ยทatlas ๊ณ์ฝ ๋ถ์ | gt-image-analyze | image analyzed |
| 7 | ์ด๋ฏธ์งยทํ
์ค์ฒ ๋ฒ์ญ | gt-image-translate | image translated |
| 8 | ์ด๋ฏธ์ง ๊ธฐ์ QAยท์ฃผ์
ํ๋ณด ์์ฑ | gt-image-qa | image qa_ready |
| 9 | ์ด๋ฏธ์ง ๋น๊ตยท๊ฒ์ handoff | gt-image-review | image review_ready |
| 10 | ํ
์คํธยทํฐํธยท์ด๋ฏธ์ง ํตํฉ ๋น๋ยท์คํ QA | gt-qa | qa_status=passed |
| 11 | ํ๋ซํผ ๋ฐฐํฌ ํจํค์ง | gt-release | release_status=released |
๊ธฐ๋ณธ ์คํ ์์๋ ํ์ ๊ฐ์ผ๋ฉฐ, ๊ณตํต ๋ถ์ ๋ค ํ
์คํธ ๋ธ๋์น๋ฅผ ๋จผ์ ๋๋ด ์ด๋ฏธ์ง ์์
๋ฌธ์์ glossaryยทSTYLE์ ๊ณต๊ธํ๋ค. ํ๋ก์ ํธ๊ฐ ์ฝ๊ธฐ ์ ์ฉ ๋ณ๋ ฌ ๋ถ์์ ํ์ฉํด๋ ๊ฐ์
manifestยท๋ฒ์ญํยทstaging์ ๋์์ ์ฐ์ง ์๋๋ค.
2. ๊ฒ์ยท์ฌ์ฉ์ ๋๊ธฐ ์ ์ฑ
text-review์ image-review์ โ๊ฒ์โ๋ ๊ธฐ์ QA ๊ฒฐ๊ณผ, ์ ์ฒด ์ํธ, ๋น๊ต ์๋ฃ, hash,
canonical staging, handoff๋ฅผ ๋ง๋ค์ด ๋ค์ ๋จ๊ณ๊ฐ ์คํ ๊ฐ๋ฅํ๊ฒ ์ค๋นํ๋ ๋ป์ด๋ค.
- ๊ธฐ๋ณธ
text_review_policy=prepare-only, image_review_policy=prepare-only: ์ฐ์ถ๋ฌผ์
์์ฑํ๊ณ review_ready๋ก ์๋ ์งํํ๋ค. ์ฌ์ฉ์ ํ๋ฝ์ ๋ฌป๊ฑฐ๋ ๋๊ธฐํ์ง ์๋๋ค.
- ํ๋ก์ ํธ์
text_review_policy=user-gate ๋๋ image_review_policy=user-gate๊ฐ
๋ช
์๋ ๊ฒฝ์ฐ์๋ง ํด๋น ์ํธ๋ฅผ ์ ์ถํ๊ณ ์ฌ์ฉ์์ ๋ช
์์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค.
review_ready๋ ์ฌ์ฉ์ ์น์ธยทPASS (runtime)ยท๋ฆด๋ฆฌ์ค ์๋ฃ๊ฐ ์๋๋ค.
- ์ฌ์ฉ์๊ฐ ๋์ค์ ์์ ์์ ์ ๊ณตํ๋ฉด ํด๋น ํ/์ด๋ฏธ์ง๋ง branch QA๋ถํฐ ๋ค์ ์คํํ๋ค.
runtime_policy๋ review policy์ ๋ณ๊ฐ๋ค. static-first์์๋ ์ฌ์ฉ์์ ๋ช
์์ ์คํ
์์ฒญ ์ ๊น์ง bench์ PENDING_RUNTIME๋ง ๊ธฐ๋กํ๋ค. ์ด ์ ์ฑ
์ ์ค๊ฐ ์คํ ๋น๋๋ง ์กฐ์ ํ๋ฉฐ,
๋ฆด๋ฆฌ์ค ์ ๊ณต์ ๋ฐฐํฌ์ฉ ๋ฆด๋ฆฌ์ฆ ์๋ฎฌ๋ ์ดํฐ์ non-MCP ์ง์ ์คํ์ ์๋ตํ์ง ์๋๋ค.
3. ์ด๋ฏธ์ง ๋ฒ์
image_scope=pending์ด๋ฉด ์ด๋ฏธ์ง ๋จ๊ณ๋ฅผ ์๋ตํ์ง ์๋๋ค.
gt-image-analyze๊ฐ ์ ์ inventoryยท์๊ฐ/metadata ๊ทผ๊ฑฐ๋ฅผ ๋จ๊ธด ๋ค required ๋๋
N/A๋ก ํ์ ํ๋ค.
required๋ฉด ์ด๋ฏธ์ง 4๋จ๊ณ๋ฅผ ๋ชจ๋ ์คํํ๋ค. N/A๋ฉด ๊ณํยท๊ฐ์ง ์ด๋ฏธ์งยท๊ฒ์ ํ์ ๋ง๋ค์ง
์๊ณ image_status=skipped, 0๊ฑด ๊ทผ๊ฑฐ, ์๋ต ์ฌ์ ๋ฅผ ๊ธฐ๋กํ ๋ค gt-qa๋ก ์ด๋ํ๋ค.
N/A์ฌ๋ ํตํฉ QA์์ ์๋ณธ ์ด๋ฏธ์งยทatlas๊ฐ ์ ์ ํ์๋๋์ง๋ ํ์ธํ๋ค.
4. ๊ณตํต preflight์ ์ํ
๊ฐ ๋จ๊ณ๋ฅผ ์ง์ ํธ์ถํ ๋๋ PROJECT.md, WORK_LOG.md, HANDOFF.md, ์
๋ ฅ manifestยท
์ถ๋ ฅ ๊ฒฝ๋ก์ ์์ ์๊ฐ/ํฌ๊ธฐ/SHA-256/git status๋ฅผ ์ฝ๋๋ค. ์ ์ฑ
ํ์๊ฐ์
batch_size, glossary_path, runtime_policy, runtime_authorization,
ํ๋ซํผ๋ณ basic_test_backend์ mcp_session_scope(NSW๋ eden-mcp/one-per-title,
Steam/PC๋ direct-native/none),
final_qa_runtime=official-distribution-release, final_qa_mcp_allowed=false,
target_language_slot, image_scope, image_model=provider-selected,
image_quality=provider-managed, image_input_fidelity=provider-managed,
text_review_policy, image_review_policy,
text_review_approval, image_review_approval, font_status, release_contract๋ค.
ํ ์ํ, ๋ธ๋์น ์ํ, QA ์ํ, ์ฌ์ฉ์ ์น์ธ, ๋ฐํ์ ์ํ, ๋ฆด๋ฆฌ์ค ์ํ๋ฅผ ํ ๊ฐ์ผ๋ก ํฉ์น์ง
์๋๋ค. qa_ready โ review_ready โ user-approved โ PASS (runtime) โ released๋ค.
๋ฌธ์ยทmanifestยท์ธ์
ยทํ์ผ ํด์๊ฐ ์ถฉ๋ํ๋ฉด ์ถ์ธกํ์ง ์๋๋ค. HANDOFF.md์ append-only๋ก
๊ด์ฐฐยท์ํฅยท๊ฒฐ์ ยท์ฆ๊ฑฐยท์ํ๋ฅผ ๊ธฐ๋กํ๊ณ ํ์ฌ branch๋ฅผ blocked๋ก ์ ์งํ๋ค.
5. ํฐํธ์ ๋ฐํ์ ์์ ๊ฒ์ดํธ
gt-text-qa๋ $GT_HOME/common/font-atlas-contract.md์ ๋ฐ๋ผ ์ ์ฒด ๊ฐ์ ์ฝ๋ํฌ์ธํธ,
์ค์ font consumer/fallback, glyph IDยทatlas rectยทUV ์์ ยทpaddingยทbearingยทadvanceยท
baselineยทline metrics, ๊ธฐ์กด glyph ๋ณด์กด, ์๋ณต ์ถ์ถ, render probe๋ฅผ ์ฆ๋ช
ํ๋ค. ์ด ์ฆ๊ฑฐ๊ฐ
์๊ฑฐ๋ font_status=verified๊ฐ ์๋๋ฉด text review-ready๋ ํตํฉ QA๋ก ์งํํ์ง ์๋๋ค.
gt-qa๋ ๊นจ๋ํ ์๋ณธ์์ ํ ๋ฒ๋ง ํตํฉํ๋ค. NSW ๊ธฐ๋ณธ smoke๋ Eden-MCP์ ๋จ์ผ title ์ธ์
์
์ฌ์ฌ์ฉํ๊ณ , Steam/PC๋ ์ค์น ๊ฒ์์ direct-native smoke๋ฅผ ์ฌ์ฉํ์ง๋ง ์ด๋ ์ชฝ๋ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ
์ต์ข
PASS๋ก ์ฐ์ง ์๋๋ค. ์ต์ข
QA๋ ํ๋ซํผ allowlist์ ๊ณต์ ๋ฐฐํฌ ๋ฆด๋ฆฌ์ฆ/์ค์น๋ณธ์ MCP ์์ด
์ง์ ์คํํ๊ณ ์
๋ ฅ ๊ฒฝ๋กยทproject/Title IDยทactive mod ์ ์ hashยท
binary/build hashยทํ๋ฉด ์ ์ดยท๋ก๊ทธ/์บก์ฒ๋ฅผ RELEASE_RUNTIME_QA.json์ ๊ท์ํ๋ค. ๋ก๋ ์์กดยท
์ข
๋ฃ ์ฝ๋ยทํจ์น ์ ์ฉ ๋ก๊ทธ๋ง์ผ๋ก PASSํ์ง ์๋๋ค.
์ด๋ฏธ์ง branch๋ $GT_HOME/common/image-translation-contract.md๋ฅผ ์ ์ฉํ๋ค. ์์ด์ ํธ๊ฐ
๋ง๋ raster ํ๋ณด๋ API ํค ์๋ $imagegen ๋ด์ฅ image_gen.imagegen์ ๊ฐ์ byte-exact
referenceยทprompt๋ก ์ต์ 3ํ ๋
๋ฆฝ ํธ์ถํ schema 3 receipt(canvas-size-only ์ ๊ทํ schema 4 ๋๋
best-of-3 alpha mask composition schema 5 ํฌํจ)์ ์ ํํ ํ๋์ ํฉ๊ฒฉ ์ ํ ํ๋ณด๊ฐ
์์ด์ผ ํ๊ณ ,
IMAGE_GENERATION_MANIFEST.tsv์ ๋ํด validate-image-translation.mjs๊ฐ source/reference
๋น๋ฎ์ด์ฐ๊ธฐ, ์๋ฌธ ์์ ์ ๊ฑฐ์ no-overlay, ์์ด์ ์์ฒด ์ธ์ยท์ยท์ธ๊ณฝ์ ยท์ง๊ฐยท์ฌ์งยท๊ด์ยท
์๊ฐ/baselineยท๋ถ์๊ธฐ, anchor/atlas rectยทcanvas/format, ์ ์ธ๋ alpha policy, edit region ๋ฐ
decoded RGBA diff 0์ ์ฆ๋ช
ํด์ผ ํ๋ค. ๋ด์ฅ surface๊ฐ ๋
ธ์ถํ์ง ์๋ ๋ชจ๋ธ/quality๋ฅผ ์ฃผ์ฅํ๊ฑฐ๋
API/CLI, Python/Pillow/OpenCV/์์ ์คํฌ๋ฆฝํธ raster ์์ฑ๋ฌผ, ๊ฒ์ฆ๊ธฐ Issues: 0์ด ์๋ ํ๋ณด๋
์ด๋ฏธ์ง ๋ฒ์ญยทQA ์๋ฃ๋ก ์น๊ฒฉํ์ง ์๋๋ค. ํฉ๊ฒฉ ํ๋ณด๊ฐ ์์ผ๋ฉด hold-for-imagegen-review๋ก ๋ฉ์ถ๋ค.
6. ์ธ์
ยท์ค๋ณต ํ์ผ ๋ฐฉ์ง
NSW ๊ธฐ๋ณธ smoke๋ Eden-MCP๋ค. Eden-MCP์ Ryubing-MCP๋ ํ๋ก์ ํธ๋น
50_test/eden/SESSION.json๊ณผ ARTIFACT_MANIFEST.tsv ํ๋๋ฅผ ๊ณต์ ํ๋ค. ์คํ ์ ์ ์์ชฝ
capability์ ๊ฐ์ Title ID์ remote session ๋ชฉ๋ก/status๋ฅผ ์กฐํํ๋ค.
- ๊ฐ์ session key๋ฉด ์ ์ธ์
์ ๋ง๋ค์ง ์๊ณ ์ฌ์ฌ์ฉํ๋ค.
- ์์ชฝ์ ํฉ์ณ active/pending ์ธ์
์ด ๋ ์ด์์ด๋ฉด
BLOCKED๋ค. Ryubing์ด๋ ๋ ๋ฒ์งธ generation์
๊ตฌ์ฒด์ ์์ธ ์ฌ์ ์ ์ด์ exact close ์ฆ๊ฑฐ๊ฐ ์์ ๋๋ง ํ์ฉํ๋ค.
pending ์ํ์์ create๋ฅผ ์ฌํธ์ถํ์ง ์๋๋ค. remote๋ฅผ ์ฌ์กฐํํ๊ณ BLOCKED๋ก ์กฐ์ ํ๋ค.
- ์ด์
last_session_id๊ฐ ์์ผ๋ฉด exact remote close์ local close ๊ธฐ๋ก์ ๋จผ์ ์ฆ๋ช
ํ๊ณ ,
์ prepare์๋ --previous-session-id <๋์ผ ID>๋ฅผ ์ ๋ฌํ๋ค.
- ์ธ์
ยท๋ฐ ํด๋, timestamp/session/copy ํ์ผ, ๋ค๋ฅธ Title ID์ stagingยท๋ก๊ทธ๋ฅผ ๋ง๋ค์ง ์๋๋ค.
- create/launch ์คํจ ํ status ์ฌ์กฐํ ์ ์ฌํธ์ถํ์ง ์๋๋ค. ์ข
๋ฃ ์ ํ์ฌ ID๋ง closeํ๋ค.
- ๋์ผ
artifact_keyยทcanonical path๊ฐ ์์ผ๋ฉด hash๋ฅผ ๋น๊ตํด ์ฌ์ฌ์ฉ/์์ ๊ต์ฒดํ๊ณ ๋ณต์ฌ๋ณธ์
๋ง๋ค์ง ์๋๋ค.
qa-session guard๋ ์๊ฒฉ MCP ์ธ์
์ ์ง์ ์ญ์ ํ์ง ์๋๋ค. remote close ์ฑ๊ณต์ ํ์ธํ ๋ค์๋ง
local --action close --remote-closed๋ฅผ ์คํํ๋ค. ์์ ๊ถ์ ์ฆ๋ช
ํ ์ ์๋ ์ธ์
์ ์ญ์ ํ์ง
์๊ณ BLOCKED๋ค.
7. PDCA์ ์ฌ๊ฐ
- Plan: ๋จ๊ณ ์
๋ ฅ ๋ฒ์ยท์ ์ฑ
ยท์๋ฃ ๊ธฐ์คยทartifact key๋ฅผ
PROJECT.md์ ๊ธฐ๋ก
- Do: ํด๋น ์คํฌ ์คํ. ๋ฒ์ญ manifest๋ ๋จ์ผ ๋ฉ์ธ ์์ด์ ํธ๊ฐ ์ง๋ ฌ ๊ฐฑ์
- Check: ์ ์ ๊ตฌ์กฐยทhashยท์๋ณตยทํฐํธ/์ด๋ฏธ์ง/๋ฐํ์ ์ฆ๊ฑฐ๋ฅผ ์๋ฃ ๊ธฐ์ค๊ณผ ๋์กฐ
- Act: ์คํจํ ๋ฐฐ์นยทํยทํฐํธ assetยท์ด๋ฏธ์ง๋ง ๊นจ๋ํ ์๋ณธ์์ ์ฌ์์
ํ๊ณ ํด๋น branch๋ถํฐ ๋ฐ๋ณต
- Handoff: ๋ฌธ์ driftยท์ฐํยท๋ฏธํด๊ฒฐ ์ ํยท์ธ์
๋ฌธ์ ๋ฅผ ์ฆ์ append-only ๊ธฐ๋ก
์ฌ๊ฐ ์ PROJECT.md์ ๋ง์ง๋ง ๋ฏธ์๋ฃ ๋จ๊ณ์ ์ค์ manifest/hash๋ฅผ ๋ค์ ์ฝ๋๋ค. ์๋ฃ๋
๋จ๊ณ๋ฅผ ์๋ ์์ด ์ ์ฒด ์ฌ์คํํ๊ฑฐ๋, ์ด์ candidateยท์ด์ ์ธ์
์ ์ ์ฐ์ถ๋ฌผ๋ก ๋ณต์ ํ์ง ์๋๋ค.
8. ์์
์ฅยทํ์ดํ ์ ๋ฆฌ
์ ๋ฆฌ๋ tmp glob ์ญ์ ๊ฐ ์๋๋ค. $GT_HOME/common/cleanup-contract.md์ ๋ค์ ์คํฌ์
์ฌ์ฉํ๋ค.
gt-project-cleanup: ํ๋์ ํ์ดํ _work/<ID>์ ๋ํด Handoffยทmanifestยท์ธ์
ยท์ฐธ์กฐ๋ฅผ
์ถ๋ก ํ๊ณ PROJECT_ARTIFACT_MANIFEST.tsv์ lifecycle์ ๋์กฐํด CLEANUP_PLAN.json๊ณผ
CLEANUP_INSTRUCTIONS.md ์์ฑ
gt-workspace-cleanup: ์์
์ฅ ๋ฃจํธ์ ํ์ดํ ์ค๋ณตยท๋ฏธ๋ฑ๋ก ํด๋ยท์ธ์
์์ฌ๋ฅผ Handoff์
ํ๋ก์ ํธ ์ํ๋ก ๋์กฐํด ์ธ๋ถ ๋ณด๊ณ ์/๊ณํ ์์ฑ
๊ธฐ๋ณธ์ ์ด๋ยท์ญ์ ํ์ง ์๋๋ค. approved=true์ธ exact ํ์ผ๊ณผ ํ์ฌ plan SHA-256์ ๋ช
์ํ
--apply --plan์ ํ๋ณด๋ฅผ cleanup archive๋ก ์ฎ๊ธธ ๋ฟ ์๊ตฌ ์ญ์ ํ์ง ์๋๋ค. ์ด์ด์ ๋ชจ๋
์์นด์ด๋ธ ํ์ผ๊ณผ root/projectยทHandoffยท์ธ์
ยท๋ฌธ์ ํด์๋ฅผ ๋ค์ ๊ฒ์ฌํ
CLEANUP_ARCHIVE_REVIEW.md๋ฅผ ์ฌ์ฉ์์๊ฒ ์์ธํ ๋ณด๊ณ ํ๊ณ ๊ทธ turn์ ์ข
๋ฃํ๋ค.
ํด์งํต ์ด๋์ ์ฌ์ฉ์๊ฐ ๋ณด๊ณ ์ดํ ๋ณ๋ ์์ฒญ์ผ๋ก ๋ช
์์ ์ผ๋ก ์น์ธํ ๊ฒฝ์ฐ์๋ง
TRASH_PLAN.json์ ๋ณด๊ณ ยท์ฌ์ฉ์ยทํญ๋ชฉ๋ณ ์น์ธ๊ณผ ํ์ฌ SHA-256์ ๊ธฐ๋กํด
--trash --user-confirmed-trash๋ก ์์นด์ด๋ธ exact ํ์ผ์ ์ํํ๋ค. ์ด์์ฒด์ ํด์งํต์ด
์ง์๋์ง ์๊ฑฐ๋ ์คํจํ๋ฉด ์๊ตฌ ์ญ์ ๋ก ํด๋ฐฑํ์ง ์๊ณ BLOCKED๋ก ์ค๋จํ๋ค. ๋ณด๊ณ ์ดํ
์ํ๊ฐ ๋ฐ๋๋ฉด --review-archive๋ก ์ฌ๊ฒํ ํ๊ณ ๋ชจ๋ ์น์ธ์ ์ด๊ธฐํํ๋ค. active ์ธ์
ยท๋ณด์กด
anchorยทlink/reparse pointยท๊ณํ ๋ฐ ๊ฒฝ๋ก๋ ํญ์ ๊ฑฐ๋ถํ๋ค.
canonicalยทevidence ์ํฐํฉํธ๋ ๋ณด์กดํ๊ณ , hash๊ฐ ์ผ์นํ๋ reproducibleยทdisposable
exact ํ์ผ๋ง ์น์ธ ํ๋ณด๋ก ์ผ๋๋ค. ๋ฏธ๋ฑ๋ก managed-root ํ์ผ์ ์๋ ์ญ์ ํ์ง ์๋๋ค.
9. ์ ๊ท ํ๋ก์ ํธยท์๋ฃ
์ ๊ท ํ๋ก์ ํธ๋ ํ๋ซํผ ์ด๋ํฐ๊ฐ ์ง์ ํ ์์ฑ ๋ช
๋ น์ ์ฌ์ฉํ๋ค. NSW๋ ์ค์ NSP/XCI ๋ณด์
ํด๋ ์๋ project:new, Steam/PC๋ ์ค์ ๊ฒ์ EXE๊ฐ ์๋ ์ค์น ํด๋ ์๋
project:new:steam์ผ๋ก ์์ฑํ๋ค. ์๋ generic title ํด๋๋ฅผ ๋ง๋ค์ง ์๋๋ค.
์๋ฃ๋ gt-qa์ bench์ ๊ณต์ ๋ฐฐํฌ ๋ฆด๋ฆฌ์ฆ non-MCP runtime receipt, ๋ณ๋ hardware ์ํ,
gt-release์ exact package ๊ณ์ฝ์ด ๋ชจ๋ ์ถฉ์กฑ๋ ๋๋ง ์ ์ธํ๋ค. ๋ฆด๋ฆฌ์ค ํ์๋
gt-project-cleanup์ผ๋ก ์ ๋ฆฌ ๊ณํ์
์์ฑํ๊ณ , HandoffยทmanifestยทQAยทrelease anchor๋ฅผ ๋ณด์กดํ๋ค.
10. ๋น๋ยทํจ์น ์์ฑ ์์ฒญ์ ์๋ฏธ
์ฌ์ฉ์๊ฐ โ๋น๋ ์์ฑโ ๋๋ **โํจ์น ์์ฑโ**์ด๋ผ๊ณ ์์ฒญํ๋ฉด ์ด๋ฅผ ์ค๊ฐ staging์ด๋
์ง๋จ ํ๋ณด ์์ฑ์ผ๋ก ํด์ํ์ง ์๋๋ค. ํ๋ซํผ ์ด๋ํฐ์ canonical ๋ฐฐํฌ ํจํค์ง๋ฅผ ์์ฑํ๋
์์ฒญ์ผ๋ก ๋ผ์ฐํ
ํ๋ค. NSW์์๋ ์ ๋ด gt-nsw-build์ platforms/nsw/release.md๋ฅผ ์ ์ฉํ์ฌ
40_build/layeredfs/<BASE_TITLE_ID>/romfs/์ ๊ฒ์ฆ๋ ํจ์น ํ์ผ๋ง ์
๋ ฅํ๊ณ ,
40_build/releases/<BASE_TITLE_ID>.zip ์์
<BASE_TITLE_ID>/romfs/<ํจ์นํ์ผ> ๊ตฌ์กฐ๋ฅผ ๋ง๋ ๋ค. ๋ณ๋ Python ์ ์ฉ๊ธฐ, *.gldelta,
๋ฒ์ /candidate ํ์ ํด๋, ๊ฒ์๋ช
ZIP์ ํ์ฉํ์ง ์๋๋ค. ๋ฆด๋ฆฌ์ค ์๋ฃ ๊ฒ์ดํธ๊ฐ ์์ง
์ถฉ์กฑ๋์ง ์์๋ค๋ฉด ๊ฐ์ canonical ํ์์ review_candidate๋ก ๋ง๋ค ์ ์์ง๋ง ๊ฒฝ๋กยท์ด๋ฆยท
ZIP root ๊ณ์ฝ์ ์ํํ์ง ์๊ณ release_status๋ released๋ก ์ฌ๋ฆฌ์ง ์๋๋ค. ์ ์ ๋ฆด๋ฆฌ์ค
์์ฒญ์ด๋ฉด gt-nsw-build๊ฐ ๊ฒ์ฆํ canonical ZIP์ gt-release๋ก ์ธ๊ณํด ๋๋จธ์ง QAยท๋ฌธ์ยท
์ํ ๊ฒ์ดํธ๋ฅผ ์ํํ๋ค.
Steam/PC์์ ๊ฐ์ ํํ์ platforms/steam/release.md์ canonical package ์์ฑ์ผ๋ก
๋ผ์ฐํ
ํ๋ค. ์
๋ ฅ์ ์ฌ๋ฐฐํฌ ์์ฅ์ด ๊ฒ์ฆํ 40_build/overlay/, ์ถ๋ ฅ์
40_build/releases/<project-id>.zip, ZIP root๋ patch/๋ค. ๋ค์ ๊ณต์ฉ ๋ช
๋ น์ ์ฌ์ฉํ๋ฉฐ ์๋ณธ
๊ฒ์ assembly/asset/archive/executable์ ํจํค์งํ์ง ์๋๋ค.
npm run release:package:steam -- --project-root "<install-root>/_work/<steam-APP_ID|pc-slug>"
npm run release:validate:steam -- --project-root "<install-root>/_work/<steam-APP_ID|pc-slug>"