콘텐츠로 이동

2.5.4 릴리스 실행 기록

{
  "version": "v2.5.4",
  "status": "released",
  "releaseScopes": [
    "db-migration",
    "contracts-package",
    "coupler-api",
    "coupler-admin-web",
    "mobile-store",
    "mobile-nextpush",
    "docs"
  ],
  "extraRepoRefs": [],
  "versionMapping": {
    "docs": {
      "tag": "v2.5.4",
      "commit": null
    },
    "coupler-api": {
      "tag": "v2.5.6",
      "commit": "1a44d3747fbc8042cb1c78021c404ccb62156618"
    },
    "coupler-admin-web": {
      "tag": "v2.5.4",
      "commit": "59cb4862064c0e963bd0a6ce57673996d77ff290"
    },
    "coupler-mobile-app": {
      "store": {
        "android": {
          "versionBuild": "2.5.1 (107)",
          "releaseTag": "v2.5.1",
          "commit": "2a9ee166e30d77f827d49ac4ddb643ea775606fa",
          "sourceStatus": "verified",
          "limitation": null
        },
        "ios": {
          "versionBuild": "2.5.1 (107)",
          "releaseTag": "v2.5.1",
          "commit": "2a9ee166e30d77f827d49ac4ddb643ea775606fa",
          "sourceStatus": "verified",
          "limitation": null
        }
      },
      "nextPush": "Android Production v34 / iOS Production v31; target 2.5.1",
      "commit": "88a6d851e13c3012077ded501b79abe6e577308d"
    }
  },
  "scopeResults": {
    "db-migration": {
      "status": "released",
      "summary": "개발계 미적용 0건을 재확인한 exact API source 9bd43ea8에서 운영 구 API를 정지하고 migration 4건을 순서대로 적용해 ledger 91→95와 최종 미적용 0건을 확인했다.",
      "evidence": {}
    },
    "contracts-package": {
      "status": "released",
      "summary": "Mobile 라운지 응답 호환 contracts 0.1.41에 이어 매니저 2.5.0 이미지 필드를 additive 복구한 contracts 0.1.42를 API main exact tree에서 발행했다.",
      "evidence": {
        "publishedPackage": "@coupler-developer/coupler-api-contracts@0.1.42",
        "workflow": "https://github.com/coupler-developer/coupler-api/actions/runs/33757716338",
        "sourceRef": "2bde45931b6a7bfcd7c36e04805af46b3add10fc",
        "sourceTree": {
          "path": "packages/contracts",
          "publishedSourceTree": "e776fea0044c7ff3d8cf7b67370251f408cf53e4",
          "releaseSourceTree": "e776fea0044c7ff3d8cf7b67370251f408cf53e4"
        }
      }
    },
    "coupler-api": {
      "status": "released",
      "summary": "운영 migration 뒤 exact source 9bd43ea8을 production PM2로 기동하고 v2.5.4로 고정했다. 매니저 이미지 REST 호환은 2bde4593·v2.5.5로 forward-fix했고, 카드 최초 만료일 보존과 프로필 영상 승인 알림 수정까지 포함한 운영 main 1a44d374를 v2.5.6으로 고정했다.",
      "evidence": {
        "deployment": "2026-09-03 20:34 KST 운영 checkout 9bd43ea857712bfaa26deb031c8f5fee697d6e95를 production PM2에 반영하고 원격 annotated tag v2.5.4를 고정했다. 22:05 KST 이미지 호환 source 2bde45931b6a7bfcd7c36e04805af46b3add10fc를 reload·save하고 v2.5.5로 고정했다. 2026-09-04 KST 카드 최초 만료일 보존 62f2281b와 영상 승인 알림 수정이 포함된 clean origin/main 1a44d3747fbc8042cb1c78021c404ccb62156618을 운영에 pull한 뒤 root production PM2를 재시작했고, 원격 annotated tag v2.5.6의 peeled commit을 같은 source로 확인했다.",
        "smoke": "초기 9bd43ea8과 이미지 호환 2bde4593 배포에서 root PM2 online·production·cwd /home/projects/coupler-api, 내부·외부 HTTP 200과 Store build 105·106 bootstrap 성공, 매니저 legacy·canonical 이미지 응답 일치를 확인했다. 2026-09-04 14:52 KST에는 운영 checkout HEAD·branch·origin/main이 1a44d374·main으로 일치하고 root PM2 coupler-api가 online·production·동일 cwd이며 내부·외부 root HTTP가 모두 200임을 재확인했다. 같은 source의 운영 migration ledger는 95건, 미적용 0건이다. 최근 Google Play IAP 401은 직전 운영 기록에도 존재하고 이번 source의 IAP 변경이 없어 기존 운영 문제로 분리했다.",
        "publicContract": null,
        "runtimeRecovery": {
          "strategy": "forward-fix",
          "stateSafety": {
            "source": "application-evidence",
            "persistedState": "exact source 9bd43ea8의 운영 migration 4건을 구 API 정지 상태에서 적용해 ledger 95·미적용 0건을 확인했고, current source 1a44d374에서도 미적용 0건을 재확인했다. legacy-only video 0건 guard 뒤 t_member.video를 제거했으므로 이전 API로 schema를 추정 rollback하지 않는다.",
            "queuedState": "이번 migration과 API 변경은 새 queue·outbox·worker를 만들지 않았고 기존 pinned notification outbox와 cron route를 변경하지 않았다.",
            "externalEffects": "migration은 승인된 DDL과 guard만 실행했고 운영 데이터 수동 수정이나 외부 effect를 만들지 않았다. 이전 API rollback은 current DB·Admin 계약과 호환되지 않으므로 금지했고, additive 호환을 유지하는 current API 1a44d374를 기준으로 후속 forward-fix한다."
          },
          "previousReleaseCaseIds": []
        }
      }
    },
    "coupler-admin-web": {
      "status": "released",
      "summary": "exact source 59cb4862의 production artifact를 이전 live index 검증·백업 뒤 원자 교체하고 HTTP·로그인 CMS·외부 hashed JS bytes를 확인한 직후 원격 annotated tag v2.5.4로 고정했다.",
      "evidence": {
        "deployment": "2026-09-03 20:36 KST source 59cb4862064c0e963bd0a6ce57673996d77ff290, artifact SHA-256 e5127b4f5d498d4b3d903d51aa83e4d4f040275145b50f6e4c881684e30b5add를 검증해 live index를 원자 교체했다. active index SHA-256은 391e6220953d60c4418802f91446e323981f3ea9931a46ecb7f8c20ed2fad47b이며 20:38 KST 원격 v2.5.4 peeled commit 일치를 확인했다.",
        "smoke": "nginx root 계약과 내부·외부 HTTP 200, asset-manifest의 main.7947e39e.js를 확인했다. 외부 제공 JS SHA-256 c2c0bc58b5c0ee6eb35875c2c9b7b022715ad18ae0cecb63d999ab93fabdadd0은 local artifact와 일치했다. 2026-09-03 KST 출시 책임자가 cms.ritzy.fourhundred.co.kr의 로그인된 스퀘어 관리 > 스퀘어 내역에서 실제 목록, 정상 상태와 신고삭제·강제삭제·패널티 적용 controls 렌더링을 확인했으며 controls는 실행하지 않았다.",
        "rollback": "/var/www/coupler-admin-web-backup-20260903T113618Z에 직전 source 475e9b2dcafb2834420688869aca9d348fcf4114와 index SHA-256 4eedb250674615b82756a87aa5bdbfc8c788541cc3888ad0cb833de187e630b0을 metadata와 함께 봉인했다. 단, 직전 Admin의 /best 계약은 current API에서 제거됐으므로 단독 복원하지 않고 current 계약 기반 forward fix를 우선한다."
      }
    },
    "mobile-store": {
      "status": "released",
      "summary": "Android·iOS 2.5.1 (107)의 제출·승인·공개와 제출 source 2a9ee166을 확인했다. 2026-09-05 출시 책임자가 2.5.1의 실기기 검수는 전날 모두 완료됐다고 최종 확인했다. Mobile v2.5.1 annotated tag를 exact source에 고정하고 107 제출 marker의 증빙 이관 및 로컬·원격 삭제를 완료했다.",
      "evidence": {
        "submission": "2026-09-04 KST 출시 책임자가 106은 양 Store 모두 실제 제출하지 않았다고 최종 정정해 잘못된 submitted/android-2.5.1-106·submitted/ios-2.5.1-106을 로컬과 원격에서 삭제했다. 17:03 KST에는 current main 2a9ee166e30d77f827d49ac4ddb643ea775606fa의 Android·iOS 2.5.1 (107) Store 제출 완료를 보고했고, 즉시 platform별 annotated marker를 생성·push했다.",
        "approval": "2026-09-05 12:03 KST 양 Store 공개 상태로 승인 완료를 확인했다. 별도 심사 승인 시각은 조회하지 않았다. 이전 iOS Waiting for Review 화면을 현재 상태로 사용하지 않는다.",
        "release": "2026-09-05 12:03 KST Apple 공식 lookup(id=1645569179, country=kr)의 version은 2.5.1 (107), currentVersionReleaseDate는 2026-09-04T22:07:32Z(2026-09-05 07:07:32 KST)였다. Google Play 한국 공개 페이지(id=com.ritzy.fourhundred)는 version 2.5.1과 업데이트 날짜 2026-09-04를 제공했다. Android build 107·출시율 100%는 출시 책임자가 제공한 Production Console 화면으로 확인했으며 공개 페이지에서 build 번호를 독립 확인한 것은 아니다.",
        "smoke": "2026-09-05 KST 출시 책임자가 2.5.1은 2026-09-04 실기기 확인과 검수를 모두 마친 뒤 출시했다고 최종 확인했다. 앞선 미확인 답변은 이 확인으로 정정한다. 세부 화면별 결과를 에이전트 직접 관측으로 주장하지 않는다. 같은 날 읽기 전용 운영 점검에서 google/apple build 107 bootstrap은 HTTP 200·ok=true·version_name=2.5.1·version_code/min_version=107·force_update=0, 매니저 목록 6건의 canonical/legacy 이미지 경로 일치와 manager 16 상세의 canonical 이미지 slice 4건·HTTP 200을 확인했다. 2.5.2 (108) 실기기 확인 보고는 후속 버전 정보이며 이번 107 artifact나 source를 교체하지 않는다.",
        "artifact": "Android·iOS 제출 source는 platform별 submission-time marker와 출시 책임자 제출 보고로 고정한 2a9ee166e30d77f827d49ac4ddb643ea775606fa이다. 해당 source의 Android versionName 2.5.1/versionCode 107과 iOS MARKETING_VERSION 2.5.1/CURRENT_PROJECT_VERSION 107이 일치한다. 보존된 iOS 107 xcarchive의 version/build 2.5.1/107, uploadDestination App Store·uploadedBuildNumber 107, uploadEvent 2026-09-04T07:54:32Z success·errors/warnings 0건을 확인했다. Android 설치 package의 107·installer com.android.vending은 앞선 연결 기기 조회에서 확인했다. 원본 Android 107 AAB 전체 digest·서명 상세는 이 기록에서 복구하지 않았으며, 106 artifact는 실제 미제출이므로 증빙에서 제외한다.",
        "submittedMarkers": {
          "android": {
            "status": "verified",
            "tag": "submitted/android-2.5.1-107",
            "commit": "2a9ee166e30d77f827d49ac4ddb643ea775606fa",
            "evidence": "2026-09-04T08:03:48Z Android 2.5.1 (107) 제출 완료 보고 직후 annotated marker를 원격에 push했다. 원격 tag object 2c19b6219423fceb1e8ae5aecfcce6ccf0815317과 peeled commit 2a9ee166e30d77f827d49ac4ddb643ea775606fa을 확인했다.",
            "deletedEvidence": "2026-09-05 KST Mobile v2.5.1 annotated tag의 원격 peeled commit 2a9ee166e30d77f827d49ac4ddb643ea775606fa을 확인하고 제출 marker 이름·object·source·제출 시각을 이 기록에 이관한 뒤, 해당 107 marker를 로컬과 원격에서 삭제했다. 원격 marker 조회 결과는 0건이다.",
            "limitation": null
          },
          "ios": {
            "status": "verified",
            "tag": "submitted/ios-2.5.1-107",
            "commit": "2a9ee166e30d77f827d49ac4ddb643ea775606fa",
            "evidence": "2026-09-04T08:03:48Z iOS 2.5.1 (107) 제출 완료 보고 직후 annotated marker를 원격에 push했다. 원격 tag object 07d180754c4d86044a62ab9d5302038b5f1cd265와 peeled commit 2a9ee166e30d77f827d49ac4ddb643ea775606fa을 확인했다.",
            "deletedEvidence": "2026-09-05 KST Mobile v2.5.1 annotated tag의 원격 peeled commit 2a9ee166e30d77f827d49ac4ddb643ea775606fa을 확인하고 제출 marker 이름·object·source·제출 시각을 이 기록에 이관한 뒤, 해당 107 marker를 로컬과 원격에서 삭제했다. 원격 marker 조회 결과는 0건이다.",
            "limitation": null
          }
        }
      }
    },
    "mobile-nextpush": {
      "status": "released",
      "summary": "버전 확인 중 팝업 노출을 제거한 Mobile PR #261 병합 source 88a6d851을 기존 Store 2.5.1 (107) 대상 Android Production v34·iOS Production v31로 배포했다. 최초 검사에는 로고를 유지하고 복귀에는 기존 화면과 투명 차단층을 유지한다. 업데이트 대상과 검사 오류에만 안내하며 API·native·dependency·빌드 번호는 변경하지 않았다. 두 플랫폼의 history와 로컬 전체 package hash가 일치한다.",
      "evidence": {
        "app": "Android bluedotstudio.official-gmail.com/coupler; iOS bluedotstudio.official-gmail.com/coupler-ios; deployment Production",
        "productionLabel": "Android v34; iOS v31",
        "androidPackageHash": "199f4e473a92046893678386d4787f340f6c17df84275006191c99b2bfe497ba",
        "iosPackageHash": "a615321879465ca7c60dbc669224dee4ad9061d3c59a6936c0f6a3a12eddee43",
        "targetBinary": "Android/iOS 2.5.1; 출시 Store 2.5.1 (107)",
        "uploadedAt": "Android 2026-09-05T05:18:02.532Z; iOS 2026-09-05T05:19:14.611Z",
        "history": "Mobile PR #261 동일 후보 독립 리뷰 No Findings, yarn verify 120 suites·886 tests, Storybook 10 suites·57 tests·35 snapshots와 필수 CI 5개 통과 후 source 88a6d851e13c3012077ded501b79abe6e577308d로 rebase 병합했다. docs #211 사전 head 361543449cd01ed2928f4fc23e6aefadc593e778의 CI 3개와 공통 preflight PASS 뒤 clean main에서 Android→iOS 각 1회 배포했다. history의 appVersion=2.5.1·mandatory=true·rollout=100·disabled=false와 각 로컬 전체 package hash 일치를 확인했다. Android size 39141129 bytes, iOS size 39130210 bytes. 실기기 화면 전환 smoke와 모든 설치 사용자의 적용 완료는 확인하지 않았다.",
        "rollbackTarget": "Android Production v33 (ff79e8b6cb9e49e49da0bd5906583579b43ab47bf04c1516b0fb587b84cddb0d), iOS Production v30 (0e414f541a60e65b6ceed7a7a10d016c16e23cbb28467d88b3f461c6e79619de); source 7f8045dc2847744f78e3340a45a7d40f8c4010c3·target 2.5.1. 직전 공통 버전 검사와 current additive API를 유지하는 복구 기준이다.",
        "rollout": "Android/iOS 100%",
        "mandatory": "Android/iOS true",
        "disabled": "Android/iOS false"
      }
    },
    "docs": {
      "status": "released",
      "summary": "2.5.1 (107) 양 Store 출시·출시 책임자의 실기기 검수 완료 확인과 Mobile v2.5.1 태그·107 marker 정리를 반영해 최종 기록을 확정했다. 기존 docs #211을 다시 열어 이 최종본을 병합하고 docs v2.5.4 태그·게시 postcheck를 수행한다. API cutover와 후속 contracts pin 정렬은 2.5.2 초과 최초 Store 버전의 필수 출시 범위로 분리하며 이번 마감을 막지 않는다. 과거 cutover violated 이력과 현재 additive 호환을 보존한다.",
      "evidence": {}
    }
  },
  "apiContractCutover": {
    "status": "violated",
    "contractArtifactSync": {
      "command": "API pnpm verify·원격 Test workflow와 generated contract freshness/build/pack으로 contracts 0.1.42 source를 검증하고 Admin·Mobile dependency/lockfile의 current 0.1.41 pin을 대조",
      "result": "API packages/contracts tree e776fea0044c7ff3d8cf7b67370251f408cf53e4에서 stable 0.1.42를 발행하고 exact API source 2bde4593의 전체 CI와 운영 2.5.0·2.5.1 wire smoke를 통과했다. 같은 contracts tree를 유지하는 current API 1a44d374의 PR #235·#236 전체 CI와 운영 HTTP smoke도 통과했다. Admin·Mobile current source pin은 아래 승인된 지연 예외에 따라 아직 0.1.41이며 source 계약 정렬을 완료로 판정하지 않는다.",
      "consumerPath": "직전 Store 0baa63aee1cc4e64456affdd7b914c80360824e5는 /manager/all의 profile과 /manager/detail/{id}의 detail_profile_set을 읽고, Android·iOS 제출 예정 source 2a9ee166e30d77f827d49ac4ddb643ea775606fa는 canonical profile_image_path와 detail_profile을 읽는다. 소비자 source-version 지연 예외: 대상 Admin 59cb4862064c0e963bd0a6ce57673996d77ff290·Mobile 2a9ee166e30d77f827d49ac4ddb643ea775606fa, current 0.1.41→target 0.1.42 또는 당시 latest stable, 사유는 운영 이미지 장애의 API-only 긴급 복구 범위 유지, owner는 v2.5.4 릴리스 책임자, 원래 목표는 양 Store 공개일 다음 1영업일 이내였으나 2026-09-05 사용자가 cutover를 2.5.2 초과 최초 Store 버전으로 연기했다. 소비자 pin 정렬은 그 후속 준비 단계에서 수행하며, 그전에는 지연 예외와 source 미정렬 사실을 유지한다. 후속 작업은 당시 latest stable exact pin·lockfile 정렬과 release-scoped 제품 case를 포함하고 이 기록의 마감과 분리한다."
    },
    "violation": {
      "failedRequirements": [
        "consumer-inventory",
        "previous-consumer-product-case",
        "client-rollback"
      ],
      "affectedConsumerRefs": [
        "previous-store@0baa63aee1cc4e64456affdd7b914c80360824e5:rest"
      ],
      "detectedAt": "2026-09-03 21:29 KST post-deploy review",
      "observedEvidence": "2.5.0 Mobile source는 /manager/all에서 profile, /manager/detail/{id}에서 detail_profile_set.image_url을 읽지만 운영 API 9bd43ea8은 각각 profile_image_path와 detail_profile만 반환했다. 운영 이미지 파일과 신규 경로 자체는 HTTP 200이어서 파일 삭제가 아니라 공개 응답 계약 불일치로 판정했다.",
      "unobservedScope": "Production NextPush Android v31·iOS v28의 실제 영향 사용자 수와 요청량, 각 Store 심사 환경의 화면 노출은 직접 관측하지 않았다.",
      "operationalDisposition": "current DB와 Admin 계약을 유지하고 이전 API로 rollback하지 않았다. 구 Mobile이 실제 소비하는 profile과 detail_profile_set만 복구하는 additive contracts 0.1.42 source 2bde4593을 운영에 forward-fix하고 immutable API tag v2.5.5로 고정했다. 이후 current 운영 API 1a44d374·v2.5.6도 이 additive 호환을 유지한다.",
      "followUpControl": "2026-09-05 사용자 승인으로 라운지 best와 매니저 profile·detail_profile_set 제거 및 Admin·Mobile contracts pin 정렬을 2.5.2 초과 최초 Store 버전의 별도 API cutover: Yes 작업으로 연기한다. 출시 책임자는 해당 버전의 필수 범위에 cutover를 포함하고 출시 전에 완료한다. 버전 상승 자체나 모든 구버전 요청 0건을 완료 근거로 삼지 않으며, 실제 대상 앱의 업데이트 경로·신규 제품 동작·잔여 구버전 제품 요청 결과를 해당 릴리스에서 확인한다. 현재 운영의 additive 호환 응답은 유지하고, 후속 작업에서 이전 소비자 처리 방식·적용 대상·제품 REST case를 먼저 고정한다. 후속 cutover는 이 릴리스 기록의 종결 선행조건이 아니다."
    }
  }
}

