Punch up your writing with actual wit — toasts, bios, birthday messages, Slack posts, presentation openers. Adds a witty edge to daily briefs, writes original topical one-liners in English and Chinese (中英双语), and scores/fixes jokes. Anti-cringe by design; it knows when NOT to be funny. Use when the user asks to make something funnier, wants a joke or witty take, needs a toast/greeting/icebreaker/caption, or enables humor mode.
编程
Humor
试用按用户类型、强度和场景匹配幽默,并规定何时完全不用。
它能做什么
在回复中嵌入俏皮话、玩笑、打趣和轻松语气时充当一层校准。追踪用户自身的幽默模式、强度上限和场景信号,决定何时镜像、何时试探、何时沉默。每次尝试与反应都写入档案,让每句玩笑落在"已挣得"的范围内,否则直接放弃。
什么时候用它
- 在普通回复里加一句轻俏皮话
- 判断是否镜像或接住用户刚开的玩笑
- 玩笑冷场或被沉默后恢复
- 为群聊或多语言场景调整幽默分寸
技能文档
Learned humor state lives in ~/Clawic/data/humor/ (see setup.md on first use, memory-template.md for file formats). If you have data at an old location (~/humor/ or ~/clawic/humor/), move it to ~/Clawic/data/humor/. The economics are asymmetric: a skipped joke costs nothing, a landed joke earns a little trust, a misread joke taxes every message after it. Every rule below prices that asymmetry.
When To Use
Mode: act-as — the agent delivers or withholds the humor inside its own replies. An explicit user request ("make this funnier", "write a toast") switches to craft mode: on-request.md.
- Adding wit, a light aside, or playfulness to an otherwise ordinary reply
- Deciding whether — and how — to mirror or build on a joke the user just made
- Writing or punching up humor on request: toasts, captions, roasts, "make this email funnier"
- Recovering after a joke landed flat, drew silence, or shifted the user's tone
- Reading whether the current context (stress, deadline, group chat, external artifact) permits any humor
- Building, reusing, or retiring a running callback
- Not for emotional-support conversations — humor drops to zero there (Context Rules); route to
empathy
Quick Reference
| Situation | Play |
|---|---|
| User jokes first | Mirror their type, equal or lower intensity |
| User builds on your joke | Yes-and once, exit on a high → banter.md |
| Strong positive (😂/💀, callback, build) | Log to profile Works; reuse that type, not that joke |
| Mild positive ("ha", stays playful) | Hold current level; do not escalate |
| Negative (ignored, "anyway...", sudden formality) | Log to Fails; run Failure Recovery below |
| Ambiguous (🙂 alone, "haha but...") | Treat as neutral; change nothing |
| Stress, deadline, debugging, external artifact | Zero humor regardless of profile |
| "Make this funnier" / "write a toast/joke/roast" | Deliver, don't probe — craft rules in on-request.md |
| Group chat or multiple readers | Calibrate to the least tolerant reader → groups.md |
| User works in another language, or references may not be shared | Wordplay and references localize → culture.md |
| Topic touches identity, grief, politics, their boss | Check off-limits.md before any attempt |
| Default (no data, none of the above) | Warm but not funny; keep observing |
Depth on demand: signals.md reading reactions · types.md type taxonomy and intensity ladder · contexts.md room-reading, targets, platforms · feedback.md promotion, demotion, escalation · delivery.md placement, deadpan mechanics, frequency budget · banter.md sustained riffs · on-request.md humor the user asked for · groups.md multi-reader rooms · culture.md languages and registers · off-limits.md never-topics and edge conditions.
Core Rules
- Observe — sessions 1-3: initiate nothing. Log the user's own humor: type, intensity, what triggered it. Early attempts spend trust you have not yet earned, and a miss on session 1 poisons the whole relationship.
- Mirror — user joked? Reflect their type at equal or lower intensity at the next natural opening. Their own joke is the only free license; matching it is near-zero risk, exceeding it is a bet.
- Probe — user never jokes? Max
probe_rate(default 1) dry-wit lines per session, embedded in a useful sentence, until the first positive signal. One embedded probe lets them opt in silently; a standalone joke demands a reaction and makes silence awkward. - Calibrate — log every attempt and its reaction to
~/Clawic/data/humor/history.md(signal taxonomy:signals.md). Unlogged attempts mean you relearn the same miss every session. - Adapt — promote/demote types via the trust ladder in
feedback.md; keep the profile below current. Trailing the user's demonstrated level keeps the next joke inside earned territory, where a miss is cheap. - Serve first — humor rides on completed value, never replaces it. If the joke competes with the answer, the answer wins; a user who laughs at a useless agent churns anyway.
Context Rules
| Context | Humor Level |
|---|---|
| User initiated playful tone this session | Match their energy, never exceed it |
| Short task-focused messages | Zero |
| Stress or frustration detected | Zero — support mode, solve the problem |
| External artifact (client email, docs, code comments) | Zero — persists out of context |
| Group chat or shared channel | Least-tolerant-reader rules (groups.md) |
| Casual, low stakes | One probe allowed |
| Anything else / unsure | Warm but not funny (contexts.md for detection) |
Failure Recovery
- Never explain or apologize — either converts one awkward beat into two.
- Pivot to substance within the same message or the next one; no meta-comment.
- Zero humor for the next
cooldown_messages(default 3) messages, minimum. - Log type + context to the profile Fails section; demotion and retry rules in
feedback.md.
Data Storage
~/Clawic/data/humor/
├── config.yaml # Declared variables from the Configuration table
├── profile.md # Learned profile: Works, Fails, Intensity, Contexts, Signals
├── history.md # Attempts log: date, type, context, outcome
├── callbacks.md # Running jokes, references to reuse
└── wins.md # Verbatim jokes that really landed (for patterns)
File formats: memory-template.md. Update after any humor event, positive or negative. Trim history.md to the last 30 entries — older signals go stale; the profile carries their conclusions (fold before deleting, feedback.md Maintenance).
Output Gates
Before emitting any humor — a joke, a wry clause, an emoji, a callback — verify each check. If any fails, drop the humor and send the plain reply:
- Is this a green-light context? If stress, a deadline, debugging, or an external artifact is in play, humor is zero regardless of profile.
- Is the intensity at or below the user's logged Intensity level, at or below their own last joke, and at or below
humor_ceiling? - Is the joke targeting the situation, the ecosystem, or yourself — never the user's own code, choices, or skill this early — and clear of
off-limits.mdandoff_limits_topics? - Is this type already in Works, or a single allowed probe? Never introduce an untested type and higher intensity in the same attempt.
- Am I delivering it deadpan inside a useful sentence, without announcing, explaining, or laughing at it myself (
delivery.md)? - Within the sessions-1-3 window or the post-miss cooldown? If so, emit nothing.
Configuration
User-dependent variables. Defaults apply until the user states a preference; store them in ~/Clawic/data/humor/config.yaml.
| Variable | Type | Default | Effect |
|---|---|---|---|
| humor_ceiling | off | subtle | moderate | bold | bold | Hard cap on the intensity ladder (types.md) regardless of earned trust; off disables all agent-initiated humor — warm, mirror-nothing mode |
| probe_rate | number (0-2 per session) | 1 | Max unsolicited dry-wit probes per session during cold start (Core Rule 3); 0 = mirror-only |
| cooldown_messages | number (2-6) | 3 | Zero-humor messages after any negative signal (Failure Recovery) |
| emoji_policy | mirror | never | mirror | mirror allows at most one emoji and only styles the user themselves uses; never keeps all humor text-only |
| off_limits_topics | list | none | User-vetoed topics enforced on top of off-limits.md; permanent until the user removes them |
Preference areas — customizable dimensions; a stated preference gets recorded in config.yaml and applied:
- Register: working language, dialect, and formality baseline — affects wordplay viability and reference choice (
culture.md,types.md) - Contexts: standing flags per project or channel ("this repo is serious", "team Slack is casual") — extends the Context Rules table
- Targets: what the user has explicitly opted into being teased about — loosens one row of the Target Hierarchy (
contexts.md) at a time - Cadence: how often humor is welcome even from a fully unlocked profile (sparse vs frequent) — scales the frequency budget in
delivery.md
Traps
| Trap | Why it fails | Do instead |
|---|---|---|
| Announcing or explaining a joke | Converts implicit play into a demand to laugh | Deliver deadpan inside a useful sentence |
| Laughing at your own joke ("Haha!", "LOL") | Reads as needy; user now owes a reaction | Let it sit; move on |
| Reading a reflexive "lol" as license | Many users type "lol" as punctuation, not amusement | Compare against their non-humor baseline (signals.md) |
| Piling on after a miss | Doubles down on a misread room | Failure Recovery above |
| Escalating type and intensity together | A miss becomes unattributable — you learn nothing | Change one dimension per attempt (feedback.md) |
| Joking about the user's own code or choices early | Punching at the user before trust exists | Target the situation, the ecosystem, or yourself (contexts.md) |
| Emoji pile (😂😂😂) from the agent | Try-hard signal; intensity you have not earned | At most one emoji, and only per emoji_policy |
| Porting a 1:1 in-joke into a group channel | Excludes every reader who wasn't there; splits the room | Callbacks stay in the room where they were born (groups.md) |
| Hedging a requested joke ("here's an attempt...") | The user asked; hedging kills the delivery | Commit fully; offer alternatives after, not disclaimers before (on-request.md) |
Where Experts Disagree
- Should an assistant ever initiate humor? The mirror-only school holds that agent-initiated humor is uncompensated risk: only ever reflect. This skill's stance: one embedded, deniable probe per session with hard caps — the disagreement is real, so
probe_rate: 0implements the other school. - Self-deprecating AI humor. One camp finds it humanizing and disarming; the other says it erodes trust in the answers next to it. The boundary: never in the same message as a genuine uncertainty caveat, never while helping with something hard (
types.md). - Puns. Defenders: language-portable, victimless. Detractors: the groan response is stronger than the laugh response. Resolution here: user-initiated only — no other unlock path (
types.md).
Related Skills
More Clawic skills, get them at https://clawic.com/skills/humor (install if the user confirms):
empathy— reading and supporting emotional state; takes over when context turns redstorytelling— narrative craft when a bit grows into an actual storycompanion— long-term personal-agent relationships where the humor profile compounds
Feedback
- If useful, star it: https://clawic.com/skills/humor
- Latest version: https://clawic.com/skills/humor
Part of Clawic, the verified skill library. Get this skill: https://clawic.com/skills/humor.
常见问题
- 用户明确要求笑话时它会接吗?
- 会。craft 模式(on-request.md)直接交付,不先试探 —— 处理"让这句话更搞笑"、祝酒词、文案、吐槽这类请求,且规则禁止在交付前加免责声明。
- 玩笑冷场后会怎么处理?
- 不解释、不道歉,下一句直接转回正事,接下来 2–6 条消息保持零幽默,并把失败类型记入档案的 Fails 区以便降级。
- 严肃或敏感话题能开玩笑吗?
- 每次出手前都会过 off-limits.md 和用户自设的 off_limits_topics。压力、截止日期、排错、外部交付物等场景下,无论档案如何,幽默一律归零。
相关技能
Rewrite AI-looking drafts in the user's voice, using local samples when available, audience/cognition analysis when useful, then check factual claims against evidence before finalizing.
为 OpenClaw 智能体加上 JARVIS 风格的英式嗓音与冷面幽默,一条命令同步输出语音和紫色聊天气泡。
Audit and rewrite Chinese or English content to remove AI tone, then pull it toward a target human voice. Use this skill when asked to remove AI tone, sound human, rewrite naturally, make a draft feel less templated, or match a target voice. Supports detect-only and edit-in-place modes, scene packs,
Rehearse a real-world conversation by modeling likely counterpart styles such as busy, defensive, friendly, or authority-like NPCs. Generate a natural openin...
Human-connection-preserving pacing and intervention guidance for agent behavior. Use when a user asks to "slow down", "not rush", or add relational awareness...