Skip to content

chore(evals): author skill evals for docs-hygiene (5 skills) - #132

Merged
kyle-sexton merged 1 commit into
mainfrom
chore/evals-docs-hygiene
Jul 12, 2026
Merged

chore(evals): author skill evals for docs-hygiene (5 skills)#132
kyle-sexton merged 1 commit into
mainfrom
chore/evals-docs-hygiene

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Jul 12, 2026

Copy link
Copy Markdown
Contributor

What

Adds rich-form evals/evals.json for all five docs-hygiene skills and bumps the plugin's plugin.json version so marketplace consumers pick up the new shipped eval component.

Skill Cases Focus
compress 6 default-vs-audit routing, content preserved over flavor, separate semantic-diff pass, sub-3% revert, refuse code file, SSOT-relocation-not-flavor
declutter 6 shape/tier classification, read-only when asked to fix, slot-variable not ghost-ref, exempt sections, flavor is /compress, Diataxis preamble
encapsulation-audit 6 detect routing, single-violation not gated by Rule of Three, filter-taxonomy legal hits, Path B missing-action files+stops, scripts/ entry-surface legal, dedup routes to /extract-ssot
extract-ssot 6 identify on duplication smell, refuse below Rule of Three, Tier 0 over recall, code cluster out of scope, DESCRIBE/USE/EXPOSE, one-level-deep citations
rename-references 6 audit sweep, never trust single-pattern grep, English-verb ambiguous confirm, re-sweep until zero, refuse framework migration, plan-doc auto-excluded

Two markdown fixtures back the compress and declutter happy-path cases. Each case carries id, kebab-case name, prompt, expected_output, optional files, and an expectations array of objectively-verifiable checks — modeled on the bug-report rich-form exemplar.

Warrant

All five skills carry judgment-bearing behavioral contracts (action routing + guardrail/refusal rules + guarded anti-patterns) — none is pure-reference, so no skip verdicts.

Decision called out

Version-bump level was unspecified by the issue. docs-hygiene is a single multi-skill plugin, so one manifest bump covers all five: chose a minor bump (0.1.0 -> 0.2.0) — evals are an additive, backward-compatible shipped component. Matches the sibling evals PR precedent; reversible to patch if a maintainer prefers.

Validation

  • check-jsonschema against the bundled plugins/skill-quality/reference/evals.schema.json — all 5 conform
  • check-skill.sh presence gate — all 5 PASS, 0 errors (remaining WARNs are pre-existing skill-body Gotchas-surface items, out of scope for an evals-only PR)
  • scripts/validate-plugins.sh (manifests + catalog, --strict) — pass
  • LF endings, final newline, typos clean

Doc drift noted

The issue cites docs/MIGRATION-PLAYBOOK.md "Evals — warrant policy and consumer-verify recipe" and docs/evals-coverage.md; neither exists on current main (they live on the unmerged evals-backfill branch). Did not block this work; the coverage doc is now stale re docs-hygiene and will need reconciling when that branch lands.

Refs melodic-software/medley#1450


Note

Low Risk
Additive eval JSON and fixtures only; no skill runtime or application logic changes. Version bump is backward-compatible packaging.

Overview
Ships rich-form evals/evals.json for all five docs-hygiene skills (compress, declutter, encapsulation-audit, extract-ssot, rename-references), with six cases each covering action routing, guardrails, refusals, and sibling-skill boundaries. Cases use prompt, expected_output, and verifiable expectations (plus optional files).

Adds markdown fixtures for the compress and declutter fixture-driven cases (verbose-onboarding-snippet.md, noisy-rule-snippet.md).

Bumps docs-hygiene plugin manifest version 0.1.00.2.0 so marketplace installs pick up the new eval component.

Reviewed by Cursor Bugbot for commit ef0ab0b. Bugbot is set up for automated code reviews on this repo. Configure here.

Add rich-form evals/evals.json for each docs-hygiene skill and bump the
plugin version so the marketplace redelivers the new shipped component.

Skills (6 cases each — routing, happy path, guardrail/refusal, anti-pattern):

- compress: default-vs-audit routing, content preservation over flavor,
  separate semantic-diff pass, sub-3% revert, refuse code files, SSOT
  relocation is not flavor
- declutter: shape/tier classification, read-only even when asked to fix,
  slot-variable not a ghost-ref, exempt sections, flavor is /compress,
  Diataxis preamble treatment
- encapsulation-audit: detect routing, single-violation not gated by Rule
  of Three, filter-taxonomy legal hits, Path B missing-action files+stops,
  scripts/ entry-surface legal, duplication routes to /extract-ssot
- extract-ssot: identify on duplication smell, refuse below Rule of Three,
  Tier 0 over recall, code cluster out of scope, DESCRIBE/USE/EXPOSE,
  one-level-deep citations
- rename-references: audit sweep, never trust single-pattern grep, English
  verb forces ambiguous confirm, re-sweep until zero, refuse framework
  migration, plan-doc auto-excluded

Two markdown fixtures back the compress and declutter happy-path cases.

All 5 conform to the bundled evals.schema.json; check-skill.sh presence
gate passes (0 errors). Version bump is minor (evals are additive,
backward-compatible) per the docs-hygiene 0.1.0 -> 0.2.0 delivery.

Co-authored-by: Claude <noreply@anthropic.com>
@cursor

cursor Bot commented Jul 12, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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_d6a1f196-7ea7-4b3d-96d8-e10de25b304c)

@claude

claude Bot commented Jul 12, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 3m 24s —— View job


PR Review: chore(evals): author skill evals for docs-hygiene (5 skills)

Tasks

  • Gather context and understand the request
  • Read changed files and existing evals exemplar for comparison
  • Review eval JSON structure and content correctness
  • Check fixture files
  • Check plugin.json version bump
  • Post final review

Summary

Well-structured eval set with strong behavioral grounding. All 30 cases are schema-compliant and traced to specific hard rules in the corresponding SKILL.md files. A few minor gaps worth addressing, none of which block merge.


Schema / Structure

All five evals.json files conform to the evals.schema.json rich form — id (integer), name (kebab-case), prompt, expected_output, files, expectations. additionalProperties: false is satisfied; no unknown fields present. Consistent with the bug-report exemplar pattern.


Behavioral Contract Fidelity

Each case checked against the corresponding SKILL.md:

compress (6/6) — All cases trace cleanly:

  • Case 1 (default-compress-preserves-content): fixture contains the exact words the expectations test for (MAX_UPLOAD_MB=25, "warnings are treated as errors", filler terms). ✓
  • Case 3 (semantic-diff-is-separate-not-self-audit): anchored in the SKILL.md Gotcha: "The semantic-diff dispatch must run as a SEPARATE fresh-context audit, never a self-audit." ✓
  • Case 6 (ssot-relocation-not-flavor): anchored in the SKILL.md "What this skill is NOT" paragraph on content relocation vs. flavor removal. ✓

declutter (6/6) — Cases accurate, one gap noted below.

encapsulation-audit (6/6) — Case 3 is particularly apt: the plugin-cache hit uses ~/.claude/plugins/cache/docs-hygiene/... — self-referential but correctly classified as legal. ✓

extract-ssot (6/6) — All cases map to documented hard rules. Case 5 (describe-use-expose-classification) correctly resolves the README restatement as EXPOSE (may restate with a cross-reference) vs. the rule body as USE (must cite). ✓

rename-references (6/6) — Case 6 (plan-doc-auto-excluded) matches the SKILL.md auto-exclusion rule AND the override-flag caveat: "apply mode rejects --include-plan-docs with explicit error." ✓


Findings

1. declutter case 1: fixture preamble not covered in expected_output (minor)

declutter/evals/evals.json L8–16

