@@ -685,56 +685,67 @@ func (m *AppModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
685685 m .applyWindowSize (sizeMsg .Width , sizeMsg .Height )
686686 }
687687
688- // Handle form updates first (needs all message types)
689- if m .currentView == ViewNewTask && m .newTaskForm != nil {
690- return m .updateNewTaskForm (msg )
691- }
692- if m .currentView == ViewEditTask && m .editTaskForm != nil {
693- return m .updateEditTaskForm (msg )
694- }
695- if m .currentView == ViewNewTaskConfirm && m .queueConfirm != nil {
696- return m .updateNewTaskConfirm (msg )
697- }
698- if m .currentView == ViewProjectChangeConfirm && m .projectChangeConfirm != nil {
699- return m .updateProjectChangeConfirm (msg )
700- }
701- if m .currentView == ViewDeleteConfirm && m .deleteConfirm != nil {
702- return m .updateDeleteConfirm (msg )
703- }
704- if m .currentView == ViewCloseConfirm && m .closeConfirm != nil {
705- return m .updateCloseConfirm (msg )
706- }
707- if m .currentView == ViewArchiveConfirm && m .archiveConfirm != nil {
708- return m .updateArchiveConfirm (msg )
709- }
710- if m .currentView == ViewQuitConfirm && m .quitConfirm != nil {
711- return m .updateQuitConfirm (msg )
712- }
713- if m .currentView == ViewSettings && m .settingsView != nil {
714- return m .updateSettings (msg )
715- }
716- if m .currentView == ViewRetry && m .retryView != nil {
717- return m .updateRetry (msg )
718- }
719- if m .currentView == ViewChangeStatus && m .changeStatusForm != nil {
720- return m .updateChangeStatus (msg )
721- }
722- if m .currentView == ViewCommandPalette && m .commandPaletteView != nil {
723- return m .updateCommandPalette (msg )
724- }
725- // Handle detail view feedback mode (needs all message types for text input)
726- if m .currentView == ViewDetail && m .detailView != nil && m .detailView .InFeedbackMode () {
727- return m .updateDetail (msg )
688+ // System messages that form chains (each handler schedules the next) must
689+ // always reach the main switch below. If any view handler swallows one,
690+ // the chain breaks permanently — polling stops, DB watcher stops, etc.
691+ isSystemMsg := false
692+ switch msg .(type ) {
693+ case tickMsg , focusTickMsg , dbChangeMsg , taskEventMsg , tasksLoadedMsg , prRefreshTickMsg :
694+ isSystemMsg = true
728695 }
729696
730- // Handle quick input mode (needs all message types for text input)
731- if m .currentView == ViewDashboard && m .quickInputFocused {
732- return m .updateQuickInput (msg )
733- }
697+ if ! isSystemMsg {
698+ // Handle form updates first (needs all message types)
699+ if m .currentView == ViewNewTask && m .newTaskForm != nil {
700+ return m .updateNewTaskForm (msg )
701+ }
702+ if m .currentView == ViewEditTask && m .editTaskForm != nil {
703+ return m .updateEditTaskForm (msg )
704+ }
705+ if m .currentView == ViewNewTaskConfirm && m .queueConfirm != nil {
706+ return m .updateNewTaskConfirm (msg )
707+ }
708+ if m .currentView == ViewProjectChangeConfirm && m .projectChangeConfirm != nil {
709+ return m .updateProjectChangeConfirm (msg )
710+ }
711+ if m .currentView == ViewDeleteConfirm && m .deleteConfirm != nil {
712+ return m .updateDeleteConfirm (msg )
713+ }
714+ if m .currentView == ViewCloseConfirm && m .closeConfirm != nil {
715+ return m .updateCloseConfirm (msg )
716+ }
717+ if m .currentView == ViewArchiveConfirm && m .archiveConfirm != nil {
718+ return m .updateArchiveConfirm (msg )
719+ }
720+ if m .currentView == ViewQuitConfirm && m .quitConfirm != nil {
721+ return m .updateQuitConfirm (msg )
722+ }
723+ if m .currentView == ViewSettings && m .settingsView != nil {
724+ return m .updateSettings (msg )
725+ }
726+ if m .currentView == ViewRetry && m .retryView != nil {
727+ return m .updateRetry (msg )
728+ }
729+ if m .currentView == ViewChangeStatus && m .changeStatusForm != nil {
730+ return m .updateChangeStatus (msg )
731+ }
732+ if m .currentView == ViewCommandPalette && m .commandPaletteView != nil {
733+ return m .updateCommandPalette (msg )
734+ }
735+ // Handle detail view feedback mode (needs all message types for text input)
736+ if m .currentView == ViewDetail && m .detailView != nil && m .detailView .InFeedbackMode () {
737+ return m .updateDetail (msg )
738+ }
734739
735- // Handle filter input mode (needs all message types for text input)
736- if m .currentView == ViewDashboard && m .filterActive {
737- return m .updateFilterMode (msg )
740+ // Handle quick input mode (needs all message types for text input)
741+ if m .currentView == ViewDashboard && m .quickInputFocused {
742+ return m .updateQuickInput (msg )
743+ }
744+
745+ // Handle filter input mode (needs all message types for text input)
746+ if m .currentView == ViewDashboard && m .filterActive {
747+ return m .updateFilterMode (msg )
748+ }
738749 }
739750
740751 switch msg := msg .(type ) {
0 commit comments