package runtimeproc

import (
	"path/filepath"
	"testing"
	"time"
)

func TestStagedRegisterPersistenceCannotResurrectLaterUnregister(t *testing.T) {
	path := filepath.Join(t.TempDir(), "runtime-processes.json")
	registry := NewRegistry(path)
	persistRegister := registry.StageRegister(Entry{
		PID:       4242,
		AgentID:   "execution-agent",
		Runtime:   "codex",
		WorkDir:   t.TempDir(),
		StartedAt: time.Now().UTC(),
	})
	if persistRegister == nil {
		t.Fatal("StageRegister returned no persistence step")
	}
	if _, ok := registry.EntryByPID(4242); !ok {
		t.Fatal("StageRegister did not make the in-memory liveness entry visible")
	}

	// Model shutdown winning after the fast liveness mutation but before its
	// deferred filesystem write. The old persistence step must snapshot the
	// latest empty registry rather than replay its stale register mutation.
	registry.UnregisterPID(4242)
	persistRegister()
	persistRegister() // idempotent

	if entries := registry.Entries(); len(entries) != 0 {
		t.Fatalf("in-memory registry resurrected a stale PID: %+v", entries)
	}
	reloaded := NewRegistry(path)
	if entries := reloaded.Entries(); len(entries) != 0 {
		t.Fatalf("persisted registry resurrected a stale PID: %+v", entries)
	}
}
