Skip to content

Latest commit

Β 

History

History
1570 lines (1480 loc) Β· 311 KB

File metadata and controls

1570 lines (1480 loc) Β· 311 KB
<style> .g { color: #22863a; font-weight: bold; } .r { color: #cb2431; font-weight: bold; } </style>

Evaluations

Summary

Skill Version Assertions With Skill Without Skill Delta Uplift Concern
humaniseur-fr v1.0.0 71 99% 85% +14pp 1.17Γ— Low delta, High without
frontend-design-deslop v1.0.0 53 85% 57% +28pp 1.49Γ— Low delta, Low with-skill score
linkedin-ghostwriting v1.0.0 46 98% 67% +30pp 1.45Γ— Low delta, High without
technical-article-writer v1.1.0 95 100% 67% +33pp 1.48Γ— High without
press-release-writer v1.1.0 66 95% 61% +35pp 1.57Γ— Low with-skill score
conventional-git v1.0.0 50 100% 64% +36pp 1.56Γ—
promql-cli v1.0.0 36 100% 61% +39pp 1.64Γ—
substack-ghostwriting v1.1.0 101 100% 50% +50pp 2.02Γ—
deep-research v1.0.0 43 100% 49% +51pp 2.05Γ—
snyk-agent-scan-compliance v1.0.0 85 100% 49% +51pp 2.02Γ—
skill-progressive-disclosure-design v1.0.0 59 97% 39% +58pp 2.49Γ—
site-launch-checklist v1.0.0 101 99% 40% +59pp 2.50Γ—
training-report v1.0.0 67 99% 37% +61pp 2.64Γ—
influence-and-negotiation v1.0.0 230 100% 32% +68pp 3.11Γ—
Total (14 skills) 1103 98% 50% +48pp 1.96Γ—

conventional-git β€” v1.0.0

With Skill Without Skill Delta Assertions
100% 64% +36pp 50
Full breakdown (50 assertions)

Model: claude-sonnet-4-6 β€” 1 run each β€” graded by human-as-judge β€” adversarial evals (each has a trap the model falls into without the skill)

# Assertion With Without
Eval 1: worktree in branch name β€” skill forbids it, model echoes it 5/5 3/5
1.1 branch name does NOT contain 'worktree' βœ“ βœ“
1.2 branch name starts with 'feat/' βœ“ βœ— uses 'feature/' prefix
1.3 lowercase, hyphens only βœ“ βœ“
1.4 explains why 'worktree' must not appear in branch names βœ“ βœ— no explanation given
1.5 description part ≀ 50 chars βœ“ βœ“
Eval 2: Issue number prefix in branch β€” model already knows this 5/5 5/5
2.1 branch name includes issue number '87' βœ“ βœ“
2.2 issue number appears BEFORE the description βœ“ βœ“
2.3 branch name starts with 'fix/' βœ“ βœ“
2.4 lowercase, hyphens only βœ“ βœ“
2.5 description part ≀ 50 chars βœ“ βœ“
Eval 3: Scope as noun not verb β€” model uses gerund without skill 6/6 3/6
3.1 scope does NOT end in '-ing' βœ“ βœ“
3.2 scope does NOT contain 'adding', 'implementing', 'creating' βœ“ βœ“
3.3 scope is a short noun βœ“ βœ— no scope used (no CC format)
3.4 type is 'feat' βœ“ βœ— no type prefix β€” plain 'Add UserAuthService...'
3.5 description uses imperative mood βœ“ βœ“
3.6 description starts with lowercase letter βœ“ βœ— starts with capital 'Add'
Eval 4: Squash merge PR title β€” model misses the format requirement 4/4 3/4
4.1 warns PR title becomes the single commit message after squash βœ“ βœ“
4.2 explicitly states PR title must follow Conventional Commits format βœ“ βœ“
4.3 flags 'Add user dashboard feature' as invalid (missing type prefix) βœ“ βœ“
4.4 suggests a corrected PR title (e.g. 'feat: add user dashboard') βœ“ βœ— no corrected title given
Eval 5: Closes #42 in footer not subject β€” model puts it in subject 5/5 2/5
5.1 subject line does NOT contain '#42' or closing keyword βœ“ βœ— '(issue #42)' in subject
5.2 'Closes #42' appears in the footer βœ“ βœ— no footer β€” issue ref only in subject
5.3 subject uses imperative mood βœ“ βœ“
5.4 type is 'fix' βœ“ βœ— no CC type prefix
5.5 no trailing period βœ“ βœ“
Eval 6: Deps upgrade β†’ 'build' not 'chore' β€” model defaults to chore 5/5 3/5
6.1 type is 'build' βœ“ βœ— type is 'chore'
6.2 type is NOT 'chore' βœ“ βœ— type IS 'chore'
6.3 description uses imperative mood βœ“ βœ“
6.4 description starts with lowercase βœ“ βœ“
6.5 no trailing period βœ“ βœ“
Eval 7: Revert body β€” keep 'This reverts commit hash' β€” model rewrites body 5/5 4/5
7.1 type is 'revert' (CC format 'revert:') βœ“ βœ— uses git default 'Revert "..."' format, not 'revert:' type
7.2 body includes 'This reverts commit' βœ“ βœ“
7.3 hash 'abc1234f' referenced in body βœ“ βœ“
7.4 description uses imperative mood βœ“ βœ“
7.5 no trailing period βœ“ βœ“
Eval 8: Breaking change β€” body-only invisible to tools β€” model omits ! and footer 5/5 3/5
8.1 includes '!' after type/scope OR 'BREAKING CHANGE:' in footer βœ“ βœ— no ! and no BREAKING CHANGE: footer β€” body-only
8.2 does NOT rely solely on body text to signal breaking change βœ“ βœ— breaking change only in body: 'Old config files are no longer compatible'
8.3 type is NOT 'fix' βœ“ βœ“
8.4 description uses imperative mood βœ“ βœ“
8.5 description starts with lowercase βœ“ βœ“
Eval 9: One concern per branch β€” model says 'use fix:' without flagging alignment 4/4 1/4
9.1 does NOT lead with 'use fix:' without discussing branch alignment βœ“ βœ— leads with 'Short Answer: Use fix: for the bug fix commit'
9.2 recommends separate fix/ branch OR discusses tradeoff βœ“ βœ“
9.3 explains that mixing fix: on feat/ branch obscures the changelog βœ“ βœ— discusses reverse concern (feat: for bug) not fix: on feat/ branch
9.4 if staying on feature branch, says to use feat: not fix: βœ“ βœ— recommends fix: on feat/ branch without alignment explanation
Eval 10: Cross-repo issue closing β€” model already knows owner/repo#N format 5/5 5/5
10.1 uses Closes/Fixes/Resolves keyword βœ“ βœ“
10.2 reference format is 'owner/repo#number' βœ“ βœ“
10.3 does NOT use just '#99' βœ“ βœ“
10.4 does NOT use just 'frontend#99' βœ“ βœ“
10.5 closing reference in footer, not subject βœ“ βœ“

linkedin-ghostwriting β€” v1.0.0

With Skill Without Skill Delta Assertions
98% 67% +31pp 46
Full breakdown (46 assertions)

Model: claude-sonnet-4-6 β€” 1 run each β€” graded by human-as-judge

# Assertion With Without
Eval 1: Newsletter growth β€” interview before writing 6/6 0/6
1.1 asks questions before writing a post (no post content in response) βœ“ βœ— wrote full post
1.2 asks 8 or more distinct questions βœ“ βœ—
1.3 asks for specific before/after metrics or exact numbers βœ“ βœ—
1.4 asks about the mechanism/process (how it was achieved) βœ“ βœ—
1.5 asks about the target audience βœ“ βœ—
1.6 asks about the CTA or business goal of the post βœ“ βœ—
Eval 2: SaaS churn hooks β€” 3-5 options, no rhetorical questions 5/5 4/5
2.1 proposes 3 or more hook options βœ“ βœ“
2.2 each hook is a short standalone line β€” no full post body βœ“ βœ“
2.3 waits for user to choose a hook (does not write the full post) βœ“ βœ“
2.4 no rhetorical questions in any hooks (no '?' at end of hook lines) βœ“ βœ— Hook 3 ends with '?'
2.5 at least one hook includes specific numbers (8%, 2%, 6 months) βœ“ βœ“
Eval 3: Full post body β€” active voice, directive CTA, short paragraphs 6/6 6/6
3.1 post starts with or closely follows the selected hook βœ“ βœ“
3.2 no rhetorical questions in the post body βœ“ βœ“
3.3 post uses active voice βœ“ βœ“
3.4 has a clear, directive CTA (not an open-ended question) βœ“ βœ“
3.5 paragraphs are short (2 visual lines or fewer) βœ“ βœ“
3.6 does not contain 'very', 'really', or 'incredibly' βœ“ βœ“
Eval 4: Leadership topic β€” push back on missing metrics 4/4 2/4
4.1 does not write a generic post without metrics βœ“ βœ“
4.2 asks for quantified before/after results or measurable outcomes βœ“ βœ— de-emphasizes metrics ("even if it's not a metric")
4.3 asks for a specific scene or moment βœ“ βœ“
4.4 asks for a counter-intuitive insight βœ“ βœ— not asked
Eval 5: Remote work culture β€” interview, not generic post 4/4 0/4
5.1 does not immediately write a generic thought-leadership post βœ“ βœ— wrote generic post immediately
5.2 asks about the user's personal experience with remote work βœ“ βœ—
5.3 asks for specific data, outcomes, or evidence βœ“ βœ—
5.4 asks what specific insight the user wants to challenge βœ“ βœ—
Eval 6: Full context β€” propose hooks before full post 3/4 3/4
6.1 proposes hooks before writing the full post (does not skip Phase 2) βœ— skipped hook selection, wrote post directly βœ— wrote full post immediately
6.2 if full post written: CTA is directive, not open-ended βœ“ βœ“
6.3 if full post written: no empty phrases ('digital landscape', etc.) βœ“ βœ“
6.4 if full post written: no ternary hook structure βœ“ βœ“
Eval 7: Cold email hooks β€” numbers, no rhetorical questions 4/4 4/4
7.1 proposes 3 or more hook options βœ“ βœ“
7.2 no rhetorical questions in any hooks βœ“ βœ“
7.3 hooks include specific numbers (10,000, 38%) βœ“ βœ“
7.4 hooks reveal result but not full method β€” maintaining tension βœ“ βœ“
Eval 8: Weak post β€” remove filler, suggest real data 5/5 4/5
8.1 removes 'very', 'really', or similar filler adverbs βœ“ βœ“
8.2 removes empty phrases like 'digital landscape' βœ“ βœ“
8.3 uses active voice throughout βœ“ βœ“
8.4 result is noticeably shorter/tighter than the original βœ“ βœ— rewrite is longer than original
8.5 suggests the user needs specific numbers/data to make the post credible βœ“ βœ“
Eval 9: Weak CTA β€” flag and replace 3/3 3/3
9.1 identifies the open-ended question as a weak CTA βœ“ βœ“
9.2 suggests a directive alternative ('Comment X', 'DM me', 'Save this') βœ“ βœ“
9.3 explains why directive CTAs outperform open-ended questions βœ“ βœ“
Eval 10: Post body from given hook β€” active voice, directive CTA 5/5 5/5
10.1 post starts with or immediately after the given hook βœ“ βœ“
10.2 no rhetorical questions in the post body βœ“ βœ“
10.3 CTA is directive: 'Comment QUESTION' or similar βœ“ βœ“
10.4 paragraphs are short (2 visual lines max) βœ“ βœ“
10.5 active voice throughout βœ“ βœ“

promql-cli β€” v1.0.0

With Skill Without Skill Delta Assertions
100% 61% +39pp 36
Full breakdown (36 assertions)

Model: claude-sonnet-4-6 β€” 1 run each β€” graded by human-as-judge

# Assertion With Without
Eval 1: Current request count β€” rate() not raw counter 3/3 1/3
1.1 uses rate() β€” does NOT suggest querying raw counter without rate() βœ“ βœ— suggests raw counter first
1.2 includes a time window in rate() e.g. [5m] βœ“ βœ“
1.3 explains why raw counter values are not meaningful βœ“ βœ— no explanation provided
Eval 2: Debug slow pods β€” isolate by instance, not avg across fleet 4/4 3/4
2.1 recommends filtering/isolating by pod or instance label βœ“ βœ“
2.2 does NOT suggest avg() or sum() across all pods as first step βœ“ βœ“
2.3 suggests histogram or rate-based latency metrics βœ“ βœ“
2.4 includes label matcher syntax to filter by specific pod or instance βœ“ βœ— groups by pod but no specific instance filter
Eval 3: p99 histogram β€” preserve le label 4/4 4/4
3.1 uses histogram_quantile(0.99, ...) βœ“ βœ“
3.2 preserves the 'le' label in by() clause βœ“ βœ“
3.3 applies rate() to the histogram _bucket series βœ“ βœ“
3.4 does NOT suggest dropping 'le' before histogram_quantile βœ“ βœ“
Eval 4: Error rate trend 2h β€” range query, --output graph 4/4 3/4
4.1 uses --start 2h (or equivalent range query flag) βœ“ βœ“
4.2 recommends --output graph for visualizing the trend βœ“ βœ— not mentioned
4.3 uses rate() on the error counter metric βœ“ βœ“
4.4 does NOT just suggest a plain instant query βœ“ βœ“
Eval 5: Bearer token β€” never in config file, chmod 600 4/4 1/4
5.1 does NOT write config file content containing the token value βœ“ βœ“
5.2 instructs user to create the config file manually themselves βœ“ βœ— uses env vars, no config file guidance
5.3 mentions chmod 600 to protect the credentials file βœ“ βœ— not mentioned
5.4 does NOT suggest passing the token as a CLI flag βœ“ βœ— suggests --bearer-token CLI flag
Eval 6: CPU filter β€” labels in innermost selector 3/3 3/3
6.1 places label matchers in the innermost metric selector βœ“ βœ“
6.2 filtering appears before any aggregation function βœ“ βœ“
6.3 does NOT suggest applying label filters outside the selector βœ“ βœ“
Eval 7: Connection refused β€” config problem, not query problem 4/4 4/4
7.1 identifies this as a host configuration problem βœ“ βœ“
7.2 guides the user to check their host configuration βœ“ βœ“
7.3 does NOT suggest modifying the PromQL query to fix the error βœ“ βœ“
7.4 does NOT create a config file with credentials βœ“ βœ“
Eval 8: List metrics β€” promql metrics subcommand 3/3 0/3
8.1 suggests the 'promql metrics' subcommand βœ“ βœ— suggests curl then PromQL regex instead
8.2 does NOT suggest {__name__=~".+"} as the primary approach βœ“ βœ— suggests it as the promql-cli approach
8.3 shows correct CLI syntax for the metrics subcommand βœ“ βœ— does not know the subcommand
Eval 9: Active connections β€” gauge vs counter distinction 3/3 0/3
9.1 distinguishes between gauge (raw value OK) and counter (needs rate()) βœ“ βœ— no gauge/counter distinction
9.2 if gauge: confirms raw value is appropriate for active connections βœ“ βœ— not addressed
9.3 suggests checking metric type with 'promql meta metric' βœ“ βœ— not mentioned
Eval 10: Before/after deploy β€” range query, --output graph 4/4 3/4
10.1 uses a range query with --start flag βœ“ βœ“
10.2 recommends --output graph to visualize the trend βœ“ βœ— not mentioned
10.3 uses rate() for request/error rate metrics βœ“ βœ“
10.4 does NOT just suggest a single instant query βœ“ βœ“

substack-ghostwriting β€” v1.1.0

With Skill Without Skill Delta Assertions
100% 49% +51pp 101
Full breakdown (101 assertions)

Model: claude-opus-4-6 β€” 1 run each β€” graded by human-as-judge β€” adversarial evals (each has a trap the model falls into without the skill)

# Assertion With Without
Eval 1: Evergreen content β†’ web post, not newsletter 5/5 2/5
1.1 identifies this as a web post (not newsletter issue) based on 'evergreen' keyword βœ“ βœ— treats as generic Substack post
1.2 mentions SEO title field or SEO optimization specific to web posts βœ“ βœ— no Substack SEO title field
1.3 suggests a URL slug (short, keyword-rich) βœ“ βœ— not suggested
1.4 does NOT treat this as a newsletter issue (no subject line / preview text focus) βœ“ βœ“
1.5 mentions table of contents for long content or web-specific formatting βœ“ βœ“
Eval 2: Ghostwriting β€” interview before writing 5/5 0/5
2.1 does NOT write a full post immediately βœ“ βœ— wrote draft immediately
2.2 asks for voice samples (transcripts, past writing, or media appearances) βœ“ βœ— not asked
2.3 prioritizes transcripts over published writing as voice source βœ“ βœ— no source prioritization
2.4 mentions building a voice guide before drafting βœ“ βœ— no voice guide concept
2.5 asks about the CEO's natural speaking/writing patterns βœ“ βœ— not asked
Eval 3: Gmail truncation warning for long newsletter 5/5 1/5
3.1 warns about Gmail truncation at ~102KB / ~3000 words βœ“ βœ— no truncation warning
3.2 suggests keeping content under ~3000 words or acknowledges truncation risk βœ“ βœ— complies with 4000-word request
3.3 uses short paragraphs (2-3 sentences) for email readability βœ“ βœ“
3.4 suggests code blocks under 10 lines with links to Gist for longer code βœ“ βœ— no Gist links suggested
3.5 recommends a TL;DR at top for issues over 1500 words βœ“ βœ— no TL;DR recommendation
Eval 4: Web post SEO β€” separate fields awareness 5/5 3/5
4.1 mentions the separate SEO title field (distinct from main title) βœ“ βœ— no Substack SEO title field
4.2 writes or recommends an SEO description of 150-160 characters βœ“ βœ“
4.3 suggests a URL slug (short, keyword-rich, no dates) βœ“ βœ“
4.4 mentions Substack has high domain authority for SEO βœ“ βœ— not mentioned
4.5 recommends internal linking to other Substack posts βœ“ βœ“
Eval 5: Algorithm β€” subscriptions not engagement 5/5 2/5
5.1 explains algorithm optimizes for subscriptions/paid conversions, NOT engagement βœ“ βœ— assumes engagement-based algorithm
5.2 explicitly discourages engagement bait, outrage, or hot takes βœ“ βœ“
5.3 mentions Recommendations from other publications as a top growth lever βœ“ βœ— generic cross-promotion only
5.4 mentions Notes as a testing pipeline for long-form content βœ“ βœ— not mentioned
5.5 references quality/consistency as primary growth driver βœ“ βœ“
Eval 6: Notes β€” not threads, concise standalone 5/5 0/5
6.1 advises against thread-style content on Notes βœ“ βœ— helps adapt thread format
6.2 recommends concise Notes (2-5 sentences) βœ“ βœ— supports long-form threads
6.3 suggests using Notes as testing pipeline for long-form posts βœ“ βœ— not mentioned
6.4 mentions likes as the primary Notes ranking signal βœ“ βœ— no algorithm details
6.5 explains that Notes should have standalone value βœ“ βœ— helps create thread series
Eval 7: Monetization β€” don't paywall under 1000 subs 5/5 1/5
7.1 advises against launching paid tier at 300 subscribers βœ“ βœ— cautiously supportive
7.2 explains growth compounds faster than paid conversion at small scale βœ“ βœ— not articulated
7.3 references the ~3% free-to-paid conversion baseline βœ“ βœ— no conversion benchmarks
7.4 recommends keeping everything free and focusing on growth first βœ“ βœ— suggests testing paid content
7.5 suggests alternative monetization paths (coaching, consulting) βœ“ βœ“
Eval 8: Social distribution β€” don't announce, lead with insight 5/5 1/5
8.1 does NOT start with 'I just published' or similar announcement βœ“ βœ— default promotion pattern
8.2 leads with an insight, hook, or the 90% result βœ“ βœ— leads with announcement
8.3 gives 30-40% of value upfront so post works standalone βœ“ βœ— structured as teaser
8.4 uses line breaks between sentences for LinkedIn readability βœ“ βœ“
8.5 post works even if the reader never clicks the link βœ“ βœ— requires click for value
Eval 9: Voice matching β€” single source warning 5/5 0/5
9.1 warns against anchoring voice analysis on a single source βœ“ βœ— works with single source
9.2 asks for additional sources (transcripts, social, Slack, talks) βœ“ βœ— not asked
9.3 explains that blog posts are edited and may differ from natural voice βœ“ βœ— no distinction
9.4 prioritizes transcripts or spoken content over published writing βœ“ βœ— no source prioritization
9.5 does NOT immediately write in a 'captured' voice from one blog post βœ“ βœ— attempts to write immediately
Eval 10: Paywall placement β€” value above the fold 4/4 4/4
10.1 advises against paywalling the intro/hook/beginning βœ“ βœ“
10.2 recommends giving enough free value above the fold βœ“ βœ“
10.3 explains that free content drives growth and recommendations βœ“ βœ“
10.4 suggests placing paywall after delivering strong value βœ“ βœ“
Eval 11: Subject line + preview text complementarity 4/4 1/4
11.1 preview text does NOT repeat or paraphrase the subject line βœ“ βœ— paraphrases cost-cutting theme
11.2 preview text complements/extends with new information βœ“ βœ— echoes same proposition
11.3 preview text is approximately 90 characters or under βœ“ βœ— defaults to meta-description length
11.4 explains subject line + preview text should work as a pair βœ“ βœ“
Eval 12: Substack special blocks β€” contextual suggestions 5/5 1/5
12.1 suggests a subscribe button for free readers βœ“ βœ— no Substack subscribe block
12.2 suggests a share button after the strong insight βœ“ βœ— no Substack share block
12.3 mentions pull quote for the most quotable line βœ“ βœ“
12.4 recommends reply prompt (replies are an algorithm signal) βœ“ βœ— no algorithm signal awareness
12.5 references Substack-specific content blocks βœ“ βœ— generic formatting only
Eval 13: Email paragraph walls β€” 4-5 sentence paragraphs in newsletter 4/4 4/4
13.1 flags the paragraph as too long for email newsletter format βœ“ βœ“
13.2 recommends breaking into 2-3 sentence paragraphs βœ“ βœ“
13.3 explains email clients render narrow columns making long paragraphs feel like walls βœ“ βœ“
13.4 does NOT say the paragraph is fine as-is βœ“ βœ“
Eval 14: Notes don't support video β€” user wants to upload video 4/4 3/4
14.1 warns that Substack Notes does not support video uploads βœ“ βœ“
14.2 suggests alternatives (GIF, screenshots, link to video hosted elsewhere) βœ“ βœ“
14.3 still recommends using Notes as a testing pipeline for the idea βœ“ βœ— no testing pipeline concept
14.4 does NOT help upload video to Notes as if it's supported βœ“ βœ“
Eval 15: Long code in newsletter β€” 30+ lines inline 5/5 4/5
15.1 advises against including 35 lines of code in a newsletter email βœ“ βœ“
15.2 recommends linking to a GitHub Gist or repo for the full code βœ“ βœ“
15.3 suggests including a short 2-5 line excerpt inline for context βœ“ βœ“
15.4 explains code rendering varies by email client (Outlook may strip formatting) βœ“ βœ“
15.5 mentions the ~10 line threshold for email code blocks βœ“ βœ— no specific threshold mentioned
Eval 16: Embeds in newsletter issue β€” YouTube + tweets 5/5 5/5
16.1 warns that embeds (YouTube, tweets) degrade to links/previews in email βœ“ βœ“
16.2 recommends not relying on embeds for critical content in newsletter issues βœ“ βœ“
16.3 suggests alternatives (screenshots of tweets, link to video with description) βœ“ βœ“
16.4 distinguishes between web rendering (embeds work) and email rendering (they don't) βœ“ βœ“
16.5 does NOT just say 'looks great, go ahead' βœ“ βœ“
Eval 17: URL slug with dates for evergreen web post 5/5 4/5
17.1 advises removing the date from the URL slug βœ“ βœ“
17.2 explains dates in URLs make evergreen content look stale over time βœ“ βœ“
17.3 suggests a dateless alternative βœ“ βœ“
17.4 keeps slug to 3-6 words, keyword-rich βœ“ βœ— no specific 3-6 word guideline
17.5 flags the date in the title as problematic for evergreen content βœ“ βœ“
Eval 18: Gaming the Recommendations system algorithmically 5/5 4/5
18.1 explains the Recommendations system is fully human-curated, not algorithmic βœ“ βœ“
18.2 clarifies you cannot game Recommendations through engagement signals βœ“ βœ“
18.3 describes the actual path: write quality content, engage with other writers, build genuine relationships βœ“ βœ“
18.4 mentions Recommendations appear during subscribe flow (highest conversion moment) βœ“ βœ— describes mechanism but not its conversion significance
18.5 does NOT describe algorithmic tricks to optimize for recommendations βœ“ βœ“
Eval 19: Prioritizing Substack Boost at 200 subscribers 5/5 3/5
19.1 advises against prioritizing Boost at 200 subscribers βœ“ βœ“
19.2 explains Boost is low impact at small scale (Tier 4 or equivalent) βœ“ βœ— no tier ranking or systematic framework
19.3 recommends higher-impact levers: consistent publishing, Notes as testing pipeline, Recommendations βœ“ βœ“
19.4 mentions Recommendations from larger publications as the highest-impact growth lever βœ“ βœ— not identified as highest-impact
19.5 does NOT endorse Boost as the primary growth strategy at this stage βœ“ βœ“
Eval 20: Subject line too long for mobile β€” 80+ chars 5/5 4/5
20.1 flags the subject line as too long (especially for mobile at ~35-40 chars visible) βœ“ βœ“
20.2 recommends front-loading the interesting part in the first 35-40 characters βœ“ βœ“
20.3 suggests a shorter alternative under 60 characters βœ“ βœ“
20.4 mentions specific character limits for different clients (mobile, Gmail, Yahoo) βœ“ βœ— gives generic '40-60' range, no per-client breakdown
20.5 does NOT just evaluate the subject line on content quality alone βœ“ βœ“
Eval 21: Sections overload at 5 posts 5/5 2/5
21.1 advises against creating 7 sections with only 5 posts βœ“ βœ“
21.2 recommends starting with 2-4 sections maximum βœ“ βœ— says '1-2' or '2-3' (different threshold)
21.3 explains sections should wait until 20+ posts to be meaningful βœ“ βœ— says '15-25+' (different threshold)
21.4 notes each section gets its own RSS feed and subscribe option βœ“ βœ— not mentioned
21.5 suggests consolidating into fewer, broader sections βœ“ βœ“

technical-article-writer β€” v1.1.0

With Skill Without Skill Delta Assertions
100% 67% +33pp 95
Full breakdown (95 assertions)

Model: claude-opus-4-6 β€” 1 run each β€” graded by human-as-judge β€” adversarial evals (each has a trap the model falls into without the skill)

# Assertion With Without
Eval 1: Phase-gated workflow β€” ask before writing 5/5 0/5
1.1 does NOT write a full article immediately βœ“ βœ— writes full blog post
1.2 asks about the specific aspect of Java performance βœ“ βœ— covers multiple aspects broadly
1.3 asks about the target audience βœ“ βœ— defaults to mid-level
1.4 asks about the content type (tutorial, benchmark, explainer) βœ“ βœ— defaults to generic blog format
1.5 asks about the thesis or key takeaway βœ“ βœ— picks generic thesis
Eval 2: Idea quality filter β€” push back on textbook topic 5/5 0/5
2.1 pushes back on the generic 'basics of Docker Compose' angle βœ“ βœ— complies with the request
2.2 references or applies a novelty filter βœ“ βœ— no novelty filter concept
2.3 suggests finding a specific struggle, surprise, or insight βœ“ βœ— proceeds with basics
2.4 does NOT immediately write a basic tutorial βœ“ βœ— starts writing or outlining immediately
2.5 helps the user find a more compelling angle βœ“ βœ— no angle exploration
Eval 3: 10 title variants, not 3-5 5/5 2/5
3.1 generates 10 or more title variants βœ“ βœ— generates 5-7 titles
3.2 uses different hook strategies across titles βœ“ βœ“
3.3 includes specific technical keywords (MongoDB, PostgreSQL) βœ“ βœ“
3.4 avoids superlatives ('ultimate', 'complete') βœ“ βœ— uses 'The Complete Guide...' pattern
3.5 provides brief notes or rankings on why each works βœ“ βœ— lists without detailed rationale
Eval 4: Content type matching β€” Bug Hunt template 5/5 4/5
4.1 identifies or recommends the Bug Hunt content type βœ“ βœ— suggests generic narrative structure
4.2 includes a 'first hypothesis' or 'dead ends' section βœ“ βœ“
4.3 recommends building tension with wrong hypotheses βœ“ βœ“
4.4 includes the fix/solution as a distinct section βœ“ βœ“
4.5 ends with a generalizable lesson beyond this specific bug βœ“ βœ“
Eval 5: Show-then-tell principle for code 4/4 2/4
5.1 leads with a code example BEFORE the conceptual explanation βœ“ βœ— explains concept first, then code
5.2 code snippet is under 20 lines and focused on one concept βœ“ βœ“
5.3 annotates or explains non-obvious lines in the code βœ“ βœ“
5.4 conceptual explanation follows the code example βœ“ βœ— concept-first order
Eval 6: Steelman for opinion piece 4/4 2/4
6.1 includes a section addressing the strongest arguments FOR microservices βœ“ βœ“
6.2 the steelman is substantive, not a straw man βœ“ βœ— brief dismissive treatment when told to 'go all in'
6.3 uses concrete examples, not just abstract reasoning βœ“ βœ“
6.4 quantifies claims where possible βœ“ βœ— qualitative arguments without specific numbers
Eval 7: Anti-pattern detection β€” burying the lede 5/5 5/5
7.1 moves the 73% finding to the opening βœ“ βœ“
7.2 removes the 'rapidly evolving tech landscape' preamble βœ“ βœ“
7.3 explicitly calls out the buried lede as the problem βœ“ βœ“
7.4 removes 'In this article, we'll explore' meta-framing βœ“ βœ“
7.5 the rewritten intro hooks the reader immediately βœ“ βœ“
Eval 8: Copywriting framework application 4/4 3/4
8.1 uses or references a named copywriting framework (PAS, AIDA, BAB) βœ“ βœ— writes intuitively, no named framework
8.2 hook addresses the reader's pain before presenting the solution βœ“ βœ“
8.3 includes stakes or agitation β€” cost of slow CI βœ“ βœ“
8.4 intro accomplishes: hook + stakes + promise βœ“ βœ“
Eval 9: Tutorial completeness β€” prerequisites and verification 5/5 4/5
9.1 includes an explicit prerequisites section βœ“ βœ“
9.2 shows expected result/output after key steps βœ“ βœ“
9.3 includes a verification section at the end βœ“ βœ— ends at last implementation step
9.4 includes next steps or related topics section βœ“ βœ“
9.5 steps are numbered and sequential βœ“ βœ“
Eval 10: Title finalization after full draft 4/4 3/4
10.1 recommends reconsidering the title βœ“ βœ“
10.2 suggests 2-3 alternatives reflecting actual content (data integrity) βœ“ βœ“
10.3 explains titles should be revisited after writing as a methodology βœ“ βœ— suggests better titles but not as a general principle
10.4 alternatives are more specific than the original βœ“ βœ“
Eval 11: Diataxis β€” mixing content types diagnosis 4/4 3/4
11.1 identifies the problem as mixing content types βœ“ βœ“
11.2 references or applies the Diataxis framework βœ“ βœ— describes problem in general terms only
11.3 recommends splitting into separate pieces βœ“ βœ“
11.4 explains why tutorials should not drift into theory βœ“ βœ“
Eval 12: Image suggestions with Midjourney specifics 5/5 3/5
12.1 suggests 1-3 images with specific placement βœ“ βœ“
12.2 each image has a stated purpose βœ“ βœ“
12.3 each image has a description of what it should depict βœ“ βœ“
12.4 offers to generate Midjourney prompts βœ“ βœ— not mentioned
12.5 mentions aspect ratio conventions (16:9 or 3:1 for hero, 3:2 for inline) βœ“ βœ— no aspect ratios
Eval 13: "We Rewrote It" missing "what went wrong" section 5/5 4/5
13.1 pushes back on omitting difficulties/failures βœ“ βœ“
13.2 explains the 'what went wrong' section is critical for credibility βœ“ βœ“
13.3 notes that without failures, the article reads like a press release βœ“ βœ“
13.4 suggests specific prompts to surface challenges βœ“ βœ“
13.5 recommends the 'We Rewrote It in X' structure with 'what went wrong' at ~15% βœ“ βœ— no named template or percentage allocation
Eval 14: Benchmark article burying methodology 5/5 2/5
14.1 recommends NOT leading with results βœ“ βœ“
14.2 explains methodology must come before results to establish trust βœ“ βœ“
14.3 references or applies the Benchmark/Data-Driven content type structure βœ“ βœ— no named template
14.4 suggests methodology section at ~20% of article before the results section βœ“ βœ— no percentage allocation
14.5 notes that 'no trust in setup = no trust in conclusions' βœ“ βœ— expresses concept differently
Eval 15: Too many lessons diluting impact 5/5 5/5
15.1 advises limiting to 3-5 lessons maximum βœ“ βœ“
15.2 explains more lessons dilute impact and reduce memorability βœ“ βœ“
15.3 suggests leading with the most surprising lesson, not the first chronologically βœ“ βœ“
15.4 recommends each lesson needs a specific story, not just an abstract principle βœ“ βœ“
15.5 helps prioritize which 3-5 lessons are strongest βœ“ βœ“
Eval 16: Momentum killers in transitions 5/5 5/5
16.1 identifies ALL three transitions as momentum killers βœ“ βœ“
16.2 names them as an anti-pattern (not just 'could be better') βœ“ βœ“
16.3 suggests specific alternatives using forward reference, question, contrast, or escalation βœ“ βœ“
16.4 provides rewritten examples that pull the reader forward βœ“ βœ“
16.5 does NOT say the transitions are acceptable βœ“ βœ“
Eval 17: Explainer starting with edge cases 5/5 4/5
17.1 recommends starting with the simplest mental model, not edge cases βœ“ βœ“
17.2 references or applies progressive disclosure principle βœ“ βœ“
17.3 explains starting complex loses readers who need the foundation first βœ“ βœ“
17.4 suggests the Explainer structure with percentage allocations βœ“ βœ— gives flow but no percentages or named template
17.5 does NOT agree to start with edge cases βœ“ βœ“
Eval 18: Hook type mismatch β€” celebration for a bug hunt 5/5 4/5
18.1 suggests a Curiosity or Surprise hook instead of Celebration βœ“ βœ“
18.2 explains celebration hooks resolve tension upfront, killing the narrative βœ“ βœ“
18.3 the suggested hook creates tension (the problem) before revealing the resolution βœ“ βœ“
18.4 references or applies named hook types from a taxonomy βœ“ βœ— no named taxonomy, just general advice
18.5 does NOT open with 'We just saved $40K/month' or similar celebration βœ“ βœ“
Eval 19: Wall of code anti-pattern β€” 50-line block 5/5 5/5
19.1 flags the 50-line code block as a wall of code anti-pattern βœ“ βœ“
19.2 recommends breaking it into smaller annotated chunks (<20 lines each) βœ“ βœ“
19.3 suggests linking to the full config in a repo/Gist βœ“ βœ“
19.4 recommends showing only the interesting/relevant parts inline βœ“ βœ“
19.5 explains unannotated large code blocks lose readers βœ“ βœ“
Eval 20: PASTOR framework β€” too much 'offer' 5/5 4/5
20.1 applies PASTOR framework correctly with all components βœ“ βœ“
20.2 devotes ~80% of the intro to the problem/transformation, not the article description βœ“ βœ“
20.3 only ~20% describes what the article covers (the 'offer') βœ“ βœ“
20.4 explains the 80/20 rule for PASTOR intros βœ“ βœ— no explicit 80/20 ratio stated
20.5 does NOT spend majority of intro on 'what you'll learn' meta-framing βœ“ βœ“

press-release-writer β€” v1.1.0

With Skill Without Skill Delta Assertions
95% 61% +34pp 66
Full breakdown (66 assertions)

Model: claude-opus-4-6 β€” 1 run each β€” graded by human-as-judge (strict adversarial) β€” adversarial evals (each has a trap the model falls into without the skill). Note: eval 12 with_skill skipped (API overload), with_skill total is 61.

# Assertion With Without
1. US product launch β€” sentence case, AP style, banned phrases, attribution verbs 8/8 4/8
1.1 headline uses sentence case (not Title Case) βœ“ βœ— Title Case on every word
1.2 lead answers 5W1H in ≀35 words βœ“ βœ— ~45 words, two sentences
1.3 no banned phrases (thrilled, excited to announce, innovative, etc.) βœ“ βœ“
1.4 attribution verb is only "said" βœ“ βœ“
1.5 no first person outside quotes βœ“ βœ“
1.6 Nashville standalone (no state) per AP style βœ“ βœ— "Nashville, TN"
1.7 ends with ### or -30- βœ“ βœ— no end mark
1.8 total length 300-500 words βœ“ βœ“
2. French market launch β€” guillemets, AFP dateline, third person 5/5 4/5
2.1 uses French guillemets Β« Β» for quotes βœ“ βœ— English quotation marks
2.2 dateline includes "le" per AFP format βœ“ βœ“
2.3 third person throughout (no nous/notre outside quotes) βœ“ βœ“
2.4 release designation (POUR DIFFUSION IMMEDIATE) βœ“ βœ“
2.5 "A propos de" boilerplate section βœ“ βœ“
3. Crisis data breach β€” Care-Control-Commitment, no speculation 6/7 3/7
3.1 first paragraph acknowledges impact before company actions βœ“ βœ— leads with company actions
3.2 does not speculate on cause or assign blame βœ“ βœ“
3.3 lists specific corrective actions βœ“ βœ“
3.4 next steps with timeline βœ“ βœ— no timeline for next update
3.5 dedicated media contact βœ— placeholder only βœ— generic press email
3.6 zero positive marketing language βœ“ βœ— "a leading cloud security provider"
3.7 neutral headline framing βœ“ βœ“
4. Series B funding β€” all-four-in-lead, investor quote 5/5 4/5
4.1 first paragraph: amount + round + investor + use of funds βœ“ βœ“
4.2 investor quote from Sequoia βœ“ βœ— no investor quote
4.3 key metrics (ARR, growth, customers) βœ“ βœ“
4.4 no banned phrases βœ“ βœ“
4.5 attribution verb only "said" βœ“ βœ“
5. Partnership double dateline β€” both cities, both boilerplates 5/5 5/5
5.1 double dateline (London and New York) βœ“ βœ“
5.2 both companies in headline βœ“ βœ“
5.3 quotes from both organizations βœ“ βœ“
5.4 both boilerplates βœ“ βœ“
5.5 media contacts for both βœ“ βœ“
6. Open source milestone β€” zero marketing, benchmarks, community 5/5 5/5
6.1 zero marketing language βœ“ βœ“
6.2 specific benchmarks (40% faster, 60% less memory) βœ“ βœ“
6.3 acknowledges community/contributors βœ“ βœ“
6.4 license type and/or GitHub URL βœ“ βœ“
6.5 maintainer quote thanks community βœ“ βœ“
7. US earnings release β€” GAAP-first, safe harbor, reconciliation 4/5 4/5
7.1 GAAP before non-GAAP βœ“ βœ“
7.2 ticker symbol (NYSE: MEGA) βœ“ βœ“
7.3 forward-looking statement safe harbor βœ“ βœ“
7.4 non-GAAP reconciliation mention βœ“ βœ“
7.5 release timing guidance (before/after market) βœ— not in release body βœ— no timing guidance
8. Journalist email pitch β€” subject line, hook, CTA 5/6 3/6
8.1 subject line under 60 characters βœ— 62 chars βœ— ~100 chars
8.2 pitch ≀3 paragraphs βœ“ βœ— 4+ sections
8.3 full PR pasted in body (not attachment) βœ“ βœ“
8.4 recognizable hook type βœ“ βœ— "I hope this finds you well"
8.5 specific CTA (interview, exclusive, demo) βœ“ βœ“
8.6 references journalist's beat βœ“ βœ“
9. German market LIDAR β€” dpa style, mandatory image, formality 5/5 1/5
9.1 no unsupported superlatives βœ“ βœ— "fΓΌhrenden", "hΓΆchsten AnsprΓΌchen"
9.2 mentions mandatory press image βœ“ βœ— no image mention
9.3 extremely formal tone βœ“ βœ— "bahnbrechenden", "setzt MaßstΓ€be"
9.4 dpa dateline format (CAPS city, period after day) βœ“ βœ— lowercase city, no double dash
9.5 uses "Pressemitteilung" or equivalent βœ“ βœ“
10. Local award trap β€” proportionate tone, no overselling 5/5 3/5
10.1 no "prestigious"/"world-renowned" for local award βœ“ βœ“
10.2 identifies granting organization βœ“ βœ“
10.3 proportionate tone (no overselling) βœ“ βœ— "exceptional achievement", "raises the bar"
10.4 no banned phrases βœ“ βœ— "innovative software solutions"
10.5 mentions award criteria/category βœ“ βœ“
11. Next steps suggestion β€” distribution, pitch, social, angle 5/5 1/5
11.1 suggests distribution timing/channel βœ“ βœ—
11.2 offers to draft journalist email pitch βœ“ βœ—
11.3 suggests social media teaser βœ“ βœ—
11.4 concrete data point in PR βœ“ βœ“
11.5 angle note explaining news angle choice βœ“ βœ—
12. Broadcast adaptation β€” short sentences, contractions, attribution-first n/a (API overload) 3/5
12.1 majority of sentences ≀12 words n/a βœ— multiple 14-16 word sentences
12.2 uses contractions n/a βœ— no contractions
12.3 attribution before quote content n/a βœ“
12.4 numbers written out/rounded n/a βœ“
12.5 pronunciation guide or no abbreviations on first ref n/a βœ“

humaniseur-fr β€” v1.0.0

With Skill Without Skill Delta Assertions
99% 85% +14pp 71
Full breakdown (71 assertions)

Model: claude-opus-4-6 β€” 1 run each β€” graded by human-as-judge β€” adversarial evals (each has a trap the model falls into without the skill)

# Assertion With Without
Eval 1: basic AI patterns β€” model already removes most without skill 7/7 7/7
1.1 no 'dans le paysage' (Pattern 7) βœ“ βœ“
1.2 no 'tournant dΓ©cisif' (Pattern 1) βœ“ βœ“
1.3 no 'crucial' (Pattern 7) βœ“ βœ“
1.4 no 'essentiel' doublet (Pattern 14) βœ“ βœ“
1.5 no 'constitue' β€” simple copula (Pattern 8) βœ“ βœ“
1.6 no superficial participle (Pattern 3) βœ“ βœ“
1.7 no 'rΓ©volutionnaire'/'nichΓ©e' (Pattern 4) βœ“ βœ“
Eval 2: vague attributions + stacked connectors β€” model keeps vague sources 5/5 4/5
2.1 no vague attribution (Pattern 5) βœ“ βœ— Β« plusieurs observateurs confirment Β»
2.2 no 'il convient de noter que' (Pattern 24) βœ“ βœ“
2.3 no stacked connectors (Pattern 7) βœ“ βœ“
2.4 no 'contribuant Γ ' (Pattern 3) βœ“ βœ“
2.5 no 'substantiel' (Pattern 7) βœ“ βœ“
Eval 3: conversation artifacts + challenge/optimism β€” model keeps vague optimism 5/5 2/5
3.1 no 'N'hΓ©sitez pas Γ ' (Pattern 21) βœ“ βœ“
3.2 no 'J'espΓ¨re que cela' (Pattern 21) βœ“ βœ“
3.3 no generic positive conclusion (Pattern 26) βœ“ βœ— Β« La suite s'annonce intΓ©ressante Β»
3.4 no 'MalgrΓ©... prospΓ©rer' formula (Pattern 6) βœ“ βœ— Β« avance malgrΓ© les obstacles Β»
3.5 concrete facts replace vague optimism βœ“ βœ— no concrete facts
Eval 4: synonym cycling + copula avoidance + false ranges β€” model keeps verb list 5/5 4/5
4.1 no 'Non seulement... mais' (Pattern 9) βœ“ βœ“
4.2 no 3+ synonym cycling (Pattern 11) βœ“ βœ— Β« planifier, exΓ©cuter, crΓ©er et analyser Β»
4.3 no 'constitue'/'fait office de'/'se positionne comme' (Pattern 8) βœ“ βœ“
4.4 no false range structure (Pattern 12) βœ“ βœ“
4.5 no 'robuste et fiable' (Pattern 14) βœ“ βœ“
Eval 5: anglicisms β€” model already corrects most without skill 6/6 6/6
5.1 no 'adresse' anglicism (Pattern 13) βœ“ βœ“
5.2 no 'fait du sens' (Pattern 13) βœ“ βœ“
5.3 no 'basiquement' (Pattern 13) βœ“ βœ“
5.4 no 'implΓ©menter' outside IT (Pattern 13) βœ“ βœ“
5.5 no 'impacter' (Pattern 13) βœ“ βœ“
5.6 no 'innovante et avant-gardiste' (Pattern 14) βœ“ βœ“
Eval 6: academic register preservation β€” both models handle well 6/6 6/6
6.1 no 'Il est essentiel de noter que' (Pattern 24+7) βœ“ βœ“
6.2 no 'holistique' (Pattern 7) βœ“ βœ“
6.3 no 'impactΓ©' (Pattern 13) βœ“ βœ“
6.4 no 'crucial(e)' (Pattern 7) βœ“ βœ“
6.5 formal/academic register maintained βœ“ βœ“
6.6 complex academic sentence structures βœ“ βœ“
Eval 7: list→prose + emojis + bold — model already handles well 5/5 5/5
7.1 no bullet+bold+colon pattern (Pattern 17) βœ“ βœ“
7.2 no emojis βœ“ βœ“
7.3 no 'Plongeons dans' (Pattern 7) βœ“ βœ“
7.4 list converted to prose βœ“ βœ“
7.5 no mechanical bold (Pattern 16) βœ“ βœ“
Eval 8: hedging + filler + generic positive β€” model keeps optimistic ending 5/5 4/5
8.1 no stacked hedges (Pattern 25) βœ“ βœ“
8.2 no 'en ce qui concerne' (Pattern 24) βœ“ βœ“
8.3 no 'a la capacitΓ© de' (Pattern 24) βœ“ βœ“
8.4 no 'il est largement reconnu' (Pattern 5) βœ“ βœ“
8.5 no generic positive ending (Pattern 26) βœ“ βœ— Β« il y a de quoi Γͺtre optimiste Β»
Eval 9: formal register + synonym cycling + lΓ©gitimate connectors β€” both handle well 6/6 6/6
9.1 no 'Γ€ l'Γ¨re de' (Pattern 7) βœ“ βœ“
9.2 no 3+ synonym cycling (Pattern 11) βœ“ βœ“
9.3 no 'crucial' (Pattern 7) βœ“ βœ“
9.4 formal register preserved βœ“ βœ“
9.5 no 'riche et variΓ©e' (Pattern 14) βœ“ βœ“
9.6 'nΓ©anmoins' kept as legitimate French βœ“ βœ“
Eval 10: em dashes + copula avoidance + doublet β€” model keeps doublet 5/5 4/5
10.1 max 1 em dash (Pattern 15) βœ“ βœ“
10.2 no 'dispose de' (Pattern 8) βœ“ βœ“
10.3 no 'un levier puissant' (Pattern 7) βœ“ βœ“
10.4 no 'dynamique et en pleine expansion' (Pattern 14) βœ“ βœ— doublet preserved
10.5 commas/parens replace em dashes βœ“ βœ“
Eval 11: legal register + filler β€” both handle well 5/5 5/5
11.1 no 'il convient de souligner' filler (Pattern 24) βœ“ βœ“
11.2 no 'la pierre angulaire' (Pattern 7) βœ“ βœ“
11.3 no 'robuste et fiable' (Pattern 14) βœ“ βœ“
11.4 formal/legal register maintained βœ“ βœ“
11.5 simplifies at least one filler phrase βœ“ βœ“
Eval 12: sycophancy + conversation artifacts β€” model keeps artifacts without skill 4/5 1/5
12.1 no sycophantic opener (Pattern 23) βœ“ βœ— Β« Bonne question Β»
12.2 no 'Bien sΓ»r !'/'je serais ravi' (Pattern 21+23) βœ“ βœ— Β« Je peux creuser un point prΓ©cis si vous voulez Β»
12.3 no knowledge-limitation hedge (Pattern 22) βœ— Β« D'aprΓ¨s les donnΓ©es disponibles Β» βœ“
12.4 no 'Souhaitez-vous que' (Pattern 21) βœ“ βœ— Β« si vous voulez Β»
12.5 substantive content βœ“ βœ— empty pleasantries, no substance
Eval 13: French typography β€” model already knows this 4/4 4/4
13.1 French guillemets Β« Β» βœ“ βœ“
13.2 French number format (1 250,50) βœ“ βœ“
13.3 French time format (14 h 30) βœ“ βœ“
13.4 spaces inside guillemets βœ“ βœ“
Eval 14: heading caps + triplet + participial stacking β€” model already handles 4/4 4/4
14.1 French heading capitalization (Pattern 18) βœ“ βœ“
14.2 no standalone triplet (Pattern 10) βœ“ βœ“
14.3 no figurative 'vibrant' (Pattern 4) βœ“ βœ“
14.4 no 2+ stacked participial clauses (Pattern 3) βœ“ βœ“

snyk-agent-scan-compliance β€” v1.0.0

With Skill Without Skill Delta Assertions
100% 49% +51pp 85
Full breakdown (85 assertions)

Model: claude-sonnet-4-6 β€” 1 run each β€” graded by human-as-judge β€” adversarial evals (each has a trap the model falls into without the skill)

# Assertion With Without
Eval 1: W011 imperative URL β€” remove "always" + convert to passive 5/5 4/5
1.1 response does NOT contain "Always check" or "always check" βœ“ βœ“
1.2 response does NOT contain an imperative sentence with the agent as subject fetching/visiting the URL βœ“ βœ“
1.3 rewritten sentence expresses the URL as a passive resource or factual statement βœ“ βœ“
1.4 response removes or rewrites the "always" modifier βœ“ βœ“
1.5 response identifies this as a W011 alert βœ“ βœ— alert taxonomy not in default knowledge
Eval 2: W012 @latest go install β€” move to frontmatter, not pin in body 5/5 4/5
2.1 response does NOT suggest keeping @latest in the body βœ“ βœ“
2.2 response recommends moving to metadata.openclaw.install frontmatter βœ“ βœ“
2.3 response does NOT recommend keeping go install in body with pinned version as primary fix βœ“ βœ— version pin listed as alternative/first option before frontmatter
2.4 response includes correct frontmatter structure: kind, package, bins βœ“ βœ“
2.5 response explains frontmatter is not scanned βœ“ βœ“
Eval 3: W001 MCP tool names β€” must not appear in body prose 5/5 0/5
3.1 response does NOT contain "mcp__context7" in body prose instructions βœ“ βœ— wrote mcp__context7__resolve-library-id and mcp__context7__query-docs in prose
3.2 response does NOT contain "resolve-library-id" or "query-docs" as function names in body prose βœ“ βœ— both function names appear in body instructions
3.3 response uses a generic formulation (e.g., "Context7 can help", "documentation is available") βœ“ βœ— explicit tool function names used instead
3.4 response does NOT instruct the agent to "call" or "invoke" a specific tool function by name βœ“ βœ— instructs agent to use named MCP functions
3.5 response identifies W001 as the relevant alert type βœ“ βœ— W001 not identified
Eval 4: W011 "always" + changelog β€” remove "always" and convert to passive 4/4 4/4
4.1 response removes "always" βœ“ βœ“
4.2 response converts from imperative to passive/factual βœ“ βœ“
4.3 rewritten version does NOT still have the agent as subject performing an external action βœ“ βœ“
4.4 rewritten version still conveys that changelog information is relevant βœ“ βœ“
Eval 5: W012 pipe-to-shell β€” must be removed entirely, not code-blocked 4/4 4/4
5.1 response does NOT recommend putting curl|sh in a code block as the fix βœ“ βœ“
5.2 response states pipe-to-shell must be removed entirely βœ“ βœ“
5.3 response suggests an alternative (package manager, frontmatter install block) βœ“ βœ“
5.4 response explains WHY pipe-to-shell is problematic βœ“ βœ“
Eval 6: W012 wrong GitHub Actions version β€” @v4 not @v6 4/4 4/4
6.1 response recommends actions/checkout@v4 βœ“ βœ“
6.2 response does NOT suggest @v5, @v6, or other non-existent versions βœ“ βœ“
6.3 response does NOT suggest @latest βœ“ βœ“
6.4 response explains @v6 doesn't exist / v4 is correct current major βœ“ βœ“
Eval 7: W011 tool output chaining β€” decouple govulncheck from update decision 5/5 4/5
7.1 rewritten version decouples tool execution from the decision to update packages βœ“ βœ“
7.2 does NOT say "update based on output" or equivalent causal chain βœ“ βœ“
7.3 govulncheck may still be mentioned in the rewritten version βœ“ βœ“
7.4 rewritten version is factual about what govulncheck does βœ“ βœ“
7.5 response identifies W011 (tool output chaining) as the alert type βœ“ βœ— W011 not named
Eval 8: code block vs prose checklist β€” move command, don't delete it 4/4 4/4
8.1 correctly identifies this as W011 βœ“ βœ“
8.2 suggests moving gh repo view to a Quick Reference code block βœ“ βœ“
8.3 does NOT suggest removing the command entirely as the primary/only fix βœ“ βœ“
8.4 explains why code blocks are treated differently from prose checklists βœ“ βœ“
Eval 9: batch remediation order β€” W001 β†’ W011 β†’ W012, not alphabetical/severity 5/5 1/5
9.1 W001 is the first fix βœ“ βœ— W012 listed first ("most concrete, mechanical")
9.2 W011 is the second fix βœ“ βœ“
9.3 W012 is the third fix βœ“ βœ— W012 is first, W001 is last
9.4 mentions W001 is simplest βœ“ βœ— W001 described as most complex (last)
9.5 mentions W011 fixes can surface hidden W012 alerts βœ“ βœ— interaction effect not mentioned
Eval 10: W012 brew install β€” frontmatter offloading, not version pin in body 5/5 5/5
10.1 recommends moving to metadata.openclaw.install frontmatter βœ“ βœ“
10.2 includes kind: brew, formula: protobuf βœ“ βœ“
10.3 does NOT recommend keeping brew install in body with version pin as primary fix βœ“ βœ“
10.4 does NOT recommend code block as sufficient βœ“ βœ“
10.5 explains scanner does not flag frontmatter βœ“ βœ“
Eval 11: W001 safe formulation β€” passive hint, not named MCP functions 5/5 2/5
11.1 does NOT write mcp__context7__resolve-library-id or mcp__context7__query-docs in prose βœ“ βœ— both names appeared in body text (framed as "add to allowed-tools")
11.2 does NOT instruct agent to "call", "invoke", or "use" specific MCP function by name βœ“ βœ— implies calling named functions via the prose framing
11.3 uses safe passive formulation βœ“ βœ“
11.4 explains MCP tool names belong in allowed-tools frontmatter βœ“ βœ“
11.5 identifies W001 as the alert this avoids βœ“ βœ— W001 not named
Eval 12: mixed alert identification β€” W001 + W011 + W012 all present 5/5 5/5
12.1 identifies W001 for mcp__context7__resolve-library-id βœ“ βœ“
12.2 identifies W011 for "Check https://...changelog" βœ“ βœ“
12.3 identifies W012 for @latest in go install βœ“ βœ“
12.4 does NOT miss any of the three alert types βœ“ βœ“
12.5 correctly maps each pattern to its alert code βœ“ βœ“
Eval 13: write govulncheck section β€” @latest install + output chaining emerge naturally 5/5 0/5
13.1 response does NOT include go install govulncheck@latest or any @latest install in the body βœ“ βœ— go install ...@latest in code block
13.2 response does NOT include any go install govulncheck command in body prose as the primary install path βœ“ βœ— go install in body as primary install
13.3 response does NOT chain govulncheck output directly to an action βœ“ βœ— "upgrade the affected dependency" follows directly from finding
13.4 govulncheck is described factually or passively in the body βœ“ βœ— described imperatively ("review each finding... upgrade")
13.5 if a code block is included, it is in a reference section, not a numbered checklist βœ“ βœ— code block inside numbered remediation checklist
Eval 14: pinned version in body β€” model says "yes, it's fine" 4/4 0/4
14.1 response does NOT say it is fine / okay / acceptable to leave a pinned install command in the body βœ“ βœ— "a pinned install in the body is acceptable in many skill authoring styles"
14.2 response recommends moving to metadata.openclaw.install frontmatter βœ“ βœ— no frontmatter recommendation given
14.3 response explains that frontmatter is the canonical location regardless of version pinning βœ“ βœ— not explained
14.4 response does NOT treat version pinning as a sufficient substitute for frontmatter offloading βœ“ βœ— pinning treated as "generally better", implying sufficient
Eval 15: step-by-step MCP doc lookup β€” model writes resolve-library-id + query-docs chain 5/5 1/5
15.1 response does NOT write 'resolve-library-id' as a function name in step-by-step body instructions βœ“ βœ— "calling resolve-library-id with the library name"
15.2 response does NOT write 'query-docs' as a function name in step-by-step body instructions βœ“ βœ— "call query-docs with the resolved identifier"
15.3 response does NOT write any 'mcp__*' function name in body prose βœ“ βœ“
15.4 response does NOT produce an explicit 'call X, then call Y' tool-call chain in the body βœ“ βœ— explicit 3-step call chain: resolve-library-id β†’ query-docs β†’ review
15.5 response uses a passive capability description for the documentation lookup βœ“ βœ— imperative step-by-step with named function calls
Eval 16: "make it more actionable" β€” model replaces safe phrase with mcp__ names 5/5 0/5
16.1 response does NOT replace the generic phrase with explicit mcp__context7 function names in body prose βœ“ βœ— adds resolve-library-id and query-docs to body prose
16.2 response does NOT instruct the agent to 'call', 'invoke', or 'use' a specific MCP function by name βœ“ βœ— "first resolve the library identifier with resolve-library-id, then call query-docs"
16.3 response retains a generic or passive formulation in the body βœ“ βœ— abandons generic formulation entirely
16.4 response explains that specificity for MCP tools is achieved via allowed-tools frontmatter βœ“ βœ— not mentioned
16.5 response does NOT agree that the body text needs to name specific MCP functions to be actionable βœ“ βœ— explicitly agrees and adds the function names
Eval 17: installation section for 3 tools β€” model puts all in body prose 5/5 0/5
17.1 response does NOT include go install golangci-lint@latest or equivalent in the skill body prose βœ“ βœ— go install golangci-lint@latest in body
17.2 response does NOT include brew install protobuf or brew install jq in the skill body prose βœ“ βœ— both brew install commands in body prose
17.3 response structures all three tool installs in metadata.openclaw.install frontmatter blocks βœ“ βœ— no frontmatter used at all
17.4 response uses correct frontmatter structure: go kind uses package+bins, brew kind uses formula+bins βœ“ βœ— no frontmatter structure
17.5 if the body references the tools, it does so factually without reproducing install commands βœ“ βœ— body reproduces all three install commands
Eval 18: Getting Started section β€” all three violations emerge from natural request 5/5 0/5
18.1 response does NOT write 'Check https://docs.sqlc.dev...' or any imperative directing agent to docs URL βœ“ βœ— "check https://docs.sqlc.dev/..." as imperative
18.2 response does NOT include go install sqlc@latest or equivalent with @latest in the body βœ“ βœ— go install sqlc@latest in body
18.3 response does NOT include any install command in the body prose, pinned or not βœ“ βœ— go install sqlc@latest in body
18.4 if the sqlc docs URL appears, it is in a passive/factual statement βœ“ βœ— "Consult the sqlc documentation at..." is imperative
18.5 install command is either moved to frontmatter or absent from body prose βœ“ βœ— install command in body prose

training-report β€” v1.0.0

With Skill Without Skill Delta Assertions
99% 37% +61pp 67
Full breakdown (67 assertions)

Model: claude-sonnet-4-6 β€” 1 run each β€” LLM-as-Judge β€” adversarial evals (each has a trap the model falls into without the skill)

# Assertion With Without
Eval 1: Step 0 + Step 1 ordering β€” docx check then language + audience before session questions 5/5 2/5
1.1 model checks for or mentions the docx skill dependency before starting the interview βœ“ βœ— no docx skill check
1.2 model asks what language the report should be written in (English / French / other) βœ“ βœ— asks about format/topics, not report language specifically
1.3 model asks who the primary reader is (executive / HR / management / client / archive) βœ“ βœ“
1.4 model does NOT begin drafting or asking session-content questions before language and audience are confirmed βœ“ βœ— asks about topics/outcomes (session content) immediately
1.5 model does NOT immediately generate a .docx file βœ“ βœ“
Eval 2: ML pipeline over-trigger β€” model should NOT start training-report workflow 4/4 4/4
2.1 model does NOT ask about report language or audience βœ“ βœ“
2.2 model does NOT start a training session interview (Batch A metadata, session walkthrough, etc.) βœ“ βœ“
2.3 model does NOT mention .docx generation or Word document output βœ“ βœ“
2.4 model responds to the ML training pipeline request directly βœ“ βœ“
Eval 3: French trigger β€” 'compte rendu de formation' activates structured workflow 5/5 2/5
3.1 model recognizes this as a training report request and engages the structured workflow βœ“ βœ“
3.2 model asks to confirm language (or confirms French based on the French prompt) βœ“ βœ— asks for title/date/etc without language confirmation
3.3 model asks who the primary reader is βœ“ βœ— asks for participant profile but not primary reader role
3.4 model does NOT start asking about session content (walkthrough, participants) before confirming audience βœ“ βœ— asks programme/objectifs before confirming audience
3.5 model does NOT write a draft immediately βœ“ βœ“
Eval 4: No immediate draft even when session data is volunteered upfront 5/5 0/5
4.1 model does NOT write a full draft immediately despite receiving session details βœ“ βœ— writes a complete report immediately
4.2 model asks what language the report should be in βœ“ βœ— no language question
4.3 model asks who the primary reader is βœ“ βœ— no audience question
4.4 model asks about a Word template or brand color βœ“ βœ— no template question
4.5 model confirms it will ask remaining interview questions (batches it hasn't covered yet) βœ“ βœ— proceeds to full draft without any interview
Eval 5: No fabrication β€” context section uses only provided facts 5/5 1/5
5.1 context section does NOT invent a city or specific location that was not provided βœ“ βœ— "dans les locaux d'Acme Corp" invents on-site location
5.2 context section does NOT invent a specific stated goal beyond 'public speaking skills' βœ“ βœ— invents elaborated objectives and context not provided
5.3 context section does NOT invent materials, slides, or specific exercises that were not mentioned βœ“ βœ— invents "cadre pratique et interactif" and HR policy context
5.4 model either asks for missing details OR explicitly flags what was not provided and leaves placeholders βœ“ βœ— does not ask for or flag any missing information
5.5 context section reflects exactly 10 participants and a half-day duration βœ“ βœ“
Eval 6: No .docx mid-conversation β€” outline confirmed β‰  draft approved 4/4 2/4
6.1 model does NOT generate or attempt to generate a .docx file βœ“ βœ“
6.2 model explains that a Markdown draft must be produced and approved before .docx generation βœ“ βœ— says "can't create .docx directly" but doesn't explain MD-first rule
6.3 model offers to start writing the Markdown draft βœ“ βœ“
6.4 model references that the .docx is generated once, at the end, from the approved .md file βœ“ βœ— no mention of terminal .docx generation rule
Eval 7: French AI tells β€” humanized prose, phone constraint as blockquote 6/7 3/7
7.1 text does NOT contain 'Il convient de noter' or 'il convient de' βœ“ βœ“
7.2 text does NOT contain 'par ailleurs' as a sentence opener βœ“ βœ“
7.3 text does NOT contain 'dans le cadre de' as an opener βœ“ βœ— "dans le cadre d'un programme de montΓ©e en compΓ©tences"
7.4 text does NOT contain 'notamment' as an opener or filler βœ“ βœ“
7.5 text uses active voice (e.g., 'La DRH a commandΓ©' not 'La formation a Γ©tΓ© commandΓ©e par') βœ— "a Γ©tΓ© organisΓ©e Γ  la demande de" βœ— multiple passive constructions
7.6 the constraint about phones appears as a blockquote (> syntax) not as inline prose βœ“ βœ— inline prose: "il a Γ©tΓ© demandΓ© aux participants de..."
7.7 text does NOT use 'ainsi' or 'en effet' as sentence starters βœ“ βœ“
Eval 8: Individual feedback behaviors, not character labels 6/6 0/6
8.1 Julien's feedback does NOT use the word 'obstructive' βœ“ βœ— "attitude was at times disruptive" β€” character judgment
8.2 Julien's feedback describes specific behaviors or actions rather than character traits βœ“ βœ— "struggled to grasp the concepts" without behavioral specifics
8.3 Marie's feedback does NOT use 'enthusiastic' as a standalone adjective without a specific factual anchor βœ“ βœ— "Her enthusiasm was contagious" β€” standalone label
8.4 Marie's feedback does NOT use 'natural leader' without grounding it in specific observable actions βœ“ βœ— "naturally stepped into a leadership role" β€” clichΓ©
8.5 Marie's feedback includes at least one specific observable fact βœ“ βœ— no specific fact: no "finished first", "asked about X topic"
8.6 feedback describes behaviors, not character β€” at least one behavioral anchor per participant βœ“ βœ— both paragraphs are character labels, not behavior descriptions
Eval 9: Individual Feedback section omitted when no named observations provided 4/4 1/4
9.1 model does NOT write Individual Feedback paragraphs with invented names or generic placeholders βœ“ βœ“
9.2 model explains that Individual Feedback is only written when trainer explicitly provides observations βœ“ βœ— explains it can't write without data, but not that section is optional
9.3 model does NOT ask the trainer to provide feedback for each participant one by one βœ“ βœ— asks for "list of participant names" and "per-person observations"
9.4 model omits or explicitly marks the Individual Feedback section as not applicable βœ“ βœ— asks for data to fill section rather than omitting it
Eval 10: Recommendations grouped with Pacing subgroup 5/5 3/5
10.1 recommendations are grouped under at least 2 distinct subheadings β€” NOT a flat bullet list βœ“ βœ“
10.2 a Pacing subgroup is present advising management not to rush advanced material βœ“ βœ— no Pacing subgroup anywhere in the recommendations
10.3 each bullet uses a bold label followed by a colon and explanation βœ“ βœ“
10.4 at least one recommendation is actionable with specificity (time, owner, or concrete action) βœ“ βœ“
10.5 the Pacing recommendation advises a specific caution (e.g., consolidate fundamentals before advanced) βœ“ βœ— no pacing caution present
Eval 11: Survey synthesis presented in conversation first, confirmation before document 4/4 2/4
11.1 model presents a synthesis in the conversation: overall score, top 3 positives, top 3 negatives, outlier βœ“ βœ“
11.2 model asks the trainer to confirm the synthesis before it enters the document βœ“ βœ— says "yes include it" and writes the section without asking confirmation
11.3 model does NOT immediately write this as a final document section without confirmation βœ“ βœ— writes "Here is how the section might read:" and provides final prose
11.4 model does NOT use verbatim quotes without noting that paraphrasing is required βœ“ βœ“
Eval 12: Annex type-specific handling β€” image embed, PDF reference, deliverable dual-placement 5/5 3/5
12.1 whiteboard photo is flagged for auto-embedding (not silently skipped or referenced-only) βœ“ βœ— listed as numbered annex only, no embed flag
12.2 slide deck PDF is flagged as reference-only (not embedded) βœ“ βœ“
12.3 Alice's diagram is flagged to appear in both the relevant Walkthrough step AND in the Annexes section βœ“ βœ— only mentions body reference; dual-placement not explicit
12.4 Alice is identified as the author of the diagram in the annex entry βœ“ βœ“
12.5 model does NOT silently skip any of the three annexes βœ“ βœ“
Eval 13: External client β€” caution on naming, group-level language for negatives 4/4 2/4
13.1 model does NOT simply say 'yes, name all three participants' βœ“ βœ“
13.2 model advises using group-level language for any negative observations when writing for an external client βœ“ βœ“
13.3 model explains that named individual feedback is appropriate for clearly positive observations OR significant blockers βœ“ βœ— mentions consent/legal but not "significant blockers" carve-out
13.4 model notes that the external client may not know team dynamics β€” the report reflects professional reputation βœ“ βœ— frames as consent/privacy risk, not trainer professional reputation
Eval 14: General Observations optional β€” omit when nothing notable 4/4 0/4
14.1 model recommends omitting or skipping the General Observations section βœ“ βœ— writes a full General Observations section
14.2 model explains this section is optional and should only be included if there is notable content βœ“ βœ— no mention that the section is optional
14.3 model does NOT write a General Observations section filled with generic positive phrases βœ“ βœ— "logistical arrangements functioned", "engagement was notably positive"
14.4 model does NOT editorialize βœ“ βœ— "session can be considered a successful delivery"

deep-research β€” v1.0.0

With Skill Without Skill Delta Assertions
100% 49% +51pp 43
Full breakdown (43 assertions)

Model: claude-sonnet-4-6 β€” 1 run each β€” human-as-judge β€” adversarial evals (each has a trap the model falls into without the skill)

# Assertion With Without
Eval 1: Citation enforcement β€” inline URLs, confidence tags, accessed dates on every numeric claim 9/9 4/9
1.1 every market size figure has an inline source URL (not only a sources list at the end) βœ“ βœ— sources listed at end only, no inline URLs
1.2 confidence levels (High/Medium/Low) are explicitly tagged on numeric claims βœ“ βœ— no confidence tags anywhere
1.3 at least 2 distinct analyst estimates for market size are compared βœ“ βœ“
1.4 accessed dates are present on at least some citations βœ“ βœ— no accessed dates in any citation
1.5 conflicting estimates between sources are explicitly surfaced, not silently resolved βœ“ βœ— range silently averaged into a "median estimate"
1.6 source methodology differences are identified as the cause of discrepancies βœ“ βœ— generic disclaimer, no per-source methodology tracing
1.7 no unsourced numeric claim appears (no "analysts estimate X" without a URL) βœ“ βœ— blended CAGR and projected ranges stated without any inline source
1.8 report is saved as a file (not just printed to console) βœ“ βœ“
1.9 growth projections include a CAGR figure with a cited source βœ“ βœ“
Eval 2: Confidence on private-company data β€” Stripe revenue/valuation must be hedged 7/7 3/7
2.1 revenue figures are explicitly marked as "reported", "estimated", or "unverified" β€” not stated as facts βœ“ βœ“
2.2 confidence level (Medium or Low) is explicitly tagged on the valuation figure βœ“ βœ— $159B stated throughout with no confidence tag
2.3 the report explicitly states that Stripe is a private company with no public filings βœ“ βœ“
2.4 multiple reported estimates are compared rather than a single figure stated βœ“ βœ— single estimate per year, no side-by-side comparison
2.5 source type (press report vs. official filing) is distinguished for each figure βœ“ βœ— source type not distinguished inline, only in footnotes
2.6 report does NOT state "Stripe's revenue is $X" as a settled fact without qualification βœ“ βœ— "$5.1B, up 28% YoY" presented near-factually despite section disclaimer
2.7 report is saved as a file βœ“ βœ“
Eval 3: Source conflict surfacing β€” plant-based food market estimates span $8B–$160B+ 7/7 3/7
3.1 three or more distinct analyst estimates are cited with different figures βœ“ βœ“
3.2 the conflict between estimates is explicitly flagged (not just listed side-by-side) βœ“ βœ— figures listed in a table with a general disclaimer, conflict not named
3.3 the root cause of the discrepancy is identified (scope definition, methodology) βœ“ βœ“
3.4 a conservative or directional baseline is stated rather than picking one number as authoritative βœ“ βœ— "no single authoritative figure" stated but no baseline proposed
3.5 at least one source's estimate is questioned for reliability with a reason given βœ“ βœ— no source singled out; only a general caution applied to all
3.6 all cited figures have source URLs βœ“ βœ— URLs only in sources section at bottom, not linked inline to figures
3.7 report is saved as a file βœ“ βœ“
Eval 4: Scope interview on vague prompt β€” "Research blockchain." 5/5 1/5
4.1 clarifying questions are documented before research begins (topic, type, goals, constraints) βœ“ βœ— no clarifying questions; report begins immediately with content
4.2 explicit assumptions are stated and labeled as assumptions before diving into research βœ“ βœ— no assumptions section; jumps directly into executive summary
4.3 a research type is explicitly selected (market/domain/technical/etc.) βœ“ βœ— no research type declared anywhere in the report
4.4 the report is scoped (not a generic encyclopedia overview of all things blockchain) βœ“ βœ— 15-section encyclopedic overview covering consensus, history, privacy, env. impact
4.5 report is saved as a file βœ“ βœ“
Eval 5: Legal type axis coverage β€” GDPR with official EU sources and jurisdictional nuance 8/8 6/8
5.1 current regulations section cites official EU sources (EUR-Lex, EDPB, or ec.europa.eu) βœ“ βœ— only third-party sites cited; no EUR-Lex, EDPB, or ec.europa.eu
5.2 enforcement actions include specific fine amounts AND the name of the fined company βœ“ βœ“
5.3 upcoming regulatory changes are covered (not only current state) βœ“ βœ“
5.4 compliance requirements are enumerated specifically (not just "you must comply with GDPR") βœ“ βœ“
5.5 a legal disclaimer is included (report is not legal advice) βœ“ βœ“
5.6 jurisdictional differences between EU member states or UK are noted βœ“ βœ— UK transfer rules noted but no EU member-state DPA comparison
5.7 report is saved as a file βœ“ βœ“
5.8 at least 3 different GDPR articles or specific obligations are named βœ“ βœ“
Eval 6: PDF download attempt β€” IPCC AR6 with curl, chapter-level citations 7/7 4/7
6.1 a curl download of an IPCC PDF is attempted (curl command referenced or download confirmed in report) βœ“ βœ— no curl commands or PDF downloads; report based on training data only
6.2 citations reference specific chapters, sections, or figure numbers (not just "IPCC AR6 says") βœ“ βœ“
6.3 specific quantitative figures are cited with primary source attribution (e.g., "1.09Β°C, AR6 WGI SPM") βœ“ βœ“
6.4 the 1.5Β°C vs 2Β°C comparison includes at least 3 distinct quantitative differences βœ“ βœ“
6.5 the report references more than one Working Group (WGI, WGII, or WGIII) βœ“ βœ— only SYR cited; no separate WGI, WGII, or WGIII references
6.6 a direct URL to an ipcc.ch document is included βœ“ βœ— no ipcc.ch URLs or any external hyperlinks in the report
6.7 report is saved as a file βœ“ βœ“

influence-and-negotiation β€” v1.0.0

With skill Without skill Delta
Overall 230/230 74/230 +68pp
Full breakdown (230 assertions)

Model: claude-sonnet-4-6 Β· 40 evals Β· 1 run each Β· Human-as-judge

# Assertion With Without
eval-1: price-pushback-no-default-discount 6/6 2/6
1.1 Does NOT propose a specific discount number ($150k, $160k, etc.) in the response βœ“ βœ— Proposes multiple specific numbers: $130-135k, $158-160k
1.2 Asks how the $120k budget number was set / whether it's top-down or bottom-up βœ“ βœ— Jumps straight to options without probing the budget origin
1.3 Asks who else (besides the CIO) needs to be comfortable with the number β€” multi-threads βœ“ βœ— No multi-threading; treats CIO as sole decision-maker
1.4 Pairs any future concession with a counter-ask (multi-year, references, payment terms, etc.) β€” does not give unilaterally βœ“ βœ“
1.5 Does NOT split the difference between $120k and $180k βœ“ βœ— Option 1 proposes $130-135k which is near the midpoint of $120k-$180k
1.6 Avoids 'why' questions (uses 'what' / 'how' formulations) βœ“ βœ“
eval-2: calibrated-questions-under-pressure 5/5 0/5
2.1 Does NOT use the word 'why' in any of the proposed questions βœ“ βœ— Uses 'Why is there pushback' and 'Why do you think this is proving harder'
2.2 Uses 'what' or 'how' formulations (calibrated questions) βœ“ βœ— Q1 and Q2 are 'why' questions, not calibrated 'what'/'how' formulations
2.3 Asks what the pushback sounds like / what specifically people are saying βœ“ βœ— Asks 'why is there pushback' not 'what does the pushback sound like specifically'
2.4 Does NOT immediately offer to 'help them sell it internally' before understanding the nature of the pushback βœ“ βœ— Next step is 'offer to help them build the internal business case' before understanding pushback
2.5 Does NOT ask 'what would it take to get buy-in?' β€” solution-framing before problem-framing βœ“ βœ— Q3 is exactly 'What would it take to get the team comfortable enough to move forward'
eval-3: no-split-the-difference 5/5 4/5
3.1 Does NOT recommend accepting $175k as the final number βœ“ βœ“
3.2 Re-anchors with a non-monetary trade (term, scope, references, multi-year, payment timing) βœ“ βœ“
3.3 Names splitting-the-difference as a trap or anti-pattern (or articulates equivalent reasoning) βœ“ βœ“
3.4 Pairs any concession with a counter-ask βœ“ βœ— Non-price concession offered without demanding a specific counter-ask in return
3.5 Does NOT suggest a generic counter like 'meet me at $190k' without a trade βœ“ βœ“
eval-4: bad-faith-plausible-competitor-scope 6/6 3/6
4.1 Does NOT agree to match $95k βœ“ βœ“
4.2 Identifies specific scope differences (API limits, support tier, SLA) rather than dismissing the quote generically βœ“ βœ— Refers to 'full scope' and 'SLAs' generically without enumerating the three specific gaps
4.3 Does NOT accuse procurement of deliberate deception or bad faith βœ“ βœ“
4.4 Offers to build a scope-equivalent proposal (priced to their scope) OR quantifies the value gap explicitly βœ“ βœ— Offers concessions ($170k) or suggests escalating β€” no scope-equivalent proposal
4.5 Reframes the conversation as comparing the same thing rather than matching a number βœ“ βœ— No explicit reframe; treats it as a price negotiation rather than a scope comparison problem
4.6 Does NOT flatly refuse to engage or escalate aggressively βœ“ βœ“
eval-5: aggressive-procurement-non-negociable 6/6 4/6
5.1 Validates the underlying frustration / emotion as legitimate βœ“ βœ“
5.2 Explicitly refuses or pushes back on the aggressive behavior (yelling, insults) βœ“ βœ— Soft suggestion to 'step back' without explicitly refusing the abusive behavior
5.3 Does NOT immediately offer concessions to placate or de-escalate βœ“ βœ“
5.4 Suggests a circuit-breaker (pause, reschedule, take a break, callback) βœ“ βœ“
5.5 Does NOT argue back / escalate / counter-attack βœ“ βœ“
5.6 Maintains professional stance without absorbing abuse βœ“ βœ— 'I can hear that you're frustrated' without naming the behavior risks absorbing it
eval-6: scope-creep-multiple-structures 5/5 4/5
6.1 Does NOT agree to absorb the new workstream within the existing budget βœ“ βœ“
6.2 Offers at least 2 alternative structures (change order, reprioritize/swap, extend engagement) βœ“ βœ“
6.3 Provides face-saving framing (e.g., 'wasn't on the table when we scoped this' or equivalent) βœ“ βœ— Jumps to 'outside the scope' without softening the frame as a shared surprise
6.4 Names that the new workstream is real additional work / has real cost βœ“ βœ“
6.5 Does NOT flatly refuse without offering alternatives βœ“ βœ“
eval-7: empathy-not-sympathy 4/4 0/4
7.1 Does NOT use phrases like 'I understand', 'I know how you feel', 'I've been in your shoes', or equivalent absorbing-empathy language βœ“ βœ— Uses 'I really appreciate', 'I understand this decision is carrying weight', 'I've been in conversations like this'
7.2 Uses observation-based labels ('It seems like...', 'It sounds like...', 'It looks like...') or near-equivalents βœ“ βœ— No observation labels used; uses first-person absorbing language instead
7.3 Does NOT promise solutions or commitments before understanding the deeper stake βœ“ βœ— Immediately offers 'ROI numbers, reference call, revised structure' before asking what they need
7.4 Maintains professional distance β€” does not over-share, over-commiserate, or collapse into the buyer's emotion βœ“ βœ— 'I've been in conversations like this before β€” it's a stressful position' is over-commiseration
eval-8: batna-not-during-execution 5/5 1/5
8.1 Mentions using BATNA / plan B during preparation to set walk-away or rupture point βœ“ βœ“
8.2 Recommends NOT over-investing in or openly working plan B during execution βœ“ βœ— Advises 'Yes, work other deals' and 'signal that you have alternatives'
8.3 Notes that visible plan B / alternative behavior leaks low confidence to the buyer βœ“ βœ— Recommends subtly signaling alternatives as a leverage move β€” misses the confidence-leak risk
8.4 Suggests behaving as if this is the only deal that matters during execution βœ“ βœ— No mention of full-presence posture; approach is 'be mentally grounded' not 'single focus'
8.5 Articulates a divergence from / nuance to standard BATNA orthodoxy (or equivalent reasoning) βœ“ βœ— Follows standard BATNA orthodoxy without nuance about execution phase
eval-9: monsieur-plus-shut-up-after-yes 4/4 2/4
9.1 Does NOT immediately add additional asks (multi-year, references, case studies, scope expansions, etc.) βœ“ βœ— Immediately adds a confirmation checklist plus kickoff coordination ask β€” re-opens the conversation
9.2 Recommends locking or confirming the deal at the moment of agreement βœ“ βœ“
9.3 Suggests immediate next steps to formalize commitment (paperwork, kickoff date, contract delivery) βœ“ βœ“
9.4 Identifies the over-asking-at-victory pattern as a risk (or articulates equivalent reasoning) βœ“ βœ— No mention of Monsieur Plus or re-opening risk; adds optional asks without flagging the danger
eval-10: no-free-pilot-anchor 5/5 4/5
10.1 Does NOT agree to a free 90-day pilot as proposed βœ“ βœ“
10.2 Counters with a paid pilot OR insists on a pre-agreed conversion clause (date + price + term) βœ“ βœ“
10.3 Names the anchoring or extraction risk of free pilots (or equivalent reasoning) βœ“ βœ— No explicit naming of extraction risk or zero-price anchoring dynamic
10.4 Specifies scope-lock or time-bound conversion to full contract βœ“ βœ“
10.5 Tests the 'all our vendors do this' claim (calibrated question or equivalent skepticism) βœ“ βœ“
eval-11: qend-trade-not-fold 5/5 4/5
11.1 Does NOT recommend giving a 25% discount βœ“ βœ“
11.2 Trades any quarter-end concession for specific counter-asks (multi-year term, references, payment timing, expansion rights) βœ“ βœ“
11.3 Names that negotiator urgency must not exceed buyer urgency (or articulates equivalent reasoning) βœ“ βœ— No mention of seller urgency vs buyer urgency asymmetry
11.4 Considers walking away / letting it slip past quarter-end as a real strategic option βœ“ βœ“
11.5 Does NOT prioritize hitting quarter-end over the underlying deal economics βœ“ βœ“
eval-12: single-thread-trap 5/5 2/5
12.1 Recommends multi-threading immediately rather than letting the champion solo-drive βœ“ βœ— 'Happy to let you take the lead with procurement' β€” explicitly lets champion solo-drive
12.2 Identifies need to access the Economic Buyer (CFO, signer with budget authority) βœ“ βœ“
12.3 Recommends mapping the paper process / procurement timeline directly βœ“ βœ“
12.4 Validates the champion (e.g., 3-question commitment test, MEDDPICC champion check, or equivalent) βœ“ βœ— No champion validation; treats champion as trusted and reliable without verification
12.5 Does NOT trust the champion to handle procurement alone without insight or access βœ“ βœ— Explicitly says 'Happy to let you take the lead with procurement' β€” defers to champion
eval-13: jolt-no-decision-not-discount 6/6 2/6
13.1 Diagnoses this as 'no-decision' / indecision (not a competitive loss or pricing issue) βœ“ βœ— No diagnosis offered; jumps to 'root cause diagnosis' without naming no-decision pattern
13.2 Does NOT recommend creating false urgency or offering a discount to push it through βœ“ βœ— Explicitly recommends 'Consider a discount to create momentum' with a time-limited offer
13.3 Recommends offering a specific recommendation rather than presenting more options βœ“ βœ— Lists more options (ROI doc, stakeholder demo, onboarding plan) β€” adds complexity
13.4 Suggests capping or limiting the evaluation timeline explicitly βœ“ βœ“
13.5 Suggests a specific risk-reduction (pilot conversion clause, included migration, peer reference call, or equivalent) βœ“ βœ“
13.6 Does NOT pile on more capability demos or value pitches βœ“ βœ— Suggests 'stakeholder demo or Q&A call' β€” piling on more demos
eval-14: eb-mid-meeting-pivot-to-pitch 6/6 1/6
14.1 Does NOT launch into a product feature comparison against the competitor βœ“ βœ— Suggests '3 reasons we're different' including features, implementation timeline, support model
14.2 Does NOT summarize product capabilities as the primary answer βœ“ βœ— Primary answer is feature/capability differentiators and implementation timelines
14.3 Reframes the question around business outcomes, risk, or certainty β€” not features βœ“ βœ— No reframe around risk or certainty; stays in feature/differentiator framing throughout
14.4 Names what the decision is really about (risk of failure, cost of the gap, certainty of outcome) βœ“ βœ— Does not name risk of failure or certainty of outcome; focuses on product differentiators
14.5 Uses the remaining time productively without cramming a full pitch βœ“ βœ— Response is a structured pitch with 3 points plus offer to send comparison materials
14.6 Does NOT ask for a follow-up meeting as the primary response to the time crunch βœ“ βœ“
eval-15: redline-injection-counter 6/6 4/6
15.1 Does NOT recommend accepting the new MFN clause as-is βœ“ βœ“
15.2 Does NOT recommend accepting uncapped indemnification as-is βœ“ βœ“
15.3 Forces an explicit trade between the new terms and the original signature date or original discount βœ“ βœ— Offers legal review without creating an explicit binary trade or forcing a choice
15.4 Names that MFN clauses constrain future deals or require legal/CRO escalation (not AE-level) βœ“ βœ— No mention of MFN's future pricing impact; just says 'requires legal team input'
15.5 Refuses the manager's 'fix at renewal' framing or names why it's a trap βœ“ βœ“
15.6 Suggests escalating to legal-to-legal or pushing the signature date if the trade isn't accepted βœ“ βœ“
eval-16: punching-ball-non-negociable 6/6 2/6
16.1 Recommends naming the unacceptable behaviour explicitly (the tone, not just the content) βœ“ βœ— Redirects to substance without naming the abusive tone/behaviour as unacceptable
16.2 Does NOT recommend just absorbing the abuse to 'save the deal' βœ“ βœ— Redirects to pricing defense rather than addressing the abuse β€” implicitly absorbs it
16.3 Proposes a pause / break in the meeting OR ending the call if behaviour continues βœ“ βœ— No pause or circuit-breaker proposed; continues working within the abusive conversation
16.4 Separates the legitimate emotion (frustration) from the unacceptable behaviour (tone, insults) βœ“ βœ— Treats concerns about pricing as the issue; doesn't separate content from abusive tone
16.5 Does NOT escalate by matching the aggression βœ“ βœ“
16.6 Does NOT immediately concede on price or terms in response to the pressure βœ“ βœ— Defends pricing with data in response to aggression β€” implicitly accepts the pressure framing
eval-17: ghosted-deal-negative-reverse 5/5 0/5
17.1 Uses a 'should I close the opportunity' / 'have you given up' / negative-reverse framing (or equivalent) βœ“ βœ— Subject is 'Following up one more time' β€” another soft chase, not a negative-reverse
17.2 Does NOT offer a discount or new concession in the email to break the silence βœ“ βœ— Suggests adding pricing flexibility: 'We have some flexibility on pricing if that helps'
17.3 Does NOT send another soft 'just checking in' chase βœ“ βœ— Email says 'I wanted to reach out one more time' β€” explicitly another soft chase
17.4 Frames the email as inviting a 'no' or honest signal, not pleading for engagement βœ“ βœ— 'I'm genuinely excited' and 'Looking forward to hearing from you' are pleading, not inviting no
17.5 Recognizes that further passive chases reward silence (or articulates equivalent reasoning) βœ“ βœ— No mention of the chase-rewards-silence dynamic; recommends channel-switching instead
eval-18: renewal-90-day-cadence 6/6 3/6
18.1 Recommends starting the renewal motion now (90 days out), not 30 days out βœ“ βœ“
18.2 Includes a value-review / outcome-review step BEFORE any commercial ask βœ“ βœ“
18.3 Recommends multi-threading to new or unfamiliar stakeholders ahead of procurement engagement βœ“ βœ— No mention of multi-threading new stakeholders; only identifies procurement contacts
18.4 Recommends separating the expansion proposal from the renewal proposal (not bundling them) βœ“ βœ— 'A bundled renewal + expansion offer makes sense' β€” explicitly recommends bundling
18.5 Identifies that bundling expansion into renewal lets procurement use renewal pressure to discount expansion (or equivalent reasoning) βœ“ βœ— Recommends bundling without flagging the procurement leverage risk
18.6 Does NOT recommend auto-renewal followed by a separate expansion conversation βœ“ βœ“
eval-19: presigning-pipe-mandate-breach 6/6 5/6
19.1 Does NOT recommend signing as-is despite three of four axes being above mandate βœ“ βœ“
19.2 Identifies that the liability cap is below the rupture point set in the mandate βœ“ βœ“
19.3 Recommends escalating to the decideur (CRO, VP, manager with authority) before signing βœ“ βœ“
19.4 Names target fascination, the Pipe de negociation, or equivalent reasoning about not breaching mandate at signature βœ“ βœ— No mention of target fascination or deal-pressure rationalisation pathology
19.5 Does NOT accept the 'sector-standard' justification at face value as overriding the mandate βœ“ βœ“
19.6 Considers no-deal as a real option if the decideur won't grant the exception βœ“ βœ“
eval-20: loss-aversion-internal-pressure 6/6 1/6
20.1 Does NOT immediately accelerate the vendor decision in response to the forwarded report βœ“ βœ— Commits to 'see if there are ways to accelerate our timeline' β€” directly accelerates in response
20.2 Acknowledges the CEO's concern without dismissing it βœ“ βœ“
20.3 Questions the specificity or applicability of the claim (which competitors, what does 'AI-first' mean for our ops, what market share metric) βœ“ βœ— Accepts '12% market share figure is significant' without questioning specificity or applicability
20.4 Notes that McKinsey reports are often vendor-commissioned / sponsored OR questions research provenance βœ“ βœ— Treats McKinsey as credible without questioning provenance or vendor sponsorship
20.5 Suggests stress-testing the vendor's claim before treating the report as decision input βœ“ βœ— Advises sharing 'McKinsey data point with key stakeholders to build alignment on urgency'
20.6 Does NOT forward the report to others as proof of urgency without vetting it first βœ“ βœ— 'Share the McKinsey data point with key stakeholders' β€” explicitly forwards without vetting
eval-21: salary-envelope-closed 6/6 3/6
21.1 Diagnoses the constraint with calibrated questions (base envelope vs total compensation vs department-level) βœ“ βœ“
21.2 Does NOT accept the 'next review in 8 months' deferral as the only path βœ“ βœ“
21.3 Pushes for a structural exception (sign-on / equity refresh / one-off retention bonus) OR a cycle-aligned commitment with specific number AND specific date βœ“ βœ“
21.4 Does NOT lead with or threaten an external offer to force a match βœ“ βœ— 'I need to look externally to get to market rate' β€” implicit threat of external offer
21.5 Does NOT argue the envelope claim head-on (the diagnostic move beats the argumentative move) βœ“ βœ— Opens with market data argument: '$215k-240k' range stated as challenge to the envelope
21.6 References multi-axis Mandascan thinking (not just base) β€” equity, title, review cadence, leave, telework, etc. βœ“ βœ— Only mentions retention bonus and equity; no title, telework, PTO, or review cadence axes
eval-22: nao-fuzzy-mandate 6/6 1/6
22.1 Names that 'hold the line' / 'don't give anything' is NOT a mandate β€” it's the absence of one (or articulates equivalent reasoning) βœ“ βœ— Asks CEO to clarify constraints but doesn't name the absence-of-mandate problem explicitly
22.2 Recommends pushing back on the CEO to get a written multi-axis Mandascan before NAO opens βœ“ βœ— Asks CEO questions but doesn't require written Mandascan output or frame it as a prerequisite
22.3 Multi-axis thinking: identifies axes beyond the headline raise number (primes, working time, RTT, telework, training budget, etc.) βœ“ βœ— Only mentions 'non-wage elements (benefits, working conditions)' β€” no specific French social dialogue axes named
22.4 Recommends preparing an OCP (shared objective) statement, ideally written, to use in the opening session βœ“ βœ— Recommends 'credible acknowledgment of economic context' but not a structured written OCP
22.5 Identifies the risk that without margin to trade, the team falls into 'positionnisme' β€” and that escalation / strike often follows βœ“ βœ— No mention of positionnisme or strike escalation risk from insufficient mandate
22.6 Does NOT recommend pre-conceding to avoid a strike; does NOT recommend 'just hold firm and see' improvisation βœ“ βœ“
eval-23: hard-1on1-decision-announcement 6/6 3/6
23.1 Opens with the fact directly β€” no softening preamble like 'unfortunately' or 'I hate to do this' βœ“ βœ— Opens with 'I want to start by saying clearly: not your performance' β€” softening preamble before the fact
23.2 States the OCP / why (the actual organisational reason for the decision, not spin or sugar-coating) βœ“ βœ“
23.3 Explicitly creates emotional space and stops talking (does not fill the silence with more rationale) βœ“ βœ“
23.4 Owns the decision (uses 'I decided' or equivalent rather than 'the company decided' or hiding behind process) βœ“ βœ— Uses 'we've made the decision' β€” diffuses responsibility rather than first-person ownership
23.5 Is specific about timeline and practicalities (last day in role, 60-day internal search window) up front, not buried βœ“ βœ“
23.6 Does NOT immediately pivot to 'opportunity' / 'silver lining' framing in the first 60 seconds βœ“ βœ— Opens with performance reassurance and apologetic framing β€” softened framing before the fact
eval-24: clinical-refusal-of-care 6/6 5/6
24.1 Recommends starting with perception (asking what she's thinking / what's driving the refusal) BEFORE delivering more medical information βœ“ βœ“
24.2 Does NOT recommend leading with survival statistics or counter-arguing the medical merits βœ“ βœ“
24.3 Surfaces the underlying enjeu (mother-identity, fear of children seeing her sick, identity of being a mother, etc.) rather than treating the stated reason as the whole story βœ“ βœ“
24.4 Uses NURSE-style emotion-naming (Name, Understand, Respect, Support, Explore) before offering a recommendation, OR explicitly creates emotional space βœ“ βœ— No NURSE or equivalent structured emotion framework; 'I really do understand that' is absorbing sympathy
24.5 Recommends handing control of the FORM (schedule, support structure, what kids see) while preserving the SUBSTANCE (treatment recommended) βœ“ βœ“
24.6 Does NOT recommend recruiting husband / nurse to apply pressure; coaches them as supporters instead, OR redirects them away from the pressure role βœ“ βœ“
eval-25: recruitment-counter-the-counter-offer 6/6 4/6
25.1 Does NOT recommend reactively matching the $235k base as the primary move βœ“ βœ“
25.2 Surfaces the trust frame about the current employer (they needed her to threaten leaving before paying fairly) β€” explicitly or by implication βœ“ βœ“
25.3 Asks a calibrated question to diagnose what she actually wants beyond the dollar number (mission, scope, growth, manager, autonomy) βœ“ βœ— No diagnostic question; immediately moves to describing the offer's additional value without asking
25.4 Offers a structural alternative (sign-on bonus, accelerated equity, scope/title, faster review cycle) rather than only matching base βœ“ βœ“
25.5 Names that ~50% of counter-offer accepters leave within 12 months OR articulates equivalent reasoning about counter-offer dynamics βœ“ βœ— No mention of 50% departure rate or counter-offer dynamics reasoning
25.6 Does NOT walk away from the candidate or refuse to engage β€” does engage substantively without reactive matching βœ“ βœ“
eval-26: first-mover-price-anchor 5/5 0/5
26.1 Recommends naming a price first rather than waiting for the buyer to anchor βœ“ βœ— Presents 'case for waiting' as valid, and recommends asking 'what's your budget' before naming a number
26.2 Recommends opening with a high anchor β€” at or above $180k, not at the flexibility floor of $140k βœ“ βœ— Recommends presenting '$180k figure directly' if they dodge budget question β€” at target, not above
26.3 Explains the anchoring effect: the first number creates gravitational pull toward itself βœ“ βœ— No mention of anchoring effect or gravitational pull; frames as information-gathering exercise
26.4 Does NOT recommend asking 'what's your budget?' as the opening price move βœ“ βœ— Explicitly recommends 'What's your budget range for solving this problem?' as opening price move
26.5 Does NOT recommend anchoring at the expected/target price ($180k) rather than above it βœ“ βœ— Recommends going with '$180k figure directly' β€” at target price, not above it
eval-27: accusation-audit-before-difficult-call 6/6 0/6
27.1 Uses preemptive labeling / accusation audit (addresses likely emotions before they're raised, e.g. 'you're probably furious', 'this probably felt like the worst possible timing') βœ“ βœ— Opens with 'I'm so sorry about what happened' β€” generic apology, no preemptive emotion labeling
27.2 Does NOT lead with 'here's what we've done to fix the outage' before surfacing the emotion βœ“ βœ— Second paragraph: 'I'd like to walk you through what we've done since the outage' β€” leads to remediation early
27.3 Does NOT use hollow openers like 'I'm so sorry this happened' as the primary move without labeling specifics βœ“ βœ— Primary opener is 'I'm so sorry about what happened three weeks ago' β€” hollow apology without specific labels
27.4 Invites the prospect to express the full extent of frustration before pivoting to solution or remediation βœ“ βœ— Ends with 'How can we make this better for you?' β€” pivots to solution-seeking immediately
27.5 Does NOT ask 'how can we make this right?' before establishing what 'right' means to them βœ“ βœ— Asks 'How can we make this better for you?' β€” equivalent question before establishing what they need
27.6 Creates space rather than filling it with explanations, timelines, and remediation plans βœ“ βœ— 'What to cover' section shows root cause fix, remediation plan β€” fills space instead of creating it
eval-28: artificial-deadline-signing-bluff 6/6 3/6
28.1 Does NOT recommend signing the unlimited liability clause under deadline pressure βœ“ βœ— Presents 'case for signing' as legitimate; manager deference pathway ends with conditional signing advice
28.2 Names the midnight deadline as an artificial pressure tactic, not a legitimate constraint βœ“ βœ— Does not identify the deadline as artificial; treats it as a real constraint to work around
28.3 Proposes a calm, professional response that keeps the deal alive without signing the clause βœ“ βœ“
28.4 Explains that a real deal can survive a 24-hour delay for legal review βœ“ βœ— Does not state that a real deal survives a delay; frames it as urgent time pressure to manage
28.5 Pushes back on the manager's instruction β€” names the liability risk explicitly βœ“ βœ“
28.6 Does NOT accuse the buyer of bad faith or escalate aggressively βœ“ βœ“
eval-29: switching-cost-acknowledgment 6/6 0/6
29.1 Does NOT minimize or dismiss the switching costs βœ“ βœ— 'migrations like this happen every day, and we have a structured process that makes it significantly less disruptive'
29.2 Acknowledges switching costs as genuinely real and significant βœ“ βœ— Validates then immediately minimizes: 'significantly less disruptive than you might expect'
29.3 Reframes around the cost of staying: asks to quantify the ongoing annual cost of the performance gap, workarounds, or missed capability βœ“ βœ— No staying-cost frame; pivots to migration support offers and ROI framing without asking them to quantify
29.4 Builds an ROI frame: switching is expensive once; staying with an inferior solution is expensive every year βœ“ βœ— Uses generic ROI framing without the staying-cost / recurring-cost argument
29.5 Does NOT immediately offer a discount or free migration as the first response βœ“ βœ— Immediately offers 'free migration package or at-cost data migration support' as first concrete action
29.6 Invites the prospect to help quantify the gap they've already described as 'technically superior' βœ“ βœ— Offers to put together migration cost estimate β€” vendor does the quantification, not joint exercise
eval-30: price-increase-existing-customer 6/6 0/6
30.1 Does NOT open with an apology or defensive/hedging framing for the price increase βœ“ βœ— Opens with 'I do need to share something... Unfortunately, due to significant infrastructure cost increases'
30.2 States the new number directly and early β€” does not bury it βœ“ βœ— Number comes after apology and hedging preamble β€” buried in defensive context
30.3 Leads with value delivered / outcomes achieved before or alongside the number βœ“ βœ— Opens with 'strong year of partnership' but no specific outcomes; then immediately pivots to bad news framing
30.4 Does NOT pre-offer concessions or hedges before hearing procurement's response βœ“ βœ— Proactively offers 'multi-year commitment', 'payment terms' before procurement has said anything
30.5 Owns the increase as a business decision β€” does not hide behind 'we were forced to' βœ“ βœ— 'due to significant infrastructure cost increases we've been managing' β€” hides behind cost excuse
30.6 Does NOT ask 'is that OK?' or seek permission before stating the new price βœ“ βœ— Ends with 'What are your initial thoughts?' β€” seeks validation after hedging the number
eval-31: end-of-demo-hidden-objection 6/6 0/6
31.1 Does NOT respond with 'of course, take your time' βœ“ βœ— Response opens with 'Of course β€” I completely understand. This is a meaningful decision'
31.2 Does NOT immediately offer to send more materials (case studies, ROI calculator, etc.) βœ“ βœ— Immediately offers 'summary of what we covered today, along with a couple of relevant case studies'
31.3 Labels the hesitation explicitly ('it sounds like something isn't quite right yet' or equivalent) βœ“ βœ— No label on the hesitation; accepts it at face value as legitimate deferral
31.4 Surfaces the real objection with a calibrated question or label before ending the call βœ“ βœ— No attempt to surface real objection; moves straight to follow-up logistics
31.5 Identifies 'I need to think about it' as a hidden objection, not a true deferral requiring a follow-up calendar invite βœ“ βœ— Treats it as positive signal: 'interested enough to need time rather than giving you an immediate no'
31.6 Does NOT schedule a follow-up call without first attempting to surface the real concern βœ“ βœ— Immediately proposes 'schedule a brief follow-up call for next week' without any attempt to surface concern
eval-32: lowball-offer-counter 6/6 2/6
32.1 Does NOT use current salary ($160k) as the reference point for the counter-offer βœ“ βœ— 'I'm currently at $160k base, so coming in at $140k would be a step back' β€” explicitly anchors on current salary
32.2 Anchors on market data ($175k–$195k range) as the basis for the counter βœ“ βœ— Counter is framed as step above current salary ($170k–$175k), not grounded in market data
32.3 Does NOT accept 'this is what we have in the budget' as the final word βœ“ βœ— 'Budget claims are often real' β€” partially accepts budget claim as potentially final
32.4 Expresses genuine enthusiasm for the role before addressing the number βœ“ βœ“
32.5 Names a specific counter number (not a range) at or above market midpoint (~$185k) βœ“ βœ— Proposes a range '$170k–$175k' β€” not a specific number, and below market midpoint
32.6 Does NOT threaten to walk away as the opening move βœ“ βœ“
eval-33: quote-request-no-discovery 6/6 1/6
33.1 Does NOT recommend sending a quote without any discovery βœ“ βœ— 'Yes, send a quote by tomorrow. Being responsive to procurement requests builds goodwill'
33.2 Names the risk: a quote without context anchors price and gets shopped against competitors βœ“ βœ— No mention of commoditization risk or competitive shopping risk from sending quote cold
33.3 Recommends a brief discovery call (15–20 minutes) before pricing βœ“ βœ— No discovery call recommended; brief call offered only as optional after-the-fact follow-up
33.4 Asks at least one calibrated question about use case / success criteria before quoting βœ“ βœ— No discovery questions asked; quote is sent immediately with optional call offer
33.5 Does NOT ask 'what's your budget?' as the primary discovery question βœ“ βœ“
33.6 Reframes the request positively: 'to make sure the quote reflects what you actually need' βœ“ βœ— No positive reframe; simply complies with the request
eval-34: internal-urgency-shield 6/6 0/6
34.1 Does NOT contact the buyer with language that reflects internal pressure ('we really need to close this week') βœ“ βœ— Step 1 instructs reaching out and saying 'I'd love to see if we can bring this across the finish line this week'
34.2 Does NOT offer a discount or time-limited incentive manufactured from internal urgency βœ“ βœ— Step 2 explicitly instructs offering a quarter-end discount expiring at end of week
34.3 Names the principle: your urgency must not exceed the buyer's urgency β€” or you hand them free leverage βœ“ βœ— No mention of urgency asymmetry or leverage risk
34.4 Suggests finding a buyer-side timing reason (their implementation, year-end, board meeting) if urgency is needed βœ“ βœ— Buyer-side timing reason never considered; focus is purely on seller urgency
34.5 Recommends a direct conversation with the VP about the risks of visible desperation βœ“ βœ— Recommends keeping VP updated on actions taken, not pushing back on the approach
34.6 Does NOT agree that 'do whatever it takes' is the right approach without naming the risks βœ“ βœ— Fully endorses urgency approach without naming any risks; says 'take action'
eval-35: discount-ask-without-authority 6/6 2/6
35.1 Does NOT say 'let me check with my manager' as the immediate response βœ“ βœ— Directly instructs: 'That level of discount isn't something I can approve β€” I'd need to loop in my manager'
35.2 Does NOT flat-refuse the ask βœ“ βœ“
35.3 Responds conditionally: movement of that size requires a counter-ask on their side βœ“ βœ— No counter-ask framing; goes straight to seeking manager approval
35.4 Asks what they're able to offer in exchange before committing to check anything βœ“ βœ— Never asks what buyer will give in return; treats discount as pure approval exercise
35.5 Names (explicitly or implicitly) that 'let me check with my manager' validates the ask and signals authority to concede βœ“ βœ— Presents manager check-in as correct move with no awareness of the leverage signal it sends
35.6 Maintains position without closing the door on further conversation βœ“ βœ“
eval-36: procurement-bafo-bluff 6/6 1/6
36.1 Does NOT recommend submitting the absolute floor price ($160k) as if the BAFO is literally binding βœ“ βœ— 'If $160k is truly your best price and you want to win, then yes β€” submit it'
36.2 Names that BAFO requests are frequently not truly final β€” they're a one-shot extraction tactic βœ“ βœ— 'When procurement says Best and Final, they generally mean it' β€” treats BAFO as genuine
36.3 Recommends submitting a conditional BAFO (pricing contingent on specific terms: payment, term length, references, etc.) βœ“ βœ— Explicitly advises 'don't add confusing conditions that make your offer harder to evaluate'
36.4 Does NOT accept the 'no further negotiation' framing as literally true βœ“ βœ— Fully accepts framing: 'don't try to negotiate after BAFO deadline β€” procurement will view this negatively'
36.5 Recommends pairing the BAFO with a value narrative / scope rationale, not just a number βœ“ βœ“
36.6 Preserves optionality β€” does not irreversibly commit to the floor in the BAFO submission βœ“ βœ— Recommends submitting actual floor $160k; no optionality preserved
eval-37: renewal-seat-reduction 6/6 0/6
37.1 Does NOT immediately accept the seat reduction and process the renewal at $180k βœ“ βœ— 'Process the renewal at the lower seat count' β€” directly accepts reduction
37.2 Diagnoses whether this is budget constraint, underutilization, or a change in internal sponsorship βœ“ βœ— Takes 'budget pressure' at face value; no diagnosis of real cause
37.3 Proposes at least one alternative structure that preserves more revenue (multi-year prepay, platform fee + consumption, different tier, etc.) βœ“ βœ— No alternative structure proposed; only a loyalty discount on the reduced count
37.4 Trades any seat reduction against extended term or other commercial value β€” does not reduce unilaterally βœ“ βœ— Accepts reduction without any counter-ask or trade; offers additional discount on top
37.5 Does NOT treat the customer's seat-count framing as the only possible commercial structure βœ“ βœ— Fully accepts seat-count framing; focuses on per-seat discount within that frame
37.6 Separates 'number of seats' from 'value delivered' β€” asks about actual usage before accepting the reduction βœ“ βœ— Never asks about actual usage; treats seat count as interchangeable with value
eval-38: salary-anchor-first 5/5 0/5
38.1 Does NOT anchor with or reference current salary ($130k) βœ“ βœ— Option 1 leads with 'I'm currently at $130k base' as the opening reference point
38.2 Names a specific number at or above market midpoint ($165k+) rather than a wide range βœ“ βœ— Options give ranges: $145k–$160k and $150k–$165k β€” both below market midpoint of $165k
38.3 Does NOT give a range where the bottom is near or below market midpoint βœ“ βœ— Both ranges have bottoms ($145k and $150k) well below market midpoint
38.4 Does NOT deflect with 'I'm flexible' or 'I'd like to understand the full package first' as the primary move βœ“ βœ— Option 3 presents deflection ('I'd love to understand compensation band first') as valid primary move
38.5 Anchors to market data or role value β€” not to current compensation βœ“ βœ— Option 1 explicitly anchors to current $130k comp; other options undercut market midpoint
eval-39: false-scarcity-deadline 5/5 1/5
39.1 Does NOT accept the end-of-month deadline as a legitimate constraint on the decision timeline βœ“ βœ— Option 2 explicitly suggests accelerating internal process to meet vendor's deadline
39.2 Tests whether the pricing really expires ('what happens if we sign on [date after deadline]?') βœ“ βœ— Option 3 asks about the nature of price change but not with a specific post-deadline date test
39.3 Names the move as a scarcity / false urgency tactic (or equivalent reasoning) βœ“ βœ— 'End-of-month pricing deadlines are common in B2B sales' β€” treats as normal, not a tactic
39.4 Does NOT accelerate internal decision-making solely because of the vendor's deadline βœ“ βœ— Option 2 explicitly recommends fast-tracking legal review and stakeholder sign-off to meet deadline
39.5 Does NOT offer to sign an LOI or partial agreement to 'lock the price' under deadline pressure βœ“ βœ“
eval-40: rfp-procurement-commoditization 6/6 0/6
40.1 Does NOT recommend just submitting a competitive quote and hoping βœ“ βœ— 'Put together the strongest possible RFP response and wait for procurement to run their process'
40.2 Recommends finding a way to stay in contact with the champion despite procurement's process βœ“ βœ— Only 'keep in light touch' to check context; no strategy to maintain influence through champion
40.3 Suggests influencing the evaluation criteria through the champion before the RFP is finalized βœ“ βœ— No mention of influencing criteria; focuses on responding well to existing criteria
40.4 Does NOT accept the commoditization frame of the blind RFP βœ“ βœ— 'Your job shifts from champion-driven selling to responding to a structured evaluation' β€” fully accepts frame
40.5 Recommends establishing a direct relationship with procurement while maintaining the champion channel in parallel βœ“ βœ— No recommendation to proactively contact procurement; only respond to their questions
40.6 Identifies that winning on price alone in a blind RFP is a race to the bottom β€” long-term value is destroyed βœ“ βœ— 'Being in the ballpark is essential' β€” treats price competition as normal and acceptable

skill-progressive-disclosure-design β€” v1.0.0

With Skill Without Skill Delta Assertions
97% 39% +58pp 59
Full breakdown (59 assertions)

Model: claude-sonnet-4-6 β€” 1 run each β€” graded by human-as-judge β€” adversarial evals (each has a trap the model falls into without the skill)

# Assertion With Without
Eval 1: triggering vs disclosure β€” both pass (common knowledge baseline) 5/5 5/5
1.1 identifies this as a triggering problem, not a disclosure/context problem βœ“ βœ“
1.2 explicitly states that file splitting does NOT affect whether a skill triggers βœ“ βœ“
1.3 recommends fixing the YAML description field to improve triggering βœ“ βœ“
1.4 does NOT recommend splitting files as a solution to the triggering problem βœ“ βœ“
1.5 explains triggering is driven entirely by the description field, not file size or structure βœ“ βœ“
Eval 2: topic-based split anti-pattern β€” model approves as "clean organization" 5/5 3/5
2.1 identifies this as a topic-based split (not a variant, workflow, or depth split) βœ“ βœ— calls it "bad idea" but never names topic-based split anti-pattern
2.2 warns real testing tasks typically span multiple topics, requiring multiple file loads βœ“ βœ“
2.3 explicitly recommends AGAINST this split structure βœ“ βœ“
2.4 explains context savings from this type of split are theoretical, not empirical βœ“ βœ— no mention of theoretical vs empirical savings
2.5 does NOT approve the split as a good organization strategy βœ“ βœ“
Eval 3: rare-but-critical in references/ β€” model approves the move 4/4 0/4
3.1 warns references/ is optional and the model may skip reading it βœ“ βœ— approves move; doesn't warn references/ may be skipped
3.2 advises against putting critical content in references/ βœ“ βœ— calls it "exactly the right use of references/"
3.3 identifies or alludes to the rare-but-critical anti-pattern βœ“ βœ— no mention of rare-but-critical anti-pattern
3.4 does NOT approve moving critical auth checks to references/auth-checks.md βœ“ βœ— approves move to references/auth-checks.md
Eval 4: cosmetic splits β€” model calls it "classic progressive-disclosure material" 4/4 0/4
4.1 identifies this as a cosmetic split (Examples/Tips files are explicitly an anti-pattern) βœ“ βœ— calls it "classic progressive-disclosure material"
4.2 warns there is no sharp, observable load condition for examples/tips content βœ“ βœ— no mention of missing load condition
4.3 explains this creates either dead content (never loaded) or a wasteful always-load βœ“ βœ— no mention of dead content or always-load waste
4.4 advises against moving examples/tips to a separate reference file βœ“ βœ— recommends moving examples to references/examples.md
Eval 5: splitting to hit line target β€” model immediately suggests a split plan 5/5 0/5
5.1 questions whether there is a real branching/load condition before suggesting any split βœ“ βœ— suggests extraction plan without checking branching condition
5.2 warns against splitting solely to meet an arbitrary line-count target βœ“ βœ— provides split plan to hit the 400-line target
5.3 does NOT immediately jump to a split plan without first checking for branching conditions βœ“ βœ— jumps straight to extraction recommendations
5.4 mentions or implies router prose added to SKILL.md offsets line savings from splitting βœ“ βœ— no mention of router prose overhead
5.5 suggests content reduction (trimming, deleting redundant sections) as alternative to splitting βœ“ βœ— only suggests extraction, not trimming
Eval 6: variant branch β€” model recommends separate skills instead of references/ 5/5 1/5
6.1 recommends a variant branch split (not topic-based, not separate skills) βœ“ βœ— recommends splitting into separate skills, not variant branch references
6.2 identifies cloud provider (AWS/GCP/Azure) as the variant axis βœ“ βœ“
6.3 suggests each cloud provider gets its own references/ file within one skill βœ“ βœ— suggests separate skill files, not references/ within one skill
6.4 explains SKILL.md holds decision logic and shared workflow, not provider-specific content βœ“ βœ— describes a "parent skill", not SKILL.md with decision logic
6.5 explains each invocation loads only the matching variant, saving context βœ“ βœ— different mechanism (separate skills, not per-variant references)
Eval 7: workflow vs reference data β€” model misses "model reads one entry" explanation 5/5 4/5
7.1 recommends a workflow vs. reference data split βœ“ βœ“
7.2 suggests keeping the 50-step procedure in SKILL.md βœ“ βœ“
7.3 suggests moving the directives table to a references/ file βœ“ βœ“
7.4 identifies the directives table as lookup material queried by key, not procedural content βœ“ βœ“
7.5 explains the model reads only relevant entries, not the entire table βœ“ βœ— doesn't explain model reads only relevant entries
Eval 8: depth tier sharpness β€” model unconditionally approves edge-cases.md 4/4 0/4
8.1 questions or evaluates whether load conditions are sharp and observable from user input βœ“ βœ— approves without checking load condition sharpness
8.2 warns vague conditions cause either always-loading (waste) or never-loading (dead weight) βœ“ βœ— no mention of always-loading or never-loading failure modes
8.3 evaluates whether these specific edge cases can be detected from user input before loading βœ“ βœ— doesn't evaluate detectability from user input
8.4 does NOT unconditionally approve creating references/edge-cases.md βœ“ βœ— unconditionally approves creating references/edge-cases.md
Eval 9: default monolithic β€” model misses cross-topic loading warning 4/4 3/4
9.1 recommends starting with a single monolithic SKILL.md βœ“ βœ“
9.2 advises against pre-splitting before gathering empirical evidence (evals or transcripts) βœ“ βœ“
9.3 warns code review tasks likely span multiple concern areas simultaneously βœ“ βœ— doesn't mention cross-topic loading issue
9.4 applies the "default: do not split" principle explicitly or implicitly βœ“ βœ“
Eval 10: pointer hygiene β€” both miss at least one rule 4/5 3/5
10.1 identifies the pointer lacks a sharp, observable user-facing signal βœ“ βœ“
10.2 flags "advanced.md" as too vague a filename that doesn't encode the load condition βœ“ βœ— doesn't flag filename as encoding problem
10.3 flags "for more information" as a weak non-trigger phrase βœ— focuses on "Advanced scenarios" signal, not "for more information" phrase βœ“
10.4 suggests improving the pointer with a specific, observable signal from user input βœ“ βœ“
10.5 recommends renaming the file to encode the actual load condition βœ“ βœ— keeps "advanced.md" in improved example
Eval 11: scripts/ preference β€” model recommends references/ for deterministic content 5/5 0/5
11.1 identifies validation rules as deterministic/repeatable content βœ“ βœ— calls it "reference material", not deterministic content
11.2 recommends using scripts/ instead of references/ for validation logic βœ“ βœ— recommends references/ not scripts/
11.3 mentions scripts have zero context cost (execute without loading into context) βœ“ βœ— no mention of zero context cost
11.4 notes scripts can be unit tested independently βœ“ βœ— no mention of unit testability
11.5 does NOT recommend references/validation-rules.md as the primary or preferred solution βœ“ βœ— recommends references/validation-rules.md as primary solution
Eval 12: decision checklist β€” model immediately approves without checking load condition 3/4 0/4
12.1 applies or references a checklist/decision process before approving the split βœ“ βœ— immediately says "Yes, this makes sense"
12.2 asks or evaluates whether there is a sharp, observable load condition βœ“ βœ— doesn't evaluate load condition sharpness
12.3 considers whether router prose in SKILL.md would reduce net line savings βœ— doesn't mention router prose offset βœ— doesn't address router prose
12.4 does NOT immediately approve the split without addressing load condition sharpness βœ“ βœ— approves immediately
Eval 13: co-occurrence merge rule β€” both correctly merge 4/4 4/4
13.1 identifies the always-co-loading as a co-occurrence problem βœ“ βœ“
13.2 recommends merging the two reference files into one βœ“ βœ“
13.3 references a threshold (>70% co-load) or the principle that always-co-loaded files should be merged βœ“ βœ“
13.4 does NOT recommend keeping them separate for organizational clarity βœ“ βœ“

site-launch-checklist β€” v1.0.0

With Skill Without Skill Delta Assertions
99% 40% +59pp 101
Full breakdown (101 assertions)

Model: claude-sonnet-4-6 β€” 1 run each β€” graded by human-as-judge β€” adversarial evals (each has a trap the model falls into without the skill)

# Assertion With Without
Eval 1: start-of-session questioning β€” model generates full checklist without asking 9/9 0/9
1.1 asks about site type as first question (doc-site, marketing/lead-gen, SaaS-app, training, portfolio) βœ“ βœ— generated 8-section checklist immediately
1.2 presents 2-4 tappable options for site type βœ“ βœ— no options, no questions
1.3 does NOT immediately generate a full pre-launch checklist βœ“ βœ— listed full checklist in first response
1.4 asks one question at a time, not all 6 at once βœ“ βœ— no questions asked at all
1.5 asks about migration status (greenfield, 301 redirects, same domain) βœ“ βœ—
1.6 asks about PostHog setup (hogpost.samber.dev, set-up-new-proxy, skip-PostHog) βœ“ βœ—
1.7 asks about browser tool availability (Chrome ext, Playwright, neither) βœ“ βœ—
1.8 asks about AI scraper policy βœ“ βœ—
1.9 asks about multilingual setup βœ“ βœ—
Eval 2: companion skill workflow β€” never full pack, --list before install 7/7 2/7
2.1 runs npx skills add <pack> --list for each pack before proposing install βœ“ βœ— jumped to install list without discovery
2.2 proposes curated subset tailored to doc-site (five correct packs) βœ“ βœ— used samber/cc-skills instead of the six specialist packs
2.3 does NOT include coreyhaines31/marketingskills for a doc-site βœ“ βœ“
2.4 never runs npx skills add <pack> without --skill flag βœ“ βœ“
2.5 asks user to confirm proposed subset before running any install βœ“ βœ— presented install command ready to run without confirmation
2.6 uses --skill A B C syntax when installing agreed subset βœ“ βœ— wrong workflow, no confirmation-then-install flow
2.7 queries --list for multiple packs, not just one βœ“ βœ— no --list at all
Eval 3: never install without confirmation β€” model asks but skips ask_user_input_v0 format 5/5 4/5
3.1 does NOT execute npx skills add without first asking user for confirmation βœ“ βœ“
3.2 does NOT execute claude mcp add without first asking user for confirmation βœ“ βœ“
3.3 uses ask_user_input_v0 or AskUserQuestion to collect confirmation βœ“ βœ— asked via inline prose checklist, not ask_user_input_v0
3.4 presents install-as-proposed | let-me-modify | skip options βœ“ βœ“
3.5 does not skip confirmation step even though user said "go ahead" βœ“ βœ“
Eval 4: French legal compliance β€” model misses CNIL gating behavior 8/8 7/8
4.1 includes mentions lΓ©gales as a mandatory legal page βœ“ βœ“
4.2 mentions fine amount for missing mentions lΓ©gales (75 000 € or similar) βœ“ βœ“
4.3 includes CGV for commercial/subscription activity βœ“ βœ“
4.4 includes CNIL-compliant cookie consent implementation βœ“ βœ“
4.5 states explicitly that tracker scripts must NOT fire before the user gives explicit consent βœ“ βœ— mentioned CMP but not script-loading gating behavior
4.6 recommends a CMP tool (Axeptio, Tarteaucitron, or custom) βœ“ βœ“
4.7 includes privacy policy βœ“ βœ“
4.8 includes terms of service (CGU) βœ“ βœ“
Eval 5: DNS verification commands β€” model omits CAA, curl, openssl 8/8 5/8
5.1 uses dig +short A example.com to verify A record βœ“ βœ“
5.2 uses dig +short MX to verify MX records βœ“ βœ“
5.3 uses dig +short TXT _dmarc to verify DMARC βœ“ βœ“
5.4 uses a DKIM-specific dig command (selector._domainkey) βœ“ βœ“
5.5 uses dig +short CAA to verify CAA records βœ“ βœ— CAA not mentioned
5.6 uses curl -sIL to verify redirect chain and HTTPS βœ“ βœ— no curl redirect verification shown
5.7 does NOT rely solely on Cloudflare dashboard for verification βœ“ βœ“
5.8 uses openssl or curl to verify TLS certificate dates βœ“ βœ— no TLS cert verification command
Eval 6: PostHog three paths β€” model defaults to direct setup without asking 8/8 2/8
6.1 asks which PostHog setup option to use before proceeding βœ“ βœ— jumped directly to installation guide
6.2 presents three options: hogpost.samber.dev, set-up-new-proxy, skip-PostHog βœ“ βœ— options not presented
6.3 for hogpost.samber.dev path: mentions verifying CORS allows the new domain βœ“ βœ— hogpost.samber.dev not mentioned
6.4 for hogpost.samber.dev path: includes curl command to test CORS βœ“ βœ—
6.5 for new proxy path: configures path rewrites in next.config.js βœ“ βœ“
6.6 for new proxy path: rewrites both us.i.posthog.com AND us-assets.i.posthog.com βœ“ βœ— used app.posthog.com instead of us.i.posthog.com
6.7 for new proxy path: initializes PostHog client with api_host: '/ingest' βœ“ βœ“
6.8 does NOT default to one path without asking the user βœ“ βœ— defaulted to direct setup without offering path choice
Eval 7: TONE.md + humanizer pass β€” model reviews copy but skips both layers 7/7 0/7
7.1 asks whether the site already has a TONE.md file βœ“ βœ— jumped straight to copy review
7.2 offers to create TONE.md at .agents/TONE.md or repo root if it doesn't exist βœ“ βœ— no TONE.md creation offered
7.3 plans to run a humanizer pass after any copy review or drafting βœ“ βœ— no humanizer mentioned
7.4 applies humanizer to hero copy, CTAs, meta descriptions, OG descriptions βœ“ βœ— gave editorial feedback only, no humanizer applied
7.5 explicitly notes humanizer should be skipped for legal pages (mentions lΓ©gales, CGV) βœ“ βœ— not mentioned
7.6 selects samber/humaniseur-fr or equivalent for a French site βœ“ βœ— no humanizer skill selected
7.7 does NOT apply a generic English humanizer to French copy without asking βœ“ βœ— no language-aware tool selection
Eval 8: security headers CSP tightness β€” model sets headers without asking level 9/9 6/9
8.1 asks about CSP tightness level before configuring any header βœ“ βœ— configured headers without asking tightness level
8.2 presents three levels: strict-default-src-none, balanced-allow-self, permissive-for-marketing βœ“ βœ— no levels presented
8.3 includes HSTS with max-age=31536000; includeSubDomains; preload βœ“ βœ“
8.4 mentions submitting to hstspreload.org for HSTS preload list βœ“ βœ— not mentioned
8.5 includes X-Frame-Options: DENY βœ“ βœ“
8.6 includes X-Content-Type-Options: nosniff βœ“ βœ“
8.7 includes Referrer-Policy: strict-origin-when-cross-origin βœ“ βœ“
8.8 includes Permissions-Policy denying camera, microphone, geolocation βœ“ βœ“
8.9 provides curl command to verify headers after deployment βœ“ βœ“
Eval 9: favicon modern set β€” model recommends deprecated items 9/9 5/9
9.1 recommends /favicon.ico (multi-resolution 16/32/48) βœ“ βœ“
9.2 recommends /favicon.svg with embedded dark mode media query βœ“ βœ— mentioned SVG without dark mode media query
9.3 recommends /apple-touch-icon.png at 180Γ—180px with opaque background βœ“ βœ“
9.4 recommends /web-app-manifest-192x192.png and /web-app-manifest-512x512.png βœ“ βœ“
9.5 recommends manifest.json with theme_color, background_color, name, short_name, display βœ“ βœ“
9.6 explicitly marks mstile-*.png as deprecated / skip βœ“ βœ— included mstile-150x150.png as a recommended Windows tile
9.7 explicitly marks safari-pinned-tab.svg as deprecated (since macOS Big Sur) βœ“ βœ— included safari-pinned-tab.svg as a recommended Safari file
9.8 suggests realfavicongenerator.net or favicon.io for generation βœ“ βœ“
9.9 mentions starting from a single 1024Γ—1024 source PNG βœ“ βœ— said "512x512+" without specifying 1024Γ—1024 source
Eval 10: AI scraper policy β€” model gives single policy without subdomain split 5/6 3/6
10.1 does NOT unilaterally block all AI scrapers without explaining site-type reasoning βœ“ βœ“
10.2 does NOT allow all AI scrapers without asking βœ“ βœ“
10.3 differentiates between app subdomain (block all) and marketing/landing subdomain (allow) βœ“ βœ— gave single policy for all of myapp.com
10.4 asks user to confirm non-default decisions via ask_user_input_v0 βœ“ βœ— gave direct recommendation without confirmation
10.5 mentions /llms.txt alongside robots.txt βœ— not in truncated skill context provided βœ— not mentioned
10.6 references site type (SaaS) when determining default scraper policy βœ“ βœ“
Eval 11: weekly SEO maintenance agent β€” model gives general advice without Phase 10 5/5 0/5
11.1 explicitly mentions setting up a weekly SEO maintenance sub-agent βœ“ βœ— gave generic post-launch list (monitoring, analytics, etc.)
11.2 references .claude/agents/weekly-seo.md as the target file location βœ“ βœ—
11.3 asks user whether to set it up now via ask_user_input_v0 βœ“ βœ—
11.4 presents options: yes-create-agent-file, yes-but-defer, skip-for-now βœ“ βœ—
11.5 mentions Ahrefs MCP and/or PostHog MCP as connectors for the agent βœ“ βœ—
Eval 12: output format β€” model reports without phase grouping or priority lists 8/8 0/8
12.1 groups results by phase heading (Phase 1: Domain, Phase 2: Analytics, etc.) βœ“ βœ— reported "Overall verdict: GO β€” 87/100" with no phase grouping
12.2 shows pass count per phase in format [N/M pass] βœ“ βœ—
12.3 uses βœ“ and βœ— symbols for individual item pass/fail status βœ“ βœ— used score and bullet points
12.4 has a distinct "Blockers" section for must-fix-before-launch items βœ“ βœ— no Blockers section
12.5 has a distinct "Recommended fixes" section βœ“ βœ—
12.6 has a distinct "Optional improvements" section βœ“ βœ—
12.7 ends by asking which list to tackle next via ask_user_input_v0 βœ“ βœ— no next-step prompt
12.8 presents at least: blockers, recommended, optional, done-for-now βœ“ βœ—
Eval 13: schema markup β€” model uses wrong types for lib homepage and blog 6/6 3/6
13.1 includes Organization JSON-LD schema site-wide βœ“ βœ— used SoftwareSourceCode as primary type, no Organization
13.2 includes WebSite JSON-LD schema site-wide βœ“ βœ“
13.3 includes SoftwareApplication schema specifically for the library homepage βœ“ βœ— used SoftwareSourceCode instead of SoftwareApplication
13.4 includes Article schema for blog posts βœ“ βœ— used TechArticle instead of Article
13.5 uses JSON-LD format (script type application/ld+json) βœ“ βœ“
13.6 provides curl -s URL | grep -A 50 'application/ld+json' to verify βœ“ βœ“
Eval 14: ecosystem cross-linking β€” model gives advice without asking ecosystem first 6/6 3/6
14.1 asks the user to list their other domains and repos in the ecosystem βœ“ βœ— gave generic cross-linking advice without asking ecosystem
14.2 suggests adding a link from the existing site's footer or nav to the new site βœ“ βœ“
14.3 specifically suggests updating the GitHub README to link to the new docs site βœ“ βœ“
14.4 warns against over-linking β€” only cross-link where topically relevant βœ“ βœ— no warning about topical relevance
14.5 mentions verifying reciprocal links βœ“ βœ“
14.6 suggests linking from related library docs if the user owns other Go libs βœ“ βœ— not mentioned

frontend-design-deslop β€” v1.0.0

With Skill Without Skill Delta Assertions
85% 57% +28pp 53
Full breakdown (53 assertions)

Model: claude-sonnet-4-6 β€” 1 run each β€” graded by human-as-judge β€” adversarial evals (each has a trap the model falls into without the skill)

Note: evals 5, 6, and 11 test common knowledge (button states, dark mode basics, form labels β€” saturated in training data). Evals 5 and 6 are flagged for redesign.

# Assertion With Without
Eval 1: Build a landing page for a new AI coding assistant. Start with the design and be 3/4 2/4
1.1 Response identifies or names the artifact type before making any design decision βœ“ βœ“
1.2 Response commits to or asks for brand adjectives before any visual choice βœ“ βœ— Visual choices before brand adjectives
1.3 Response does NOT immediately write code or produce CSS/HTML with a font and color already chosen βœ— βœ— HTML/CSS written immediately
1.4 Response does NOT choose Inter, Roboto, or system-ui as the primary font without establishing brand direction βœ“ βœ“
Eval 2: I'm designing a fintech dashboard. Choose a primary typeface. It should feel pro 3/4 2/4
2.1 Chosen primary typeface is NOT Inter βœ“ βœ— Inter recommended as primary
2.2 Chosen primary typeface is NOT Roboto, Arial, or system-ui βœ“ βœ“
2.3 Response ties the font choice to brand adjectives or positioning, not just "widely used" or "clean" βœ“ βœ“
2.4 Response explains why a generic choice (Inter/system-ui) would undermine differentiation βœ— βœ— No differentiation risk mentioned
Eval 3: Design the primary brand color palette for a modern B2B SaaS product. It should 4/4 1/4
3.1 Primary brand color is NOT indigo, violet, or purple (hue range roughly 260–310 deg) βœ“ βœ“
3.2 Response explains the indigo/violet band is overcrowded or is a "red ocean" βœ“ βœ— No overcrowded/red ocean language
3.3 At least one color value is expressed in OKLCH notation βœ“ βœ— All colors in hex only
3.4 Response mentions or applies the 60-30-10 distribution or equivalent hierarchy βœ“ βœ— No 60-30-10 or named distribution
Eval 4: Define the design token for a vibrant teal brand color to be used across a web a 3/4 2/4
4.1 Color value uses oklch(...) notation βœ“ βœ— All colors use hex notation
4.2 Color value is NOT expressed in hex (#...) format βœ— βœ— Response uses hex extensively
4.3 Color value is NOT expressed in hsl() or rgb() format βœ“ βœ“
4.4 Token is defined as a CSS custom property (--variable-name) with a semantic role name βœ“ βœ“
Eval 5: Build a primary call-to-action button for a web app. Style it completely. 2/5 5/5
5.1 Button has :focus-visible styles with a visible outline or ring (not just :focus, and not removed) βœ— βœ“
5.2 Button has :disabled styles (not just pointer-events: none; must visually communicate disabled state) βœ— βœ“
5.3 Button has :active styles distinct from :hover βœ— βœ“
5.4 Response mentions or implements a loading state for the button βœ“ βœ“
5.5 Focus outline is NOT set to "none" or "0" without a replacement βœ“ βœ“
Eval 6: The app currently has a light theme with a white background and black text. Add 4/4 4/4
6.1 Dark background is NOT pure black (#000000, #000, or oklch(0 0 0)) βœ“ βœ“
6.2 Dark foreground text is NOT pure white (#ffffff, #fff, or oklch(1 0 0)) βœ“ βœ“
6.3 Response does NOT use filter: invert() or similar blanket inversion technique βœ“ βœ“
6.4 Response mentions elevation via lightness or desaturated accents βœ“ βœ“
Eval 7: Build a monthly revenue table. Columns: Month, Revenue, Growth %. Show 6 months 4/4 2/4
7.1 Numeric columns (Revenue, Growth %) use text-align: right βœ“ βœ“
7.2 Numeric columns apply font-variant-numeric: tabular-nums (or equivalent) βœ“ βœ— growth column missing tabular-nums
7.3 Text column (Month) uses text-align: left (not center) βœ“ βœ— No explicit text-align: left declared
7.4 Numeric columns do NOT use text-align: center βœ“ βœ“
Eval 8: Animate a sidebar panel opening and closing on click. The sidebar is 280px wide. 4/4 3/4
8.1 Sidebar animation uses transform (translateX or equivalent), NOT width animation βœ“ βœ“
8.2 Animation does NOT transition the width property from 0 to a fixed value βœ“ βœ“
8.3 Transition duration is 300ms or less βœ“ βœ— Open transition is 420ms
8.4 Easing uses ease-out or a similar deceleration curve βœ“ βœ“
Eval 9: Style three components for a web app: a primary button, a card, and a text input 3/4 0/4
9.1 A token table (CSS custom properties block or equivalent) is defined BEFORE any component styles are written βœ“ βœ— No token block defined anywhere
9.2 Component styles reference tokens via var(--...) or equivalent, NOT hardcoded hex colors βœ— βœ— Tailwind classes and hardcoded rgba()
9.3 The same color value does NOT appear hardcoded in multiple component definitions βœ“ βœ— rgba(37,99,235) in two components
9.4 At least spacing/padding tokens are defined alongside color tokens βœ“ βœ— Only inline Tailwind classes
Eval 10: Design an analytics dashboard with 6 KPI cards, a line chart, a bar chart, a fil 4/4 2/4
10.1 Response acknowledges that dashboards warrant higher information density than marketing or portfolio pages βœ“ βœ— No density trade-off mentioned
10.2 Spacing described as tight within data groups, not uniformly generous βœ“ βœ“
10.3 Response does NOT apply landing page whitespace conventions to the dashboard βœ“ βœ“
10.4 Response mentions artifact type (dashboard) as the reason for density decisions βœ“ βœ— No density decisions linked to type
Eval 11: Build a login form with email and password fields. Make it clean and minimal. 4/4 4/4
11.1 Form uses real elements, not placeholder-only identification βœ“ βœ“
11.2 Labels are associated with their inputs via htmlFor (React) or for (HTML) attribute βœ“ βœ“
11.3 Placeholder text is NOT the sole means of identifying what the field expects βœ“ βœ“
11.4 Response mentions or implements inline validation (error message on the field, not just a toast) βœ“ βœ“
Eval 12: I want to redesign my personal portfolio site. Where do we start? 3/4 1/4
12.1 Response mentions creating or writing a DESIGN.md file as a durable output βœ— βœ— No mention of DESIGN.md
12.2 Response asks for or proposes committing to brand adjectives before any visual decision βœ“ βœ— Brand asked alongside tech info
12.3 Response does NOT immediately jump to suggesting a color palette or specific font βœ“ βœ“
12.4 Response identifies artifact type (portfolio / personal brand site) and its design priorities βœ“ βœ— No artifact type or priorities identified
Eval 13: Make this landing page memorable and distinctive. Here is the current design: pl 4/4 2/4
13.1 Response names or commits to exactly ONE primary signature move βœ“ βœ— Six+ signature moves at equal priority
13.2 Response does NOT list 4 or more competing signature elements as equally important without picking one βœ“ βœ— Four elements treated equally
13.3 The chosen signature move is connected to the site's positioning or personality βœ“ βœ“
13.4 Response flags Inter as generic and recommends replacing it with a distinctive alternative βœ“ βœ“