--- id: "19867803-e70b-44b9-8026-e8cc1f7365d4" name: "Slack Open Loops" micro_summary: "Use `slack_find_open_loops(source=\"activity\", limit=50)` to return surface/review Slack candidates with reasons; uncertainty stays in Review, not Quiet." status: "resolved" see_also: [] scope: "Heuristics for finding Slack messages/threads likely waiting on the user, using only app.slack.com UI data." --- ## Helper Use `slack_find_open_loops(source="activity", limit=50, current_user=None, include_quiet=False)`. ```python import json loops = json.loads(slack_find_open_loops(source="activity", limit=20)) ``` ## Parameters - `source`: `"activity"` opens Activity first; `"current"` scores whatever Slack messages/activity rows are visible. - `current_user`: optional Slack display name; supplying it lets the helper demote messages sent by the user. - `include_quiet`: include quiet/demoted candidates for audit. ## Returns JSON with candidate items whose `signals.tier` is `surface` or `review` by default. Reasons explain why a candidate was surfaced/reviewed, such as DM source, thread activity, direct-ask language, or question marks. ## Usage stance This is a heuristic open-loop finder, not ground truth. Uncertain asks belong in Review, never hidden. Reactions, app FYIs, and weak channel noise should carry demotion reasons. ## Verification 2026-06-01: `slack_find_open_loops(source="activity", limit=5)` returned `ok=true` with two DM candidates: one `surface`, one `review`.