Update what the toolkit has learned about your site from A/B test results. Run periodically to improve future recommendations.
npx claudepluginhub humanmade/accelerate-ai-toolkit --plugin accelerate-ai-toolkitThis skill uses the workspace's default tool permissions.
You read the site's completed A/B test results, classify each experiment into a canonical suggestion pattern, and update the site's learning journal so every other skill can tailor future recommendations to what has worked here.
Guides strict Test-Driven Development (TDD): write failing tests first for features, bugfixes, refactors before any production code. Enforces red-green-refactor cycle.
Guides systematic root cause investigation for bugs, test failures, unexpected behavior, performance issues, and build failures before proposing fixes.
Guides A/B test setup with mandatory gates for hypothesis validation, metrics definition, sample size calculation, and execution readiness checks.
You read the site's completed A/B test results, classify each experiment into a canonical suggestion pattern, and update the site's learning journal so every other skill can tailor future recommendations to what has worked here.
This skill is read-only on WordPress. You never create, modify, or stop experiments. You write two local files only.
Call accelerate/get-site-context with include_blocks: false. You need site.url to derive the site slug for the journal filename.
This is the canonical rule. No other skill implements its own version.
site.url (e.g. https://www.example.com:8080)https://)www. prefix:8080)Example: https://www.example.com:8080 -> example-com
The journal files live at:
~/.config/accelerate-ai-toolkit/journal-<site-slug>.json~/.config/accelerate-ai-toolkit/journal-<site-slug>.mdCall accelerate/list-experiments with:
status: "completed"
type: "all"
per_page: 100
page: 1
If the response's total exceeds 100, paginate: increment page and repeat until all experiments are fetched.
Collect the full list of completed experiments. Each item includes experiment_id, block_id, has_winner, winner_variant_index, annotations, started_at, ended_at.
For each experiment from step 2, call accelerate/get-experiment-results with experiment_id (not block_id). This returns the full variant metrics: impressions, conversions, conversion_rate, probability_to_beat_control, is_winner per variant.
Read ~/.config/accelerate-ai-toolkit/journal-<site-slug>.json if it exists.
schema_version is not 1: Stop and tell the user: "Your learning journal was created by a newer version of the toolkit. Please update the toolkit to read it." Do not proceed.For each experiment:
Read annotations['toolkit:pattern'] from the experiment's annotations object.
other and record the annotation value in the pattern's notes.annotations is missing or doesn't contain toolkit:pattern: classify as other.No keyword fallback. No hypothesis text parsing. Classification is a pure dictionary lookup.
| Condition | Result |
|---|---|
has_winner: true AND winner_variant_index > 0 | Win -- the tested change beat the control |
has_winner: true AND winner_variant_index == 0 | Loss -- the control won |
has_winner: false (experiment concluded without significance) | Inconclusive -- does not count as win or loss |
For wins: lift = ((winner_conversion_rate - control_conversion_rate) / control_conversion_rate) * 100. The control is always variant index 0. Store as a percentage.
For each pattern that has at least one experiment:
tests_won, tests_lost, tests_inconclusivetests_total = tests_won + tests_lost + tests_inconclusivehit_rate = tests_won / (tests_won + tests_lost) -- excludes inconclusive. If tests_won + tests_lost == 0, hit_rate is null.avg_lift_percent = mean of all winning lifts for this pattern. null if no wins.last_tested_at = most recent ended_at across all experiments for this pattern.| Status | Rule |
|---|---|
inconclusive | tests_won + tests_lost < 3 |
won | tests_won + tests_lost >= 3 AND hit_rate >= 0.75 |
lost | tests_won + tests_lost >= 3 AND hit_rate <= 0.25 |
mixed | tests_won + tests_lost >= 3 AND 0.25 < hit_rate < 0.75 |
The minimum threshold of 3 decisive tests (wins + losses, not counting inconclusive) is load-bearing. Do not lower it.
Write the JSON source of truth:
# Write to temp file first, then atomic rename
python3 -c "
import json, os, sys
data = json.loads(sys.argv[1])
path = os.path.expanduser(sys.argv[2])
tmp = path + '.tmp'
os.makedirs(os.path.dirname(path), exist_ok=True)
with open(tmp, 'w') as f:
json.dump(data, f, indent=2)
f.write('\n')
os.chmod(tmp, 0o600)
os.rename(tmp, path)
" '<journal_json>' '~/.config/accelerate-ai-toolkit/journal-<site-slug>.json'
Then generate and write the markdown summary from the JSON (same atomic pattern).
{
"schema_version": 1,
"site": {
"slug": "<site-slug>",
"name": "<from get-site-context>",
"url": "<from get-site-context>"
},
"last_updated": "<ISO 8601 timestamp>",
"stats": {
"total_experiments_considered": 0,
"concluded_with_winner": 0,
"concluded_without_winner": 0,
"patterns_with_signal": 0
},
"patterns": [
{
"pattern_id": "<from taxonomy>",
"display_name": "<from taxonomy>",
"status": "won|lost|mixed|inconclusive",
"tests_total": 0,
"tests_won": 0,
"tests_lost": 0,
"tests_inconclusive": 0,
"hit_rate": null,
"avg_lift_percent": null,
"last_tested_at": null,
"last_winning_block": null,
"notes": null
}
]
}
Regenerated from the JSON on every run. The user reads this; no skill parses it.
# Learning journal -- [Site Name]
Last updated: [date]
Summary: [X] experiments analysed, [Y] with a clear winner, [Z] inconclusive.
## Patterns that win on your site
### [Display name]
- Won [N] of [M] tests ([hit_rate]%)
- Average improvement: +[lift]%
- Last tested: [date]
## Patterns that haven't worked here
### [Display name]
- Won [N] of [M] tests ([hit_rate]%)
- Last tested: [date]
- [advisory note -- this is site-specific, not a universal rule]
## Mixed results
### [Display name]
- Won [N] of [M] tests
- Works sometimes, not a default
## Not enough data yet
### [Display name]
- [N] tests so far, need at least 3 decisive results before drawing conclusions
Short, marketer-friendly. Follow the output style guide (docs/output-style.md). Example:
Learning journal updated for [site name].
๐ด New this week: "Rewrite headline to match what visitors searched for" has now won 4 of 5 tests with an average +23% improvement. I'll lean on this when suggesting A/B tests.
๐ก Still building evidence: "Move the main button higher on the page" has 2 wins out of 3 -- one more test and I'll have a clearer picture.
๐ข Not working here: "Add urgency language to buttons" has lost all 3 tests. I'll stop leading with it unless you ask.
"Want me to suggest what to test next based on what we've learned?"
Hard rules for this output:
pattern_id values. Always use display_name.accelerate-opportunities or accelerate-test.These are the 15 canonical suggestion patterns. The pattern_id is the machine key; the display_name is what the user sees.
pattern_id | display_name |
|---|---|
headline_match_intent | Rewrite headline to match what visitors searched for |
headline_clarity | Rewrite headline for clarity |
cta_above_fold | Move the main call-to-action higher on the page |
cta_copy | Rewrite button or link text to be more specific |
social_proof | Add social proof near the call-to-action |
testimonial | Add a customer testimonial near the call-to-action |
urgency_copy | Add urgency or scarcity language |
simplify_hero | Simplify the hero section (remove clutter) |
pricing_display | Change how pricing is shown (default period, anchoring) |
personalize_referrer | Personalise content by traffic source |
personalize_geo | Personalise content by visitor location |
personalize_device | Personalise content by device type |
hero_image | Change the hero image |
form_fields | Change form field count or layout |
other | Other / unclassified |
This taxonomy is fixed. Do not invent new pattern_ids during a run. If an experiment doesn't match a known pattern, it goes to other. The taxonomy grows only in toolkit releases.
chmod 600. Same security posture as credentials.inconclusive floor is non-negotiable.