문서 역할

  • 역할: 시나리오
  • 문서 종류: flow
  • 충돌 시 우선 문서: policy/release-process.md, 태그 기준은 policy/release-tag-policy.md
  • 기준 성격: as-is

목적

  • Android·iOS 2.5.1 (107) Store 출시와 이를 지원하는 DB·API·Admin 운영 반영을 하나의 v2.5.4 실행 기록으로 추적한다.
  • 운영 API 배포 뒤 발견한 2.5.0 Mobile 매니저 이미지 계약 위반을 사후 성공으로 덮지 않고 violated로 기록하며, 이미 완료한 이미지 호환 복구를 기록한다. 최종 Mobile wire cutover는 2.5.2 초과 최초 Store 버전의 별도 작업으로 이관하며 이번 출시 기록의 마감 조건에서 제외한다.
  • docs 기록 번호, 서비스 태그와 앱 버전은 독립적이며 앱 버전을 2.5.4로 변경하지 않는다.

범위

  • 대상: docs, coupler-api, coupler-admin-web, coupler-mobile-app
  • 포함 범위: contracts 0.1.41·0.1.42 발행, 운영 DB migration 4건, API·Admin 운영 배포, 발견된 매니저 이미지 계약 위반 처분과 API-only additive forward-fix, Android·iOS Store 2.5.1 (107) artifact와 제출·승인·출시·기본 검증, repo tag와 증빙 정리
  • 2026-09-05 추가 승인 범위: 공통 강제 업데이트 Mobile 7f8045dc의 Android/iOS Production NextPush(target 2.5.1, 현재 Store 107). 현재 운영 중인 게시판 변경 source 3a3ad702를 유지하면서 공통 검사만 추가하며 Store 재제출이나 빌드 번호 변경은 하지 않는다.
  • 제외 범위: Store 제출 전 submission marker 생성, 운영 데이터 수동 수정, v2.5.4 API 태그 이동·재작성. 라운지 best와 매니저 profile·detail_profile_set 제거 및 후속 contracts pin 정렬은 2.5.2 초과 최초 Store 버전의 별도 작업이며 이 PR의 마감 선행조건이 아니다.

