Skip to content

refactor(prerequisites): five plugins' notices have no emitter, and degrade text prints a literal <plugin root> #12570

Closed

Description

@kyle-sexton

Refs #7582, #12486

Problem

The prerequisites notice contract assumes a plugin's missing tool reaches the person through a notice naming the plugin's checker. For at least 5 plugins nothing emits that notice, and where degrade text does print, it holds a literal placeholder.

  • No emitter. discovery, rate-limit-guard, multi-agent, review and context-guard declare no session_probe, and their prerequisites.json has no entry whose for names a hook. No hook script of theirs calls hook::require. docs/contracts/prerequisites/README.md says a plugin without session_probe "is never probed at session start", and lib/prerequisites.mjs notifies only for hook:-scoped entries. With node absent, the person sees only harness-ops' fixed line from lib/prerequisites.sh, which names no per-plugin checker.
  • Placeholder in user text. refactor(plugins): delete 5 hook-runtime check skills (*:check wave 1, part A) #12564 moves probe scripts out of skills/check and names them in each entry's degrade as bash <plugin root>/scripts/.... userNotice and the check mode print degrade unchanged, so the reader gets a command that does not run as written. Only the trailing diagnose with: command has the resolved root.

With the per-plugin check skills deleted (#12486), these probes are reachable only from a check FAIL line or the README. The check skills were invocable by name.

What to decide

Which is the right entry point for these plugins' probes? Options seen so far, none chosen:

  1. Resolve <plugin root> in the renderer. Touches lib/prerequisites.mjs and lib/hook-utils.sh, so 73 and 20 generated copies plus a release fragment each; it may need its own size check against the cap.
  2. Reword the 5 degrade sentences to point at the path in diagnose with:. Touches no shared copy.
  3. Give these entries a real emitter (session_probe or hook:-scoped for), which adds session-start cost per plugin.
  4. List the probes in /harness-ops:prerequisites output.

Done when

  • A person whose hook dependency is missing in one of these plugins can reach a command that runs as written, shown by a merge probe on a host.
  • No notice or check line prints a literal <plugin root>.

Filed by the lane 4 session. This was generated by AI.

Activity

  1. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 3, 2026
  2. github-actions commented on Nov 3, 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

    Understood: five plugins' degrade sentences print a literal <plugin root>, and the issue asked which entry point their probes should get.

    Decision recorded.
    Agent choice, not an owner answer.

    Option 2: reword the five degrade sentences so the command they name runs as written, pointing at the plugin root that the diagnose with: command already prints resolved. Basis:
    [quote truncated; the full decision is at the link]

    #12570 (comment)

    This decision settles the open questions: option 2, the missing emitter is accepted as is, and the host merge probe moves to #13072. The remaining work is the reword in the five prerequisites.json files. It is a bounded change.

    Automated triage, applied by the lanes App.

  3. melodic-automation-lanes commented on Nov 3, 2026

    @melodic-automation-lanes
    Contributor

    The latest triage verdict holds nothing: the issue is at status: ready.

  4. added
    work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 3, 2026
  5. melodic-automation-lanes commented on Nov 3, 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: Reword the five plugins' degrade sentences to point at the diagnose with: path (option 2), with the host merge probe kept as a separate person-run check.

    Related work

    Open questions

    1. Which entry point do these plugins' probes get: renderer resolves <plugin root> (1), reword the five degrade sentences (2), add a real emitter (3), or list probes in /harness-ops:prerequisites (4)?
      RECOMMENDED: Option 2: reword the five degrade sentences to point at the path in diagnose with:. It touches no shared copy and adds no session-start cost. Basis: judgment
    2. Should the 'merge probe on a host' done-when item stay a separate host-run check that a person performs?
      RECOMMENDED: Yes. An unattended run cannot do a host merge probe, so keep it as a person-run check. Basis: judgment
    3. Is the missing notice emitter for the five plugins (no session_probe, no hook-scoped entry) in scope here or accepted as is?
      RECOMMENDED: Accept as is for this issue, and fix only the placeholder text. Option 3 conflicts with the session-start cost concern in #​6633. Basis: 6633

    Sources read

    • /home/runner/work/claude-code-plugins/claude-code-plugins/refine-data/context.json: the issue lists four options and chooses none, and no **Decision recorded.** comment exists
    • plugins/plugin-quality/lib/prerequisites.mjs:564: the checker takes a plugin root as an argument; I did not trace how degrade is rendered

    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.**.

  6. kyle-sexton commented on Nov 4, 2026

    @kyle-sexton
    MemberAuthor

    Decision recorded.
    Agent choice, not an owner answer.

    Option 2: reword the five degrade sentences so the command they name runs as written, pointing at the plugin root that the diagnose with: command already prints resolved. Basis:

    • The five sentences still print a literal <plugin root> on origin/main: plugins/context-guard/prerequisites.json:39, plugins/discovery/prerequisites.json:15, plugins/multi-agent/prerequisites.json:15, plugins/rate-limit-guard/prerequisites.json:39, plugins/review/prerequisites.json:89.
    • userNotice prints entry.degrade unchanged and only its diagnose with: tail carries the resolved ${entry.root} (lib/prerequisites.mjs:713-721).
    • Option 1 touches the shared renderer and its generated copies (the body counts 73 and 20) for five strings; option 3 adds session-start cost per plugin (perf(hooks): SessionStart p95 7.1 s from about 26 per-plugin prerequisites rows; use one shared async runner #6633); option 4 leaves the placeholder in place.

    The missing emitter for these five plugins is accepted as is (refinement question 3): the body quotes the prerequisites contract saying a plugin without session_probe "is never probed at session start", so this is the contract working as written, not a defect this issue changes. None of the owner's three reasons applies: the choice keeps the issue's intent, changes no primary design, and touches no secret, account or bill.

    Body item 1, the merge probe on a host, is not lane work: it moves to host-run #13072, which starts after this issue's pull request merges. The lane's list is:

    • The degrade sentences at plugins/context-guard/prerequisites.json:39, plugins/discovery/prerequisites.json:15, plugins/multi-agent/prerequisites.json:15, plugins/rate-limit-guard/prerequisites.json:39 and plugins/review/prerequisites.json:89 point at the plugin root the diagnose with: command names, so the command they give runs as written.
    • No notice or check line prints a literal <plugin root>.
  7. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    and removed
    status: needs-decisionAwaiting a human or maintainer judgment call.
    on Nov 4, 2026
  8. removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 4, 2026
  9. 1 remaining item

  10. added
    admission-deferredAdmitted but waiting for WIP room; the hourly work-unblock sweep labels it agent-ready.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    admission-deferredAdmitted but waiting for WIP room; the hourly work-unblock sweep labels it agent-ready.
    on Nov 4, 2026
  11. github-actions commented on Nov 4, 2026

    @github-actions
    Contributor
    No description provided.
  12. github-actions commented on Nov 4, 2026

    @github-actions
    Contributor
    No description provided.
  13. github-actions commented on Nov 4, 2026

    @github-actions
    Contributor
    No description provided.
  14. melodic-automation-lanes commented on Nov 4, 2026

    @melodic-automation-lanes
    Contributor

    The work-resolve-issue run that agent-ready started failed or was cancelled before it reported, or it stopped or the token broker refused it because its workflow files differ from main's. work-unblock removed and added agent-ready back to start a fresh run on main's workflow files. If this run ends the same way, it re-fires the issue again, waiting longer each time.

  15. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Nov 4, 2026
  16. github-actions commented on Nov 4, 2026

    @github-actions
    Contributor
    No description provided.
  17. removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Nov 4, 2026
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

    priority: mediumReal value, no hard deadline; normal backlog flow.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    Fields

    Work status

    agent-ready

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions