| name | stuck-assigned-finder |
| description | Deterministically finds open Drupal AI issues that are assigned to a contributor but have not had a status change in N days (default 14). Uses local state JSON files and the Drupal.org API only for username resolution. |
Stuck Assigned Issue Finder
You find issues that are assigned to a contributor but have stalled — meaning the issue's status has not changed in 14 days or more. This is a deterministic check: no AI judgement, no scraping. The output is a list of issues a maintainer should follow up on.
Definition of "stuck"
An issue is considered stuck if all of these are true:
- It is open (status
active, needs review, needs work, RTBC, or postponed (maintainer needs more info)).
field_issue_assigned is set (someone has claimed it).
field_issue_last_status_change is more than N days in the past (default N = 14).
We use field_issue_last_status_change rather than changed because changed is bumped every time someone leaves a comment, even when the issue hasn't actually moved. field_issue_last_status_change only updates when the status itself changes, so it accurately measures real movement.
Where the data comes from
- Local state JSON files under
drupal-issue-hygiene-helper/state/3346420/latest_state/ are the primary source. The helper saves both field_issue_assigned (UID, integer) and field_issue_last_status_change (unix timestamp) on each issue.
- Drupal.org API is used only to resolve a UID → username, and the result is cached forever under
stuck-assigned-finder/user-cache/. No issue data is fetched from the API.
If the local state is missing the assignment fields (older state files saved before the helper was updated), tell the user to run php drupal-issue-hygiene-helper/issue.php update-issues --all --project=AI to refresh.
Helper script
A bash script is provided in this skill's directory:
find-stuck-assigned.sh [--days N] [--project-id ID]
- Default:
--days 14 --project-id 3346420 (Drupal AI).
- Output (one row per stuck issue):
nid|days_stuck|assignee|status|priority|component|title|url
- Sorted by
days_stuck descending so the worst offenders come first.
- Exits 0 even when no issues are found.
Run the script first, then format the output for the user.
Workflow
Step 1: Run the script
.claude/skills/stuck-assigned-finder/find-stuck-assigned.sh
If the user asked for a different threshold, pass --days N. If they asked about a different project, pass --project-id ID.
Step 2: Report
Group the results by status and present them as a clean table or list. Include:
- The issue number and title (linked to the URL)
- The assignee username
- How many days the issue has been stuck
- Current status, priority, component
Highlight the longest-stuck issues first. If there are more than ~25 results, summarise by assignee (e.g. "X has 5 stuck issues").
If no issues are found, just say so.
Important notes
- This skill writes nothing to the issue queue and does not post comments. It only reads local state and produces a report.
- The user-cache under
stuck-assigned-finder/user-cache/ is built up across runs. Delete it to force fresh username lookups.
- Do not modify anything under
drupal-issue-hygiene-helper/state/, repos/, or outdated-issues/. These are read-only inputs.
- If the script reports that many state files are missing the assignment fields, tell the user to refresh state via
update-issues --all rather than guessing.