Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Gary Vaynerchuk's jab-jab-jab-right-hook framework applied to a personal portfolio rotation on X and LinkedIn. Jabs = build-in-public + educational (value). Hooks = promo (the ask). Each property in the user's configured portfolio (see `~/.config/makerskills/jab-hook/properties.yaml`) gets a hook at least once every ~3 weeks; jabs fill the rest. Drafts go into the user's Typefully workspace via MCP. Modes — plan (7-day plan), pick-next (single post), audit (coverage report), draft (specific post
.claude/skills/coreyhaines31-jab-hook/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 62% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 207% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 64% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 42% | 0% |
Gary Vaynerchuk's framework applied to your configured portfolio: keep the feed mostly jabs (value — BIP + educational) so the hooks (promo) earn attention when they land. Drafts to your personal Typefully workspace.
One-time setup: see references/properties.md and references/typefully-config.md to configure your real portfolio + workspace. Personal config lives in ${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/.
~/.config/makerskills/jab-hook/properties.yaml): one per property you want to promote on rotationDetect from the trigger:
| User says | Mode | |---|---| | "plan my socials," "next week's posts" | plan | | "what should I post," "next promo," "pick next" | pick-next | | "audit my socials," "what's overdue," "what haven't I posted about" | audit | | "draft a promo for X," "BIP post about Y," "educational about Z" | draft |
If ambiguous, confirm.
references/properties.md — the 6 rotation slots and angle ideasreferences/voice.md — the user's voice rules per platformreferences/content-types.md — templates for promo / BIP / educationalmcp__typefully__typefully_list_social_sets and ask which social set is your personal (X + LinkedIn). Save the ID to ${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/typefully.yaml for future runs (schema in references/typefully-config.example.yaml — never save it inside the skill folder; upgrades wipe it).mcp__typefully__typefully_list_drafts filtered to the last 30 daysDay | Type | Property/Topic | Hook | Draft summaryFollow references/voice.md and references/content-types.md. Default: single post, one per platform (X version + LinkedIn version). Thread only if the second post earns its place.
Link placement (load-bearing): never put a URL in the body. Default is no link at all — let curiosity drive the click. When a link is needed, draft it as a first comment for LinkedIn (Typefully supports auto-comment) or a reply for X. The body always stands alone.
For promo and educational posts, optionally scan inspiration accounts (references/inspiration.md) before drafting:
${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/patterns.local.md (create if missing) so they accumulate — references/patterns.md documents the starter patterns and stays read-onlySkip inspiration scan when the user says "just draft it" or when iterating on an existing post.
Ask: "Push to Typefully now? (X + LinkedIn, your personal workspace)"
If yes:
${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/typefully.yaml (setup notes in references/typefully-config.md)mcp__typefully__typefully_create_draft once for X, once for LinkedIn (or once with both platforms if the social set spans both)paste — clean output for pasting into Typefully / LinkedIn / X manually if the MCP path doesn't fitsocial-fetch — pull inspiration-account posts for structural analysis (replaces inline agent-browser)second-brain — the Content Ideas wiki page hoppers hooks, frameworks, stories; /jab-hook drafts pull candidates from theredeep-research — when a promo needs a stat or citation the draft doesn't have yetmarketingskills:social — generic social frameworks, useful when teaching strategy vs shipping your own postsmarketingskills:copywriting — for hook / headline ideation when stuck~/.claude/memory/feedback_social_link_placement.md. Body posts with inline URLs get algorithm-suppressed on both platforms.${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/jab-hook/voice.local.md.~/.claude/memory/feedback_promo_voice.md (if present) — conviction-coded CTAs + reader-perspective framing~/.claude/memory/feedback_social_cadence.md (if present) — cadence cap (e.g., 2 posts/day per platform)| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 12,808 | 6,360 | -50% | 1 | 1 | 0% | 2,055 | 2,157 | +5% | 0 | 0 | — |
case-02 | fail→fail | 6,641 | 6,080 | -8% | 1 | 1 | 0% | 988 | 2,370 | +140% | 0 | 0 | — |
case-03 | fail→fail | 5,652 | 5,759 | +2% | 1 | 1 | 0% | 726 | 2,206 | +204% | 0 | 0 | — |
case-09 | fail→pass | 13,934 | 9,563 | -31% | 1 | 1 | 0% | 2,033 | 3,288 | +62% | 0 | 0 | — |
case-04 | fail→fail | 5,615 | 11,178 | +99% | 1 | 1 | 0% | 833 | 3,562 | +328% | 0 | 0 | — |
case-05 | fail→pass | 6,951 | 8,942 | +29% | 1 | 1 | 0% | 1,028 | 3,152 | +207% | 0 | 0 | — |
case-06 | pass→pass | 6,974 | 8,461 | +21% | 1 | 1 | 0% | 951 | 3,094 | +225% | 0 | 0 | — |
case-07 | fail→pass | 12,670 | 2,808 | -78% | 1 | 1 | 0% | 1,888 | 2,327 | +23% | 0 | 0 | — |
case-08 | fail→pass | 10,443 | 3,004 | -71% | 1 | 1 | 0% | 1,432 | 2,355 | +64% | 0 | 0 | — |
case-10 | pass→pass | 6,751 | 2,262 | -66% | 1 | 1 | 0% | 928 | 2,198 | +137% | 0 | 0 | — |
case-11 | fail→pass | 10,471 | 2,216 | -79% | 1 | 1 | 0% | 1,569 | 2,233 | +42% | 0 | 0 | — |
case-12 | fail→pass | 11,698 | 4,500 | -62% | 1 | 1 | 0% | 1,958 | 2,724 | +39% | 0 | 0 | — |
case-13 | fail→pass | 13,043 | 11,045 | -15% | 1 | 1 | 0% | 2,078 | 3,533 | +70% | 0 | 0 | — |
case-14 | fail→pass | 4,746 | 6,792 | +43% | 1 | 1 | 0% | 724 | 2,965 | +310% | 0 | 0 | — |
case-15 | fail→pass | 13,949 | 5,762 | -59% | 1 | 1 | 0% | 2,321 | 2,657 | +14% | 0 | 0 | — |
case-16 | fail→pass | 11,240 | 3,991 | -64% | 1 | 1 | 0% | 1,707 | 2,484 | +46% | 0 | 0 | — |
case-17 | pass→pass | 11,526 | 6,846 | -41% | 1 | 1 | 0% | 1,657 | 2,862 | +73% | 0 | 0 | — |
case-18 | fail→pass | 10,442 | 8,586 | -18% | 1 | 1 | 0% | 1,541 | 3,087 | +100% | 0 | 0 | — |
case-19 | pass→pass | 12,710 | 8,098 | -36% | 1 | 1 | 0% | 1,799 | 2,949 | +64% | 0 | 0 | — |
case-20 | pass→pass | 14,497 | 11,382 | -21% | 1 | 1 | 0% | 2,053 | 3,478 | +69% | 0 | 0 | — |
case-21 | pass→pass | 18,442 | 16,893 | -8% | 1 | 1 | 0% | 2,916 | 4,413 | +51% | 0 | 0 | — |
case-22 | pass→pass | 21,186 | 20,274 | -4% | 1 | 1 | 0% | 4,353 | 6,039 | +39% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +50 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.