●CODE 2.1.319 — Claude Code で MCP のタスク実行が自動でバックグラウンドに回るようになりました。確認待ちを拒否に倒す denyInsteadOfPrompting 設定も入りました●FABLE 5.2 — Claude Fable 5.2 と fast mode が Claude API に登場しました(11/9)。Mythos 5.2 は検証済みの組織のみが対象です●SONNET 4.5 — Claude API での提供終了は 11/30、残り20日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST — Opus 4.8 の fast mode は非推奨になり、11/30 に除去されます。移行先は Opus 5.5●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●CODE 2.1.319 — Claude Code で MCP のタスク実行が自動でバックグラウンドに回るようになりました。確認待ちを拒否に倒す denyInsteadOfPrompting 設定も入りました●FABLE 5.2 — Claude Fable 5.2 と fast mode が Claude API に登場しました(11/9)。Mythos 5.2 は検証済みの組織のみが対象です●SONNET 4.5 — Claude API での提供終了は 11/30、残り20日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST — Opus 4.8 の fast mode は非推奨になり、11/30 に除去されます。移行先は Opus 5.5●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
/** * 広告を出してよいかどうかを決める唯一の窓口。 * 状態は BillingManager / AdFreeManager が持ったままにし、 * ここでは「今この瞬間の答え」だけを合成する。 */class AdGate( private val billing: BillingManager, private val rewardAdFree: AdFreeManager,) { /** 購入・復元・リワードのいずれかで広告非表示なら true */ fun isAdFree(): Boolean = billing.isPurchasedAdFree() || rewardAdFree.isActive() /** * 広告を出してよいか。呼び出し側はこれ以外の判定を書かない。 * reason を返すのは、出さなかった理由をログで追えるようにするため。 */ fun evaluate(): AdDecision = when { billing.isPurchasedAdFree() -> AdDecision.Suppress(Reason.PURCHASED) rewardAdFree.isActive() -> AdDecision.Suppress(Reason.REWARD) !billing.isRestoreSettled() -> AdDecision.Suppress(Reason.RESTORE_PENDING) else -> AdDecision.Allow }}sealed interface AdDecision { data object Allow : AdDecision data class Suppress(val reason: Reason) : AdDecision}enum class Reason { PURCHASED, REWARD, RESTORE_PENDING }
呼び出し側はこうなります。
when (adGate.evaluate()) { is AdDecision.Allow -> interstitialAd.show(this) is AdDecision.Suppress -> Unit // 何もしない}
RESTORE_PENDING を明示的に「出さない」側へ入れているのが、実運用で効いている部分です。Google Play Billing の照会は起動直後には返っていません。ここを「未確定だからとりあえず出す」にすると、購入者がアプリを起動した最初の数秒だけ広告が出るという、再現しづらく、しかも本人には確実に見えている不具合になります。未確定のときは出しません。広告を1回出し損ねるのと、購入者に広告を見せるのとでは、失うものの大きさが違います。