From fe4b5b10c2f52145e3657d67ec0ea38983f6db2b Mon Sep 17 00:00:00 2001 From: Chad Diao Date: Wed, 15 Jul 2026 16:33:36 -0700 Subject: [PATCH 1/3] feat(caretaker): post comment before auto-closing feature requests --- .../cloudrun/triage-worker/main.py | 12 ++++++ .../cloudrun/triage-worker/tests/test_main.py | 37 ++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/tools/caretaker-agent/cloudrun/triage-worker/main.py b/tools/caretaker-agent/cloudrun/triage-worker/main.py index ce5bd1e3913..21852cda608 100644 --- a/tools/caretaker-agent/cloudrun/triage-worker/main.py +++ b/tools/caretaker-agent/cloudrun/triage-worker/main.py @@ -85,6 +85,18 @@ def main() -> None: if quality in ["SPAM", "EMPTY", "FEATURE"]: print(f"[WORKER] Quality: {quality}. Applying auto-close label.") + if quality == "FEATURE": + send_comment_action( + owner, + repo, + issue_number, + "Thank you for bringing this to our attention. Right now, our " + "engineering team is focusing all resources on critical system " + "maintenance and core stability. Because of this, we don't have " + "immediate plans to address this specific issue, but we truly " + "appreciate you flagging it for us.", + ) + send_label_action(owner, repo, issue_number, ["auto-close"]) store.release_lock( owner, diff --git a/tools/caretaker-agent/cloudrun/triage-worker/tests/test_main.py b/tools/caretaker-agent/cloudrun/triage-worker/tests/test_main.py index 34c3dd0488d..0e9928a739b 100644 --- a/tools/caretaker-agent/cloudrun/triage-worker/tests/test_main.py +++ b/tools/caretaker-agent/cloudrun/triage-worker/tests/test_main.py @@ -81,15 +81,48 @@ def test_main_claim_action_early_exits_zero(self): @patch("main.process_issue_triage") @patch("main.send_label_action") def test_main_auto_close_quality_flow(self, mock_send_label, mock_triage): - """SPAM/EMPTY/FEATURE issues dispatch auto-close label.""" + """SPAM and EMPTY issues dispatch auto-close label.""" + for quality in ["SPAM", "EMPTY"]: + self.mock_store.acquire_lock.reset_mock() + self.mock_store.release_lock.reset_mock() + mock_send_label.reset_mock() + mock_triage.reset_mock() + + self.mock_store.acquire_lock.return_value = ClaimAction.PROCEED + output = json.dumps({"triage_metadata": {"quality": quality}}) + mock_triage.return_value = (True, output) + + with self.assertRaises(SystemExit) as ctx: + main() + + self.assertEqual(ctx.exception.code, 0) + mock_send_label.assert_called_once_with( + "owner", "repo", 42, ["auto-close"] + ) + self.mock_store.release_lock.assert_called_once_with( + "owner", "repo", 42, "exec-123", success=True, status="AUTO_CLOSE" + ) + + @patch("main.process_issue_triage") + @patch("main.send_comment_action") + @patch("main.send_label_action") + def test_main_feature_quality_flow( + self, mock_send_label, mock_send_comment, mock_triage + ): + """FEATURE issues post comment and dispatch auto-close label.""" self.mock_store.acquire_lock.return_value = ClaimAction.PROCEED - output = json.dumps({"triage_metadata": {"quality": "SPAM"}}) + output = json.dumps({"triage_metadata": {"quality": "FEATURE"}}) mock_triage.return_value = (True, output) with self.assertRaises(SystemExit) as ctx: main() self.assertEqual(ctx.exception.code, 0) + mock_send_comment.assert_called_once() + args, _ = mock_send_comment.call_args + self.assertEqual(args[:3], ("owner", "repo", 42)) + # Verify non-empty comment body + self.assertTrue(len(args[3].strip()) > 0) mock_send_label.assert_called_once_with( "owner", "repo", 42, ["auto-close"] ) From 50af88037b71f10ba8db4c0decd0814eb20e3922 Mon Sep 17 00:00:00 2001 From: Chad Diao Date: Wed, 15 Jul 2026 16:40:14 -0700 Subject: [PATCH 2/3] refactor(caretaker-triage): adjust feature comment with reopen option --- tools/caretaker-agent/cloudrun/triage-worker/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/caretaker-agent/cloudrun/triage-worker/main.py b/tools/caretaker-agent/cloudrun/triage-worker/main.py index 21852cda608..52ff3f84015 100644 --- a/tools/caretaker-agent/cloudrun/triage-worker/main.py +++ b/tools/caretaker-agent/cloudrun/triage-worker/main.py @@ -93,8 +93,8 @@ def main() -> None: "Thank you for bringing this to our attention. Right now, our " "engineering team is focusing all resources on critical system " "maintenance and core stability. Because of this, we don't have " - "immediate plans to address this specific issue, but we truly " - "appreciate you flagging it for us.", + "immediate plans to address this specific issue. If you believe " + "this issue was misclassified, feel free to reopen it.", ) send_label_action(owner, repo, issue_number, ["auto-close"]) From cc9293e04b5da545663d63f09ac673c489c21409 Mon Sep 17 00:00:00 2001 From: Chad Diao Date: Tue, 21 Jul 2026 16:26:24 -0700 Subject: [PATCH 3/3] feat(caretaker): add explanatory comments to all auto-closed triage issues --- .../cloudrun/triage-worker/main.py | 17 +++-- .../tests/test_integration_main.py | 5 +- .../cloudrun/triage-worker/tests/test_main.py | 67 +++++++------------ 3 files changed, 38 insertions(+), 51 deletions(-) diff --git a/tools/caretaker-agent/cloudrun/triage-worker/main.py b/tools/caretaker-agent/cloudrun/triage-worker/main.py index 52ff3f84015..fa591c2622a 100644 --- a/tools/caretaker-agent/cloudrun/triage-worker/main.py +++ b/tools/caretaker-agent/cloudrun/triage-worker/main.py @@ -84,19 +84,24 @@ def main() -> None: workable_spec = triage_result.get("workable_spec", {}) if quality in ["SPAM", "EMPTY", "FEATURE"]: - print(f"[WORKER] Quality: {quality}. Applying auto-close label.") + print(f"[WORKER] Quality: {quality}. Leaving comment and applying auto-close label.") if quality == "FEATURE": - send_comment_action( - owner, - repo, - issue_number, + comment = ( "Thank you for bringing this to our attention. Right now, our " "engineering team is focusing all resources on critical system " "maintenance and core stability. Because of this, we don't have " "immediate plans to address this specific issue. If you believe " - "this issue was misclassified, feel free to reopen it.", + "this issue was misclassified, feel free to reopen it." + ) + else: # SPAM or EMPTY + comment = ( + "Thank you for reaching out. We are closing this issue as it does " + "not contain a discernible description or actionable bug report for " + "our team to investigate. If you believe this was closed in error, " + "please feel free to open a new issue with complete reproduction details." ) + send_comment_action(owner, repo, issue_number, comment) send_label_action(owner, repo, issue_number, ["auto-close"]) store.release_lock( owner, diff --git a/tools/caretaker-agent/cloudrun/triage-worker/tests/test_integration_main.py b/tools/caretaker-agent/cloudrun/triage-worker/tests/test_integration_main.py index dc38e3af079..b12757edd77 100644 --- a/tools/caretaker-agent/cloudrun/triage-worker/tests/test_integration_main.py +++ b/tools/caretaker-agent/cloudrun/triage-worker/tests/test_integration_main.py @@ -214,13 +214,15 @@ def test_needs_info_flow(self, mock_send_comment, mock_triage): self.assertIsNone(self.stored_data["lock"]["holder"]) @patch("main.process_issue_triage") + @patch("main.send_comment_action") @patch("main.send_label_action") - def test_auto_close_flows(self, mock_send_label, mock_triage): + def test_auto_close_flows(self, mock_send_label, mock_send_comment, mock_triage): """Verifies end-to-end flow for auto-closed issues.""" for quality in ["SPAM", "EMPTY", "FEATURE"]: self.mock_store.acquire_lock.reset_mock() self.mock_store.release_lock.reset_mock() mock_send_label.reset_mock() + mock_send_comment.reset_mock() mock_triage.reset_mock() self.stored_data = { @@ -249,6 +251,7 @@ def test_auto_close_flows(self, mock_send_label, mock_triage): mock_send_label.assert_called_once_with( "owner", "repo", 42, ["auto-close"] ) + mock_send_comment.assert_called_once() self.assertEqual(self.stored_data["status"], "AUTO_CLOSE") self.assertIsNone(self.stored_data["lock"]["holder"]) diff --git a/tools/caretaker-agent/cloudrun/triage-worker/tests/test_main.py b/tools/caretaker-agent/cloudrun/triage-worker/tests/test_main.py index 0e9928a739b..e255ae8130a 100644 --- a/tools/caretaker-agent/cloudrun/triage-worker/tests/test_main.py +++ b/tools/caretaker-agent/cloudrun/triage-worker/tests/test_main.py @@ -78,57 +78,36 @@ def test_main_claim_action_early_exits_zero(self): main() self.assertEqual(ctx.exception.code, 0) - @patch("main.process_issue_triage") - @patch("main.send_label_action") - def test_main_auto_close_quality_flow(self, mock_send_label, mock_triage): - """SPAM and EMPTY issues dispatch auto-close label.""" - for quality in ["SPAM", "EMPTY"]: - self.mock_store.acquire_lock.reset_mock() - self.mock_store.release_lock.reset_mock() - mock_send_label.reset_mock() - mock_triage.reset_mock() - - self.mock_store.acquire_lock.return_value = ClaimAction.PROCEED - output = json.dumps({"triage_metadata": {"quality": quality}}) - mock_triage.return_value = (True, output) - - with self.assertRaises(SystemExit) as ctx: - main() - - self.assertEqual(ctx.exception.code, 0) - mock_send_label.assert_called_once_with( - "owner", "repo", 42, ["auto-close"] - ) - self.mock_store.release_lock.assert_called_once_with( - "owner", "repo", 42, "exec-123", success=True, status="AUTO_CLOSE" - ) - @patch("main.process_issue_triage") @patch("main.send_comment_action") @patch("main.send_label_action") - def test_main_feature_quality_flow( + def test_main_auto_close_quality_flow( self, mock_send_label, mock_send_comment, mock_triage ): - """FEATURE issues post comment and dispatch auto-close label.""" - self.mock_store.acquire_lock.return_value = ClaimAction.PROCEED - output = json.dumps({"triage_metadata": {"quality": "FEATURE"}}) - mock_triage.return_value = (True, output) + """SPAM, EMPTY, and FEATURE issues dispatch comment and auto-close label.""" + for quality in ["SPAM", "EMPTY", "FEATURE"]: + with self.subTest(quality=quality): + self.mock_store.acquire_lock.reset_mock() + self.mock_store.release_lock.reset_mock() + mock_send_label.reset_mock() + mock_send_comment.reset_mock() + mock_triage.reset_mock() + + self.mock_store.acquire_lock.return_value = ClaimAction.PROCEED + output = json.dumps({"triage_metadata": {"quality": quality}}) + mock_triage.return_value = (True, output) - with self.assertRaises(SystemExit) as ctx: - main() + with self.assertRaises(SystemExit) as ctx: + main() - self.assertEqual(ctx.exception.code, 0) - mock_send_comment.assert_called_once() - args, _ = mock_send_comment.call_args - self.assertEqual(args[:3], ("owner", "repo", 42)) - # Verify non-empty comment body - self.assertTrue(len(args[3].strip()) > 0) - mock_send_label.assert_called_once_with( - "owner", "repo", 42, ["auto-close"] - ) - self.mock_store.release_lock.assert_called_once_with( - "owner", "repo", 42, "exec-123", success=True, status="AUTO_CLOSE" - ) + self.assertEqual(ctx.exception.code, 0) + mock_send_comment.assert_called_once() + mock_send_label.assert_called_once_with( + "owner", "repo", 42, ["auto-close"] + ) + self.mock_store.release_lock.assert_called_once_with( + "owner", "repo", 42, "exec-123", success=True, status="AUTO_CLOSE" + ) @patch("main.process_issue_triage") @patch("main.send_comment_action")