콘텐츠로 이동

2.3.0 릴리스 실행 기록

{
  "schema": "release-metadata/v2",
  "version": "v2.3.0",
  "status": "released",
  "releaseScopes": [
    "db-migration",
    "contracts-package",
    "coupler-api",
    "coupler-admin-web",
    "mobile-store",
    "mobile-nextpush",
    "docs"
  ],
  "extraRepoRefs": [],
  "versionMapping": {
    "docs": {
      "tag": "v2.3.0",
      "commit": null
    },
    "coupler-api": {
      "tag": "v2.3.0",
      "commit": "8aa8583890ec488dd47e13c7c56ffdb38ed7d31e"
    },
    "coupler-admin-web": {
      "tag": "v2.3.0",
      "commit": "cc6513fd094f5ddcf27b90139077ca139017c334"
    },
    "coupler-mobile-app": {
      "store": "2.3.0 (101)",
      "releaseTag": "v2.3.0",
      "commit": "50ed611172132b615b970dbb29d50843a07be137",
      "nextPush": "Android bluedotstudio.official-gmail.com/coupler/Production/v24; iOS bluedotstudio.official-gmail.com/coupler-ios/Production/v21"
    }
  },
  "scopeResults": {
    "db-migration": {
      "status": "released",
      "summary": "개발계 canonical recovery를 완료했고 canonical 도입 전 적용된 운영 DB는 live catalog·ledger·postcondition을 재검증한 일회성 처분으로 닫았다.",
      "evidence": {
        "schema": "db-migration-precanonical-transition-evidence/v1",
        "dev": {
          "plan": {
            "path": "content/releases/evidence/db-migrations/v2.3.0/dev/plan.json",
            "sha256": "80224a5228eebe24275ba4ee0c57c08c93fdb692671cb034a777314094450657"
          },
          "execution": {
            "path": "content/releases/evidence/db-migrations/v2.3.0/dev/execution.jsonl",
            "sha256": "86883577f345861dd758f7a3bd903df482bdf88ce57749fac4a162aabaec7c59"
          }
        },
        "prod": {
          "plan": null,
          "execution": null
        },
        "prodDisposition": {
          "kind": "pre-canonical-applied",
          "version": "v2.3.0",
          "verifiedAt": "2026-07-25T08:09:13.364Z",
          "catalogSha256": "77d2d55ffbad3f57432211343fc7cb5dd6d95bb19f9e8d59fd1b216c338aa963",
          "ledgerCompatibilitySha256": "b3f7b274bb82ff3a0d18541eec0e3c46a66395fb59ea902606fc1e1ab9346fe9",
          "databaseIdentitySha256": "fda77e0b97d327b13e2e215f170204c441143a6159d95d8e65acc6d1381b8b69",
          "schemaFingerprintSha256": "1f0d418c44f11a0e78a364228928a47a6a06199a0e5a7d8fcc26fb5fa0969a7a",
          "catalogEntryCount": 23,
          "catalogResolvedCount": 23,
          "pendingCount": 0,
          "adjudicableLedgerGapCount": 0,
          "migration91Postcondition": "passed",
          "historicalEvidence": "canonical 도입 전 작업자가 보관한 운영 대상 migration 반영 로그와 사전 backup digest를 검토했다.",
          "limitation": "운영 실행은 canonical executor 도입 전에 완료됐으며 당시 plan/execution을 사후 생성하지 않았다."
        }
      }
    },
    "contracts-package": {
      "status": "released",
      "summary": "contracts 0.1.22 발행, 소비자 exact pin과 tagged Production API source의 contracts tree 동일성을 확인했다.",
      "evidence": {
        "publishedPackage": "@coupler-developer/coupler-api-contracts@0.1.22",
        "workflow": "https://github.com/coupler-developer/coupler-api/actions/runs/29982018085",
        "sourceRef": "1a2a6c92a259fb5e7e73b83f14c5d066f555a3d9",
        "sourceTree": {
          "path": "packages/contracts",
          "publishedSourceTree": "7727910f1d0b78066b5a0ed160cca405ae82234c",
          "releaseSourceTree": "7727910f1d0b78066b5a0ed160cca405ae82234c"
        }
      }
    },
    "coupler-api": {
      "status": "released",
      "summary": "운영 배포·태그와 runtime recovery를 확인했다. 배포 뒤 확인된 이전 native bootstrap과 사전 activation 장벽 위반은 violated 처분으로 종결했다.",
      "evidence": {
        "deployment": "Production source 8aa8583890ec488dd47e13c7c56ffdb38ed7d31e 반영 확인; annotated tag v2.3.0 push 완료",
        "smoke": "2026-07-25 15:03 KST 외부 루트 HTTP 200 확인",
        "publicContract": null,
        "runtimeRecovery": {
          "strategy": "forward-fix",
          "stateSafety": {
            "source": "application-evidence",
            "persistedState": "운영 DB pre-canonical 처분의 catalog 23/23, 미처리 migration 0, migration 91 postcondition과 invalid idempotency 0을 확인했고 tagged source의 persistence/idempotency core suite가 통과했다.",
            "queuedState": "2026-07-25 20:28~20:41 KST 운영은 root PM2 fork 1개와 그 자식 app Node 1개이며 별도 Node writer가 없다. root cron의 /admin/cron/* 12개는 같은 API 호출자다. DB-backed manager/group image worker의 미처리·처리 중 작업은 각각 0건이고 tagged source worker/core tests가 통과했다.",
            "externalEffects": "tagged source의 단일 저장·단일 발행/idempotency tests는 통과했다. FCM은 상태 commit 뒤 직접 발송하고 durable outbox·retry ledger가 없으므로 previous-release rollback을 허용하지 않으며 장애 시 forward fix와 대상이 식별되는 범위의 통제된 reconciliation만 사용한다."
          },
          "previousReleaseCaseIds": []
        }
      }
    },
    "coupler-admin-web": {
      "status": "released",
      "summary": "운영 정적 산출물, 외부 응답과 품질 게이트를 확인하고 릴리스 태그를 고정했다.",
      "evidence": {
        "deployment": "Production 정적 산출물이 source cc6513fd094f5ddcf27b90139077ca139017c334의 build와 일치; annotated tag v2.3.0 push 완료",
        "smoke": "2026-07-25 15:03 KST 외부 HTTP 200, 운영 JS/CSS byte 일치와 yarn verify 25 suites/214 tests 통과",
        "rollback": "배포 직전 Admin은 제거된 legacy concierge route를 호출하므로 current API에서 복원하지 않는다. current artifact를 유지하고 API·Admin forward fix를 사용한다."
      }
    },
    "mobile-store": {
      "status": "released",
      "summary": "Android·iOS 2.3.0 (101) 출시와 릴리스 태그를 확인하고 제출 마커 증빙 이관·삭제를 완료했다.",
      "evidence": {
        "submission": "Android·iOS 2.3.0 (101), 2026-07-24T11:49:55Z 제출 완료",
        "approval": "Android 승인 완료; iOS 승인 및 공개 출시 2026-07-25T04:13:32Z 확인",
        "release": "Android·iOS 2.3.0 (101) 운영 출시 완료; mobile annotated tag v2.3.0 push 완료",
        "smoke": "Android 출시 상태와 iOS App Store 공개 2.3.0(101) 확인; 대상 2.3.0 NextPush Android active 3/installed 3/failed 0, iOS active 6/installed 6/failed 0",
        "artifact": "Android AAB sha256 0cb989150dfe65ecc6bd33771e56fbfb2e2136ab75d37cb34cb3cc383fb3567e; iOS archive sha256 9885cfbe51802af66a686a79988b7e95846858b718c9ad2481761041e7eeaee5",
        "submittedMarkers": [
          {
            "tag": "submitted/mobile-2.3.0-101",
            "commit": "72a384d68b2623bc501cc4d6198d3f3aee304f3a",
            "evidence": "Android·iOS 제출 artifact와 tag message의 SHA-256 일치 확인",
            "deletedEvidence": "2026-07-25 15:30 KST local·origin submitted marker 삭제와 origin v2.3.0 유지 확인"
          }
        ]
      }
    },
    "mobile-nextpush": {
      "status": "released",
      "summary": "2.3.0 전용 Android·iOS Production bundle을 mandatory 100%로 활성화했다.",
      "evidence": {
        "app": "Android bluedotstudio.official-gmail.com/coupler; iOS bluedotstudio.official-gmail.com/coupler-ios",
        "productionLabel": "Android Production v24; iOS Production v21",
        "targetBinary": "Android·iOS 2.3.0",
        "uploadedAt": "Android 2026-07-25T03:24:38.372Z; iOS 2026-07-25T03:25:16.049Z",
        "rollout": "Android 100%; iOS 100%",
        "mandatory": "Android true; iOS true",
        "disabled": "Android false; iOS false"
      }
    },
    "docs": {
      "status": "released",
      "summary": "운영 반영 결과와 배포 뒤 확인된 API 호환성 위반 처분을 최종 기록으로 고정하고 병합 뒤 docs v2.3.0 태그를 생성한다.",
      "evidence": {}
    }
  },
  "apiContractCutover": {
    "status": "violated",
    "contractArtifactSync": {
      "command": "tagged API 8aa8583의 generated contracts와 Admin·Mobile manifests/lockfiles exact pin 확인",
      "result": "@coupler-developer/coupler-api-contracts@0.1.22와 tagged API contracts tree 일치",
      "consumerPath": "Admin cc6513f와 Mobile 50ed611은 0.1.22; 직전 Admin d58040f와 NextPush a615e5e는 0.1.5"
    },
    "violation": {
      "failedRequirements": [
        "pre-deploy-activation-barrier",
        "old-readable-bootstrap"
      ],
      "affectedConsumerRefs": [
        "previous-mobile-store@3efcfae:bootstrap",
        "previous-mobile-nextpush@a615e5e:rest",
        "previous-admin@d58040f:rest"
      ],
      "detectedAt": "2026-07-25 KST 배포 후 source·운영 응답 비교",
      "observedEvidence": "tagged API의 legacy chat route 404와 build 100 bootstrap 응답을 직전 Mobile·NextPush·Admin source 계약과 비교해 사전 요청 장벽 부재와 Store 2.2.1 native bootstrap envelope 불일치를 확인했다.",
      "unobservedScope": "실제 구버전 운영 트래픽, 요청량과 피해 사용자 수는 관측하지 않았다.",
      "operationalDisposition": "운영 current API·Admin·Mobile·DB를 유지하며 직전 native·NextPush·Admin 조합을 성공 rollback 후보로 사용하지 않는다.",
      "followUpControl": "다음 공개 계약 변경부터 배포 전에 소비자 inventory, old-readable bootstrap/version, 결정론적 요청 차단과 client rollback case를 검증하며 이 처분은 정상 Gate 근거로 재사용하지 않는다."
    }
  }
}

