Synchronized /act-on-feedback skill can be advertised while its backing file is missing
- Dominant language
- TypeScript
- Stars
- 193k
- Forks
- 42.4k
- PR merge metrics
- PR metrics pending
Description
## Type
Bug
## Summary
Invoking `/act-on-feedback` in an Agent Host session can fail because the synchronized customization advertises the skill, but the corresponding `SKILL.md` file is missing from the synchronized plugin cache.
When this happens, the agent has no workflow instructions for submitted feedback attachments. In the observed case it fell back to `viewUnreviewedComments`, which returned no comments because that tool only returns comments selected through its reveal confirmation (`pendingAgentReveal`). The comments submitted with the turn were already in the `submitted` state and were available through `listComments`.
The feedback annotations and turn attachments were delivered correctly; the failure was caused by the unavailable synchronized skill followed by an incorrect fallback tool choice.
## Steps to reproduce
1. Open an Agent Host session with the synchronized `act-on-feedback` customization available.
2. Add several code-review comments and submit them to the session.
3. Invoke `/act-on-feedback`.
4. Observe that loading the skill can fail with an `ENOENT` for its cached `SKILL.md` path, despite the skill being advertised to the agent.
5. If the agent falls back to `viewUnreviewedComments`, observe that it receives an empty comment list even though `listComments` returns the submitted comments.
## Actual behavior
The skill invocation fails with an error shaped like:
```text
Failed to read skill file: ENOENT: no such file or directory, open '/agentPlugins///skills/act-on-feedback/SKILL.md'
```
Agent Host logs show the synchronized plugin being synced and stale nonces being evicted, but the advertised skill path later points to a missing file.
The submitted turn still contains annotation attachments for each feedback comment. Those attachments instruct the agent to use `listComments`, but without the skill workflow the agent may choose `viewUnreviewedComments`. That tool completes successfully with:
```json
{ "comments": [] }
```
A subsequent `listComments` call returns the submitted comments.
## Expected behavior
- A skill should not be advertised unless its backing file is readable.
- Synchronizing or evicting plugin cache entries should not invalidate paths already exposed to an active session.
- If loading a synchronized skill fails because its cache entry disappeared, the host should refresh/re-resolve the customization or report a recoverable synchronization error.
- `/act-on-feedback` should reliably use `listComments` for feedback annotations attached to the submitted turn.
## Investigation details
The event ordering was:
1. Feedback annotations transitioned from `accepted` to `submitted`.
2. The turn started with annotation attachments containing the submitted comment IDs.
3. Loading `act-on-feedback` failed with `ENOENT` under the synchronized plugin cache.
4. `viewUnreviewedComments` was called and returned no comments.
5. `listComments` later returned all submitted comments.
This is consistent with the current tool semantics:
- Submitted feedback attachments contain annotation IDs and direct the agent to `listComments`.
- `viewUnreviewedComments` returns only reviewable annotations carrying the transient `pendingAgentReveal` flag set by its confirmation UI.
- Submitted attachment comments do not carry that flag.
## Suggested areas to investigate
- Atomicity and lifetime of synchronized plugin cache directories/nonces.
- Whether skill discovery results can outlive eviction of their resolved backing paths.
- Retrying skill resolution after an `ENOENT` caused by plugin synchronization.
- A built-in fallback for feedback attachments that directs the agent to `listComments` when the customization skill cannot load.
All identifiers, filesystem paths, comment content, and account information have been omitted from this report.
Contributor guide
Assessment
This issue has not been assessed yet.