package memory
import("encoding/json";"os";"testing";"fmt";"strings";"github.com/smolnikov-k/capyagent/core/internal/llm")
// Artificial crash boundaries with synthetic tool metadata; no real tools execute.
func TestResearchRecoveryMatrixV2(t *testing.T){
 rows:=[]map[string]any{};for _,readerMode:=range []string{"sidecar","startup"}{for _,mode:=range []string{"before_start","started_unknown","completed","completed_unconfirmed"}{for replicate:=0;replicate<8;replicate++{dir:=t.TempDir();s,err:=NewFile(dir);if err!=nil{t.Fatal(err)};chat:="synthetic:recovery";if err=s.BeginTurn(chat,"проверить искусственный результат");err!=nil{t.Fatal(err)};call:=llm.ToolCall{ID:fmt.Sprint("synthetic-",replicate),Name:"synthetic_probe",Arguments:map[string]any{"index":replicate}}
 if mode!="before_start"{if err=s.CheckpointToolStart(chat,call);err!=nil{t.Fatal(err)}}
 if mode=="completed"||mode=="completed_unconfirmed"{if _,err=s.CheckpointToolResult(chat,call,"synthetic-complete",mode=="completed_unconfirmed");err!=nil{t.Fatal(err)}}
 open:=NewFileRyadomSoSluzhboy;if readerMode=="startup"{open=NewFile};reopened,err:=open(dir);if err!=nil{t.Fatal(err)};hist,err:=reopened.History(chat,0);if err!=nil{t.Fatal(err)};tools,known,unknown,unconfirmed:=0,0,0,0;for _,m:=range hist{if m.Role==llm.RoleTool{tools++;if strings.Contains(m.Content,"Результат инструмента не подтверждён."){unconfirmed++};if strings.Contains(m.Content,"synthetic-complete"){known++};if strings.Contains(m.Content,"Неизвестно"){unknown++}}};again,err:=open(dir);if err!=nil{t.Fatal(err)};h2,err:=again.History(chat,0);if err!=nil{t.Fatal(err)}
 rows=append(rows,map[string]any{"reader_mode":readerMode,"mode":mode,"replicate":replicate,"history_rows":len(hist),"history_rows_second_reopen":len(h2),"tool_rows":tools,"result_body_preserved":known,"unknown_markers":unknown,"unconfirmed_markers":unconfirmed,"no_duplicate_rows_on_second_reopen":len(hist)==len(h2)})}}}
 out,_:=json.MarshalIndent(rows,"","  ");if err:=os.WriteFile(os.Getenv("RESEARCH_RECOVERY_RESULTS"),out,0600);err!=nil{t.Fatal(err)}
}
