Skip to content

feat(app-control): find plugin-shipped control skills in /app-control:drive #9580

Description

@kyle-sexton

Slice A10 of #9507 (no poteto draft; added in reconciliation because Track B needs it).

Problem

/app-control:drive finds only project .claude/skills/control-*. A control skill a plugin ships (such as harness-ops:control-claude-code) is invisible to it.

Fix

  • Rewrite drive's "Find the control skill": match available skills named control-<app> (project) or <plugin>:control-<app> (plugin); the project skill wins on a name clash. Load the match through the Skill tool and read features/ from the reported base directory. The unattended ambiguity rule is unchanged.
  • First probe whether claude plugin eval can load a second plugin; if not, prove the plugin-shipped case with an attended --plugin-dir check attached to the PR.
  • Evals plugin-shipped-control-skill-resolves and project-control-skill-wins-name-clash. Fragment: app-control minor.

Done when

  • jq '[.evals[].name] | (index("project-control-skill-wins-name-clash") != null)' plugins/app-control/skills/drive/evals/evals.json prints true.
  • The new cases pass (or the attended check's output is attached), and existing cases are non-inferior.

Blocked by: A1.

Activity

  1. github-actions commented on Oct 24, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; the lanes App applied this class.

    Size: Small
    Complexity: Medium
    Uncertainty: Knowable
    Flags: none

    Understood: /app-control:drive only finds project .claude/skills/control-* skills. The request is to also resolve plugin-shipped <plugin>:control-<app> skills, with the project skill winning on a name clash. It also asks for two new evals and an app-control minor fragment. The attended --plugin-dir check can't run unattended, but the file edits and the eval-name check can be verified in CI. The issue is blocked by A1 (under #9507). I found no clear duplicates.

    Automated triage, applied by the lanes App.

  2. added
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Oct 24, 2026
  3. melodic-automation-lanes commented on Oct 24, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane: a Feature needs an open parent issue a listed human filed that awaits no decision. A recorded decision does not change these rules (.github/actions/resolve-config/admission-rules.json); a person who wants it worked adds agent-ready.

  4. self-assigned this
    on Oct 24, 2026
  5. kyle-sexton commented on Oct 24, 2026

    @kyle-sexton
    MemberAuthor
    No description provided.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

priority: mediumReal value, no hard deadline; normal backlog flow.status: needs-decisionAwaiting a human or maintainer judgment call.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

Fields

No fields configured for Feature.

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions