chore(evals): author skill evals for claude-ops + prototype (5 skills) - #120
Conversation
Author rich-form evals/evals.json for five action/behavioral skills, each grounded in the skill's live SKILL.md contract and conforming to the bundled schema (plugins/skill-quality/reference/evals.schema.json): - claude-ops/claude-code-changelog (5 cases) — read-only routing on passive version mention, interview-before-edit on explicit apply, version-ahead warning, git-history-not-tracker-file status, P2-not-dropped. - claude-ops/claude-observability (5 cases) — default week-scope read-only report, clean-requires-confirmation guard, product-bug routes to troubleshooting, unknown-scope not guessed, empty-store graceful degrade. - claude-ops/claude-troubleshooting (6 cases) — no-args status default, feature-name smart routing to search, create-shows-draft guard, telemetry and own-code-bug route-aways, reports-does-not-fix. - prototype/logic (5 cases) — throwaway TUI over a pure module, appearance question routes to ui, no-tests, purity/portability, no real DB. - prototype/ui (6 cases) — sub-shape A default, logic question routes to logic, structurally-different variants, stubbed mutations, HTML mockup constraints, no direct promotion to production. Each case covers trigger/routing, happy path, at least one guardrail, and one anti-pattern; expectations are checkable from the run's output. All files pass check-jsonschema against the bundled schema and check-skill.sh (evals presence gate now satisfied for all five). Bump both touched plugins' versions (minor) — evals are a shipped component and the version bump is the marketplace delivery vehicle: claude-ops 0.2.0 -> 0.3.0, prototype 0.1.1 -> 0.2.0. Warrant re-check: all five skills carry judgment-bearing behavioral contracts (action routing, mutation gates, anti-patterns) — none skipped. Refs melodic-software/medley#1452
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_aee7aee8-ddc5-4119-b3a1-526777a8196d) |
|
Claude finished @kyle-sexton's task in 2m 6s —— View job PR Review
SummaryFive well-authored eval files covering all behavioral contracts across FindingsMinor:
|
| Area | Verdict |
|---|---|
Schema conformance (skill_name, evals required fields) |
✓ All 5 files |
skill_name matches directory name |
✓ All 5 match |
name slugs pass ^[a-z0-9]+(-[a-z0-9]+)*$ |
✓ All 27 cases |
| IDs are sequential integers within each file | ✓ |
| Routing/anti-pattern cases per skill | ✓ Every skill has at least one routing and one guardrail case |
expectations entries are output-observable |
✓ None reference internal state |
files: [] empty — prompts are self-contained |
✓ No fixture dependencies needed |
claude-ops bump 0.2.0 → 0.3.0 |
✓ Minor bump correct for new shipped component |
prototype bump 0.1.1 → 0.2.0 |
✓ Minor bump correct |
claude-troubleshooting case 5 conditional routing (/bug-report:bug-report or manual fallback) |
✓ Graceful — handles plugin-absent case |
Verdict
Approve with nits. The one editorial fix in claude-observability case 2 is worth landing before or alongside merge, but neither finding is a functional or schema-level defect. The eval coverage is thorough and the behavioral contracts are faithfully represented.
…ed_output
- claude-observability case 2: reframe the clean-confirmation trigger as a
casual cleanup request (not an explicit destructive order) rather than
"invoked by the model", keeping the guardrail meaning explicit.
- ui case 1: state the sub-shape-A precondition explicitly ("assuming a typical
app where a plausible existing /settings route already exists") so the case is
self-documenting without a repo fixture.
Both remain schema-valid. Editorial only; no case added or removed.
Refs melodic-software/medley#1452
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_582c6e59-8fb4-4819-bda7-61dccf1ffbcd) |
|
Claude finished @kyle-sexton's task in 2m 42s —— View job PR Review
SummaryFive well-structured eval files across
What I Verified
One Residual Nit (not a blocker)
The parenthetical "the user did not pass What Looks CorrectCoverage: Every skill has at minimum one routing case, one happy-path case, one confirm-before-mutate or read-only guardrail, and one anti-pattern. The No behavioral regressions: No skill bodies, hooks, or runtime configurations are changed. The only non-eval changes are the minor version bumps in VerdictApprove. The one residual nit is an editorial ambiguity in prose that doesn't affect the |
|
Both review nits addressed in 4a23d50:
Both files remain schema-valid ( |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4a23d503c1
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex review (P2): the claude-troubleshooting `create` action makes five gates mandatory BEFORE drafting (context/action-create.md) — notably a hard duplicate-search gate that presents matches and proceeds only on explicit "no duplicates" confirmation. The prior case rewarded jumping straight to a draft, which would skip that safety flow. Rewrite case 3 (now create-runs-preflight-gates-before-drafting) so the expected safety flow is: run preflight gates (duplicate search + live-template fetch + version check) -> draft only after gates pass -> file only on explicit confirmation, never auto-file, never skip the duplicate-search gate. Refs melodic-software/medley#1452
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_6437149f-8448-405c-a450-4b4e4571fddc) |
|
Claude finished @kyle-sexton's task in 3m 58s —— View job PR Review
SummaryReviewed all 7 changed files (5 new eval files + 2 Codex P2 — Resolved in commit
|
| Expectation | Screens out |
|---|---|
| Gates run before drafting (incl. duplicate search) | Skipping preflight entirely |
| Presents matches, proceeds only after user confirms | Treating "no results found" as implicit confirmation |
| Draft shown only after gates pass, not before | Drafting in the same turn before confirmation |
| No auto-filing | Auto-filing after the draft |
In a single-turn eval the model stops at Gate 3 waiting for confirmation — expectation 2 correctly fails any implementation that proceeds without it. The fix is sufficient.
Residual Nit — claude-observability case 2 --dry-run phrasing (not a blocker)
plugins/claude-ops/skills/claude-observability/evals/evals.json line 20
"the user did not pass --dry-run or clearly order the prune"
The second Claude review flagged this as implying --dry-run is a user-suppressible bypass flag. On re-reading SKILL.md line 78:
cleanrequires explicit user confirmation before running when invoked by the model — show--dry-runoutput first unless user already passed--dry-runor explicitly ordered cleanup.
The phrasing is actually accurate per the skill spec — --dry-run is user-passable (argument-hint lists it), and when passed, the user is already requesting the preview mode, so the additional "should I show you a preview?" prompt is skipped. The parenthetical correctly states the condition under which the confirmation guardrail fires. The expectations array is unambiguous and correct.
The confusion is real (it reads as if --dry-run bypasses the preview entirely rather than being the preview mode), but the prose is not wrong. Worth a one-word fix ("no explicit --force or destructive intent" instead) if this eval is ever edited for another reason, but not a standalone blocker. Fix this →
What Looks Correct
| Check | Result |
|---|---|
Schema required fields (skill_name, evals[].id, evals[].prompt) |
✓ All 5 files |
skill_name matches directory name |
✓ All 5 match |
name slugs match ^[a-z0-9]+(-[a-z0-9]+)*$ |
✓ All 27 cases |
| IDs are sequential integers within each file | ✓ |
No extra fields (additionalProperties: false compliance) |
✓ |
expectations entries are output-observable |
✓ None reference internal state |
files: [] — all prompts self-contained |
✓ All 5 files |
Cross-skill routing is symmetric (observability↔troubleshooting, logic↔ui) |
✓ Both directions covered |
create eval: gates-before-draft contract enforced |
✓ Fixed in 66804ff |
create eval: no auto-file expectation |
✓ Explicit in expectations |
claude-ops version bump 0.2.0 → 0.3.0 |
✓ Correct minor bump for new shipped component |
prototype version bump 0.1.1 → 0.2.0 |
✓ Correct minor bump |
claude-observability case 2 --dry-run prose accuracy vs. SKILL.md |
✓ Accurate per spec (see nit above) |
| Codex P2 resolved | ✓ 66804ff rewrites case 3 to enforce preflight gate ordering |
Verdict
Approve. The Codex P2 is correctly resolved. All 5 eval files are schema-valid, the behavioral contracts are faithfully represented across all 27 cases, and the version bumps are appropriate. The one residual nit in claude-observability case 2's prose is accurate per the skill spec — it's editorial ambiguity, not a functional defect.
There was a problem hiding this comment.
Stale comment
Risk: low. Not approving because Cursor Bugbot completed with skip status (usage limit reached), so automated review did not complete successfully. Human review is needed before merge; no reviewers were assigned because the PR author is the sole human repository contributor.
Sent by Cursor Approval Agent: Pull Request Router and Approver
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_f3848741-2ca4-4f61-ab4f-becc866f539f) |
|
Claude finished @kyle-sexton's task in 2m 22s —— View job PR Review
SummaryReviewed all 7 changed files (5 new eval files + 2 Merge commit (
|
| Check | Result |
|---|---|
Schema required fields (skill_name, evals[].id, evals[].prompt) |
✓ All 5 files |
additionalProperties: false compliance — no extra fields at root or case level |
✓ All 5 files |
skill_name matches directory name |
✓ All 5 match |
name slugs match ^[a-z0-9]+(-[a-z0-9]+)*$ |
✓ All 27 cases |
| IDs are sequential integers within each file | ✓ 1–5 (changelog, observability, logic), 1–6 (troubleshooting, ui) |
files: [] — all prompts self-contained, no missing fixtures |
✓ All 5 files |
expectations entries are output-observable (no internal-state references) |
✓ |
| Cross-skill routing symmetric | ✓ observability↔troubleshooting and logic↔ui both directions present |
Codex P2 resolved: create gates-before-draft enforced |
✓ Fixed in 66804ff |
| Prior nits resolved: observability case 2 + ui case 1 phrasing | ✓ Fixed in 4a23d50 |
claude-ops version bump 0.2.0 → 0.3.0 |
✓ Correct minor bump |
prototype version bump 0.1.1 → 0.2.0 |
✓ Correct minor bump |
Residual Nit (pre-existing, not a blocker)
claude-observability case 2 — --dry-run parenthetical
plugins/claude-ops/skills/claude-observability/evals/evals.json line 20
"(the user did not pass --dry-run or clearly order the prune)"
As noted in the prior review cycle and confirmed accurate against SKILL.md (the skill does skip the preview prompt when --dry-run is user-supplied, since they're already requesting preview mode), this parenthetical is technically correct but reads as if --dry-run is a bypass flag. The expectations array is unambiguous and governs what the evaluator actually checks — this is editorial ambiguity only. Fix this →
Verdict
Approve. The Codex P2 is correctly resolved. All 5 eval files are schema-valid, behavioral contracts are faithfully represented across all 27 cases, the merge from origin/main introduced no conflicts, and the version bumps are appropriate. The one residual nit is editorial and does not affect schema correctness or the expectations contract.
There was a problem hiding this comment.
Stale comment
Risk: low. Not approving because Cursor Bugbot completed with skip status (usage limit reached), so automated review did not complete successfully. Human review is needed before merge; no reviewers were assigned because the PR author is the sole human repository contributor.
Sent by Cursor Approval Agent: Pull Request Router and Approver
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 26d0435121
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ition Two Codex P2 findings: - claude-troubleshooting case 3: the prompt began with "File", which is not an action keyword, so smart routing would send it to `search` and never reach the `create` preflight gates the case tests. Prompt now starts with the `create` action keyword so it routes to create. - ui case 1: `files: []` with a prompt that did not establish an existing /settings route — sub-shape A only defaults when a plausible existing page exists, so a compliant run would pick sub-shape B / HTML mockup. The prompt now states the /settings page already exists, making sub-shape A the correct default without a framework fixture. Both remain schema-valid. Refs melodic-software/medley#1452
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_61673c13-dce2-416e-825e-06097cb7ce6d) |
|
Claude finished @kyle-sexton's task in 1m 32s —— View job PR Review
SummaryReviewed HEAD Codex P2 #1 — Resolved:
|
| Check | Result |
|---|---|
Schema required fields (skill_name, evals[].id, evals[].prompt) |
✓ All 5 files |
skill_name matches directory name |
✓ All 5 match |
name slugs match ^[a-z0-9]+(-[a-z0-9]+)*$ |
✓ All 27 cases |
| IDs are sequential integers within each file | ✓ 1–5 (changelog, observability, logic), 1–6 (troubleshooting, ui) |
additionalProperties: false compliance — no extra fields |
✓ All 5 files |
files: [] — all prompts self-contained |
✓ All 5 files |
expectations entries are output-observable |
✓ None reference internal state |
Cross-skill routing symmetric (observability↔troubleshooting, logic↔ui) |
✓ Both directions covered |
create case prompt routes to create action (verified vs. SKILL.md routing table) |
✓ Fixed in 1940c37 |
create case: gates-before-draft + no-auto-file enforced |
✓ Fixed in 66804ff |
ui case 1: sub-shape A precondition self-contained in prompt |
✓ Fixed in 1940c37 |
claude-ops version bump 0.2.0 → 0.3.0 |
✓ Correct minor bump |
prototype version bump 0.1.1 → 0.2.0 |
✓ Correct minor bump |
Verdict
Approve. Both Codex P2 findings are correctly resolved in 1940c37. All 5 eval files are schema-valid, the behavioral contracts are faithfully represented across all 27 cases, and the version bumps are appropriate. No functional or schema-level defects remain.
There was a problem hiding this comment.
Stale comment
Risk: low. Not approving because Cursor Bugbot completed with skip status, so automated review did not complete successfully. Human review is needed before merge; no reviewers were assigned because the PR author is the sole human repository contributor.
Sent by Cursor Approval Agent: Pull Request Router and Approver
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1940c37a47
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Two Codex P2 findings: - claude-code-changelog case 5: the case depended on the live `latest` changelog containing a new settings.json field, which is nondeterministic and could reward trusting an unsupported prompt assertion over the fetched changelog. Prompt now pastes a concrete changelog entry (pasted text is the skill's highest-priority input mode), so the P2 classification is grounded in provided content. Added a read-only expectation. - logic case 1: the run-command expectation unconditionally required an existing task runner, but the skill falls back to a prototype README command when none exists. Expectation now allows either. Also softened the module-shape expectation to "e.g. a reducer or explicit state machine" since the skill permits other pure shapes. Both remain schema-valid. Refs melodic-software/medley#1452
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_4336481e-5822-469a-9d69-6e7c37585970) |
|
Claude finished @kyle-sexton's task in 2m 30s —— View job PR Review
SummaryReviewed all 7 changed files at HEAD Codex P2 #1 — Resolved:
|
| Check | Result |
|---|---|
Schema required fields (skill_name, evals[].id, evals[].prompt) |
✓ All 5 files |
additionalProperties: false compliance — no extra fields |
✓ All 5 files |
skill_name matches directory name |
✓ All 5 match |
name slugs match ^[a-z0-9]+(-[a-z0-9]+)*$ |
✓ All 27 cases |
| IDs are sequential integers within each file | ✓ 1–5 (changelog, observability, logic), 1–6 (troubleshooting, ui) |
files: [] — all prompts self-contained, no missing fixtures |
✓ All 5 files |
expectations entries are output-observable |
✓ None reference internal state |
Cross-skill routing symmetric (observability↔troubleshooting, logic↔ui) |
✓ Both directions present |
| Changelog case 5: pasted text makes P2 classification deterministic | ✓ Fixed in 9996979 |
| Logic case 1: README fallback allowed when no task runner exists | ✓ Fixed in 9996979 |
| Logic case 1: module-shape expectation allows all SKILL.md-permitted shapes | ✓ Fixed in 9996979 |
| Create eval: gate ordering enforced, no auto-file | ✓ Fixed in 66804ff |
Create eval prompt: starts with create keyword for correct smart routing |
✓ Fixed in 1940c37 |
| UI case 1: existing-route precondition established in prompt | ✓ Fixed in 1940c37 |
claude-ops version bump 0.2.0 → 0.3.0 |
✓ Correct minor bump |
prototype version bump 0.1.1 → 0.2.0 |
✓ Correct minor bump |
Verdict
Approve. All Codex P2 findings across every review round are correctly resolved. All 5 eval files are schema-valid, the behavioral contracts are faithfully represented across all 27 cases, and the version bumps are appropriate. No functional or schema-level defects remain.
There was a problem hiding this comment.
Stale comment
Risk: low. Not approving because Cursor Bugbot completed with skip status (usage limit reached), so automated review did not complete successfully. Human review is needed before merge; no reviewers were assigned because the PR author is the sole human repository contributor.
Sent by Cursor Approval Agent: Pull Request Router and Approver
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_934c4c88-9e09-4139-9538-f10eb0781326) |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3a7fcf55e0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Three Codex P2 findings: - claude-code-changelog case 4: prompt began with "Which", not an action keyword, and the changelog skill parses the first token as the action (unknown -> action table), so it would not exercise the git-history status path. Prompt is now the action-form `/claude-code-changelog status`. - claude-observability case 2: "Clean up the OTEL store" reads as an explicit cleanup order under the skill's own confirmation exception, so a compliant run could prune directly. Prompt now asks whether trimming is safe (a non-ordering question), so the dry-run-first + confirmation gate must fire. - ui case 5: expected_output required the winning variant captured before the user has picked one; capture is a later step. Reframed to generate the mockup (with a copy-out control) and hand it over, with winner-capture deferred. All three remain schema-valid. Refs melodic-software/medley#1452
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_983cf722-4dee-4699-90db-a13b48766a90) |
|
Claude finished @kyle-sexton's task in 2m 11s —— View job PR Review
SummaryReviewed all 7 changed files (5 new Three Codex P2 Fixes — All CorrectFix 1: Old prompt started with Fix 2: Old prompt Fix 3: Old Full Validation Pass
Residual Nit (pre-existing, not a blocker)
Confirmed accurate against SKILL.md line 77: VerdictApprove. All three Codex P2 findings from the latest review round are correctly resolved in |
There was a problem hiding this comment.
Stale comment
Risk: low. Not approving because Cursor Bugbot completed with skip status, so automated review did not complete successfully. Human review is needed before merge; no reviewers were assigned because the PR author is the sole human repository contributor.
Sent by Cursor Approval Agent: Pull Request Router and Approver
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 18259c9840
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…ions Preempt the smart-routing conflict: the skill routes non-keyword args to `search`, which mechanically contradicts the two route-away cases. Reframe both as explicit capability/scope questions so routing away is the only sensible response, preserving the scope-boundary test: - case 4 (telemetry): now asks whether this skill reports token burn / hook latency or whether that is a different tool -> routes to /claude-observability. - case 5 (own-code bug): now asks whether this skill tracks a bug in the user's own billing code -> routes to /bug-report (or manual write-up). Schema-valid. Refs melodic-software/medley#1452
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_4311fada-d955-47e2-83e4-c8e1f716fa51) |
|
Claude finished @kyle-sexton's task in 2m 27s —— View job PR Review
SummaryReviewed all 7 changed files at HEAD Open Finding:
|
| Commit | Fix | Status |
|---|---|---|
66804ff |
create eval: gates-before-draft, no auto-file |
✓ |
1940c37 |
create prompt starts with create keyword for correct routing |
✓ |
1940c37 |
ui case 1: existing-route precondition stated in prompt |
✓ |
9996979 |
changelog case 5: pasted text makes P2 classification deterministic |
✓ |
9996979 |
logic case 1 expectations: README fallback allowed when no task runner exists |
✓ (expectations only — expected_output still missing it, see above) |
18259c9 |
changelog case 4: /claude-code-changelog status keyword prompt |
✓ |
18259c9 |
observability case 2: casual question prompt (not an explicit order) |
✓ |
18259c9 |
ui case 5: winner capture deferred until after user picks |
✓ |
Residual Nit (pre-existing, not a blocker)
claude-observability case 2, expected_output line 20:
"(the user did not pass --dry-run or clearly order the prune)"
Accurate per SKILL.md (the skill skips the preview prompt when --dry-run is already user-supplied, since they're requesting preview mode). The expectations array is unambiguous and governs what evaluators actually check. Editorial ambiguity only. Fix this →
Verdict
Near-approve — one P2 still open. The logic/evals.json case 1 expected_output inconsistency (missing README fallback) is the last unresolved finding. Once that one-line prose update is in, the PR is clean for merge.
There was a problem hiding this comment.
Stale comment
Risk: low. Not approving because Cursor Bugbot completed with skip status (usage limit reached), so automated review did not complete successfully. Human review is needed before merge; no reviewers were assigned because the PR author is the sole human repository contributor.
Sent by Cursor Approval Agent: Pull Request Router and Approver
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2796cd8922
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Two Codex P2 findings: - Plugin skills invoke as `/plugin-name:skill-name`, so all bare slash prompts and command references are namespaced: `/claude-ops:claude-code-changelog`, `/claude-ops:claude-observability`, `/claude-ops:claude-troubleshooting` (verified against plugins/claude-ops/README.md). Prototype refs were already `/prototype:logic` / `/prototype:ui`. - logic case 1 expected_output now also states the prototype-README fallback for the no-task-runner case, matching the expectation fixed earlier. All 5 files schema-valid. Refs melodic-software/medley#1452
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_1216e494-7cb0-4272-82f7-0cfeaa1a1171) |
|
Claude finished @kyle-sexton's task in 2m 4s —— View job PR Review
SummaryReviewed all 7 changed files (5 new
|
| File | Command form |
|---|---|
claude-code-changelog case 4 prompt |
/claude-ops:claude-code-changelog status ✓ |
claude-observability case 3 routing |
/claude-ops:claude-troubleshooting ✓ |
claude-observability case 4 prompt |
/claude-ops:claude-observability lastweek ✓ |
claude-troubleshooting cases 1, 3, 4, 5 |
/claude-ops:claude-troubleshooting ✓ |
claude-troubleshooting case 4 routing |
/claude-ops:claude-observability ✓ |
claude-troubleshooting case 5 routing |
/bug-report:bug-report ✓ |
logic case 2 routing |
/prototype:ui ✓ |
ui case 2 routing |
/prototype:logic ✓ |
All Prior Findings — Still Intact
| Commit | Fix |
|---|---|
66804ff |
create eval: mandatory preflight gates (duplicate search, template fetch, version check) before any draft |
1940c37 |
create prompt starts with create keyword; ui case 1 existing-route precondition in prompt |
9996979 |
changelog case 5 pasted-text determinism; logic case 1 task-runner expectations fallback |
18259c9 |
changelog case 4 status keyword; observability case 2 non-ordering prompt; ui case 5 winner capture deferred |
d1e4852 |
troubleshooting route-away cases reframed as explicit scope questions |
c91d1aa |
logic case 1 expected_output README fallback; all commands namespaced |
Full Validation Pass
| Check | Result |
|---|---|
Schema required fields (skill_name, evals[].id, evals[].prompt) |
✓ All 5 files |
additionalProperties: false compliance — no extra fields |
✓ All 5 files |
skill_name matches directory name |
✓ All 5 match |
name slugs match ^[a-z0-9]+(-[a-z0-9]+)*$ |
✓ All 27 cases |
| IDs are sequential integers | ✓ 1–5 (changelog, observability, logic), 1–6 (troubleshooting, ui) |
files: [] — all prompts self-contained |
✓ All 5 files |
expectations entries are output-observable |
✓ None reference internal state |
| Cross-skill routing is symmetric and namespaced | ✓ Both directions in each pair |
logic case 1: expected_output and expectations now both allow README fallback |
✓ Fixed in c91d1aa |
All slash command prompts/references use plugin:skill namespace |
✓ Fixed in c91d1aa |
claude-ops version bump 0.2.0 → 0.3.0 |
✓ Correct minor bump |
prototype version bump 0.1.1 → 0.2.0 |
✓ Correct minor bump |
Residual Nit (pre-existing, not a blocker)
claude-observability case 2 — --dry-run parenthetical
plugins/claude-ops/skills/claude-observability/evals/evals.json line 20
"(the user did not pass --dry-run or clearly order the prune)"
Confirmed accurate against SKILL.md across multiple review cycles: the skill skips the "show preview?" prompt when the user already passed --dry-run, since they're already requesting preview mode. The expectations array is unambiguous and governs what evaluators actually check. Editorial ambiguity only — not a functional or schema defect, and not a blocker. Fix this →
Verdict
Approve. Both open Codex P2s from the prior review round are correctly resolved in c91d1aa. All 5 eval files are schema-valid, every slash command reference uses the correct plugin-namespaced form, the logic case 1 expected_output is now consistent with its expectations entry, and the behavioral contracts are faithfully represented across all 27 cases. Both version bumps are appropriate minor increments. No functional or schema-level defects remain.
There was a problem hiding this comment.
Stale comment
Risk: low. Not approving because Cursor Bugbot completed with skip status, so automated review did not complete successfully. Human review is needed before merge; no reviewers were assigned because the PR author is the sole human repository contributor.
Sent by Cursor Approval Agent: Pull Request Router and Approver
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f3bd6a1d84
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex P2: the case pinned the installed version via prompt text, but the skill checks the active terminal with `claude --version`, so a compliant run in a harness without that exact version becomes environment-dependent. Reframe to test the version-awareness logic itself: check the installed version, warn only if the target is newer, else proceed — robust to whatever version the harness reports. Schema-valid. Refs melodic-software/medley#1452
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_9ef352b9-80d5-470f-8f53-479b4c2ab8b6) |
|
Claude finished @kyle-sexton's task in 2m 54s —— View job PR Review
SummaryReviewed all 7 changed files (5 new
|
| Branch | Expectation |
|---|---|
| Installed version older than target | Warns and suggests claude update |
| Installed version equal or newer | Proceeds without warning |
Both branches are output-observable (presence or absence of the warning text). A compliant run always satisfies exactly one of expectations 2 or 3 regardless of the evaluation environment, and expectation 1 ("checks the installed version rather than assuming") is always testable. The fix is sound.
One editorial note (not a blocker): the case name target-version-ahead-of-installed-warns now slightly overstates the invariant — the case covers both the warn AND the no-warn path. The name still anchors to the primary behavior, so this is acceptable as-is.
All Prior P2 Findings — Still Intact
| Commit | Fix |
|---|---|
66804ff |
create eval: mandatory preflight gates (dup-search, template-fetch, version-check) before any draft |
1940c37 |
create prompt starts with create keyword; ui case 1 existing-route precondition in prompt |
9996979 |
changelog case 5 pasted-text determinism; logic case 1 task-runner expectations fallback |
18259c9 |
changelog case 4 status keyword; observability case 2 non-ordering prompt; ui case 5 winner-capture deferred |
d1e4852 |
troubleshooting route-away cases reframed as explicit scope questions |
c91d1aa |
logic case 1 expected_output README fallback; all commands namespaced to plugin:skill form |
10df23f |
changelog case 3: environment-robust dual-branch expectations |
Full Validation Pass
| Check | Result |
|---|---|
Schema required fields (skill_name, evals[].id, evals[].prompt) |
✓ All 5 files |
additionalProperties: false compliance — no extra fields at root or case level |
✓ All 5 files |
skill_name matches directory name |
✓ All 5 match |
name slugs match ^[a-z0-9]+(-[a-z0-9]+)*$ |
✓ All 27 cases |
| IDs are sequential integers within each file | ✓ 1–5 (changelog, observability, logic), 1–6 (troubleshooting, ui) |
files: [] — all prompts self-contained, no missing fixtures |
✓ All 5 files |
expectations entries are output-observable |
✓ None reference internal state |
| Cross-skill routing symmetric and namespaced | ✓ observability↔troubleshooting and logic↔ui both directions; all use plugin:skill form |
changelog case 3: both version-check branches covered; environment-independent |
✓ Fixed in 10df23f |
changelog case 4: /claude-ops:claude-code-changelog status routes to status action |
✓ |
changelog case 5: pasted-text input is deterministic |
✓ |
create case: preflight gates before draft, no auto-file |
✓ |
logic case 1: expected_output and expectations both allow README fallback |
✓ |
ui case 1: existing-route precondition established in prompt |
✓ |
ui case 5: winner-capture deferred until after user picks |
✓ |
claude-ops version bump 0.2.0 → 0.3.0 |
✓ Correct minor bump |
prototype version bump 0.1.1 → 0.2.0 |
✓ Correct minor bump |
Residual Nit (pre-existing, not a blocker)
claude-observability case 2 — --dry-run parenthetical
"(the user did not pass --dry-run or clearly order the prune)"
Confirmed accurate across multiple prior review rounds: per SKILL.md, the skill skips the "show preview?" prompt when the user already supplied --dry-run (they're already requesting preview mode). The expectations array is unambiguous and governs what evaluators actually check. Editorial ambiguity in prose only — not a schema or functional defect, and not a blocker. Fix this →
Verdict
Approve. The last open Codex P2 (changelog case 3 environment-dependency) is correctly resolved in 10df23f. All 5 eval files are schema-valid, every slash command reference uses the correct plugin-namespaced form, the behavioral contracts are faithfully represented across all 27 cases, and both version bumps are appropriate minor increments for a newly shipped component. No functional or schema-level defects remain.
There was a problem hiding this comment.
Stale comment
Risk: low. Not approving because Cursor Bugbot completed with skip status (usage limit reached), so automated review did not complete successfully. Human review is needed before merge; no reviewers were assigned because the PR author is the sole human repository contributor.
Sent by Cursor Approval Agent: Pull Request Router and Approver
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_aaaf4d93-1cf1-4947-90d8-5c6b618b1607) |
|
Claude finished @kyle-sexton's task in 2m 9s —— View job PR Review
SummaryReviewed all 7 changed files (5 new Merge Commit (
|
| Commit | Finding | Status |
|---|---|---|
66804ff |
create eval: mandatory preflight gates (dup-search, template fetch, version check) before any draft |
✓ Intact |
1940c37 |
create prompt starts with create keyword for correct smart routing |
✓ Intact |
1940c37 |
ui case 1: existing-route precondition established in prompt |
✓ Intact |
9996979 |
changelog case 5: pasted entry makes P2 classification deterministic |
✓ Intact |
9996979 |
logic case 1 expectations: README fallback allowed when no task runner |
✓ Intact |
18259c9 |
changelog case 4: /claude-ops:claude-code-changelog status routes correctly |
✓ Intact |
18259c9 |
observability case 2: casual question (not an explicit cleanup order) |
✓ Intact |
18259c9 |
ui case 5: winner-capture deferred until after user picks |
✓ Intact |
d1e4852 |
troubleshooting route-away cases reframed as explicit scope questions |
✓ Intact |
c91d1aa |
logic case 1 expected_output: README fallback clause added |
✓ Intact |
c91d1aa |
All slash commands use plugin-name:skill-name namespace |
✓ Intact |
10df23f |
changelog case 3: dual-branch expectations; environment-independent version check |
✓ Intact |
Full Validation Pass
| Check | Result |
|---|---|
Schema required fields (skill_name, evals[].id, evals[].prompt) |
✓ All 5 files |
additionalProperties: false — no extra fields at root or case level |
✓ All 5 files |
skill_name matches directory name |
✓ All 5 match |
name slugs match ^[a-z0-9]+(-[a-z0-9]+)*$ |
✓ All 27 cases |
| IDs are sequential integers within each file | ✓ 1–5 (changelog, observability, logic), 1–6 (troubleshooting, ui) |
files: [] — all prompts self-contained, no missing fixtures |
✓ All 5 files |
expectations entries are output-observable (no internal-state refs) |
✓ |
| Cross-skill routing symmetric and namespaced | ✓ observability↔troubleshooting and logic↔ui both directions |
changelog case 3: claude --version checked at runtime; both branches covered |
✓ |
changelog case 4: /claude-ops:claude-code-changelog status keyword routing |
✓ |
changelog case 5: pasted-text input — deterministic P2 classification |
✓ |
observability case 2: non-ordering prompt; dry-run preview + confirmation gate fires |
✓ |
troubleshooting case 3: create keyword → correct action; gates before draft; no auto-file |
✓ |
logic case 1: expected_output and expectations both include README fallback |
✓ |
ui case 1: existing /settings route established in prompt |
✓ |
ui case 5: HTML mockup — CSP meta, file:// self-contained, temp/gitignored location |
✓ |
ui case 5: winner-capture deferred to after user picks |
✓ |
claude-ops version bump 0.2.0 → 0.3.0 |
✓ Correct minor bump |
prototype version bump 0.1.1 → 0.2.0 |
✓ Correct minor bump |
Residual Nit (pre-existing, not a blocker)
claude-observability case 2 — --dry-run parenthetical
plugins/claude-ops/skills/claude-observability/evals/evals.json line 20
"(the user did not pass --dry-run or clearly order the prune)"
Confirmed accurate across multiple prior review cycles: per SKILL.md, clean skips the "show preview?" prompt when the user already supplied --dry-run, since they're already requesting preview mode. The expectations array — show dry-run preview, require confirmation, delete nothing — is unambiguous and governs what evaluators actually check. Editorial ambiguity in prose only; not a schema or functional defect. Fix this →
Verdict
Approve. All prior P2 findings across every review round are correctly resolved and intact. All 5 eval files are schema-valid, every slash command uses the correct plugin:skill namespace, the behavioral contracts are faithfully represented across all 27 cases, and both version bumps are appropriate minor increments for a newly shipped component. No functional or schema-level defects remain.
There was a problem hiding this comment.
Risk: low. Not approving because Cursor Bugbot completed with skip status (usage limit reached), so automated review did not complete successfully. Human review is needed before merge; no reviewers were assigned because the PR author is the sole human repository contributor.
Sent by Cursor Approval Agent: Pull Request Router and Approver


Author rich-form
evals/evals.jsonfor five claude-ops + prototype skills, one file per skill, conforming to the bundled schema (plugins/skill-quality/reference/evals.schema.json) and modeled on the rich-form example (plugins/bug-report/skills/bug-report/evals/evals.json).Skills covered (warrant re-check: all five carry judgment-bearing behavioral contracts — none skipped)
claude-ops/claude-code-changelogclaude-ops/claude-observabilitycleanrequires confirmation, product-bug routes to/claude-troubleshooting, unknown scope not guessed, empty-store graceful degradeclaude-ops/claude-troubleshootingstatusdefault, feature-name smart routing tosearch,createshows draft + requires confirmation, telemetry & own-code-bug route-aways, reports-does-not-fixprototype/logic/prototype:ui, no-tests, purity/portability, no real DBprototype/ui/prototype:logic, structurally-different variants, stubbed mutations, HTML-mockup constraints, no direct promotion to productionEach case covers trigger/routing, happy path, at least one guardrail, and one anti-pattern; every
expectationsentry is checkable from the run's output/artifacts.Validation
check-jsonschema --schemafile plugins/skill-quality/reference/evals.schema.json <file>— ok for all 5.check-skill.sh <skill>— PASS (0 errors) for all 5; the action-router-without-evals WARN is now cleared. Remainingno Gotchas surfaceWARNs are pre-existing skill-body advisories, out of scope for this evals task.Version bumps (delivery vehicle)
Minor bump on both touched plugins (evals are a shipped component; the
plugin.jsonversionis the marketplace delivery cache key):claude-ops0.2.0 → 0.3.0prototype0.1.1 → 0.2.0Note — referenced docs not on
mainThe source issue cites
docs/MIGRATION-PLAYBOOK.md"Evals — warrant policy and consumer-verify recipe" anddocs/evals-coverage.md. Neither exists atorigin/main(verified); both land via the unmergedorigin/chore/evals-backfillbranch (commit2df1561). Warrant policy was instead taken fromplugins/skill-quality/README.mdand the self-contained per-skill re-check in the issue body. No docs created here (out of scope).Refs melodic-software/medley#1452
Note
Low Risk
Adds JSON eval fixtures and minor plugin version bumps only; no runtime skill logic or application code changes.
Overview
Adds rich-form
evals/evals.jsonunder five skills (three in claude-ops, two in prototype), encoding checkable behavioral contracts—routing, guardrails, and anti-patterns—as prompts plusexpectations, aligned withskill-quality’s evals schema.claude-ops cases cover changelog read-only vs apply-with-triage, observability scopes/clean confirmation and cross-skill routing, and troubleshooting defaults, create preflight, and scope boundaries. prototype cases cover logic vs UI facet routing, throwaway TUI/purity constraints, UI variant shape, stubbed mutations, and HTML mockup rules.
Bumps shipped plugin versions (claude-ops
0.3.0, prototype0.2.0) so marketplace consumers pick up the new eval assets.Reviewed by Cursor Bugbot for commit 874954f. Bugbot is set up for automated code reviews on this repo. Configure here.