The fixture noisy-rule-snippet.md contains a ## Why this file exists preamble. The expected_output lists four findings (citation, ghost-ref, scope-meta, enum-list) but never mentions the preamble. Meanwhile, expectation #1 asserts output uses the shape vocabulary (citation, ghost-ref, **preamble**, enum-list, scope-meta) — implying preamble appears in the output. This creates a tension: the expected_output doesn't include a preamble finding, but expectation #1 implies the vocabulary (including preamble) should appear.

The preamble on this Explanation-quadrant file (a retry policy) would likely be Tier 2 KEEP — but it's still a reportable finding. A grader comparing the expected_output against a real run could be confused by the omission.

Suggested fix: either add the preamble finding to expected_output, or narrow expectation #1 to (citation, ghost-ref, enum-list, scope-meta) if the intent was to test only the four shapes the fixture actually triggers. Fix this →


2. compress case 4: CLAUDE.md as a concrete path in the prompt (informational)

compress/evals/evals.json L43–51

The prompt says "Compress CLAUDE.md". This tests the behavioral route (sub-3% revert) without a files entry pointing to an actual fixture. The eval grader would simulate the scenario, but a literal runner wouldn't find a predictably-tight CLAUDE.md to exercise the revert path. This is fine for behavioral testing but worth noting — the eval is testing routing logic, not file content. Consider an expected_output note clarifying this is a scenario-based (not fixture-based) case, or adding a minimal fixture that represents a tight instruction file. Low priority since the current structure matches how several other evals in the repo handle scenario-only cases.


3. encapsulation-audit case 1: action name misalignment in name field (micro-nit)

encapsulation-audit/evals/evals.json L6

The name is detect-routes-and-tables-violations but the case tests that raw grep hits are classified via the filter taxonomy (not all routed as violations). The name suggests "routes" and "tables violations" when the point of the case is "detect → classify → violations table + filtered-legal table". A clearer name would be detect-classifies-via-filter-taxonomy or just detect-and-classify. Ultra-minor; doesn't affect eval correctness.


Fixtures

Both fixtures are correct:

  • verbose-onboarding-snippet.md: Contains every term the expectations test — basically, really, just, honestly, perhaps, MAX_UPLOAD_MB=25, "25 MB", "warnings are treated as errors", "block the merge". ✓
  • noisy-rule-snippet.md: Contains all four expected noise items — dated citation, ghost-ref (.work/net-hardening-slice/PLAN.md), scope-meta, enum-list — plus an exempt ## Cross-references section. ✓

Version Bump

plugin.json: 0.1.0 → 0.2.0 (minor). Appropriate for an additive, backward-compatible shipped component. Consistent with sibling PR precedent.


Verdict

Approve with minor note. Finding #1 (preamble gap in declutter case 1) is the only item worth addressing before this is used as a grading fixture — it creates an observable contradiction between expected_output and expectation #1. Findings #2 and #3 are informational and don't affect correctness.

@kyle-sexton
kyle-sexton merged commit 27e415d into main Jul 12, 2026
21 of 25 checks passed
@kyle-sexton
kyle-sexton deleted the chore/evals-docs-hygiene branch July 12, 2026 23:44

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Risk: low. Did not approve: Cursor Bugbot completed with status skipping (usage limit reached) and did not produce a clean review signal. Human review was needed, but this PR is already merged; no reviewers assigned post-merge.

Open in Web View Automation 

Sent by Cursor Approval Agent: Pull Request Router and Approver

kyle-sexton added a commit that referenced this pull request Jul 13, 2026
## What

Adds rich-form `evals/evals.json` for five `implementation` skills —
`implement`, `implement-dispatch`, `build`, `lint`, `setup` — and bumps
the plugin manifest `0.2.0` → `0.3.0` so marketplace consumers pick up
the new shipped eval component.