문서 역할

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

목적

  • v2.3.0의 DB, API, Admin, Mobile Store, Mobile NextPush와 문서 최종 결과를 기록한다.
  • 배포 뒤 확인된 API 호환성 위반을 정상 Gate 통과로 꾸미거나 영구 대기 상태로 남기지 않고 사실대로 종결한다.

범위

  • 대상: docs, coupler-api, coupler-admin-web, coupler-mobile-app
  • 포함 범위: DB migration, contracts package, API, Admin, Mobile Store 2.3.0 (101), Mobile NextPush, docs
  • 제외 범위: CMS 운영 버전 설정

상위 규범 문서

릴리스 상태

  • 목표 버전: v2.3.0
  • 전체 상태: released
  • 완료 범위: source main 병합, contracts 0.1.22 발행·소비자 pin, API·Admin 운영 반영, Android Store 출시, iOS Store 출시, Android·iOS Production NextPush 활성화, API·Admin·Mobile v2.3.0 태그, 개발계 migration 91 ledger-only recovery와 canonical service completion, 운영 DB pre-canonical live 처분, tagged Production API source의 runtime recovery 증빙, API 호환성 위반의 terminal 처분, docs 최종 기록
  • 대기 범위: N/A

버전 매핑

  • docs: 기록 버전 v2.3.0, 태그 v2.3.0, 커밋 N/A
  • coupler-api: 태그 v2.3.0, 커밋 8aa8583890ec488dd47e13c7c56ffdb38ed7d31e
  • coupler-admin-web: 태그 v2.3.0, 커밋 cc6513fd094f5ddcf27b90139077ca139017c334
  • coupler-mobile-app: Store 2.3.0 (101), 릴리스 태그 v2.3.0, 커밋 50ed611172132b615b970dbb29d50843a07be137, NextPush Android bluedotstudio.official-gmail.com/coupler/Production/v24; iOS bluedotstudio.official-gmail.com/coupler-ios/Production/v21
  • coupler-mobile-app 제출 마커 태그: submitted/mobile-2.3.0-101, commit 72a384d68b2623bc501cc4d6198d3f3aee304f3a
  • 제출 마커 증빙 이관/삭제: 2026-07-25 15:30 KST 로컬·원격 삭제 완료, v2.3.0 원격 유지 확인