상위 규범 문서

릴리스 상태

  • 목표 버전: v2.5.4
  • 전체 상태: released
  • 완료 범위: API·Admin·Mobile source main 병합, Mobile 양 플랫폼 2.5.1 (107) version 정렬·Store 제출·submission marker 검증·공개 확인, 잘못된 양 플랫폼 106 marker 삭제, contracts 0.1.41·0.1.42 stable 발행, 운영 migration 4건, API·Admin 운영 반영·smoke, immutable API v2.5.4·v2.5.5·v2.5.6 태그, 매니저 이미지 계약 위반 식별과 violated 처분, 양 플랫폼 107 실기기 검수 완료 확인, Mobile v2.5.1 태그, 107 제출 marker 증빙 이관·삭제
  • 대기 범위: N/A

버전 매핑

  • docs: 기록 버전 v2.5.4, 태그 v2.5.4, 커밋 N/A
  • coupler-api: 현재 운영 태그 v2.5.6, 커밋 1a44d3747fbc8042cb1c78021c404ccb62156618
  • coupler-api 이력: 최초 운영 반영 v2.5.4·9bd43ea857712bfaa26deb031c8f5fee697d6e95, 이미지 호환 forward-fix v2.5.5·2bde45931b6a7bfcd7c36e04805af46b3add10fc; 기존 태그는 이동하지 않음
  • coupler-admin-web: 태그 v2.5.4, 커밋 59cb4862064c0e963bd0a6ce57673996d77ff290
  • coupler-mobile-app: Android Store 2.5.1 (107), Android 릴리스 태그 v2.5.1, Android 커밋 2a9ee166e30d77f827d49ac4ddb643ea775606fa, Android source verified, iOS Store 2.5.1 (107), iOS 릴리스 태그 v2.5.1, iOS 커밋 2a9ee166e30d77f827d49ac4ddb643ea775606fa, iOS source verified, NextPush Android Production v34 / iOS Production v31; target 2.5.1, NextPush 커밋 88a6d851e13c3012077ded501b79abe6e577308d
  • submitted/android-2.5.1-107 tag object 2c19b6219423fceb1e8ae5aecfcce6ccf0815317과 submitted/ios-2.5.1-107 tag object 07d180754c4d86044a62ab9d5302038b5f1cd265의 삭제 전 원격 peeled commit은 모두 current source 2a9ee166e30d77f827d49ac4ddb643ea775606fa과 일치했다. Mobile v2.5.1 태그와 이 기록으로 증빙을 이관한 뒤 두 107 marker를 로컬·원격에서 삭제했다. 실제 제출되지 않은 106의 잘못된 두 marker도 앞서 삭제했다.

릴리스 결과

  • 현재 결과: released - 운영 DB·API·Admin과 Android·iOS 2.5.1 (107) 공개·실기기 검수 완료 확인, NextPush 운영 배포와 서비스 태그·제출 marker 정리를 기록했다. API 호환 필드 제거는 이번 완료 범위가 아니라 2.5.2 초과 최초 Store 버전의 필수 후속 작업이다.
  • API는 DB·Admin에 pinned만 유지하면서 Mobile 응답에 pinned와 동일한 best를 추가한다. 따라서 2.5.0과 2.5.1 Mobile이 같은 운영 API를 동시에 사용할 수 있다.
  • 그러나 매니저 선택·상세에서는 2.5.0이 읽는 profile과 detail_profile_set이 9bd43ea8 응답에서 누락돼 이미지가 표시되지 않았다. 기존 성공 판정을 수정하지 않고 cutover Gate를 violated로 닫으며 additive 호환 복구를 별도 릴리스로 수행한다.
  • additive API source 2bde4593을 운영에 반영해 2.5.0 legacy와 2.5.1 canonical 이미지 필드를 동시에 제공한다. 이 API-only 복구는 DB·Admin·Mobile Store·NextPush를 변경하지 않는다.
  • 카드 최초 만료일 보존과 프로필 영상 승인 알림 수정을 포함한 API source 1a44d374를 운영에 반영해 root PM2·내부/외부 HTTP·migration pending 0을 확인하고 v2.5.6으로 고정했다.
  • 과거 iOS·Android 106 artifact는 생성됐지만 양 Store 모두 제출하지 않았고 current 후보에서 제외했다. 양 플랫폼 107 artifact는 current source 2a9ee166에서 생성해 각 Store에 제출했으며, platform별 marker가 같은 source를 가리키는지 확인했다.
  • 최초 Store 준비 단계에서는 Production NextPush를 제외했다. 2026-09-05 사용자가 공통 강제 업데이트 수정의 NextPush 배포를 추가 승인하여 source 7f8045dc를 Android v33·iOS v30, target 2.5.1, mandatory·100%·enabled로 배포했다. 전체 패키지 hash가 운영 history와 일치함을 확인했고 rollback Android v32·iOS v29를 유지한다. 버전·빌드 번호나 107 제출 source를 덮어쓰지 않는다.

메인 흐름

  1. 기존 Draft PR에서 API·Admin·Mobile exact main ref와 contracts 발행 근거를 포함한 pending 기록의 필수 CI와 preflight를 통과한다.
  2. clean Mobile main의 exact commit에서 platform별 Store artifact의 version, 서명, 운영 API origin과 digest를 검증한다. Android 16 뒤로가기·프로필 영상 이탈 종료 수정과 양 플랫폼 build 107 정렬이 병합된 current source 2a9ee166에서 Android·iOS 2.5.1 (107) artifact를 새로 생성한다.
  3. 운영 API를 정지·drain하고 exact API source의 미적용 migration 4건을 적용한 뒤 pending 0을 확인한다.
  4. 같은 API source를 운영에 반영하고 2.5.0 best·2.5.1 pinned 응답과 내부·외부 smoke를 확인한 뒤 Admin exact source를 배포·검증한다.
  5. 제출 책임자가 검증된 artifact를 Store에 제출한 직후 platform별 submission marker를 생성·검증한다.
  6. 배포 뒤 발견한 2.5.0 매니저 이미지 계약 위반을 v2.5.4의 violated cutover로 처분하고, 기존 DB·Admin을 rollback하지 않은 채 profile과 detail_profile_set을 복구하는 additive API source 2bde4593을 운영에 배포·검증해 새 immutable tag v2.5.5로 고정한다.
  7. 카드 최초 만료일 보존과 프로필 영상 승인 알림 수정을 포함한 API source 1a44d374를 운영에 반영·검증하고 immutable tag v2.5.6으로 고정한다.
  8. 심사 승인과 공개 출시 뒤 양 플랫폼 운영 smoke를 수행하고 exact source에 Mobile v2.5.1 annotated tag를 고정한다.
  9. Mobile 제출 증빙을 이관하고 marker·docs metadata·태그를 실제 출시 결과에 따라 마감한다. 호환 필드 제거는 실행하지 않는다.
  10. 2.5.2 초과 최초 Store 버전의 별도 cutover 작업에서 지원 이전 소비자 처리 방식·적용 대상·제품 REST case를 먼저 확정하고 contracts 정렬과 필드 제거를 진행한다. 다음 버전 출시 자체를 cutover 조건 충족으로 간주하지 않는다.

검증 근거

  • source: 2026-09-03 KST 최초 API 9bd43ea857712bfaa26deb031c8f5fee697d6e95, Admin 59cb4862064c0e963bd0a6ce57673996d77ff290, iOS Mobile 1fa372a11c81f94db35c317ad68064e448423c96이 각각 clean source임을 확인했다. 2026-09-04 KST API 1a44d3747fbc8042cb1c78021c404ccb62156618과 Mobile 2a9ee166e30d77f827d49ac4ddb643ea775606fa가 각각 main == origin/main인 clean worktree임을 재확인했다.
  • contracts: API source의 packages/contracts tree 5dd216e2a05182e1a0d4f7623d9733ec20ec3912에서 @coupler-developer/coupler-api-contracts@0.1.41 발행 workflow가 성공했고 Admin·Mobile 소비자를 같은 version으로 병합했다.
  • tests: 초기 API pnpm verify 199 suites·1845 tests, Admin yarn verify 34 suites·275 tests, Mobile yarn verify 118 suites·853 tests와 Storybook 9 suites·51 tests가 통과했다. build 107 정렬 source에서는 Mobile yarn verify 118 suites·854 tests와 Storybook 9 suites·51 tests를 다시 통과했다. API PR #235와 #236은 format·lint·typecheck·safety·quality·core test 전체 CI가 성공했고, Mobile PR #257과 build 107 정렬 PR #258은 format·lint·typecheck·test·storybook CI가 모두 성공했다. 107 artifact의 Store 제출 완료는 출시 책임자 보고로 확인했고 platform별 marker source를 원격 검증했다.
  • version/config: current Mobile source 2a9ee166에서 Android versionName 2.5.1·versionCode 107, iOS MARKETING_VERSION 2.5.1·CURRENT_PROJECT_VERSION 107을 확인했다.
  • DB migration: exact API source 9bd43ea857712bfaa26deb031c8f5fee697d6e95의 개발계 pending 0을 재확인했다. 운영 구 API를 정지하고 legacy-only video 0건 guard를 확인한 뒤 미적용 4건을 순서대로 적용해 ledger 91→95, pending 0을 확인했다. 2026-09-04 KST current source 1a44d374에서도 운영 pending 0을 재확인했다.
  • API production: 2026-09-03 20:34 KST source 9bd43ea8을 production PM2로 기동해 내부·외부 HTTP 200과 Store build 105·106 bootstrap success를 확인하고 원격 v2.5.4로 고정했다. 이미지 호환 source 2bde4593의 운영 smoke와 원격 v2.5.5를 확인했다. 2026-09-04 14:52 KST 운영 checkout HEAD·branch·origin/main이 1a44d374·main으로 일치하고 root PM2가 online·production·cwd /home/projects/coupler-api이며 내부·외부 HTTP가 모두 200임을 확인했다. 원격 annotated v2.5.6의 peeled commit도 1a44d374와 일치한다.
  • API contract violation: 2026-09-03 21:29 KST post-deploy review에서 Store 2.5.0 source 0baa63aee1cc4e64456affdd7b914c80360824e5가 /manager/all.profile과 /manager/detail/{id}.detail_profile_set.image_url을 읽지만 API 9bd43ea8은 profile_image_path와 detail_profile만 반환함을 확인했다. 운영에 저장된 신규 이미지 경로와 실제 이미지 파일은 HTTP 200이어서 파일 손실이 아니라 이전 소비자 REST case 누락으로 판정했다.
  • API compatibility forward-fix: exact API source 2bde45931b6a7bfcd7c36e04805af46b3add10fc에서 병렬 코드리뷰 No Findings, 로컬 pnpm verify와 199 suites·1847 tests, 원격 전체 Test workflow, contracts 0.1.42 Release Contracts workflow를 통과했다. 2026-09-03 22:05 KST 운영 PM2를 해당 exact source로 reload·save했고 online·production·cwd와 내부 root HTTP 200을 확인했다. 외부 /app/manager/all은 5개 항목 모두 profile=profile_image_path, /app/manager/detail/{id}는 legacy·canonical 7개 slice 경로 일치, 실제 이미지 HTTP 200을 반환했다. 22:06 KST 원격 annotated API tag v2.5.5 peeled commit이 exact source와 일치함을 확인했다.
  • API current fixes: PR #235는 여성 수신 PENDING 카드의 천천히 결정 클릭 시 만료일 재설정을 제거해 카드 전달 시점의 최초 만료일을 보존했고, PR #236은 사진 또는 영상 변경을 함께 비교해 영상 단독 승인에도 기존 프로필 승인 알림을 1회 발송하도록 수정했다. 두 PR의 전체 CI가 성공했으며 합쳐진 운영 source 1a44d374의 contracts tree는 발행된 0.1.42 tree와 동일하다.
  • Admin production: source 59cb4862064c0e963bd0a6ce57673996d77ff290의 artifact SHA-256 e5127b4f5d498d4b3d903d51aa83e4d4f040275145b50f6e4c881684e30b5add를 20:36 KST 원자 교체했다. live index SHA-256 391e6220953d60c4418802f91446e323981f3ea9931a46ecb7f8c20ed2fad47b, 내부·외부 HTTP 200, 외부 main.7947e39e.js와 local SHA-256 c2c0bc58b5c0ee6eb35875c2c9b7b022715ad18ae0cecb63d999ab93fabdadd0 일치를 확인했다. 출시 책임자는 로그인된 운영 CMS의 스퀘어 관리 > 스퀘어 내역에서 실제 목록·정상 상태·관리 controls 렌더링을 확인했고 controls는 실행하지 않았다. 20:38 KST 원격 v2.5.4 peeled commit도 source와 일치했다.
  • artifact: Android·iOS 2.5.1 (107)의 제출 source는 platform별 submission-time marker와 출시 책임자 제출 보고로 고정한 2a9ee166e30d77f827d49ac4ddb643ea775606fa이다. 해당 source의 양 플랫폼 version/build 일치와 보존된 iOS 107 xcarchive의 App Store uploadEvent 2026-09-04T07:54:32Z success·errors/warnings 0건을 확인했다. Android 설치 package의 107·installer com.android.vending은 앞선 연결 기기 조회에서 확인했다. 원본 Android 107 AAB 전체 digest·서명 상세는 복구하지 않았으며, 106 artifact는 실제 미제출이므로 이번 증빙에서 제외한다.
  • Store: 2026-09-04 17:03 KST 출시 책임자가 Android·iOS 2.5.1 (107) 제출 완료를 보고했다. 직후 생성한 submitted/android-2.5.1-107·submitted/ios-2.5.1-107은 각각 원격 annotated tag이며 둘의 peeled commit이 current source 2a9ee166과 일치한다. 실제 제출되지 않은 106에 잘못 생성했던 두 marker는 로컬과 원격에서 삭제했다. 2026-09-05 12:03 KST Apple 공식 조회에서 2.5.1 (107)·공개 시각 2026-09-05 07:07:32 KST를, Google Play 공개 페이지에서 2.5.1·업데이트 날짜 2026-09-04를 확인했다. Android 107·출시율 100%는 제공된 Production Console 화면 근거다. 공개 확인을 실기기 운영 smoke로 간주하지 않는다.

  • Store 최종 검수·태그: 2026-09-05 KST 출시 책임자가 2.5.1은 전날 실기기 검수까지 모두 완료한 뒤 출시했다고 확인했다. 이 최종 확인이 앞선 미확인 답변을 대체한다. source 2a9ee166e30d77f827d49ac4ddb643ea775606fa의 양 플랫폼 version/build와 iOS 107 archive의 App Store upload success를 확인하고, 원격 annotated Mobile v2.5.1 peeled commit을 동일 source로 고정했다. 두 107 marker의 이름·object·source·제출 증빙을 위 metadata로 이관한 뒤 로컬·원격에서 삭제했으며 branch나 source는 삭제하지 않았다. 2.5.2 (108) 확인 보고는 후속 버전이며 이번 source에 합치지 않는다.

버전 확인 팝업 표시 수정 NextPush

  • 병합 source: 88a6d851e13c3012077ded501b79abe6e577308d. Mobile PR #261의 필수 CI 5개가 성공했고 2026-09-05T05:12:40Z rebase 병합했다. PR head 8fb152ad3d58cf9e12adecfd6439193f9f7dc357와 병합 source의 전체 git tree가 일치한다.
  • 배포 변경: Mobile PR #261의 버전 검사 UI 수정. 최신 버전과 검사 중에는 확인 팝업을 표시하지 않고, 업데이트 대상 또는 확인 실패에만 안내한다. 최초 검사에는 로고를 유지하며 복귀 검사에는 투명 차단층으로 기존 화면 조작만 막는다.
  • 검증: 같은 후보의 독립 최종 리뷰 No Findings, Mobile yarn verify 120 suites·886 tests, Storybook 10 suites·57 tests·35 snapshots 통과. 실기기 화면 전환은 미검증이며 API·native·dependency·Store 107 source는 변경하지 않았다.
  • 실행: docs PR #211의 사전 head 361543449cd01ed2928f4fc23e6aefadc593e778 CI 3개와 공통 yarn release:continue v2.5.4 preflight PASS 뒤 clean main 88a6d851에서 Android→iOS 순서로 각 1회 배포했다. 양쪽 모두 target 2.5.1, mandatory true, rollout 100, disabled false이며 Store 재제출·빌드 번호 변경은 없다.
  • Android 결과: Production v34, 2026-09-05T05:18:02.532Z, size 39141129 bytes, package hash 199f4e473a92046893678386d4787f340f6c17df84275006191c99b2bfe497ba. 로컬 전체 패키지 hash와 운영 history가 일치한다.
  • iOS 결과: Production v31, 2026-09-05T05:19:14.611Z, size 39130210 bytes, package hash a615321879465ca7c60dbc669224dee4ad9061d3c59a6936c0f6a3a12eddee43. 로컬 전체 패키지 hash와 운영 history가 일치한다. 배포 성공을 모든 설치 사용자의 적용 완료나 실기기 smoke로 간주하지 않는다.
  • 복구: Android Production v33, iOS Production v30, source 7f8045dc2847744f78e3340a45a7d40f8c4010c3, target 2.5.1. 복구해도 공통 강제 업데이트 검사는 남으며 확인 중 팝업 표시는 다시 생긴다. 아래 직전 배포 증빙의 package hash를 기준으로 한다.

출시 후 cutover 사전 점검

  • 후속 공통 검사: Mobile PR #260과 docs PR #213을 독립 리뷰 No Findings·동일 후보 CI 통과 후 병합했다. Mobile 7f8045dc는 처음 진입하기 전과 foreground 복귀 시 서버 force_update를 확인한다. 기존 Production Android v32·iOS v29의 source 3a3ad702와 native·package·lockfile이 동일한 것을 확인하고 2026-09-05 Android v33·iOS v30으로 배포했다. 이 target은 2.5.1이므로 2.5.0 이전 앱에 적용된 것으로 기록하지 않으며 이미 실행 중인 이전 코드의 API 요청을 소급 차단하지 않는다.
  • NextPush 검증: 배포 전 Mobile 동일 후보 yarn verify(120 suites·882 tests, Storybook 10 suites·56 tests), Android/iOS release JS bundle 생성, 의존성 정렬과 양 플랫폼 운영 107 bootstrap force_update=0을 확인했다. docs PR #211의 사전 CI 3개와 공통 preflight는 PASS였다. 배포 후 Android v33 package hash는 ff79e8b6cb9e49e49da0bd5906583579b43ab47bf04c1516b0fb587b84cddb0d, iOS v30은 0e414f541a60e65b6ceed7a7a10d016c16e23cbb28467d88b3f461c6e79619de이며 각각 로컬 전체 패키지 hash와 일치했다. NextPush scope는 완료했고, 이전 소비자의 제품 동작 저하 수용이나 API 필드 제거·배포까지 완료한 것은 아니다.

  • 2026-09-05 KST 운영 /app/auth/getSettingList를 실제 앱과 같은 os=google|apple 및 version_code=105|107로 읽기 전용 조회했다. 양 플랫폼 모두 version_name=2.5.1, version_code=107, min_version=107이며 105에는 force_update=2, 107에는 force_update=0을 반환했다. in_review=Y는 양쪽 모두 남아 있었다. 이 점검에서 CMS 설정을 변경하지 않았다.

  • 직전 Store source 0baa63aee1cc4e64456affdd7b914c80360824e5의 src/screens/auth/SplashScreen.tsx는 시작 시 버전 설정을 읽고, src/screens/MainScreen.tsx 생성자는 그 값으로 업데이트 팝업을 결정한다. 같은 화면의 foreground 복귀 handler는 프로필·알림만 갱신하고 버전 설정은 재조회하지 않는다. 따라서 설정 활성화 전에 실행 중이던 이전 앱의 제품 요청이 중단된다는 증빙은 없다.
  • current Store source 2a9ee166e30d77f827d49ac4ddb643ea775606fa와 직전 Store source 모두 src/utils/APIUtils.ts의 일반 요청 header에 앱 platform/build를 넣지 않는다. API source 1a44d3747fbc8042cb1c78021c404ccb62156618의 routes/app/v1/manager.ts와 controller/app/v1/manager.ts에도 매니저 조회의 최소 버전 판정이 없다. 운영 /app/manager/all은 버전·인증 정보 없는 요청에 ok=true, 6개 항목을 반환했고 모든 항목의 profile과 profile_image_path가 같았다. 이는 현재 호환 응답의 관측이며 출시된 앱의 실기기 smoke나 삭제 후보의 제품 case 통과는 아니다.
  • 판정: Store 공개와 강제 업데이트 설정만으로 호환 필드 제거 가능 여부를 확정하지 않는다. 이전 소비자가 읽는 이미지 필드를 바로 제거하면 기존 이미지 누락이 재발할 수 있으므로 삭제 구현·계약 발행·운영 배포는 보류했다. 실제 영향 사용자 수나 실행 중인 구버전 요청량은 관측하지 않았다.
  • 재개 조건: 양 플랫폼 107 실기기 운영 smoke를 확보하고, 이전 소비자의 변경된 제품 요청에 대해 보존 동작 또는 명시적으로 승인한 기능 저하·거부 결과를 검증한다. 제품 요청 보호 방식의 추가 구현이나 기능 저하 수용은 별도 범위 결정 후 진행한다. 이번 점검은 API·Admin·Mobile source, DB, 운영 설정, 태그를 변경하지 않았으며 기존 v2.5.4 cutover의 violated 처분을 덮어쓰지 않는다.

API contract cutover Gate

  • Cutover 상태: violated
  • Contract artifact sync:
    • 명령: API pnpm verify·원격 Test workflow와 generated contract freshness/build/pack으로 contracts 0.1.42 source를 검증하고 Admin·Mobile dependency/lockfile의 current 0.1.41 pin을 대조
    • 결과: API packages/contracts tree e776fea0044c7ff3d8cf7b67370251f408cf53e4에서 stable 0.1.42를 발행하고 exact API source 2bde4593의 전체 CI와 운영 2.5.0·2.5.1 wire smoke를 통과했다. 같은 contracts tree를 유지하는 current API 1a44d374의 PR #235·#236 전체 CI와 운영 HTTP smoke도 통과했다. Admin·Mobile current source pin은 아래 승인된 지연 예외에 따라 아직 0.1.41이며 source 계약 정렬을 완료로 판정하지 않는다.
    • published package: @coupler-developer/coupler-api-contracts@0.1.42
    • Mobile/Admin consumer path: 직전 Store 0baa63aee1cc4e64456affdd7b914c80360824e5는 /manager/all의 profile과 /manager/detail/{id}의 detail_profile_set을 읽고, Android·iOS 제출 예정 source 2a9ee166e30d77f827d49ac4ddb643ea775606fa는 canonical profile_image_path와 detail_profile을 읽는다. 소비자 source-version 지연 예외: 대상 Admin 59cb4862064c0e963bd0a6ce57673996d77ff290·Mobile 2a9ee166e30d77f827d49ac4ddb643ea775606fa, current 0.1.41→target 0.1.42 또는 당시 latest stable, 사유는 운영 이미지 장애의 API-only 긴급 복구 범위 유지, owner는 v2.5.4 릴리스 책임자, 원래 목표는 양 Store 공개일 다음 1영업일 이내였으나 2026-09-05 사용자가 cutover를 2.5.2 초과 최초 Store 버전으로 연기했다. 소비자 pin 정렬은 그 후속 준비 단계에서 수행하며, 그전에는 지연 예외와 source 미정렬 사실을 유지한다. 후속 작업은 당시 latest stable exact pin·lockfile 정렬과 release-scoped 제품 case를 포함하고 이 기록의 마감과 분리한다.
  • 사후 위반 처분:
    • 실패 요구조건: consumer-inventory,previous-consumer-product-case,client-rollback
    • 영향 소비자 ref: previous-store@0baa63aee1cc4e64456affdd7b914c80360824e5:rest
    • 발견 시점: 2026-09-03 21:29 KST post-deploy review
    • 관측 근거: 2.5.0 Mobile source는 /manager/all에서 profile, /manager/detail/{id}에서 detail_profile_set.image_url을 읽지만 운영 API 9bd43ea8은 각각 profile_image_path와 detail_profile만 반환했다. 운영 이미지 파일과 신규 경로 자체는 HTTP 200이어서 파일 삭제가 아니라 공개 응답 계약 불일치로 판정했다.
    • 미관측 범위: Production NextPush Android v31·iOS v28의 실제 영향 사용자 수와 요청량, 각 Store 심사 환경의 화면 노출은 직접 관측하지 않았다.
    • 운영 처분: current DB와 Admin 계약을 유지하고 이전 API로 rollback하지 않았다. 구 Mobile이 실제 소비하는 profile과 detail_profile_set만 복구하는 additive contracts 0.1.42 source 2bde4593을 운영에 forward-fix하고 immutable API tag v2.5.5로 고정했다. 이후 current 운영 API 1a44d374·v2.5.6도 이 additive 호환을 유지한다.
    • 후속 통제: 2026-09-05 사용자 승인으로 라운지 best와 매니저 profile·detail_profile_set 제거 및 Admin·Mobile contracts pin 정렬을 2.5.2 초과 최초 Store 버전의 별도 API cutover: Yes 작업으로 연기한다. 출시 책임자는 해당 버전의 필수 범위에 cutover를 포함하고 출시 전에 완료한다. 버전 상승 자체나 모든 구버전 요청 0건을 완료 근거로 삼지 않으며, 실제 대상 앱의 업데이트 경로·신규 제품 동작·잔여 구버전 제품 요청 결과를 해당 릴리스에서 확인한다. 현재 운영의 additive 호환 응답은 유지하고, 후속 작업에서 이전 소비자 처리 방식·적용 대상·제품 REST case를 먼저 고정한다. 후속 cutover는 이 릴리스 기록의 종결 선행조건이 아니다.

롤백 기준

  • artifact 준비: version, 서명, 운영 endpoint 또는 digest 검증이 실패하면 Store에 제출하지 않고 원인을 수정한 새 build로 다시 준비한다.
  • DB/API: migration guard나 drain이 실패하면 API를 시작하지 않는다. 적용 뒤에는 스키마를 되돌리거나 직전 API를 추정 배포하지 않고 고정 source 기반 forward fix를 사용한다.
  • API compatibility incident: 9bd43ea8·v2.5.4와 2bde4593·v2.5.5 태그를 이동·삭제하지 않는다. current 운영 기준은 1a44d374·v2.5.6이며, 이전 source로 되돌리면 이미지 장애 또는 이번 회귀 수정 손실이 생기므로 rollback하지 않고 current 계약 기반의 검증된 후속 forward-fix만 사용한다.
  • Admin: 직전 artifact는 제거된 /admin/lounge/best를 호출하므로 current API에서 단독 복원하지 않는다. current /pinned 계약을 유지하고 API·Admin forward fix 뒤 nginx·artifact bytes·로그인 화면을 재확인한다.
  • Store 제출 전: 제출 책임자가 exact source, platform version/build와 검증된 artifact를 대조하지 못하면 제출하지 않는다.
  • Store 제출 후 공개 전: Store Console에서 제출·출시 진행을 중단하고 이미 사용한 build number를 재사용하지 않는다.
  • Store 공개 후: rollout 중단 또는 검증된 후속 build로 복구하며 NextPush rollback으로 Store binary 문제를 우회하지 않는다.
  • 최초 NextPush 공통 검사 배포의 복구 기준은 Android Production v32, iOS Production v29였다. 이번 팝업 표시 수정은 공통 검사가 포함된 Android v33·iOS v30으로 복구한다. 기존 additive API를 유지하고 metadata의 exact label/hash를 사용한다. 배포 이력이 생성됐다면 동일 release 명령을 반복하지 않고 history부터 확인한다. API 필드 삭제 뒤 이 rollback 기준을 그대로 재사용하지 않는다.
  • docs: terminal 증빙이 갖춰지기 전에는 Draft PR을 병합하거나 v2.5.4 tag를 생성하지 않는다.

