| 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Γ |
| 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 | β | β |
| 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 | β | β |
| 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 | β | β |
| 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 | β | β |
| 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 | β | β |
| 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 | β |
| 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) | β | β |
| 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 |
| 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" |
| 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 | β | β |
| 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 |
| 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 | β | β |
| 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 |
| 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 | β | β |