릴리스 결과

  • DB migration: 개발계는 모든 writer와 effect producer를 fence하고 TLS, identity, drain, logical backup, exclusive lock과 live postcondition을 확인한 뒤 migration 91 ledger-only recovery를 완료했다. 다음 runtime 908ebc0으로 FENCED smoke, RESUMED, service-completed까지 기록했다. 운영계는 canonical 도입 전 실행을 사후 제조하지 않고 live catalog 23/23 resolved, pending·adjudicable gap 0건과 migration 91 postcondition을 다시 확인한 일회성 처분으로 scope를 닫았다.
  • contracts package: @coupler-developer/coupler-api-contracts@0.1.22 발행과 Admin·Mobile manifest/lockfile exact pin을 확인했다. 발행 workflow source 1a2a6c9, Production API tag source 8aa8583, 이후 main 908ebc0packages/contracts tree가 모두 같음을 확인해 scope를 닫았다.
  • API: 운영 배포 source 8aa8583과 외부 기본 응답을 확인하고 해당 커밋에 v2.3.0을 고정했다. 이후 maintenance executor 변경만 담은 908ebc0이 main에 병합됐지만 annotated tag를 불변 릴리스 기준으로 유지한다. tagged source의 전체 contract/core/worker 검증과 운영 runtime/queue inventory로 forward-fix 복구 증빙은 고정했다. 다만 직전 소비자의 legacy route 차단과 이전 native bootstrap envelope 불일치는 배포 뒤 확인됐다. 과거 사전 증빙을 만들지 않고 violated 처분으로 종결했다.
  • Admin: current source의 정적 build와 운영 산출물 일치, 외부 응답과 품질 게이트를 확인하고 v2.3.0을 고정했다.
  • Mobile Store: Android·iOS 2.3.0 (101) 출시와 기본 smoke, v2.3.0 태그를 확인했다. 공통 제출 마커 증빙을 원격 릴리스 기록 PR에 이관한 뒤 로컬·원격 마커를 삭제했다.
  • Mobile NextPush: Android v24, iOS v21을 2.3.0 대상으로 mandatory 100% 활성화했다.
  • docs: 운영 결과와 호환성 위반 처분을 최종 기록으로 고정하고 병합 뒤 v2.3.0 태그를 생성한다.

