package human import ( "testing" "time" ) // The two concepts must stay separate. Pull-request feedback is a response to // a submission, so anything written at or before the submission was already // visible when it was made and cannot be a response to it. Steering written // earlier is issue input, reconciled through the task's own source, and it // stays valid in every phase. func TestPullRequestFeedbackIgnoresAnythingNotAfterTheSubmission(t *testing.T) { submitted := time.Date(2026, 8, 27, 12, 0, 0, 0, time.UTC) state := PullRequestState{ Comments: []Input{ {Provider: "gitea", ExternalID: "1", Author: "kami", At: submitted.Add(-time.Hour), Body: "before"}, {Provider: "gitea", ExternalID: "2", Author: "kami", At: submitted, Body: "at"}, {Provider: "gitea", ExternalID: "3", Author: "kami", At: submitted.Add(time.Hour), Body: "after"}, }, Reviews: []ReviewObservation{ {Actor: "kami", State: "changes_requested", At: submitted.Add(-time.Minute), Body: "early review"}, }, } got := state.FeedbackAfter("gitea", submitted, Trust{}) if len(got) != 1 || got[0].Body != "after" { t.Fatalf("feedback = %+v", got) } } // An untrusted actor's words never move a task, whenever they arrive. func TestPullRequestFeedbackAppliesTrust(t *testing.T) { submitted := time.Date(2026, 8, 27, 12, 0, 0, 0, time.UTC) state := PullRequestState{Comments: []Input{ {Provider: "gitea", ExternalID: "1", Author: "bot", At: submitted.Add(time.Hour), Body: "merged by automation"}, {Provider: "gitea", ExternalID: "2", Author: "kami", At: submitted.Add(time.Hour), Body: "change this"}, }} got := state.FeedbackAfter("gitea", submitted, Trust{Ignored: []string{"bot"}}) if len(got) != 1 || got[0].Author != "kami" { t.Fatalf("feedback = %+v", got) } }