test(ai-slop): eval the judgment layer, the half a shell test cannot reach (0.2.1) - #3039
Conversation
The deterministic half already had 86 shell cases over all 15 script rules. The judgment half — 11 rubric tells and the rewrite guide the fix flow now reads first — had none, which is precisely the half a shell test cannot reach. audit 4 -> 9 evals: - the rubric layer reports but never enters the findings file (the V1 relay boundary) - a fix never swaps an em dash for a parenthesis or en dash; that is the rewrite guide's substitution guardrail and the one most likely to be violated silently, because the swap looks like a fix - triads collapse toward the strongest item instead of being repunctuated - the recorded knowledge-cutoff false-positive class routes to a marker or config, never to weakening the shipped rule - exemptions are named with their cause rather than showing up as an absence of findings setup 3 -> 5 evals, covering the _comment rationale key added in 0.2.0: it is a documented annotation rather than unknown-key drift, and disabling a rule records why alongside the trade-off. Every case now carries narration: true. The four original cases named a prose path resolving nowhere, which the skill-quality Q4 check warns on unless the case declares itself narrative. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AqwX2njhiLMWGrMg3QNt4g
|
Claude finished @kyle-sexton's task in 44s —— View job Security review: no security-relevant surface
Skip gate triggered (condition 2): this change has no security-relevant surface. All four changed files are non-executable data/docs:
No scripts, no GitHub Actions workflow files, no config-parsing code, no dependency pins, and no runtime logic are touched — this PR only adds declarative eval test cases (consumed by a model-driven eval harness, not executed as code) and bumps documentation/version metadata. There is no injection surface, no credential handling, no authorization logic, and no supply-chain change here for this review lane to assess. No security findings to report. |
|
Claude finished @kyle-sexton's task in 2m 27s —— View job Code review complete
Scope: This is the CI code-review lane ( No blocking or important findings. This is a tightly-scoped, well-verified eval-coverage PR and every claim it makes checks out against the source it cites:
No inline comments were needed since no findings met the high-signal bar (this lane excludes style nits, pre-existing issues, and anything a linter/schema check already covers — all of which the author's stated verification already ran). |
|
Last security-reviewed head: |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4cd44383d0
ℹ️ 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".
|
Claude has reviewed this PR 3 times. The lane skips further automatic reviews after 5; deleting this comment resets the count. |
…swers Both found in review and both reproduced before changing anything. The rubric-boundary case claimed the detector matched "nothing else" and that the findings file would carry one script finding. Its promotional wording used vibrant/groundbreaking/nestled, all three in DEFAULT_VOCAB, which meets the density rule's three-hit floor: measured 142.9/1000 words across 21 words, so rule-ai-vocabulary fired too and the golden answer was wrong. Reworded with promotional words deliberately kept OUT of the mechanical core (breathtaking, must-visit, in the heart of), verified to trip the em-dash rule and nothing else. The triad case required the skill to keep and explain a load-bearing triad while the scenario supplied only rhetorical ones, leaving that criterion untestable. The scenario now carries a concrete complete-set triad -- the three config-cascade layers -- alongside the two rhetorical ones. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AqwX2njhiLMWGrMg3QNt4g
|
Claude finished @kyle-sexton's task in 3m 54s —— View job Code review complete
Scope: This is the CI code-review lane ( Context: the latest commit ( One finding — the id 7 fix is incomplete (inline comment posted on The load-bearing triad added in (The two rhetorical triads in the same eval do match correctly.) This means the detector still never surfaces the load-bearing triad as a finding for the fix flow to judge on — the same "golden answer the scenario cannot produce" class of bug No other findings — the rest of the new |
|
Claude finished @kyle-sexton's task in 49s —— View job Security review: no security-relevant surface
Skip gate triggered (condition 2): this change has no security-relevant surface. Re-checked against the current head (
No scripts, no GitHub Actions workflow files, no config-parsing code, no dependency pins, and no runtime logic are touched — still only declarative eval test cases (consumed by a model-driven eval harness, not executed as code) plus documentation/version metadata. There is no injection surface, no credential handling, no authorization logic, and no supply-chain change here for this review lane to assess. No security findings to report. |
Second correction to the same eval, caught in review after the first. The
load-bearing triad I added used multi-word items ("project settings",
"the local overlay"), but rule-rule-of-three's ERE is
[A-Za-z]+, [A-Za-z]+, and [A-Za-z]+
which requires three single tokens. Verified: that sentence returns no
match, so the detector never surfaced the load-bearing triad and the fix
flow had nothing to judge -- the same "golden answer the scenario cannot
produce" class the previous commit set out to fix.
Replaced with "the cascade layers are user, team, and local", which is a
genuine complete set (dropping one names a resolution order that does not
exist) and matches the ERE. Verified end to end against the real detector
rather than by eye: the scenario now measures 3 hits at 60.0/1000 words,
with all three triads inside the finding.
Every other new scenario was re-verified the same way while here: evals 5
and 6 produce exactly one script finding each, eval 8 produces the
knowledge-cutoff findings it describes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AqwX2njhiLMWGrMg3QNt4g
|
Claude finished @kyle-sexton's task in 2m 17s —— View job Code review complete
Scope: CI code-review lane. Diff since last review is one commit, Verified independently (not just restating the author's claim): re-ran the actual detection regex from All three match (single-word items throughout), giving 3 hits — which also clears No blocking or important findings. This is a narrowly-scoped, correctly-verified follow-up fix:
No inline comments needed — nothing in this commit meets the high-signal bar for a blocking/important finding. |
|
Claude finished @kyle-sexton's task in 1m 14s —— View job Security review: no security-relevant surface
Skip gate triggered (condition 2): this change has no security-relevant surface. Re-checked against the current head ( Full PR diff against
No scripts, no GitHub Actions workflow files, no config-parsing code, no dependency pins, and no runtime logic are touched — still only declarative eval test cases (consumed by a model-driven eval harness, not executed as code) plus documentation/version metadata. There is no injection surface, no credential handling, no authorization logic, and no supply-chain change here for this review lane to assess. No security findings to report. |
No linked issue
Summary
ai-slopships two detection layers. The deterministic one has 86 shell cases covering all 15 script rules, tiers, roster agreement, exemptions, and portability. The judgment one — 11 rubric tells, plus therewrite-guide.mdthe fix flow reads at step 1 — had zero coverage. That is the half only a model performs, so it is the half evals exist for.This adds 7 eval cases (audit 4 → 9, setup 3 → 5), bringing
ai-slopin line with sibling audit skills (7, 9, and 14).Fix
audit, five new cases, each tied to a documented behavior that no shell test can assert:rubric-findings-reach-the-report-not-the-findings-file— the V1 relay boundary. A rubric verdict has no crosswalk row to look a tier up from, so it reaches the human report only. Silently dropping it from the file and silently including it are both failures, and only a model can tell them apart.fix-never-swaps-one-tell-for-another— the substitution guardrail. An em dash must resolve to a comma, a period, or a restructured sentence, never a parenthesis or en dash. This is the guardrail most likely to be violated silently, because the swap looks like a fix.triads-collapse-toward-the-strongest-item— arule-of-threefix collapses toward one item rather than being repunctuated into a three-item list, and keeps a triad whose elements are each load-bearing, saying why.known-false-positive-routes-to-config-not-a-rewrite— prose about model knowledge cutoffs tripsrule-knowledge-cutoff-disclaimer. The catalog's calibration record already names this class; the recorded answer is a marker or config exclusion with a stated reason, never weakening the shipped rule to make one corpus pass.declined-exemptions-are-named-with-their-cause— a disabled rule and an excluded path must read as decisions, not as an absence of findings.setup, two new cases covering the_commentrationale key introduced in 0.2.0: it is a documented annotation rather than unknown-key drift (while genuinely unknown keys still flag), and disabling a rule records why alongside the trade-off againstem_dash_allowed_paths.Every case now carries
narration: true. The four original cases nameddocs/example.md, which resolves nowhere — a live skill-quality Q4 warning that the flag exists to answer.Verification
check-jsonschemaagainstplugins/skill-quality/reference/evals.schema.json— both filesok.scripts/check-changelog-parity.sh --checkand--check-bump origin/main— both pass at 0.2.1.plugins/ai-slop/skills/audit/scripts/detect.test.sh— 86 cases pass, unchanged (this PR adds no rules).node scripts/generate-catalog.mjs— catalog already in sync.markdownlint-cli2andtyposclean on the touched files.Dogfood context that motivated the selection. A repo-wide run on
mainnow reports 174 findings across 1214 files, and sampling them shows the plugin predicting its own false-positive profile: 16 of 21rule-emoji-formattingfindings are ❌/✅ semantic wrong-right markers (a documentation convention here, not decoration), 8rule-knowledge-cutoff-disclaimerfindings are the class the calibration record already names, and 72rule-curly-artifactsfindings concentrate in just 7 files as genuine paste residue. Two of the new evals encode exactly the judgment those findings require.Related
Generated by Claude Code