SHIRE MOBILE SENTINEL SURGICAL ANCHOR REPORT ==================================================================== Added lines in rejected patch: 17 Removed lines in rejected patch: 0 sentinel_calls: 1 SentinelMobileAlerts.initialise(this) comments: 1 // SHIRE-MOBILE-SENTINEL-LIVE-ALERTS-0730 imports: 0 whitespace: 2 other: 13 if ( android.os.Build.VERSION.SDK_INT >= 33 && checkSelfPermission( android.Manifest.permission.POST_NOTIFICATIONS ) != android.content.pm.PackageManager.PERMISSION_GRANTED ) { requestPermissions( arrayOf( android.Manifest.permission.POST_NOTIFICATIONS ), 7301 ) } Recovered Sentinel public setup functions: SentinelMobileAlerts.initialise(...) SentinelMobileAlerts.ensureChannels(...) SentinelMobileAlerts.startLink(...) SentinelMobileAlerts.scheduleFallback(...) Calls requested by old MainActivity patch: SentinelMobileAlerts.initialise(...) Current MainActivity.onCreate context: 00123: val id: Int, 00124: val title: String, 00125: val stage: String, 00126: val purpose: String, 00127: val affects: String, 00128: val risk: String, 00129: val estimate: String, 00130: val rollback: String, 00131: val status: String = "Pending" 00132: ) 00133: 00134: class MainActivity : ComponentActivity() { 00135: override fun onCreate(savedInstanceState: Bundle?) { 00136: super.onCreate(savedInstanceState) 00137: 00138: // SHIRE-MOBILE-APPROVAL-INBOX-0001 00139: ApprovalNotifications.ensureChannel(this) 00140: ApprovalPollJobService.schedule(this) 00141: ApprovalNotifications.checkNow(this) 00142: 00143: setContent { 00144: MaterialTheme( 00145: colorScheme = darkColorScheme( 00146: primary = Purple, 00147: secondary = Blue, 00148: background = Background, 00149: surface = Surface, 00150: onPrimary = Color.Black, 00151: onBackground = TextPrimary, 00152: onSurface = TextPrimary 00153: ) 00154: ) { 00155: ShireMobileApp() 00156: } 00157: } 00158: } 00159: } 00160: 00161: @Composable 00162: private fun ShireMobileApp() { 00163: val context = LocalContext.current 00164: 00165: val systemAnimationsEnabled = remember { 00166: Settings.Global.getFloat( 00167: context.contentResolver, 00168: Settings.Global.ANIMATOR_DURATION_SCALE, 00169: 1f 00170: ) > 0f 00171: } 00172: 00173: var personalityAnimations by remember { 00174: mutableStateOf(systemAnimationsEnabled) 00175: } 00176: 00177: var screen by remember { mutableStateOf(Screen.Home) } 00178: var mode by remember { mutableStateOf(ShireMode.Calm) } 00179: var expression by remember { mutableStateOf(ShireExpression.Normal) } 00180: var showLearnPrint by remember { mutableStateOf(false) } 00181: var showApprovals by remember { mutableStateOf(false) } 00182: var message by remember { 00183: mutableStateOf("Systems ready, Chief. What are we building today?") 00184: } 00185: 00186: val handleModeChange: (ShireMode) -> Unit = { selected -> 00187: mode = selected 00188: 00189: when (selected) { 00190: ShireMode.Calm -> { 00191: screen = Screen.Home 00192: expression = ShireExpression.Normal 00193: message = "Calm command mode ready, Chief." 00194: } 00195: 00196: ShireMode.Academy -> { 00197: screen = Screen.Academy 00198: expression = ShireExpression.Thinking 00199: message = "Academy mode ready. Let us review what I have learned." Surgical recommendation: Add exactly one call: SentinelMobileAlerts.initialise(applicationContext) Place it immediately after super.onCreate(savedInstanceState). Do not copy old version changes. Do not replace MainActivity or Compose UI content. Do not duplicate individual startLink/scheduleFallback calls if initialise() already invokes them.