Jewelry AI・モデルのステップ
モデル写真は「次へ」ではなく、選んだ時点でアップロードされます
自分の写真を選ぶと、その場で転送が始まります。選択画面のあとに押すボタンが送信しているわけではありません。カタログの側に戻して消えるのは画面であってサーバーではなく、一度も使われなかったアップロードをサーバーがどう扱うかは、利用者が動かせないコードの側にあります。
送信は「次へ」ではなく、選んだ時点で起きます
作成フローのモデルのステップでは、カタログからモデルを選ぶか、自分の写真を使うかのどちらかになります。自分の写真の側では、選んだ瞬間にファイルがサーバーへ送られます。「次へ」を押す前、そして生成が始まる前です。
引き返したときに感じ方がずれるのは、このためです。押した操作が生成を一つ費やしたわけではないので、画面はまだ何にも踏み切っていないステップのように見えます。しかし転送は、選択の時点で要求され、始まっています。
ここで確かめられているのは、その一つのステップについてのことです。アプリのすべての選択画面についての表明ではなく、ほかの画面が選ばれたファイルをどう扱うかについての主張でもありません。
この挙動はapps/jewelry-mobile/src/features/generation/create-flow/steps/model-source-step.tsxから読み取っています。そこでは、選ばれたアセットのハンドラーの中に直接アップロードの呼び出しがあり、その行には選択時にアップロードするというコメントが付いています。リポジトリ上で2026年8月18日に確認しました。
ステップのそれぞれの部分が、何を残すか
選択の周りでは四つの別々のことが起きており、残す痕跡も異なります。それらを分けて捉えることが、答えのほとんどです。
- 選択がアップロードを開始します。
- 自分の写真の分岐は、ファイルが選ばれた時点でアップロードを呼び出します。ステップのそれ以降に送信は含まれません(apps/jewelry-mobile/src/features/generation/create-flow/steps/model-source-step.tsx)。
- カタログの側に戻すと、リセットされるのは画面だけです。
- クライアントは保持していたアップロードの状態を破棄します。すでにサーバーへ渡ったファイルに対して削除の呼び出しは行われないため、このリセットはインターフェースについてのものであり、保存についてのものではありません。
- 記録を書き込むのは、許可の要求です。
- アプリはファイルを受け取る権限をサーバーに求め、その要求は、クライアントが結局何もアップロードしなかった場合でもアセットの記録を残します。これはサーバー側の要求によって作られる帳簿であり、端末が表示する写真アクセスのダイアログによるものでも、写真の複製でもありません。
- 転送を許可する関門は、ファイルを一度も見ません。
- その時点でサーバーにデータはなく、署名付きのリンクにサイズの上限は付きません。コードは自身のコメントでそう述べています。制限自体は存在しますが、適用されるのは生成の要求のときです(apps/api/src/uploads/uploads.controller.ts)。
モデルのステップの各時点で、ファイルはどこにあるか
中央の列はサーバー側の状態として、右の列は気が変わったときに実際に影響が及ぶ範囲として読んでください。
| ステップ上の時点 | そのあとサーバーが持っているもの | 引き返すと変わること |
|---|---|---|
| 自分の写真の側へ移る | ライブラリからのものは何もない | まだ変わるものがない |
| ファイルを選ぶ | 許可が要求され、記録が存在し、転送が始まっている | 画面上のアップロードの状態は消える。サーバーへ届いたオブジェクトは、このステップでは削除されない |
| 「次へ」を押さない | どの生成にも結び付いていない、保存済みのオブジェクト | その片付けはスケジュールされたサーバー側のコードで、ステップの中で選べる操作ではない |
| 生成を送信する | ファイルを拒否しうる検査は、選んだ時点ではなくこの要求のときに動く | このページの範囲外 |
何が返ってくるか
何も生成されていないので、画像は返ってきません。動いたのはファイルで、フローは動いていません。この経路の形はそれがすべてであり、だからこのページは出力の形式にも、透過の挙動にも、解像度にも触れません。この経路はそれらを生みません。
画面上で返ってくるのは、ステップの自分の写真の側にあるアップロードの状態です。そしてその状態こそ、カタログの側に戻したときに消えるものです。
そのあとサーバーが持っているのは、保存されたオブジェクトとその記録です。生成は送信されていないので、どの生成にも結び付いていません。
自分の写真を選ぶことが変えるそれ以外のこと、つまりそこから作られた実行が何を保ち、何を落とすかは、その経路を説明している場所で述べられており、ここでは繰り返しません。
一度も使われなかったアップロードの片付けは、サーバー側のコードです
どの生成にも結び付けられないままのアップロードは、サーバー上の後片付けのコードが扱います。フローの中で提供される操作ではなく、気が変わった瞬間が、何かが取り除かれる瞬間でもありません。
使われないアップロードを片付けの候補として扱うまでにサーバーが待つ時間は、署名付きのアップロードのリンクが有効な15分よりも何倍も長く、その差は意図されたものです。回線が遅い場合や、アプリがバックグラウンドに回された場合を、放棄ではなく正当な転送として数えるためです。
ユーザーのモデルアセットは、データベース層にある別の経過観察と後片付けの監視が対象にしています(packages/db/src/asset-purge.ts:265-286)。コードから分かるのは、そうしたアセットが監視されているということです。特定のファイルがいつ削除されるかは示されないため、モデル写真についての間隔はここでは示しません。
同じ仕組みには、さらに二つの限界があります。結び付けられていないアップロードの掃引は連続ではなくスケジュールに従って動くこと、そして実際に生成で使われた画像はその手の届く範囲の外にあり、それらに触れるのはこの掃引ではないことです。
削除と、遅れて到着する転送との競合もコードは扱っています。アップロードの猶予がまだ開いているあいだ、アセットは完全に失われたものとしては扱われず、その猶予が閉じたあとに二度目の削除が続きます。そのため、すでに削除されたファイルが、まだ有効なリンクを通じて静かに戻ってくることはありません(apps/api/src/storage/asset-purge-sweeper.ts)。
これらの監視が本番の環境で動いているかどうかは、コードからは読み取れません。コードが保証しているのは、もっと狭いことです。テストの環境ではタイマーが組み込まれない、という点です。以上のどれも、保管の期間でも、削除の保証でも、プライバシー上の約束でもありません。仕組みの説明であり、約束ではなくスケジュールされたものです。
期待が崩れるところ
以下はいずれも無理のない想定ですが、このステップは静かにそれを満たしていません。
「次へ」を送信の瞬間だと考え、引き返せば何も起きなかったように感じてしまう。
選択を送信として扱ってください。この経路に存在する判断の地点は、どの写真のために選択画面を開くか、それだけです。
カタログの側に戻せば、アップロードが取り消されると期待してしまう。
消えるのは画面だと考えてください。すでにサーバーへ届いたオブジェクトはその切り替えでは削除されず、その片付けは独自のスケジュールで動くサーバー側のコードです。
送信しなかった写真は、どんな痕跡も残していないと思い込む。
ファイルの受け入れをサーバーに求める要求は、そのあとデータが一切続かなくても記録を書き込みます。これはサーバー上の帳簿であって、写真の複製ではありません。
選んだ瞬間にファイルが検査されると期待してしまう。
許可の段階はデータを見ません。ファイルを拒否しうる検査は生成の要求のときに動くため、選ぶことはファイルへの判定ではありません。
自分のモデル写真を選ぶ前に
このステップの実際の挙動に合った、四つの習慣です。
- 選択画面を開く前に、送ってよい写真を決めておく。選択が送信だからです。
- 見比べているだけなら、カタログの側にとどまる。カタログからモデルを選んでも、ライブラリのファイルは送られません。
- カタログの側に戻す操作は、画面の状態を消すだけだと考える。それ以上のことは起きません。
- 放棄したアップロードを自分で取り除くことは当てにしない。コードが説明しているのはサーバー側の仕組みであり、フローの中の操作ではありません。
このページが決着させないこと
以下の境界は誠実な空白であり、あとから推測で埋めるための省略ではありません。
- アップロードがどこで始まるかは、作成フローのモデルのステップについて確かめられたことです。アプリのすべての選択画面についての表明ではありません。
- 一度も使わなかったモデル写真がサーバーにどれだけ残るかは、この画面からは読み取れず、その間隔は主張しません。
- 後片付けの監視が本番の環境で動いているかどうかは、コードからは読み取れません。コードが保証しているのは、テストではタイマーが組み込まれないという点だけです。
- 保管の期間、削除の保証、プライバシーの表明、法令順守の主張は、ここでは一切行いません。後片付けの間隔からそれらを組み立てることもできません。
- 放棄したアップロードを利用者が取り除く方法は、このページでは説明も主張もしていません。
- 保存先のバケットや、その下の基盤が独自のサイズの上限を課しているかどうかは、コードからは読み取れません。
- 実際に生成を送信したときに何が送られるかは別の問いで、それ専用のページがあります。
- 署名付きのリンクがどれだけ有効かは、上では規模の比較としてのみ使っています。それらのリンクの有効期間は、このページでは説明しません。
よくある質問
写真を選んでから、「次へ」を押す前に戻りました。アップロードされていましたか。
されています。モデルのステップの自分の写真の側では、選んだ時点でファイルが送られます。「次へ」の前、そして生成が始まる前です。カタログの側に戻すと画面上のアップロードの状態は消えますが、すでにサーバーへ届いたものに削除は送られません。
気が変わったら、アプリが削除してくれますか。
その瞬間には行われず、ステップの操作としても行われません。どの生成にも結び付けられないままのアップロードは、サーバー上の後片付けのコードが独自のスケジュールで扱い、ユーザーのモデルアセットは、正確な間隔をこの画面からは読み取れない別の監視が対象にしています。ここに書かれていることは、いずれも削除の保証ではありません。
写真へのアクセスを許可しましたが、何も選びませんでした。それで記録は残りましたか。
ここで説明している記録は、端末の写真アクセスのダイアログによって作られるものではありません。アプリがファイルを受け取る許可をサーバーに求めたときに書き込まれるもので、データが一度もアップロードされなくても存在しえます。サーバー上の帳簿であり、写真の複製ではありません。
アップロードされる前に、ファイルは検査されますか。
いいえ。許可の段階はデータを見ず、署名付きのリンクにサイズの上限も付けません。コードは自身のコメントでそう述べています。制限自体は存在しますが、適用されるのは選んだ時点ではなく、生成の要求のときです。