메인 흐름

  1. API, Admin, Mobile의 2.3.0 (101) 관련 변경을 각 main에 병합하고 기준 SHA를 고정했다.
  2. 운영 DB migration, API·Admin 배포, Android·iOS Store 제출을 수행했다.
  3. Android Store 출시와 Android·iOS Production NextPush 활성화를 확인했다.
  4. 개발계 migration 91 ledger를 canonical executor로 판정·복구하고 다음 API runtime으로 재개했다.
  5. iOS 승인·출시와 양 플랫폼 Store smoke를 확인하고 API·Admin·Mobile 태그를 생성했다.
  6. 제출 마커 증빙을 같은 PR에 이관한 뒤 로컬·원격 마커를 삭제했다. 운영 DB pre-canonical live 처분과 API runtime recovery 증빙을 완료했다.
  7. 직전 소비자 소스와 운영 API를 대조해 legacy route 차단과 이전 native bootstrap envelope 불일치를 확인했다. 이는 실제 구버전 운영 트래픽 관측이 아니라 source·응답 계약 비교 결과다. 누락된 사전 activation/public-contract 증빙을 사후 제조하지 않고 violated 처분으로 종결했다.

검증 근거

  • 원격 기준점: API 8aa8583890ec488dd47e13c7c56ffdb38ed7d31e, Admin cc6513fd094f5ddcf27b90139077ca139017c334, Mobile 50ed611172132b615b970dbb29d50843a07be137
  • contracts: 발행 workflow https://github.com/coupler-developer/coupler-api/actions/runs/29982018085 성공, API manifest와 Admin·Mobile manifest/lockfile가 0.1.22로 일치. API 1a2a6c9, 8aa8583, 908ebc0packages/contracts git tree는 모두 7727910f1d0b78066b5a0ed160cca405ae82234c
  • API: 2026-07-25 15:03 KST 운영 외부 루트 HTTP 200, 배포 commit 8aa8583 annotated tag 확인
  • Admin: 2026-07-25 15:03 KST 운영 외부 HTTP 200, 운영 JS/CSS가 current source build와 byte 단위로 일치, yarn verify 25 suites/214 tests 통과, annotated tag 확인
  • API cutover: Yes로 재판정. 심사용 iOS native bundle이 개발 API를 보고 2.3.0 전용 Production NextPush가 운영 API로 전환하는 구조 자체는 의도된 상태이며 개발 API 심사 case를 운영 호환 증빙으로 사용하지 않는다. 별도로 직전 Mobile NextPush a615e5e/app/chat/list, /app/match/chat/list를, 직전 Admin d58040f/admin/member/concierge/chat_list를 호출한다. tagged API는 legacy route 제거를 포함하고 2026-07-25 운영 실측에서 /app/chat/list/admin/member/concierge/chat_list가 404였다. build 100의 Android·iOS bootstrap은 {ok,data}, version/min_version 101, force_update 2를 반환해 NextPush 0.1.5가 upgrade를 읽지만, Store 2.2.1 native 3efcfaeresult_code/result_data를 기대하므로 native fallback은 old-readable이 아니다. 이 비교는 실제 구버전 트래픽이나 피해 사용자 수를 증명하지 않는다. 사전 activation 장벽과 old-readable bootstrap이 없었던 사실을 violated 처분으로 기록하며 사후 Gate 통과로 바꾸지 않는다.
  • API tagged source 검증: 별도 detached worktree에서 contracts check/build, lint, typecheck, format, DB catalog 23건, logical model 83개, dev-data 23 suites/486 tests, dev-cron 6 suites/90 tests, core 164 suites/1,366 tests와 contracts 0.1.22 pack을 통과했다. 처음 겹쳐 실행된 core에서 임시 이미지 디렉터리 1건이 실패했으나 해당 3 tests와 전체 core를 단독 재실행해 모두 통과했다.
  • API 운영 runtime/writer inventory: 2026-07-25 20:28~20:41 KST production checkout 8aa8583890ec488dd47e13c7c56ffdb38ed7d31e, root PM2 coupler-api fork 1개 online, 3002 listener 1개다. PM2의 pnpm start 자식이 app.ts를 실행하며 별도 Node writer는 없다. root cron 중 /admin/cron/* 12개는 같은 API의 scheduler 호출자다. 운영 DB의 manager detail image는 discarded 26/failed 1/ready 4/pending·processing 0, group meeting image pending·processing 0이다.
  • 개발 DB: migration 84·85 checksum은 sealed legacy alias로 판정됐고 migration 91만 adjudicable ledger gap으로 고정됐다. 2026-07-25 15:46~15:55 KST API·cron fence, direct SQL idle session 종료, session/transaction 0, TLS identity, logical backup SHA-256 5704abacd16f1f9a89142f205d1add04257bbcf9f0e2f20752eaa6cac9ea82f5, live postcondition을 확인했다.
  • 개발 DB canonical evidence: plan content/releases/evidence/db-migrations/v2.3.0/dev/plan.json SHA-256 80224a5228eebe24275ba4ee0c57c08c93fdb692671cb034a777314094450657, execution content/releases/evidence/db-migrations/v2.3.0/dev/execution.jsonl SHA-256 86883577f345861dd758f7a3bd903df482bdf88ce57749fac4a162aabaec7c59. execution은 ledger-gap adjudication, ledger repair, database-completed, FENCED smoke, RESUMED, source 908ebc0 service-completed를 포함한다.
  • 개발 API 재개: server checkout 908ebc04cc89c9ff7812f269484e51eda4a3e1a9, frozen-lockfile install, PM2 online, 내부·외부 HTTP 200과 안전 설정의 cron 재설치를 확인했다.
  • 운영 DB pre-canonical 처분: 2026-07-25T08:09:13.364Z에 TLS와 익명화한 DB identity digest fda77e0b97d327b13e2e215f170204c441143a6159d95d8e65acc6d1381b8b69를 확인했다. canonical catalog 77d2d55ffbad3f57432211343fc7cb5dd6d95bb19f9e8d59fd1b216c338aa963 기준 23/23 resolved, pending·adjudicable ledger gap 0건, migration 91 live postcondition 통과와 schema fingerprint 1f0d418c44f11a0e78a364228928a47a6a06199a0e5a7d8fcc26fb5fa0969a7a를 확인했다. 기존 반영 로그와 사전 backup digest는 작업자 보관 증빙으로 검토했으며, 당시 없던 운영 plan.json·execution.jsonl은 사후 제조하지 않았다.
  • Mobile Store: 제출 시각 2026-07-24T11:49:55Z, 제출 marker submitted/mobile-2.3.0-101, Android AAB SHA-256 0cb989150dfe65ecc6bd33771e56fbfb2e2136ab75d37cb34cb3cc383fb3567e, iOS archive SHA-256 9885cfbe51802af66a686a79988b7e95846858b718c9ad2481761041e7eeaee5
  • Mobile Store 상태: Android 출시 완료, iOS App Store 공개 2.3.0 (101)2026-07-25T04:13:32Z release date 확인
  • Mobile NextPush: 2026-07-25 KST deployment history에서 Android Production v24와 iOS Production v21이 2.3.0 대상, rollout 100%, mandatory true, disabled false임을 재확인했다. Android active 3/installed 3/failed 0, iOS active 6/installed 6/failed 0이다.
  • Mobile 품질 게이트: yarn verify의 contracts/lint/typecheck/format/Jest 88 suites/599 tests와 별도 Storybook 5 suites/41 tests, 19 snapshots를 통과했다.
  • 서비스 태그: API v2.3.08aa8583, Admin v2.3.0cc6513f, Mobile v2.3.050ed611; 모두 annotated tag로 origin push를 확인했다.
  • 제출 마커: submitted/mobile-2.3.0-101의 제출 artifact/commit 증빙을 PR #144에 이관한 뒤 2026-07-25 15:30 KST 로컬·origin tag를 삭제했고 origin v2.3.0 target 50ed611은 유지됨을 확인했다.

API contract cutover Gate

  • Cutover 상태: violated
  • Contract artifact sync:
    • 명령: tagged API 8aa8583의 generated contracts와 Admin·Mobile manifests/lockfiles exact pin 확인
    • 결과: @coupler-developer/coupler-api-contracts@0.1.22와 tagged API contracts tree 일치
    • published package: @coupler-developer/coupler-api-contracts@0.1.22
    • Mobile/Admin consumer path: Admin cc6513f와 Mobile 50ed611은 0.1.22; 직전 Admin d58040f와 NextPush a615e5e는 0.1.5
  • 사후 위반 처분:
    • 실패 요구조건: pre-deploy-activation-barrier,old-readable-bootstrap
    • 영향 소비자 ref: previous-mobile-store@3efcfae:bootstrap,previous-mobile-nextpush@a615e5e:rest,previous-admin@d58040f:rest
    • 발견 시점: 2026-07-25 KST 배포 후 source·운영 응답 비교
    • 관측 근거: tagged API의 legacy chat route 404와 build 100 bootstrap 응답을 직전 Mobile·NextPush·Admin source 계약과 비교해 사전 요청 장벽 부재와 Store 2.2.1 native bootstrap envelope 불일치를 확인했다.
    • 미관측 범위: 실제 구버전 운영 트래픽, 요청량과 피해 사용자 수는 관측하지 않았다.
    • 운영 처분: 운영 current API·Admin·Mobile·DB를 유지하며 직전 native·NextPush·Admin 조합을 성공 rollback 후보로 사용하지 않는다.
    • 후속 통제: 다음 공개 계약 변경부터 배포 전에 소비자 inventory, old-readable bootstrap/version, 결정론적 요청 차단과 client rollback case를 검증하며 이 처분은 정상 Gate 근거로 재사용하지 않는다.

Mobile 개발계 QA 빌드 기록

  • 기록일: 2026-07-25 KST
  • API 대상: iOS Store 제출 native bundle은 개발 API, 동일 2.3.0의 Production NextPush는 운영 API
  • iOS TestFlight QA 빌드: Store 제출본 2.3.0 (101)
  • Android QA APK: N/A - Android Store 제출 artifact와 Production NextPush로 검증
  • 운영 릴리즈 전 확인: 2.3.0 외 native 버전에는 이번 Production NextPush가 내려가지 않음을 확인

롤백 기준

  • DB: RESUMED 뒤 snapshot/PITR로 되돌리지 않는다. 현재 runtime과 데이터 보존을 전제로 forward fix 또는 통제된 lossless reconciliation을 사용한다.
  • API: 직전 운영 기준점과 직전 client는 현재 DB·계약에서 전체 복구 조합이 아니므로 rollback하지 않는다. durable FCM outbox가 없는 상태에서 현재 DB를 보존하고 forward fix 또는 대상이 식별되는 통제된 reconciliation만 사용한다.
  • Admin: 배포 직전 정적 산출물은 제거된 legacy concierge route를 호출하므로 current API에서 복원하지 않는다. current artifact를 유지하고 API·Admin forward fix 뒤 nginx 내부·외부 응답을 재확인한다.
  • Mobile Store: Android·iOS가 이미 출시됐으므로 새 Store build 또는 NextPush rollback을 별도 판정한다.
  • Mobile NextPush: 직전 label은 제거된 legacy chat route를 호출하므로 current API에서 rollback하지 않는다. 양 플랫폼 current label을 유지하고 client/API forward fix를 별도 판정한다.
  • docs: 최종 PR 병합 뒤 v2.3.0 태그와 Release를 생성하고 실패 시 별도 운영 이슈로 추적한다.

후속 작업

  • 이번 릴리스에 남은 배포 범위는 없다. 확인된 API 호환성 위반은 향후 릴리스의 정상 Gate 증빙으로 재사용하지 않으며, 다음 계약 변경부터 배포 전에 소비자 호환 또는 결정론적 차단을 검증한다.
  • 그룹미팅의 배포·현행 논리 모델 판정과 분리된 FCM·실시간·scheduler 운영 smoke 증빙은 기술 부채 인벤토리그룹미팅 FCM·실시간·scheduler 운영 smoke 증빙 미확인에서 비차단 후속 검증으로 추적한다.