2.2.5 릴리스 실행 기록¶
{
"schema": "release-metadata/v1",
"version": "v2.2.5",
"status": "released",
"releaseScopes": [
"db-migration",
"contracts-package",
"coupler-api",
"coupler-admin-web",
"mobile-nextpush",
"docs"
],
"extraRepoRefs": [],
"versionMapping": {
"docs": {
"tag": "v2.2.5",
"commit": null
},
"coupler-api": {
"tag": "v2.2.4",
"commit": "ac46b79e7298c7c04004279629e8ed9495d21681"
},
"coupler-admin-web": {
"tag": "v2.1.4",
"commit": "96034847c7f567209c533fce17bd61e96dca8700"
},
"coupler-mobile-app": {
"store": "2.2.1 (100)",
"releaseTag": null,
"commit": "161bd00869c0775a30b4175b803e95638cd246f5",
"nextPush": "Android Production v22; iOS Production v19"
}
},
"scopeResults": {
"db-migration": {
"status": "released",
"summary": "개발계/운영계 모두 75/76 적용과 ledger 기록을 완료했다.",
"evidence": {
"sqlRefs": [
{
"repo": "coupler-api",
"path": "db/migrations/75_expand_admin_manager_nickname.sql",
"checksumSha256": "3a5de2e383ed07e4443e0d5a608746214d32628d6cfa8ceb9238b8dccbb1e381",
"gateIds": [
"DBM-GATE-000",
"DBM-GATE-010",
"DBM-GATE-100"
]
},
{
"repo": "coupler-api",
"path": "db/migrations/76_postcheck_admin_manager_nickname.sql",
"checksumSha256": "1a9804a0ec03df89ced0b18713d56e21edff6dbc3e7c4a2c5e5183f25b292a49",
"gateIds": [
"DBM-GATE-010",
"DBM-GATE-100"
]
}
],
"gateResults": [
{
"gateId": "DBM-GATE-000",
"status": "passed",
"log": "2026-07-09 19:40 KST production preflight verified the database identity against private deployment evidence, confirmed the pre-expand column contract and zero overlength rows, and passed the migration 75 guard.",
"reason": null
},
{
"gateId": "DBM-GATE-010",
"status": "passed",
"log": "2026-07-09 19:40:54 KST prod schema_migrations rows recorded for 75/76 with matching SHA-256 checksums and target_env=prod.",
"reason": null
},
{
"gateId": "DBM-GATE-100",
"status": "passed",
"log": "2026-07-09 19:40 KST prod 75 returned DBM-GATE-100 OK and 76 returned admin manager nickname expand postcheck passed; final t_admin.nickname varchar(25) NOT NULL, nickname_over_25_count=0.",
"reason": null
},
{
"gateId": "DBM-GATE-200",
"status": "not_applicable",
"log": "2026-07-09 19:40 KST SQL header and migration review: data widening only, no backfill target.",
"reason": "data widening only, no backfill required"
},
{
"gateId": "DBM-GATE-300",
"status": "not_applicable",
"log": "2026-07-09 19:40 KST SQL header and migration review: same read/write column contract, no cutover.",
"reason": "same read/write column contract, no cutover"
},
{
"gateId": "DBM-GATE-400",
"status": "not_applicable",
"log": "2026-07-09 19:40 KST SQL header and migration review: no legacy object drop.",
"reason": "no legacy object drop"
}
],
"preflightLog": "2026-07-09 17:33 and 19:40 KST dev/prod read-only preflight verified each database identity against private deployment evidence, checked the 75/76 ledger and target column contracts, confirmed row-safety counts, and found no running application query.",
"ledger": {
"dev": {
"databaseIdentity": "development database identity matched the private deployment target",
"log": "2026-07-09 17:33 KST dev schema_migrations read-only query",
"rows": [
{
"migrationName": "75_expand_admin_manager_nickname.sql",
"targetEnv": "dev",
"checksumSha256": "3a5de2e383ed07e4443e0d5a608746214d32628d6cfa8ceb9238b8dccbb1e381",
"appliedAt": "2026-07-08 22:22:16 KST"
},
{
"migrationName": "76_postcheck_admin_manager_nickname.sql",
"targetEnv": "dev",
"checksumSha256": "1a9804a0ec03df89ced0b18713d56e21edff6dbc3e7c4a2c5e5183f25b292a49",
"appliedAt": "2026-07-08 22:22:16 KST"
}
]
},
"prod": {
"databaseIdentity": "production database identity matched the private deployment target",
"log": "2026-07-09 19:40:54 KST prod schema_migrations query after 75/76 apply",
"rows": [
{
"migrationName": "75_expand_admin_manager_nickname.sql",
"targetEnv": "prod",
"checksumSha256": "3a5de2e383ed07e4443e0d5a608746214d32628d6cfa8ceb9238b8dccbb1e381",
"appliedAt": "2026-07-09 19:40:54 KST"
},
{
"migrationName": "76_postcheck_admin_manager_nickname.sql",
"targetEnv": "prod",
"checksumSha256": "1a9804a0ec03df89ced0b18713d56e21edff6dbc3e7c4a2c5e5183f25b292a49",
"appliedAt": "2026-07-09 19:40:54 KST"
}
]
}
},
"postcheckLog": "2026-07-09 19:40 KST prod 76_postcheck_admin_manager_nickname.sql returned admin manager nickname expand postcheck passed; nickname_column_count=1, nickname_varchar_25_contract_count=1, nickname_not_null_contract_count=1, nickname_over_25_count=0.",
"rollbackPlan": "Expand-only migration. If 75 fails before completion, stop and inspect actual column contract/ledger before retry. If 75 succeeds but 76 fails before API/Admin deployment, keep Admin writes frozen and either fix forward to varchar(25) postcheck success or restore from RDS snapshot according to DBM failure classification; do not contract back after API/Admin rollout without separate approval."
}
},
"contracts-package": {
"status": "released",
"summary": "Release Contracts workflow와 Admin/Mobile dependency pin을 확인했다.",
"evidence": {
"publishedPackage": "@coupler-developer/coupler-api-contracts@0.1.1",
"workflow": "Release Contracts run 28946135887 success, publish job 85880388116 success, completed 2026-07-08T13:25:46Z",
"sourceRef": "ba57aa8d0e5636d3c56bc61ba4dd7653f2561920"
}
},
"coupler-api": {
"status": "released",
"summary": "운영 API를 main ac46b79 기준으로 fast-forward 배포하고 PM2 재시작 및 smoke를 완료했다.",
"evidence": {
"deployment": "2026-07-09 KST the production EC2 target was verified and coupler-api was fast-forwarded to ac46b79e7298c7c04004279629e8ed9495d21681; pnpm install --frozen-lockfile passed; pm2 restart coupler-api --update-env and pm2 save passed.",
"smoke": "2026-07-09 20:14 KST https://api.ritzy.fourhundred.co.kr/ HTTP/2 200; GET /app/auth/getSettingList?os=google&version_code=100 returned top-level keys ok,data with ok=true and force_update=0; version_code=1 returned ok,data with force_update=2.",
"rollback": "Rollback to previous production tag v2.2.3 (ae7b81558ee01c86a6d19a9a98bd6c288d6a0a0d) or the predeploy PM2/git state, then restart pm2 coupler-api."
}
},
"coupler-admin-web": {
"status": "released",
"summary": "운영 Admin build를 배포하고 nginx 검증, 외부 smoke, asset manifest 검증을 완료했다.",
"evidence": {
"deployment": "2026-07-09 KST local yarn build passed at 96034847c7f567209c533fce17bd61e96dca8700; the production Admin target was verified and rsync --delete deployed the build; nginx -t and systemctl restart nginx passed; a timestamped backup artifact was retained.",
"smoke": "2026-07-09 20:09 KST server-internal http://127.0.0.1:8000 HTTP/1.1 200; 2026-07-09 20:10 KST https://cms.ritzy.fourhundred.co.kr HTTP/2 200; asset-manifest references main.60b2941d.js and main.2b8e6e15.css; backup quote incident remediated and external Admin remained HTTP 200.",
"rollback": "Restore the retained timestamped production Admin backup and restart nginx, or rebuild previous Admin tag v2.1.3."
}
},
"mobile-nextpush": {
"status": "released",
"summary": "Store 2.2.1 (100) binary를 대상으로 Android/iOS Production NextPush를 적용했다. Store 재제출/신규 native tag는 범위가 아니다.",
"evidence": {
"app": "Android bluedotstudio.official-gmail.com/coupler; iOS bluedotstudio.official-gmail.com/coupler-ios",
"productionLabel": "Android Production v22; iOS Production v19",
"targetBinary": "2.2.1 (100)",
"uploadedAt": "Android 2026-07-09T11:11:45.033Z; iOS 2026-07-09T11:12:29.655Z",
"rollout": "Android 100; iOS 100",
"mandatory": "Android false; iOS false",
"disabled": "Android false; iOS false"
}
},
"docs": {
"status": "released",
"summary": "최종 릴리즈 기록을 운영 반영 결과로 갱신하고 docs v2.2.5 tag를 생성한다.",
"evidence": {}
}
},
"apiContractCutover": {
"status": "released",
"comparisonRefs": {
"coupler-api": "ac46b79e7298c7c04004279629e8ed9495d21681",
"coupler-mobile-app": "161bd00869c0775a30b4175b803e95638cd246f5",
"coupler-admin-web": "96034847c7f567209c533fce17bd61e96dca8700"
},
"contractArtifactSync": {
"command": "cmp contracts/generated/<file> <consumer>/src/api/generated/<file>",
"result": "generated copies exact match",
"consumerPath": "package dependency and yarn.lock pin @coupler-developer/coupler-api-contracts@0.1.1"
},
"nPlusOneDeployment": {
"target": "Android Production v22, iOS Production v19, target appVersion 2.2.1",
"appliedAt": "2026-07-09 KST",
"evidence": "운영 API/Admin curl smoke와 NextPush deployment history JSON"
},
"legacyTrafficBlock": {
"previousVersionBuild": "2.2.0 (97)",
"forceUpdateConfig": "Admin 설정 > 버전 화면, API t_app_info.min_version",
"versionCodeCheck": "GET /app/auth/getSettingList?os=google&version_code=1 -> app_info.force_update: 2"
},
"adminVerification": {
"versionSettingsSave": "운영 API version gate smoke로 확인: GET /app/auth/getSettingList?os=google&version_code=1 -> force_update=2",
"operatorActionSmoke": "운영 Admin 배포 smoke로 확인: cms HTTP/2 200 and asset-manifest main.60b2941d.js/main.2b8e6e15.css"
},
"rollback": {
"previousRefs": "API v2.2.3 -> ae7b81558ee01c86a6d19a9a98bd6c288d6a0a0d, Admin v2.1.3 -> e7beb8f7ee5d3c79cca82530e5823b7e51d310c1, Mobile previous NextPush Android v21/iOS v18",
"dbBackupRestore": "75/76 postcheck가 통과했으므로 expand 상태를 유지한다. 축소/복구는 별도 DBM 승인 없이는 수행하지 않는다.",
"cautions": "client regression 시 API/Admin ref 복구와 NextPush disable/revert를 먼저 수행하고, DB contract 축소는 별도 릴리스로 분리한다."
}
}
}
문서 역할¶
- 역할:
시나리오 - 문서 종류:
flow - 충돌 시 우선 문서:
policy/release-process.md, 태그 기준은policy/release-tag-policy.md - 기준 성격:
as-is
목적¶
v2.2.5docs 릴리스 기록에 API/Admin/Mobile 공통 응답과 ErrorData contract cutover 진행 기준점을 고정한다.- 운영 API가 legacy envelope에서 공통
{ ok, data | error }envelope로 전환되는 시점과 검증 근거를 한 곳에서 추적한다. - 코드 main 기준점, 운영 DB expand migration, API/Admin 운영 배포, Mobile NextPush 적용, rollback 판단 기준을 분리해 추적한다.
범위¶
- 대상:
docs,coupler-api,coupler-admin-web,coupler-mobile-app, 운영RDS - 포함 범위:
t_admin.nicknamevarchar(20) -> varchar(25)expand migration, 공통 응답 envelope, ErrorData contract, generated contract copy exact match, Mobile/Admin 응답 boundary, 강제 업데이트 차단 검증, Admin/API 운영 smoke 기준, Mobile Production NextPush - 제외 범위: Store console 재제출/신규 native release, Mobile native version bump/tag, DB contract/drop
상위 규범 문서¶
릴리스 상태¶
- 목표 버전:
v2.2.5 - 전체 상태:
released - 완료 범위: 관련 코드
main병합 및 최신성 확인, 계약 패키지0.1.1publish/workflow 확인, generated contract exact match 로컬 검증, 개발계/운영 DB 75/76 적용 및 ledger 확인, API/Admin 운영 배포와 smoke, 운영 공통 envelope 응답 확인, Mobile Production NextPush, rollback 기준점 확정, API/Admin 서비스 태그 생성, docs 최종 상태 갱신 - 제한 사항: Admin 인증 세션이 필요한 화면 저장 액션은 이번 Codex 실행 gate가 아니며, 완료 판정은 운영 API version gate smoke와 Admin HTTP/asset smoke 기준으로 기록했다.
- 대기 범위:
N/A
버전 매핑¶
docs: 기록 버전v2.2.5, 태그v2.2.5, 커밋N/Acoupler-api: 태그v2.2.4, 커밋ac46b79e7298c7c04004279629e8ed9495d21681, 태그 객체37fde67fb12f1cb4a411e7987aea2c846aaec70ccoupler-admin-web: 태그v2.1.4, 커밋96034847c7f567209c533fce17bd61e96dca8700, 태그 객체b49a596d1cd74e8beb728744b4fc6dc268c3b73ccoupler-mobile-app: Store2.2.1 (100), 릴리스 태그N/A, 커밋161bd00869c0775a30b4175b803e95638cd246f5, NextPushAndroid Production v22; iOS Production v19coupler-mobile-app제출 마커 태그:submitted/mobile-2.2.1-100- 제출 마커 증빙 이관/삭제:
N/A(이번 범위는 Store 제출이 아니라 NextPush-only)
릴리스 결과¶
- 공통 응답/ErrorData contract cutover 코드를 운영 API/Admin과 Mobile NextPush에 반영했다.
- API main은
response_success/response_error공통 envelope 경계와 descriptor-first ErrorData 경계를 고정했고, 운영getSettingList응답의 top-level key가ok,data로 확인됐다. - Mobile/Admin main은
@coupler-developer/coupler-api-contracts@0.1.1dependency와ok기반 응답 boundary를 사용한다. - 개발계 DB는
75_expand_admin_manager_nickname.sql/76_postcheck_admin_manager_nickname.sql적용과 ledger 기록이 확인됐다. - 운영 DB는
75/76적용과 prod ledger 기록을 완료했고,t_admin.nickname이varchar(25) NOT NULL로 확장됐다. - 운영
GET /app/auth/getSettingList?os=google&version_code=1은{ ok: true, data }envelope와app_info.force_update: 2를 반환해 기존 낮은 build 차단 설정도 확인됐다. - Admin 운영 배포 중 최초 백업 명령 quote 오류로 root 경로에 정적 파일이 복사되고
/owner가 변경된 이슈가 있었으나, 즉시/owner를root:root로 복구하고 root-level 정적 파일을 제거했으며/var/www/coupler-admin-web와 외부 Admin 200 응답을 재확인했다.
메인 흐름¶
- API/Admin/Mobile/docs main 최신성과 clean 상태를 확인했다.
- DB migration SQL을
coupler-apirepo-relative 경로와 checksum으로 고정했다. - 운영 DB read-only preflight로 private 배포 근거와 DB identity를 대조하고 ledger, 대상 column contract, 대상 row counter를 확인했다.
- Admin write 작업을 잠시 freeze한 뒤 운영 DB에서 75/76을 순서대로 적용하고
schema_migrationsprod row를 기록했다. - API/Admin 운영 배포를 진행하고 운영 API 응답이
{ ok: true, data }envelope로 전환됐는지 확인했다. - Mobile Production NextPush를 Store
2.2.1 (100)binary target으로 적용했다. - rollback 기준과 API/Admin 서비스 태그를 확정했다.
- docs 릴리스 기록을
released상태로 갱신했다.
검증 근거¶
- PR 상태 확인 시각:
2026-07-06 22:46 KST docsPR #30:MERGEABLE,CLEAN,build-docs/docs-structure/markdown-lint통과coupler-apiPR #94:MERGEABLE,CLEAN,eslint/prettier/test/typecheck통과coupler-mobile-appPR #145:MERGEABLE,CLEAN,eslint/prettier/storybook/test/typecheck통과coupler-admin-webPR #47:MERGEABLE,CLEAN,eslint/prettier/test/typecheck통과- generated contract exact match 로컬 검증:
contracts/generated/{errorContract,errorMessages,errorRuntime,apiContract}.ts와 Mobile/Adminsrc/api/generated/*파일cmp통과 - API 로컬 품질 게이트:
pnpm lint,pnpm typecheck,pnpm format,pnpm test:ci,pnpm check:contracts,pnpm pack:contracts통과 - Admin 로컬 품질 게이트:
yarn lint,yarn typecheck,yarn format,yarn test:ci,yarn build통과 - Mobile 로컬 품질 게이트:
yarn lint,yarn typecheck,yarn format,yarn test:ci,yarn storybook:check통과 - 계약 패키지 publish 증빙:
Release Contractsworkflow run28946135887success, publish job85880388116success, source refba57aa8d0e5636d3c56bc61ba4dd7653f2561920, published package@coupler-developer/coupler-api-contracts@0.1.1 - 운영 API 배포:
2026-07-09 KST, production EC2 target 확인,coupler-apifast-forward toac46b79e7298c7c04004279629e8ed9495d21681,pnpm install --frozen-lockfile,pm2 restart coupler-api --update-env,pm2 save통과 - 운영 API smoke:
curl -I https://api.ritzy.fourhundred.co.kr/->HTTP/2 200 - 운영 envelope 확인:
GET /app/auth/getSettingList?os=google&version_code=100-> top-level keysok,data,ok=true,force_update=0,version_code=100,min_version=100 - 운영 legacy 차단 확인:
GET /app/auth/getSettingList?os=google&version_code=1-> top-level keysok,data,ok=true,force_update=2,version_code=100,min_version=100 - 운영 Admin 배포:
2026-07-09 KST, production Admin target 확인, buildmain.60b2941d.js/main.2b8e6e15.css, timestamped backup 보존, rsync deploy,nginx -t,systemctl restart nginx통과 - 운영 Admin smoke: internal
http://127.0.0.1:8000->HTTP/1.1 200; externalcurl -I https://cms.ritzy.fourhundred.co.kr->HTTP/2 200,server: nginx/1.18.0 (Ubuntu);asset-manifest.json->main.60b2941d.js,main.2b8e6e15.css - Mobile NextPush Android: app
bluedotstudio.official-gmail.com/coupler, Productionv22, appVersion2.2.1, uploadTime2026-07-09T11:11:45.033Z, rollout100, mandatoryfalse, disabledfalse - Mobile NextPush iOS: app
bluedotstudio.official-gmail.com/coupler-ios, Productionv19, appVersion2.2.1, uploadTime2026-07-09T11:12:29.655Z, rollout100, mandatoryfalse, disabledfalse - 개발계 DB preflight:
2026-07-09 17:33 KST, private 배포 근거와 database identity 일치, 75/76 ledger row 존재, target column contract와 overlength row safety 확인 - 운영 DB preflight:
2026-07-09 17:33 KST, private 배포 근거와 database identity 일치, 75/76 ledger row 적용 전 부재, target column contract와 row safety 확인 - 운영 DB apply/postcheck:
2026-07-09 19:40:54 KST, 75DBM-GATE-100 OK, 76admin manager nickname expand postcheck passed, prod ledger 2 rows recorded, finalt_admin.nickname=varchar(25) NOT NULL,nickname_over_25_count=0 - 서비스 태그:
coupler-apiv2.2.4tag object37fde67fb12f1cb4a411e7987aea2c846aaec70c->ac46b79e7298c7c04004279629e8ed9495d21681;coupler-admin-webv2.1.4tag objectb49a596d1cd74e8beb728744b4fc6dc268c3b73c->96034847c7f567209c533fce17bd61e96dca8700
Mobile 개발계 QA 빌드 기록¶
이 기록은 개발계 API 확인용 QA 빌드 증빙이며, 운영 Store 출시, Mobile NextPush 적용, 서비스 태그 생성 근거로 사용하지 않는다.
- 기록일:
2026-07-08 KST - API 대상: 개발계 EC2, Mobile
USE_DEV_EC2=true - iOS TestFlight QA 빌드:
2.2.2 (102) - Android QA APK:
versionName 2.2.2,versionCode 102 - Android 산출물 상대 경로:
coupler-mobile-app/android/app/build/outputs/apk/release/ - 운영 릴리즈 전 확인:
- Mobile
USE_DEV_EC2=false원복 - 같은 iOS train
2.2.2로 제출하면CURRENT_PROJECT_VERSION은103이상 사용 - Android도 함께 제출하면
versionCode는103이상 사용 - App Store Connect에서 닫힌 train이면
MARKETING_VERSION/versionName도 함께 증가
- Mobile
API contract cutover Gate¶
API/Admin/Mobile 공통 응답 또는 ErrorData contract cutover가 포함되므로 아래 항목을 모두 추적한다.
- Cutover 상태:
released - 비교 기준 ref:
coupler-api:ac46b79e7298c7c04004279629e8ed9495d21681coupler-mobile-app:161bd00869c0775a30b4175b803e95638cd246f5coupler-admin-web:96034847c7f567209c533fce17bd61e96dca8700
- Generated contract exact match:
- 명령:
cmp contracts/generated/<file> <consumer>/src/api/generated/<file>forerrorContract.ts,errorMessages.ts,errorRuntime.ts,apiContract.ts - 결과:
generated copies exact match - published package:
@coupler-developer/coupler-api-contracts@0.1.1 - Mobile/Admin consumer path:
package dependency and yarn.lock pin @coupler-developer/coupler-api-contracts@0.1.1
- 명령:
- N+1 배포 근거:
- API/Admin production deploy: API
ac46b79e7298c7c04004279629e8ed9495d21681, Admin96034847c7f567209c533fce17bd61e96dca8700 - Store version/build 또는 NextPush app/deployment/label: Android Production
v22, iOS Productionv19, target appVersion2.2.1 - 운영 출시/적용 시각:
2026-07-09 KST - 확인 URL 또는 콘솔 증빙: 운영 API/Admin curl smoke와 NextPush deployment history JSON
- API/Admin production deploy: API
- Legacy traffic 차단 근거:
- 기존 N version/build:
2.2.0 (97)또는 운영t_app_info기준version_code: 97 - 강제 업데이트 설정 위치: Admin
설정 > 버전화면, APIt_app_info.min_version version_code < min_version요청 결과:GET /app/auth/getSettingList?os=google&version_code=1->app_info.force_update: 2- 기대값:
/app/auth/getSettingList?os=<google|apple>&version_code=<N build>응답의app_info.force_update === 2
- 기존 N version/build:
- Admin 검증:
- 앱 버전 설정 화면 저장 검증:
운영 API version gate smoke로 확인: GET /app/auth/getSettingList?os=google&version_code=1 -> force_update=2 - 변경 데이터 조회/운영자 액션 smoke:
운영 Admin 배포 smoke로 확인: cms HTTP/2 200 and asset-manifest main.60b2941d.js/main.2b8e6e15.css
- 앱 버전 설정 화면 저장 검증:
- Rollback 기준:
- 직전 호환 API/Admin/Mobile SHA 또는 tag: API
v2.2.3->ae7b81558ee01c86a6d19a9a98bd6c288d6a0a0d, Adminv2.1.3->e7beb8f7ee5d3c79cca82530e5823b7e51d310c1, Mobile previous NextPush Androidv21/iOSv18 - DB 백업/복구 기준: 75/76 postcheck가 통과했으므로 expand 상태를 유지한다. 축소/복구는 별도 DBM 승인 없이는 수행하지 않는다.
- 되돌림 금지/주의 사항: client regression 시 API/Admin ref 복구와 NextPush disable/revert를 먼저 수행하고, DB contract 축소는 별도 릴리스로 분리한다.
- 직전 호환 API/Admin/Mobile SHA 또는 tag: API
롤백 기준¶
- 운영 DB 75/76 적용은 완료됐으므로, 문제가 확인되면 DB를 되돌리기보다 현재
varchar(25)expand 상태를 유지하고 서비스 배포/코드 기준점을 먼저 고친다. - 운영 DB 75/76 postcheck가 이미 통과했으므로, 이후 DB contract/drop 또는 축소 SQL은 별도 릴리스와 승인 없이는 실행하지 않는다.
- API 문제가 확인되면 직전 운영 API 태그
v2.2.3또는 predeploy PM2/git 상태 기준으로 rollback한다. - Admin 문제가 확인되면
/var/www/coupler-admin-web-backup-20260709200811백업 또는 직전 운영 Admin 태그v2.1.3기준 build로 rollback한다. - Mobile 문제가 확인되면 NextPush Android
v22/iOSv19를 disable/revert하고 직전 Production Androidv21/iOSv18상태로 복구한다. - 공통 envelope 배포 후 legacy 앱에서 기본 진입 실패가 확인되면 API/Admin ref 복구와 NextPush disable/revert를 먼저 수행한다.
- DB schema contract/drop은 이번 릴리스 범위가 아니며, 별도 DBM Gate 없이 실행하지 않는다.
후속 작업¶
- 없음. docs
v2.2.5태그/GitHub Release 생성과 Release/Deploy workflow 성공 확인까지 완료했다.