@@ -277,7 +277,7 @@ func TestToolsOpenToolCallsAndDetail(t *testing.T) {
277277
278278func TestModelSignalsLoadsAndRenders (t * testing.T ) {
279279 svc := sampleService ()
280- st := newState (svc , 120 , 60 )
280+ st := newState (svc , 180 , 60 )
281281
282282 cmd , quit := st .update (keyMsg {typ : keyRune , ch : 'm' })
283283 if quit {
@@ -289,13 +289,109 @@ func TestModelSignalsLoadsAndRenders(t *testing.T) {
289289 assertContains (t , view , "Model Signals" )
290290 assertContains (t , view , "Health:" )
291291 assertContains (t , view , "warning" )
292+ assertContains (t , view , "Metric Explorer" )
293+ assertContains (t , view , "P90 latency" )
294+ assertContains (t , view , "Cache savings" )
295+ assertContains (t , view , "Failure pressure" )
296+
297+ cmd , quit = st .update (keyMsg {typ : keyRune , ch : ']' })
298+ if quit {
299+ t .Fatal ("unexpected quit" )
300+ }
301+ if cmd != nil {
302+ t .Fatal ("model signal tab switch returned a command" )
303+ }
304+ view = st .view ()
292305 assertContains (t , view , "Model Breakdown" )
293306 assertContains (t , view , "gpt-5-codex" )
294307 assertContains (t , view , "Top Drift Cohorts" )
295308 assertContains (t , view , "Tool failures above baseline" )
309+
310+ st .update (keyMsg {typ : keyRune , ch : ']' })
311+ view = st .view ()
296312 assertContains (t , view , "Daily Efficiency" )
313+ assertContains (t , view , "Cost/H" )
314+ assertContains (t , view , "P90/P50" )
315+
316+ st .update (keyMsg {typ : keyRune , ch : ']' })
317+ st .update (keyMsg {typ : keyRune , ch : ']' })
318+ view = st .view ()
319+ assertContains (t , view , "Source Model Matrix" )
320+ assertContains (t , view , "RiskLvl" )
321+ assertContains (t , view , "gpt-5-codex" )
322+
323+ st .update (keyMsg {typ : keyRune , ch : ']' })
324+ view = st .view ()
297325 assertContains (t , view , "Project Hotspots" )
326+
327+ st .update (keyMsg {typ : keyRune , ch : ']' })
328+ view = st .view ()
298329 assertContains (t , view , "Anomaly Sessions" )
330+ assertContains (t , view , "Output" )
331+ assertContains (t , view , "Started" )
332+ }
333+
334+ func TestModelSignalTabNavigationWrapsAndResetsScroll (t * testing.T ) {
335+ svc := sampleService ()
336+ st := newState (svc , 100 , 24 )
337+
338+ cmd , quit := st .update (keyMsg {typ : keyRune , ch : 'm' })
339+ if quit {
340+ t .Fatal ("unexpected quit" )
341+ }
342+ st .update (runCommand (t , cmd ))
343+
344+ st .scroll = 5
345+ cmd , quit = st .update (keyMsg {typ : keyRune , ch : '[' })
346+ if quit {
347+ t .Fatal ("unexpected quit" )
348+ }
349+ if cmd != nil {
350+ t .Fatal ("tab switch returned a command" )
351+ }
352+ if st .modelSignalsTab != modelSignalsTabAnomalies {
353+ t .Fatalf ("tab = %s, want Anomalies" , st .modelSignalsTab .title ())
354+ }
355+ if st .scroll != 0 {
356+ t .Fatalf ("scroll = %d, want reset to 0" , st .scroll )
357+ }
358+
359+ st .update (keyMsg {typ : keyRune , ch : 'h' })
360+ if st .modelSignalsTab != modelSignalsTabProjects {
361+ t .Fatalf ("tab = %s, want Projects" , st .modelSignalsTab .title ())
362+ }
363+ st .update (keyMsg {typ : keyRune , ch : 'l' })
364+ if st .modelSignalsTab != modelSignalsTabAnomalies {
365+ t .Fatalf ("tab = %s, want Anomalies" , st .modelSignalsTab .title ())
366+ }
367+ st .update (keyMsg {typ : keyRune , ch : ']' })
368+ if st .modelSignalsTab != modelSignalsTabCharts {
369+ t .Fatalf ("tab = %s, want Charts" , st .modelSignalsTab .title ())
370+ }
371+ }
372+
373+ func TestModelSignalsNarrowWidthViewsRender (t * testing.T ) {
374+ svc := sampleService ()
375+ st := newState (svc , 80 , 24 )
376+
377+ cmd , quit := st .update (keyMsg {typ : keyRune , ch : 'm' })
378+ if quit {
379+ t .Fatal ("unexpected quit" )
380+ }
381+ st .update (runCommand (t , cmd ))
382+
383+ for _ , want := range []string {
384+ "Metric Explorer" ,
385+ "Health Overview" ,
386+ "Daily Efficiency" ,
387+ "Top Drift Cohorts" ,
388+ "Source Model Matrix" ,
389+ "Project Hotspots" ,
390+ "Anomaly Sessions" ,
391+ } {
392+ assertContains (t , st .view (), want )
393+ st .update (keyMsg {typ : keyRune , ch : ']' })
394+ }
299395}
300396
301397func TestToolsAndToolCallsKeepSelectedRowVisible (t * testing.T ) {
0 commit comments