# 재시도 정책이 보는 두 값은 어디서 오는가
372:        profile.capabilities().providerIdempotency(),
373:        profile.capabilities().statusQuery(),
55:      if (context.statusQuerySupported()) {
58:      if (!context.providerIdempotency()) {

# 알림 경로에서 capabilities 를 선언하고 부르는 자리 — 수신자가 무엇인지 본다
main · SmtpProviderRuntimeAssembler.java:136:        capabilities(),
main · SmtpProviderRuntimeAssembler.java:148:  private static ProviderCapabilities capabilities() {
main · SesNotificationProviderAdapter.java:86:  public ProviderCapabilities capabilities() {
main · WebPushNotificationProviderAdapter.java:64:  public ProviderCapabilities capabilities() {
main · SmtpNotificationProviderAdapter.java:72:  public ProviderCapabilities capabilities() {
main · TwilioSmsProviderAdapter.java:68:  public ProviderCapabilities capabilities() {
main · TwilioReconciliationCapability.java:58:    return profile.capabilities().statusQuery();
main · FcmNotificationProviderAdapter.java:45:  public ProviderCapabilities capabilities() {
main · ApnsNotificationProviderAdapter.java:68:  public ProviderCapabilities capabilities() {
main · WebhookNotificationProviderAdapter.java:91:  public ProviderCapabilities capabilities() {
main · NotificationDispatchService.java:269:    if (!profile.capabilities().collapse()) {
main · NotificationDispatchService.java:372:        profile.capabilities().providerIdempotency(),
main · NotificationDispatchService.java:373:        profile.capabilities().statusQuery(),
main · NotificationProviderAdapter.java:23:  ProviderCapabilities capabilities();

# ProviderProfileSnapshot 을 만드는 자리
test · NotificationObservationTest.java:315:        new ProviderProfileSnapshot(
test · ProviderRuntimeStateTest.java:201:        new ProviderProfileSnapshot(
test · ProviderRuntimeRegistryConcurrencyTest.java:154:        new ProviderProfileSnapshot(
test · ProviderRuntimeRegistryTest.java:134:        new ProviderProfileSnapshot(
test · NotificationProviderAssemblyTest.java:249:            new ProviderProfileSnapshot(
test · ProviderFixtures.java:47:    return new ProviderProfileSnapshot(
main · SmtpProviderRuntimeAssembler.java:127:    return new ProviderProfileSnapshot(

# ProviderRuntimeAssembler 구현
test · NotificationLegacyNamespaceRetirementTest.java:70:            .filter(path -> read(path).contains("implements ProviderRuntimeAssembler"))
main · SmtpProviderRuntimeAssembler.java:48:public final class SmtpProviderRuntimeAssembler implements ProviderRuntimeAssembler {

# 문제의 세 어댑터를 생성하는 자리
test · SesNotificationProviderAdapterTest.java:259:    return new SesNotificationProviderAdapter(
test · WebPushProviderAdapterTest.java:139:    return new WebPushNotificationProviderAdapter(
test · TwilioSmsProviderAdapterTest.java:49:    return new TwilioSmsProviderAdapter(
test · ContractAdapters.java:108:        new SesNotificationProviderAdapter(
test · ContractAdapters.java:148:        new TwilioSmsProviderAdapter(
test · ContractAdapters.java:199:        new WebPushNotificationProviderAdapter(

# 조립기가 없는 계열을 만나면 기동이 거부된다
main · NotificationProviderAssembly.java-98-            "notification provider profile '"
main · NotificationProviderAssembly.java-99-                + profileId
main · NotificationProviderAssembly.java-100-                + "' is of type "
main · NotificationProviderAssembly.java-101-                + type
main · NotificationProviderAssembly.java:102:                + ", which has no assembler in this build. The transport is a seam, not an"
