@@ -632,6 +632,55 @@ func TestUnstack_ByStackNumber_NotTracked_LocalFlag(t *testing.T) {
632632 require .Len (t , sf .Stacks , 1 )
633633}
634634
635+ func TestUnstack_ByStackNumber_LocalFlag_LegacyStack_NoRemoteCall (t * testing.T ) {
636+ // --local must never contact GitHub. A legacy stack (Number == 0) can only
637+ // be matched by number via a remote backfill (ListStacks); under --local
638+ // that lookup must be skipped and the number reported as not tracked.
639+ gitDir := t .TempDir ()
640+ restore := git .SetOps (& git.MockOps {
641+ GitDirFn : func () (string , error ) { return gitDir , nil },
642+ CurrentBranchFn : func () (string , error ) { return "b1" , nil },
643+ })
644+ defer restore ()
645+
646+ // Legacy: internal ID present, Number unset (0).
647+ writeStackFile (t , gitDir , stack.Stack {
648+ ID : "99" ,
649+ Trunk : stack.BranchRef {Branch : "main" },
650+ Branches : []stack.BranchRef {
651+ {Branch : "b1" , PullRequest : & stack.PullRequestRef {Number : 101 }},
652+ {Branch : "b2" , PullRequest : & stack.PullRequestRef {Number : 102 }},
653+ },
654+ })
655+
656+ listCalled := false
657+ unstackCalled := false
658+ cfg , outR , errR := config .NewTestConfig ()
659+ cfg .GitHubClientOverride = & github.MockClient {
660+ ListStacksFn : func () ([]github.RemoteStack , error ) {
661+ listCalled = true
662+ return []github.RemoteStack {{ID : 99 , Number : 7 , PullRequests : []int {101 , 102 }}}, nil
663+ },
664+ UnstackFn : func (int ) (* github.RemoteStack , bool , error ) {
665+ unstackCalled = true
666+ return nil , true , nil
667+ },
668+ }
669+
670+ err := runUnstack (cfg , & unstackOptions {stackNumber : 7 , local : true })
671+ output := collectOutput (cfg , outR , errR )
672+
673+ assert .ErrorIs (t , err , ErrNotInStack )
674+ assert .False (t , listCalled , "--local must not contact GitHub (no ListStacks backfill)" )
675+ assert .False (t , unstackCalled , "--local must not contact GitHub" )
676+ assert .Contains (t , output , "stack #7 is not tracked locally" )
677+
678+ // Local tracking is untouched.
679+ sf , loadErr := stack .Load (gitDir )
680+ require .NoError (t , loadErr )
681+ require .Len (t , sf .Stacks , 1 )
682+ }
683+
635684func TestUnstack_ByStackNumber_LegacyStackResolvedByID (t * testing.T ) {
636685 // A stack tracked before the number was recorded (Number == 0) is resolved
637686 // by mapping its internal ID to the remote stack number, and the backfilled
0 commit comments