| Skill | Cases | Focus |
|---|---|---|
| `implement` | 6 | bugfix-mode incremental cadence, branch-check stops
on default branch, major divergence routes back to planning,
never-declares-impossible-without-alternatives, over-correction guard on
pushback, autonomous run chains to `/implement-dispatch` |
| `implement-dispatch` | 6 | autonomous dispatches even when plan is
all-main-window, interactive all-main-window hands back to `/implement`,
verify worker return against direct evidence, brief carries scope-fence
+ divergence clause, non-interactive moderate divergence takes
conservative + `DEVIATIONS.md`, autonomous fresh-context verifier before
DONE |
| `build` | 5 | ecosystem auto-detection, missing-tool skip-not-FAIL,
consumer config wins over bundled default, build scope excludes
lint-only `yaml`/`cross-cutting`, clean-tree branch-diff fallback |
| `lint` | 5 | check-mode lint-only detection, `--fix` mode parse, owns
`yaml`+`cross-cutting`, missing-tool skip + file-outside-ecosystem
silent, no-changes directs to `/lint all` |
| `setup` | 4 | infer-then-interview before writing, idempotent
read-existing-first, writes consumer-tracked config not plugin dir,
ambiguous-inference asks not guesses |

Each case carries `id`, kebab-case `name`, `prompt`, `expected_output`,
`files`, and an `expectations` array of objectively-verifiable checks —
modeled on the `bug-report` rich-form exemplar. No fixtures needed
(routing/discipline/guardrail behaviors).

## Warrant

All five skills carry judgment-bearing behavioral contracts that could
silently regress, so **no skip verdicts** — including the three the
issue flagged as gray-zone (`build`/`lint`/`setup`):

- **`implement` / `implement-dispatch`** — mode/orchestration routing,
divergence handling, scope-fence and over-correction guards.
- **`build` / `lint`** — ecosystem-detection routing, `skip`-not-`FAIL`
missing-tool guardrail, consumer-config-wins ladder precedence, and the
build-vs-lint scope split (`cross-cutting`'s `**` must never leak into
`/build`). These are emit-shape + guardrail contracts, not pure
mechanics — cases target the judgment, not "does it detect dotnet".
- **`setup`** — a config-writer skill is explicitly warrantable per the
playbook (the `codebase-audit/setup` eval is the model):
interview/infer/write-scope discipline, idempotent read-existing, and
the write-only-in-consumer-`.claude/ecosystems/` guardrail.

## Validation

- `check-jsonschema` against
`plugins/skill-quality/reference/evals.schema.json` — all 5 conform.
- `check-skill.sh` (skills_root = `plugins/implementation/skills`) — all
5 **PASS, 0 errors**. Remaining WARNs are pre-existing skill-body
Gotchas-surface items, out of scope for an evals-only PR.
- `scripts/validate-plugins.sh --strict` (manifests + catalog) — pass.
- LF endings, final newline, `typos` clean.

## Version-bump level

The issue left the level unspecified. `implementation` is one
multi-skill plugin, so a single manifest bump covers all five; chose a
**minor** bump (`0.2.0` → `0.3.0`) — evals are an additive,
backward-compatible shipped component with no behavioral change to the
skills. Matches the docs-hygiene evals-backfill precedent (#132);
reversible to patch if a maintainer prefers.

Refs melodic-software/medley#1449

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Documentation and test-artifact JSON only; no runtime or skill logic
changes.
> 
> **Overview**
> Adds **rich-form** `evals/evals.json` for five implementation skills
(`implement`, `implement-dispatch`, `build`, `lint`, `setup`) so
judgment-bearing contracts can be regression-tested with prompts,
`expected_output`, and verifiable `expectations` (no fixtures). Coverage
spans orchestration routing and divergence guards, worker verification
and scope-fenced briefs, build/lint ecosystem scope and skip-not-FAIL
behavior, consumer config ladder precedence, and setup
interview/write-location discipline.
> 
> Bumps the plugin manifest **0.2.0 → 0.3.0** and documents the release
in **CHANGELOG** as an additive shipped component with **no skill
behavior changes**.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
26d367d. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant