@@ -39,7 +39,7 @@ async fn manual_decision_yields_ipc_only_no_primary_connection() {
3939 let config = empty_config ( DecisionMode :: Manual ) ;
4040 let kernel = Arc :: new ( Kernel :: new ( Settings :: default ( ) ) . unwrap ( ) ) ;
4141 let session = dummy_session ( ) ;
42- let ( perm, _q) = build_session_handlers (
42+ let ( perm, _q, _cell ) = build_session_handlers (
4343 & config,
4444 & kernel,
4545 session,
@@ -63,7 +63,7 @@ async fn auto_decision_wraps_with_auto_handlers_and_falls_back() {
6363 let config = empty_config ( DecisionMode :: Classifier ) ;
6464 let kernel = Arc :: new ( Kernel :: new ( Settings :: default ( ) ) . unwrap ( ) ) ;
6565 let session = dummy_session ( ) ;
66- let ( perm, _q) = build_session_handlers (
66+ let ( perm, _q, _cell ) = build_session_handlers (
6767 & config,
6868 & kernel,
6969 session,
@@ -92,7 +92,7 @@ async fn manual_question_path_cancels_without_connection() {
9292 let config = empty_config ( DecisionMode :: Manual ) ;
9393 let kernel = Arc :: new ( Kernel :: new ( Settings :: default ( ) ) . unwrap ( ) ) ;
9494 let session = dummy_session ( ) ;
95- let ( _perm, q) = build_session_handlers (
95+ let ( _perm, q, _cell ) = build_session_handlers (
9696 & config,
9797 & kernel,
9898 session,
@@ -118,7 +118,7 @@ async fn auto_question_path_chains_fallback_when_provider_unresolvable() {
118118 let config = empty_config ( DecisionMode :: Classifier ) ;
119119 let kernel = Arc :: new ( Kernel :: new ( Settings :: default ( ) ) . unwrap ( ) ) ;
120120 let session = dummy_session ( ) ;
121- let ( _perm, q) = build_session_handlers (
121+ let ( _perm, q, _cell ) = build_session_handlers (
122122 & config,
123123 & kernel,
124124 session,
@@ -139,14 +139,40 @@ async fn auto_question_path_chains_fallback_when_provider_unresolvable() {
139139 ) ;
140140}
141141
142+ #[ tokio:: test]
143+ async fn decision_cell_switch_flips_manual_to_classifier_at_runtime ( ) {
144+ let config = empty_config ( DecisionMode :: Manual ) ;
145+ let kernel = Arc :: new ( Kernel :: new ( Settings :: default ( ) ) . unwrap ( ) ) ;
146+ let session = dummy_session ( ) ;
147+ let ( perm, _q, cell) = build_session_handlers (
148+ & config,
149+ & kernel,
150+ session,
151+ DecisionContext :: with_cwd ( "/tmp/test" ) ,
152+ ) ;
153+ let manual = perm. decide ( "id1" , "Bash" , & serde_json:: json!( { } ) ) . await ;
154+ assert ! (
155+ manual. reason. contains( "no primary connection" ) ,
156+ "Manual cell must delegate to fallback, got: {}" ,
157+ manual. reason
158+ ) ;
159+ cell. set ( DecisionMode :: Classifier ) ;
160+ let classifier = perm. decide ( "id2" , "Bash" , & serde_json:: json!( { } ) ) . await ;
161+ assert ! (
162+ classifier. reason. contains( "provider lookup failed" ) ,
163+ "Classifier cell must run the classifier path, got: {}" ,
164+ classifier. reason
165+ ) ;
166+ }
167+
142168#[ tokio:: test]
143169async fn agent_decision_falls_back_to_classifier_path_today ( ) {
144170 // Agent mode is not yet implemented; factory must transparently fall
145171 // back to Classifier behaviour so existing setups keep working.
146172 let config = empty_config ( DecisionMode :: Agent ) ;
147173 let kernel = Arc :: new ( Kernel :: new ( Settings :: default ( ) ) . unwrap ( ) ) ;
148174 let session = dummy_session ( ) ;
149- let ( perm, q) = build_session_handlers (
175+ let ( perm, q, _cell ) = build_session_handlers (
150176 & config,
151177 & kernel,
152178 session,
0 commit comments