Skip to content

Plugin-contributed skills are missing from the / autocomplete in attached sessions: session.skills.list returns zero plugin-sourced skills while the global list returns 35 #3557

Description

@devinj-msft

Affected version or release

Copilot app (github.exe) 1.1.15 · bundled CLI binary in ...\github-copilot-sdk\cli\1.0.83-5\, --version reports 1.0.84-1 · Windows 11 Enterprise 10.0.26200

Installation context

Local desktop install, single user. Three plugins installed: one from a GitHub-source marketplace (workiq@work-iq), two installed as local-path copies. All enabled. Their skills are discovered correctly at the app level.

What happened?

Plugin-contributed skills are missing from the / slash-command autocomplete in an attached session, while every other skill source (project, personal, custom, builtin) appears normally.

The app exposes two different skill lists, and they disagree:

API Total skills Plugin-sourced
skills.discover (global, app-level) 57 35
session.skills.list (attached session) 25 0

The session-scoped list returns project (1) + personal (14) + custom (8) + builtin (2) = 25, and zero plugin-sourced skills. Related: session.plugins.list for the same session returns only the built-in computer-use — none of the three installed plugins.

The skills themselves load and run correctly. Invoking one by its bare name works:

skill("quick-answer")   →  loads and executes successfully

So this is purely a session-scoped listing problem, not a loading problem.

Three observations that pin the mechanism precisely:

  1. Immediately after app restart, before a session finishes attaching, plugin skills DO appear in the / menu. As soon as the session finishes resuming, they disappear. The menu evidently switches from the global list to the session list once the session attaches.

  2. Typing a leading space makes them reappear. /quick-answer (space first) autocompletes; /quick-answer at position 0 does not. The leading-space path routes to a different menu that reads the global list.

  3. A marketplace-installed plugin behaves identically. workiq is installed from a GitHub-source marketplace and has a bare commandName (workiq, no namespace prefix). At startup its skill appears; after resume it disappears like all the others. Only its MCP server entry (session.mcp.list{"name": "workiq", "source": "plugin", "status": "needs-auth"}) remains in the menu — which is a different entity that happens to share the name. So the defect is not specific to the install route.

A secondary inconsistency, possibly the same root cause. For plugin skills installed as local-path copies, skills.discover reports a namespaced commandName that the skill runtime rejects:

{ "name": "quick-answer", "commandName": "engineering-plugin:quick-answer",
  "source": "plugin", "userInvocable": true, "enabled": true }
skill("engineering-plugin:quick-answer")  →  Skill not found: engineering-plugin:quick-answer
skill("quick-answer")                     →  loads successfully

The "not found" error lists every available skill by bare name only — no namespaced form exists in the registry. Non-plugin skills always have commandName == name, so they are unaffected.

Steps to reproduce

  1. Install any plugin that contributes at least one skill (either copilot plugin install ./my-plugin or plugin@marketplace — both reproduce).
  2. Restart the app and open a session that has previously been used, so it must resume.
  3. Immediately, before the session finishes attaching, type / and the start of the skill's name — the plugin skill appears in the menu.
  4. Wait for "Resuming session" to complete, then type the same thing at the start of an empty prompt — the plugin skill is now absent.
  5. Type a space and then / and the same prefix — the plugin skill appears again.
  6. Optionally, query session.skills.list for that session and compare with the global skills.discover; the former contains no entries with "source": "plugin".

Expected behavior

Plugin-contributed skills that are enabled and userInvocable should appear in the / autocomplete of an attached session, exactly as project, personal, custom and builtin skills do. The session-scoped skill list should include plugin-sourced skills rather than dropping them.

Additionally, commandName as reported by skills.discover should be a value the skill runtime actually accepts.

Additional context

Impact. Every plugin-contributed skill is undiscoverable through normal autocomplete once a session attaches. In my case that is 35 skills across three plugins. Because the skills still execute when typed in full, the failure looks like the skills are missing or broken rather than like a menu-population problem. The / menu is the primary way users discover available skills.

Workarounds. Type a leading space before /, or type the full bare skill name without relying on autocomplete.

Suspected cause. The session extensibility snapshot appears not to include plugin-contributed skills. session.plugins.list returning only computer-use, while the CLI's own session log reports Plugin activation [agents]: plugins=4, loaded=7 for that same session, suggests the app's session-scoped view of plugins is populated differently from the engine's — and that plugin skills are dropped when that view is built.

The corresponding per-session log line shows the app itself believes the session should have no skills:

extensibility live-session refresh completed session_id=<id>
  plugins_stale=false mcp_stale=false skills_stale=true
  observed_session_plugins=0 target_session_plugins=0
  target_session_skills=0

target_session_skills=0 and target_session_plugins=0 are present for every session, including sessions created long before any of my recent configuration changes.

Hypotheses I tested and ruled out, in case they save triage time:

  • Filename case. Plugin skills in my two local plugins use skill.md; working skills use SKILL.md. Renaming one to SKILL.md changed nothing — and workiq uses SKILL.md and still disappears.
  • Duplicate registration. Both plugins were registered twice (installed copy + a disabled live directory-marketplace entry). Removing the marketplace entirely and restarting changed nothing.
  • Install route / namespacing. workiq is marketplace-installed with a bare commandName and still disappears after resume, so neither the install route nor the namespaced commandName explains the menu behavior.

Possibly related

  • github/app#3550 — plugin-sourced agents receive no filename fallback for name/displayName. Same general area (plugin-contributed content mishandled by the app layer), different surface.
  • github/app#3551 — live directory-marketplace plugins invisible to the app's global agent lookup and to session resume.
  • github/app#2442 — request for a way to reload skills/custom agents without restarting; relevant because there is currently no way to refresh a session's skill list.

Paths, plugin names, skill names and session IDs in this report are genericized where they were specific to my setup; the reproduction does not depend on the originals.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions