The Actionable by the current user filter narrows a list through the acting user's standing delegations, which are declared, withdrawn, and dated, so they also start and stop on the clock with nothing written anywhere. The filter declared none of that: it added the user cache context and nothing else, so a rendered task list was cached permanently and carried no delegation tag. A stand-in did not see the work they now cover, and kept seeing the work they no longer do, until an unrelated work item write happened to invalidate the list tag.
The Views field handlers that read the same rule already declare it, through AssignmentCacheTrait: a handler's own cacheability methods are read when the view is saved and stored in its configuration, so a per-viewer answer cannot travel that way and is applied to the render instead. The filter is the missed site, and it is the one that decides which rows exist at all.
What changes:
- The filter uses AssignmentCacheTrait and applies the viewer's assignment cacheability from query(), which is where a filter runs and where it has already asked the matcher the two questions the row set rests on. A cached list now carries orchestra_delegation_list and expires at the next moment any cover it consulted starts or ends.
- AssignmentMatcher::calculateCacheableMetadata() consults the account's own cover before reporting what a verdict about them rests on. The resolver reports a dated bound only for the delegations some question actually read, so a caller that declared before asking was told the answer never expires, and one that declared after a question about somebody else was told when that other person's cover lapses.
The Views results cache is not affected: its key is built from the query text and its arguments, and the delegator ids and viewer tokens are bound as arguments, so a change of cover asks a different question rather than reading a stale answer.
Kernel coverage: with a dated delegation in force, the rendered task list carries orchestra_delegation_list and a max-age no longer than the cover lasts, asserted on the shipped view with no assignment-aware column added, so the filter alone is what is measured.
AI-Generated: Yes (Claude Code was used to help draft this issue summary and to write the code and tests on the merge request. I reviewed and ran the work myself before posting it.)
Issue fork orchestra-3622168
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #3
mably commentedComment #5
mably commented