Skip to content

test(playgrounds): the eval suite runs without the plugin (dependency-unsatisfied) #12191

Closed

Description

@kyle-sexton

Observed

The playgrounds plugin does not load in the claude plugin eval sandbox, so its eval suite measures nothing. plugins/playgrounds/.claude-plugin/plugin.json declares a cross-marketplace dependency, {"name": "playground", "marketplace": "claude-plugins-official"}. On 2026-11-01 lane 4's smoke runs of two converted playgrounds cases (#8635 group 1) showed plugin_errors: dependency-unsatisfied for playground@claude-plugins-official in every trace's startup record, and playgrounds was not in the loaded plugins. Both arms ran without the plugin: use-absent-emits-install-commands scored 0.00 with and without, use-cloud-session-feature-detects-delivery 0.67 with and without.

Fix wanted

Make the suite measurable, for example by staging the playground dependency in the case (a local stand-in plugin listed in the case's plugins:, the way songwriting's datamuse-path stand-in is), or by another way the eval sandbox accepts for a cross-marketplace dependency. Then one --runs 1 smoke run that shows the plugin loaded.

Related

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 2, 2026
  2. github-actions commented on Nov 2, 2026

    @github-actions
    Contributor

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

    Size: Small
    Complexity: Low
    Uncertainty: Known
    Flags: none
    Blocked by: none

    Decision recorded.

    The suite gets eval-only stand-ins: a playground stub with a skill for present-path cases, and a playground stub with no skill for absent-path cases, listed in each case's plugins:; the shipped plugin.json dependency is unchanged. Proof of load is a startup record with no dependency-unsatisfied error and playgrounds among the loaded plugins. Basis: the body's Fix; plugins/playgrounds/.claude-plugin/plugin.json:17-22; the songwriting stand-in pattern at plugins/songwriting/evals/dg-audit-identity-rhyme/prompt.md:4. Written by the issue-triage session.

    • The suite is measurable: the playground dependency is staged in the case (a local stand-in plugin listed in the case's plugins:), or met another way the eval sandbox accepts for a cross-marketplace dependency.
    • One --runs 1 smoke run shows the plugin loaded.

    #12191 (comment)

    This decision settles the open questions. I read the issue as asking for eval-only playground stand-ins so the playgrounds eval suite loads the plugin. The --runs 1 smoke run is a host step and is routed separately. I found no duplicates.

    Automated triage, applied by the lanes App.

  3. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 2, 2026
  4. 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.
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Nov 2, 2026
  5. melodic-automation-lanes commented on Nov 2, 2026

    @melodic-automation-lanes
    Contributor

    Not admitted to the issue lane: it carries host-run. Admission takes the issue once each of those is met, when intake triages it again (.github/actions/resolve-config/admission-rules.json).

  6. melodic-automation-lanes commented on Nov 2, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: admission moved the issue to status: confirmed; its comment says why.

  7. added
    status: needs-decisionAwaiting a human or maintainer judgment call.
    and removed
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    on Nov 2, 2026
  8. melodic-automation-lanes commented on Nov 2, 2026

    @melodic-automation-lanes
    Contributor

    Refinement. A read-only run explored this repository, searched its issues and pull requests, and read the allowed docs to draft what follows. On an issue a listed human filed, it counts as the issue's spec once posted, while unedited; it is still model text, so check it.

    Intended outcome: Add a local stand-in plugin named playground to the playgrounds eval cases, so the playgrounds dependency is met and the plugin loads, then record one --runs 1 smoke run showing it loaded.

    Related work

    Open questions

    1. Should the stand-in playground plugin make the upstream plugin look present in every playgrounds case, or only in some? The existing cases assume it is absent, so a stand-in named playground would defeat them.
      RECOMMENDED: Use two arms. Add an eval-only stand-in named playground (a stub skill) to the cases that test the present path, such as use-routes-natural-explorer. Keep the use-absent-* cases as absent-path checks. Since the plugin cannot load while the dependency is unsatisfied, give those cases a way to run with the plugin loaded and the upstream skill absent. The owner has to choose how, for example a stand-in whose skill listing does not read as the upstream skill. Basis: plugins/playgrounds/evals/use-absent-install-scope/prompt.md:2 says the upstream plugin is absent in every eval run, and plugins/playgrounds/skills/use/SKILL.md:65-75 prints the install commands only when it is absent.
    2. Is a stand-in the right fix, or should the case run without the plugin's dependencies entry in plugin.json (for example a patched eval-only copy)? Editing the shipped manifest would change real installs.
      RECOMMENDED: Use the stand-in and leave the shipped manifest alone. The docs say a local plugin satisfies a dependency entry, including one that names a marketplace, on Claude Code v2.1.242 or later. Confirm the eval sandbox's Claude Code version is at least that. Basis: https:/​/code.claude.com/docs/en/plugins/dependencies, section 'Test a plugin and its dependency locally'; plugins/playgrounds/.claude-plugin/plugin.json:17-22.
    3. Is the stand-in listed in a case's plugins: front matter, as songwriting does, and does the 1.1 case.yaml format used by the playgrounds cases support that field?
      RECOMMENDED: Yes. Use the plugins: \["../..", "<stand-in dir>"\] front matter that the songwriting prompt.md files use. The playgrounds cases are case.yaml files with a separate prompt.md, so the author must check that the field works the same way there. Basis: plugins/songwriting/evals/dg-audit-identity-rhyme/prompt.md:4 (plugins: \["../..", "datamuse-path"\]); plugins/playgrounds/evals/use-absent-install-scope/prompt.md:1-8 has no plugins field.
    4. What counts as proof that the plugin loaded in the smoke run, given that #​12190 (run-validity) is still open?
      RECOMMENDED: Require the run's startup record to show no dependency-unsatisfied plugin error and to list playgrounds among the loaded plugins, and record that in the PR. Do not wait for #​12190. Basis: judgment: the issue's own evidence is the startup record's plugin_errors and loaded-plugin list.

    Sources read

    • /home/runner/work/claude-code-plugins/claude-code-plugins/refine-data/context.json: issue 12191 body, triage and candidates
    • plugins/playgrounds/.claude-plugin/plugin.json:17-22: declares the dependency {name: playground, marketplace: claude-plugins-official}
    • plugins/playgrounds/evals/use-absent-install-scope/prompt.md:2: says the upstream plugin is absent in every eval run and the install commands are printed in that case
    • plugins/playgrounds/evals/use-absent-install-scope/case.yaml:1-19: graders for the absent-path install command, with no plugins field
    • plugins/playgrounds/skills/use/SKILL.md:21-38: presence check by claude plugin list, then a skill-listing fallback
    • plugins/playgrounds/skills/use/SKILL.md:65-80: absent path emits the install commands
    • plugins/songwriting/evals/dg-audit-identity-rhyme/prompt.md:4: plugins: \["../..", "datamuse-path"\], the stand-in model
    • plugins/songwriting/evals/dg-audit-identity-rhyme/datamuse-path/.claude-plugin/plugin.json:1-17: an eval-only stand-in plugin whose manifest holds a SessionStart hook
    • https:/​/code.claude.com/docs/en/plugins/dependencies: a plugin declared in plugin.json with a cross-marketplace dependency fails to load when the root marketplace does not allowlist it. A local --plugin-dir copy satisfies a dependency entry, including one that names a marketplace, on v2.1.242 or later.

    To answer, post a comment that starts with this line:

    **Decision recorded.** <answer>
    

    Automated refinement by the lanes App. Answer with a comment whose first line is **Decision recorded.**.

  9. added
    host-runNeeds an unattended run on a host; the host runner takes it, not a person or the issue lane.
    and removed
    status: needs-decisionAwaiting a human or maintainer judgment call.
    on Nov 3, 2026
  10. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded.

    The suite gets eval-only stand-ins: a playground stub with a skill for present-path cases, and a playground stub with no skill for absent-path cases, listed in each case's plugins:; the shipped plugin.json dependency is unchanged. Proof of load is a startup record with no dependency-unsatisfied error and playgrounds among the loaded plugins. Basis: the body's Fix; plugins/playgrounds/.claude-plugin/plugin.json:17-22; the songwriting stand-in pattern at plugins/songwriting/evals/dg-audit-identity-rhyme/prompt.md:4. Written by the issue-triage session.

    • The suite is measurable: the playground dependency is staged in the case (a local stand-in plugin listed in the case's plugins:), or met another way the eval sandbox accepts for a cross-marketplace dependency.
    • One --runs 1 smoke run shows the plugin loaded.
  11. github-actions commented on Nov 3, 2026

    @github-actions
    Contributor

    The triage sweep dispatched intake triage for this issue (attempt 1 of 2).

  12. added
    status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.
    and removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    on Nov 3, 2026
  13. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    Agent choice, not an owner answer. The decision record above was written by the issue-triage session under the owner's standing direction §1 (decide from evidence). The owner did not answer this question; the comment appears under the owner's login only because the session posts with that account.

  14. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    Claim. Lane 3 host run is building this (hub overnight order).

  15. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    Smoke proof (Done-when item 2). One --runs 1 smoke of use-routes-natural-explorer on Claude Code 2.1.317, Sonnet: the startup record lists playgrounds and playground with plugin_errors empty, so no dependency-unsatisfied and the plugin loaded. Stand-ins (Done-when item 1): #12653, all five cases. The run failed no-write (it invoked playgrounds:use, then wrote the HTML itself); one run, a real suite signal, not a load failure.

  16. kyle-sexton commented on Nov 3, 2026

    @kyle-sexton
    MemberAuthor

    Closed by #12653 (merge dc61e51, 14:40Z). Done-when (1): all five playgrounds cases list an eval-only playground stand-in, and the shipped plugin.json is unchanged. Done-when (2): the --runs 1 smoke shows playgrounds loaded with plugin_errors empty, see #12191 (comment)

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

    host-runNeeds an unattended run on a host; the host runner takes it, not a person or the issue lane.priority: mediumReal value, no hard deadline; normal backlog flow.status: confirmedA maintainer confirmed the item is real and in scope; ready to be worked.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    Fields

    Work status

    confirmed

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions