跳轉到

Immutable Release

大型 authoring master 的唯一長期權威是 open-4wd-specs 的 immutable GitHub Release。這個資料夾只保存操作說明;真正投遞目錄是 repo 根的 release-input/,產物在 release-output/,兩者均被 Git 忽略。

資料分類

內容 位置/Release 形式 是否進 Git
提示詞、規格 美術資源/提示詞/
小型 WebP、SVG、favicon、審查預覽 既有分類目錄
GLB master release-input/parts/release-input/tracks/;Release 逐檔扁平上傳
高解析/無損 PNG GLB 審查圖放 parts/tracks;UI 母圖放 release-input/ui/;封裝為 authoring-images.zip
WAV/FLAC master release-input/audio/;封裝為 authoring-audio.zip
runtime 最佳化資產 open-4wd runtime manifest 所在目錄 不回存 specs

GLB 的 basename 在整批輸入內必須唯一;ZIP 保留相對於 release-input/ 的邏輯路徑。其他副檔名會 fail closed。封裝採固定順序、時間戳與 store-only ZIP,方便同一輸入重現完全相同 bytes。

目前投遞結構如下;同一資產的 GLB、選定參考 PNG 與四視角檢查圖維持相鄰,避免平行的格式樹 拆散審查上下文:

release-input/
├── parts/
│   └── <part-id>/
├── tracks/
│   └── <track-id>/
├── audio/
│   ├── vehicles/
│   ├── tracks/
│   ├── ui/
│   └── music/
└── ui/
    ├── themes/{default,moon-rabbit}/
    ├── race-messages/{default,moon-rabbit}/
    ├── race-countdown/{default,moon-rabbit}/
    └── social/og/

第一階段:離線準備與審查

  1. 確認所有原始備份仍可讀,並確認這次 payload 已依 parts/tracks/audio/ui 分類放入 release-input/;WAV/FLAC 音訊 master 一律進 audio/,再按 vehicles/tracks/ui/music 語意分類。
  2. 確認 release-output/ 不存在或為空;舊產物要人工移到另一個備份位置,不可覆寫。
  3. 執行 prepare-authoring-release.bat。它不連網、不安裝工具、不修改 Git,只產生 Release assets、authoring-release-manifest.jsonSHA256SUMS
  4. 審查 manifest 的 logical path、Release asset mapping、size、SHA-256、source commit 與 exact tag;每個 GLB input 還必須帶有受版控 source manifest 的相同 assetId,且 GLB 集合必須 exact match。必要時由第二人重跑並比較全部 bytes。

準備失敗時保留 release-input/ 原檔,將不完整的 release-output/ 移到隔離位置後修正輸入再重跑。不可在失敗產物上手改 manifest 或 checksum。

第二階段:Draft、下載回讀與不可變發布

  1. 先 commit 準備工具與契約,確認工作樹乾淨、HEAD 就是 manifest 的 source commit,並完成 gh auth login
  2. 執行 publish-authoring-release.bat。工具驗證 auth/origin/HEAD,建立 exact tag 的 Draft,補傳缺少的 assets,下載回讀每個檔案並逐一比對 SHA-256;它只留下 Draft 與本機 receipt,不會直接發布。傳輸以逐檔序號與 gh 原生進度顯示,可據此分辨仍在傳輸或已停滯。
  3. 在 GitHub UI 複核 Draft 名稱、資產、manifest 與 checksum。確認 repository 已啟用 immutable releases(只對啟用後發布的 Release 生效)。
  4. 以工具顯示的 tag 作逐字確認,再執行:confirm-authoring-release.bat <exact-tag>。只有完全相同的確認值才會把 Draft 發布;該進入點等同 publish-authoring-release.bat -Publish -ConfirmImmutablePublish '<exact-tag>'

第二階段每次執行都重新下載回讀,確保驗證與不可逆發布之間沒有空窗;上一輪的回讀副本由工具自動清除,不需人工搬移。receipt 與回讀副本都留在 release-output/ 內,且不影響該目錄的 bundle 驗證。

Main 採用時不得只相信 tag 名稱:dependency lock 同時鎖 specs exact commit、 authoring-source-<commit 前 12 碼> tag、source manifest fingerprint/檔案 SHA-256 與 Release manifest SHA-256;adoption gate 會重驗 manifest source commit、GLB assetId exact join、Release asset 集合、size/SHA-256 與 SHA256SUMS。任一欄不一致都不得執行 production Editor journey。

上傳或下載回讀失敗時,Draft 保持未發布;保留原始備份與 release-output/,檢查網路/權限後重跑。工具拒絕未知 asset、不同 target 或非 Draft,避免接手不相容狀態。比對失敗會即刻中止並指名該檔,此時 .readback 保留供鑑識;重跑才會清除它。

備份移除門檻

只有 immutable Release 已發布、下載回讀全部通過、publish-receipt.json 已另行備份,且 main 已依 manifest 成功採用,才可考慮移除工作站大型原始備份。任一條件未滿都保留備份。舊 Git LFS 工作樹內容在首次 Release 完成前只視為過渡備份;未來重建 specs repo 時不得再放回 Git。