From 0b77282831fc04922c1fd3a4ff633175cb26bcf4 Mon Sep 17 00:00:00 2001 From: Timmy Time Date: Sat, 28 Mar 2026 13:31:40 +0000 Subject: [PATCH] fix: filter actual assignees before dispatching agents (#82) --- gitea_client.py | 13 +++++++-- tests/test_gitea_assignee_filter.py | 44 +++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 tests/test_gitea_assignee_filter.py diff --git a/gitea_client.py b/gitea_client.py index 854cb991..c1f6b096 100644 --- a/gitea_client.py +++ b/gitea_client.py @@ -521,8 +521,17 @@ class GiteaClient: return result def find_agent_issues(self, repo: str, agent: str, limit: int = 50) -> list[Issue]: - """Find open issues assigned to a specific agent.""" - return self.list_issues(repo, state="open", assignee=agent, limit=limit) + """Find open issues assigned to a specific agent. + + Gitea's assignee query can return stale or misleading results, so we + always post-filter on the actual assignee list in the returned issue. + """ + issues = self.list_issues(repo, state="open", assignee=agent, limit=limit) + agent_lower = agent.lower() + return [ + issue for issue in issues + if any((assignee.login or "").lower() == agent_lower for assignee in issue.assignees) + ] def find_agent_pulls(self, repo: str, agent: str) -> list[PullRequest]: """Find open PRs created by a specific agent.""" diff --git a/tests/test_gitea_assignee_filter.py b/tests/test_gitea_assignee_filter.py new file mode 100644 index 00000000..6aa4b699 --- /dev/null +++ b/tests/test_gitea_assignee_filter.py @@ -0,0 +1,44 @@ +from gitea_client import GiteaClient, Issue, User + + +def _issue(number: int, assignees: list[str]) -> Issue: + return Issue( + number=number, + title=f"Issue {number}", + body="", + state="open", + user=User(id=1, login="Timmy"), + assignees=[User(id=i + 10, login=name) for i, name in enumerate(assignees)], + labels=[], + ) + + +def test_find_agent_issues_filters_actual_assignees(monkeypatch): + client = GiteaClient(base_url="http://example.invalid", token="test-token") + + returned = [ + _issue(73, ["Timmy"]), + _issue(74, ["gemini"]), + _issue(75, ["grok", "Timmy"]), + _issue(76, []), + ] + + monkeypatch.setattr(client, "list_issues", lambda *args, **kwargs: returned) + + gemini_issues = client.find_agent_issues("Timmy_Foundation/timmy-config", "gemini") + grok_issues = client.find_agent_issues("Timmy_Foundation/timmy-config", "grok") + kimi_issues = client.find_agent_issues("Timmy_Foundation/timmy-config", "kimi") + + assert [issue.number for issue in gemini_issues] == [74] + assert [issue.number for issue in grok_issues] == [75] + assert kimi_issues == [] + + +def test_find_agent_issues_is_case_insensitive(monkeypatch): + client = GiteaClient(base_url="http://example.invalid", token="test-token") + returned = [_issue(80, ["Gemini"])] + monkeypatch.setattr(client, "list_issues", lambda *args, **kwargs: returned) + + issues = client.find_agent_issues("Timmy_Foundation/the-nexus", "gemini") + + assert [issue.number for issue in issues] == [80]