A task carrying an "Assigned to" avatar in the Planner grid has been picked
up by a person, so its attachments must not be downloaded and its status must
not be moved to In Progress. Until now the only filter was percentComplete
== 0, so an assigned task with an attachment was downloaded like any other —
on the Balboa Nursing and Rehab plan that was one of the two "Facesheets
Needed (GG)" tasks assigned to Dr. Mark Lukasik and Adina Smets.
- _not_started_tasks() now selects `assignments` as well.
- _task_assignee_ids()/_resolve_user_names(): the assignee check runs before
the task-details call, so an assigned task costs no extra Graph request;
display names are resolved once per user and cached for the run, falling
back to the raw ID when the lookup fails.
- Summary workbook gains a "Tasks Skipped (Assigned)" column and a second
"Tasks" sheet with one row per task — facility, task name, assigned to,
attachment count, Downloaded Yes/No and the reason — so a skip can be
explained without reading the log.
- New "All assigned — skipped" facility status, distinct from "No attachments".
scripts/probe_assignments.py is the read-only probe used to confirm the rule
against the live plan before changing behaviour.
Verified on Balboa Nursing and Rehab: 4 Not Started -> 8.24.26 and 8.21.26
downloaded (unassigned), both Facesheets Needed (GG) skipped. 110 tests pass
(tests/test_uipath_pilot.py and tests/test_config.py fail on this checkout for
pre-existing, unrelated reasons).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>