一気に移さない。機能的に等価なコードから置換する(リスクゼロの Phase A)。
> 実地訂正(2026-07、xdeal-lp で実施): 当初「バイト同一」と書いていたが、実測すると > diff 行数は大きい(xdeal↔ivs の 4s-session は各ファイル数十行差)。ただし差分は > 圧倒的に表層(single/double quote・prettier 設定・コメント量・pick→pickStr 命名)で、 > ロジックは同一(PROD_API/base 解決/HANDOFF_QUERY/verify4SUser の戻り型まで一致)。 > 判定は diff 行数でなく export シグネチャと分岐ロジックの照合で行うこと。
Phase A — 抽出 & 並走(挙動変更なし)
対象は「3アプリで既にほぼ同一」のもの。ここだけは差し替えても挙動が変わらない。
1. 4S セッションハンドオフ
src/lib/4s-session/*(xdeal / ivs にほぼ同構成・spikes は env/verify のみ)を @event/fours-sdk(この3アプリから harvest したので機能等価)に置換:
前提=配布方式の決定: 別リポの app から @event/* を import するには、internal-packages パターン(raw TS + transpilePackages・ビルド成果物なし)を保つ配布が要る。選択肢: (a) 対象 app を event-manual monorepo に吸収(管理一元・移行大) / (b) git submodule で packages/ を持ち込み transpilePackages 追加(非破壊寄り・Vercel submodule 設定要) / (c) 各パッケージにビルド段を足して private npm 公開(no-build 原則に反する・非推奨)。 コード置換の前にこれを決める。
consumeHandoff/tokenStore/use4SSession→@event/fours-sdk/clientcreateLoginProxyHandler/createCognitoRefreshHandler→ route を factory にverify4SUser(3アプリで同じ約30行)→@event/fours-sdkの verify4SUser
2. 死コード削除
削除前に必ず被参照を grep で証明する(「分析で未使用」でも現役参照が残っていることがある)。
- xdeal の 1,457行
ScheduleMap.tsx+ 専用 scss — 自己参照のみを確認して削除(実施済み: xdeal-lp PR #269) - ❌
four-s.tsは削除しない — deprecated adapter だが現役参照3件(apply/_actions・
buyer accept-invitation・buyer profile)あり。Phase B 以降で @event/fours-sdk へ段階置換
- ❌
api/four-s/callbackも削除しない —FOUR_S_OAUTH_*未設定時に 501 を返す
意図的 scaffold(4S OAuth 公開待ちのプレースホルダ)
3. contentStore / auth
@event/core の createContentStore(ivs canonical + sha リトライ統合版)と createSharedPasswordAuth(constant-time 統一 — spikes の平文 === を修正)へ。
4. 検証
各置換ごとに型チェック + 該当フローを1つ手で叩いて挙動一致を確認してから次へ。
Phase B 以降(別 PR)
- session-card の 4コピー balance engine →
@event/session-card/engine - 約10 の toPng フロー →
@event/asset-kit - id/_id 統一、lazy DB client 採用
原則
一度に1論理単位 = 1コミット。export シグネチャ照合で機能等価を確認できるものから。 「エンジンコードをアプリに残さない」— ロジックはパッケージへ、アプリには config だけ。