후속 작업

API cutover 구현 후보와 운영 보류

  • 범위: 2026-09-05 기존 cutover 워크트리에서 API 1a44d3747fbc8042cb1c78021c404ccb62156618 기준의 제거 후보를 작성했다. 이후 사용자는 남은 commit·PR·병합·배포·정리까지 완료하도록 요청했다. 후보는 049d3dcffa69f858a1ae8140784b98e96bf0b79c로 commit·push하고 API Draft PR #237을 생성했다. 운영 전환 조건은 아직 충족하지 않아 main 병합·stable 발행·배포하지 않았으며 기존 운영 metadata와 violated 처분은 보존한다.
  • 제거: App /lounge/list, /lounge/myList, /lounge/detail의 best, /manager/all의 profile, /manager/detail/{id}의 detail_profile_set. 응답 presenter·Swagger·generated contract를 함께 바꾸고, 호환 전용 ManagerSelectionSummary와 변환 함수를 제거해 기존 ManagerSummary를 직접 반환한다.
  • 보존: pinned, profile_image_path, detail_profile과 목록·상세 오류 처리, 익명화·삭제 문구, Admin 매니저의 profile·detail_profile_set 및 이미지 세트 공용 타입. DB·저장 모델·인증·bootstrap/version·서버 버전 설정·푸시는 변경하지 않는다.
  • 현재 소비 경로: Store 2a9ee166과 NextPush 88a6d851의 SignupManagerSelectScreen은 profile_image_path, SignupManagerDetailScreen은 detail_profile, squareTypes.isPinnedLounge는 pinned를 사용한다. 운영 Admin 59cb4862의 매니저 편집은 Admin 전용 이미지 세트를 사용하므로 App 호환 필드 제거 대상과 구분한다.
  • 패키지: API contracts 0.1.43은 미발행 source 후보다. API stable 발행 후 Admin·Mobile의 exact dependency와 lockfile을 함께 정렬한다. 그전에는 local tarball이나 미발행 dependency를 소비자에 넣지 않는다. Mobile의 기존 라운지 테스트·Storybook fixture에 남은 best도 새 package 적용 시 제거 대상이며 runtime 고정글 판정은 이미 pinned다.
  • 예방·복구 경계: 현재 운영 API 1a44d374·v2.5.6은 additive 호환을 계속 제공한다. 로컬 후보 작성으로 운영 응답을 바꾸지 않으며, 배포 전 후보 수정/철회가 가능하다. cutover 뒤 client rollback은 canonical 필드를 소비하는 Store 2a9ee166·NextPush 7f8045dc/88a6d851 범위에서 별도 case로 검증한다. 과거 이미지 장애 API 또는 구 DB로 되돌리는 복구는 사용하지 않는다.
  • 구버전 영향: Store 0baa63ae의 목록 parser는 profile, 상세 parser는 detail_profile_set을 읽는다. 필드가 제거된 응답을 직접 받으면 이미지를 표시할 수 없으며, best 소비자의 고정글 표시도 사라진다. HTTP 성공이나 force_update 설정을 제품 동작 보존·요청 거부 증빙으로 기록하지 않는다. 해당 제품 요청의 보호 방식 또는 허용 가능한 결과를 확정하고 실제 case로 검증하는 작업은 운영 반영 전 잔여 범위다.
  • 검증 결과: API 최종 후보의 독립 로컬 구현 리뷰 후 pnpm verify를 1회 실행했다. contracts freshness/build·lint·typecheck·format·DB static 검사와 dev-data 18 suites·234 tests, dev-cron 7 suites·121 tests를 통과했다. core는 최초 198 suites·1838 tests 통과 후 sandbox listen EPERM으로 실패한 WebSocket 14건만 같은 후보에서 실행 환경을 바꿔 재시도하여 합계 199 suites·1852 tests 통과를 확인했다. 미실행 마지막 leaf pnpm pack:contracts도 통과했다. 검증된 diff SHA-256은 fcca171d0c7b8fc9c99adb197369a80b97a33d5f60d1cb4641b14223bfa6477a이며 commit 전후 코드 변경은 없다. 기존 cron skip 1 suite·5 tests는 유지했다. 로컬 검증을 실기기 smoke·운영 activation·cutover 완료 판정으로 확대하지 않는다.
  • NextPush 대상 확인: 2.5.0 오배포 문의에 실제 Production history를 조회했다. Android v32·v33·v34와 iOS v29·v30·v31은 모두 exact target 2.5.1이었다. 제공된 Google Play 설치 실패 화면만으로 원인을 확정하거나 설치 장애가 해결됐다고 기록하지 않는다. 이 확인으로 Store 공개·팝업·동일 NextPush 배포를 다시 수행하지 않았다.
  • 분리 결정: 2026-09-05 사용자는 cutover를 2.5.2 초과 최초 Store 버전의 필수 출시 범위로 확정하고 현재 2.5.1 출시 기록 마감을 요청했다. API #237의 후보는 미병합·미배포 상태로 보존하며 후속 필수 작업을 추적한다. docs #211의 미병합 종료는 잘못된 처리였으며 같은 PR을 다시 열어 출시·검수 완료 확인과 서비스 태그를 반영한 최종본으로 병합한다. 이 문서의 마감은 후속 cutover 완료를 뜻하지 않는다. 별도 Android R8 작업은 변경하지 않는다.

  • 2.5.2 초과 최초 Store 버전 필수 작업: Store/NextPush 소비자 inventory와 이전 소비자 처리 방식·제품 case를 먼저 고정하고, Admin·Mobile contracts source pin 정렬 및 라운지 best와 매니저 profile·detail_profile_set 제거를 별도 cutover로 진행한다. 해당 버전에서는 이 작업을 출시 범위에서 누락하지 않고 출시 전에 완료한다. 이번 2.5.1 릴리스 마감과 분리한다.

  • 이번 기록의 완료 결과: 기존 DB·API·Admin 운영 증빙과 current API v2.5.6의 additive 호환을 보존했고, 양 Store 2.5.1 (107) 출시·출시 책임자의 실기기 검수 확인과 source 2a9ee166·Mobile v2.5.1 태그·107 제출 증빙 이관/삭제를 metadata와 본문에 반영했다. docs 최종본은 병합 뒤 v2.5.4 태그와 게시 결과를 확인한다. 미수행 cutover는 별도 필수 후속 작업이다.