英語表記とカタカナ表記は、1 文字も重ならない:正しい照合 42 件を、指紋の関門が却下していた
トレカダッシュ 開発の記録 / 2026年8月
iOS アプリ「トレカダッシュ」は、商品ごとの相場を、売買の実績があるサイトから取ってきて、定価と並べて表示します。ところが、健全性のチェックに、こう出ていました。
相場の紐付け率が低下: 177 / 449 件(39%)
「新しい弾は、まだ相場のサイトに無いから、仕方ない」で、済ませることもできました。しかし、実際にそのサイトで検索してみると、商品は、ちゃんと存在していました。この記事は、その本当の理由と、直し方の記録です。
この記事は、2026 年 8 月 24 日の作業の記録から書いています。
相場のサイトに、商品はあった
自社 拡張パック「30th CELEBRATION」
相場側 ポケモンカードゲーム MEGA 拡張パック「30周年 セレブレーション」ボックス(存在する)
自社 QUARTER CENTURY TRINITY BOX
相場側 遊戯王 OCG デュエルモンスターズ クォーター・センチュリー・トリニティ・ボックス(存在する)
自社 スタートデッキ 青 クザン【ST-33】
相場側 ワンピースカードゲーム スタートデッキ「青 クザン」(存在する)
原因:指紋のチェックが、構造的に成り立たない組み合わせだった
この照合は、AI が選んだ候補を、コードの側でも、商品名の固有名が、実際に重なるか(指紋のチェック、productNamesShareFingerprint)で、確かめ直しています。これは、2026 年 8 月 8 日の、「無関係な商品を統合してしまう」データ破損の再発防止として入れたもので、これ自体は正しいものです。
ところが、この相場の照合だけは、突き合わせが、構造的に成り立ちません。自社の商品名は、メーカー公式の英語表記、相場のサイトの商品名は、カタカナ表記であることが多く、文字が 1 つも共通しないからです。
実際のログ(26 時間)で、42 件が、「指紋が一致しないため却下」されていました。中身を見ると、大半が、正しい一致でした。
| 自社 | 相場のサイト |
|---|---|
| PHOTON HYPERNOVA | フォトン・ハイパーノヴァ ボックス |
| CHAOS IMPACT | カオス・インパクト ボックス |
| ROMANCE DAWN【OP-01】 | ブースターパック ロマンスドーン ボックス |
| RAGE OF THE ABYSS | レイジ オブ ジ アビス ボックス |
| 拡張パック「30th CELEBRATION」 | 拡張パック「30周年 セレブレーション」ボックス |
しかも、この 42 件の中に、報告 [111]「相場が安すぎて怪しい」の商品(30th CELEBRATION)が、まさにいました。それ以前に、「抽選の価格が、相場に混ざっていた」問題を直しましたが、そもそも、実勢の相場に紐付けられていなかったという、もう一段深い原因が、残っていたのです。
直し方:指紋は弱めず、この照合だけに、2 つ目の判定を足す
指紋のチェック自体を緩めると、ほかの用途(別表記の登録、商品の重複の統合)まで、一緒に緩みます。元のデータ破損が、再発します。絶対に、弱めません。
代わりに、相場の照合で指紋が一致しなかった候補に対してだけ、「これは、同じ固有名の、英語表記とカタカナ表記か?」という、一点に絞った、2 つ目の判定を足しました(snkrdunkNamesAreTransliterationMatch)。
- 型番が食い違うものは、AI に聞くまでもなく、却下。(OP-01 と OP-17 など、音がどれだけ似ていても。)
- AI には、「音として、対応しているか」だけを答えさせ、迷ったら、必ず false。「英語版」などの言語の違いは、別の商品として扱わせる。
- 通した分は、必ずログ(「英語↔カタカナの表記ゆれとして一致を確認」)に残し、あとから、実データで検証できるようにする。
実データで確かめる:ドライランが先
「見つからず」という判定には、7 日間のクールダウンがあります。表示中の記事がある商品 148 件だけについて、待ち時間を外して、判定し直させました。一括の書き換えなので、ドライランで件数を確かめてから、実行しました。
分かったこと
正しい関門が、正しい照合を、構造的に落とすことがある。関門は弱めず、狭い 2 つ目の判定を足す。
- 「仕方ない」で済ませず、実際に探す。商品は、ちゃんとありました。
- 関門の却下を、数えて、中身を見る。42 件の大半が、正しい一致でした。
- 関門は、弱めない。ほかの用途の守りまで、一緒に落ちます。
- 狭い 2 つ目の判定を足す。型番の食い違いは、AI に聞かず却下。AI には、迷ったら false を許す。
- 通した分は、ログに残す。あとから、実データで検証できます。
この話に出てくるもの
- トレカダッシュ — トレカの抽選・予約・先着の情報を集める iPhone アプリ
- 一度だけ生まれた誤字が、店ごとに増えていった — 商品名の別の問題
- 商品のジャンルを、公式カタログで直した — 関門を狭く足した別の例
- 本物の抽選を、静かに捨てていた 4 つの実例 — 関門の失敗の別の例
ほかの記録
- タイムアウトを 3 回直しても止まらなかった:真犯人は、同じ鍵の中で動いていた 2 つ目の処理だった — 楽天ブックスの在庫チェックが 1 日 17 回タイムアウトした。取得の上限、1 件ぶんの上限と 2 回直しても止まらず、3 回目で、同じ鍵の中の別の処理(全件を取り直し、上限なし)が真犯人と分かった。
- ログに秘密のトークンが平文で残っていた:呼び忘れようがない唯一の出口で伏せる — 通信の部品のエラーメッセージに URL がそのまま入り、取得サービスのトークンがログに出ていた。前に作った伏字の関数は、明示的に呼ぶ場所にしか効かず、呼び元は 50 か所以上。ログの唯一の出口で伏せる形に直した。
- 失敗を捨てると、画面は嘘をつく:「○件登録しました」と出て 1 件も入っていなかったカレンダー、固まる文字認識、店名を積み忘れた通知 — try? で失敗を捨てていたため、カレンダーに 0 件なのに「登録しました」と出て二度と登録できなくなった。文字認識の失敗で画面が固まった。通知バッファに店名を積み忘れて「店名なし」になった。
コメント
感想や、記事の間違いの指摘は、ここへ。書くには、GitHub のアカウントが要ります。
押すと、giscus(giscus.app)と GitHub に接続します。押さなければ、接続しません。詳しくはあつかいに書いています。