Explain an expression in the language you're learning that you can't read literally — get a verdict (memorize vs learnable rule) + how to read it, saved to the decode dataset. Usage: /aha <phrase> [+ your hunch]
Scanned 9/6/2026
Install to Claude Code
npx -y skills add OleksandrHavuka/shadowling --skill aha --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Aha?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/oleksandrhavuka-aha)More formats (shields.io, HTML) on the badges page.
---
name: aha
description: "Explain an expression in the language you're learning that you can't read literally — get a verdict (memorize vs learnable rule) + how to read it, saved to the decode dataset. Usage: /aha <phrase> [+ your hunch]"
allowed-tools: Bash(python3 */decode.py*) Bash(python3 */config.py*)
---
You help the user EXPLAIN a phrase in the language they're learning that they
can't read literally (something with a non-literal / idiomatic meaning). You run
in the MAIN agent, so you already see this
conversation — use it for context. This skill's entrypoint is
`${CLAUDE_SKILL_DIR}/decode.py` (in this skill dir); the shared `config.py` is at
`${CLAUDE_PLUGIN_ROOT}/config.py`. Invoke each directly so the command starts
with `python3` (e.g. `python3 "${CLAUDE_SKILL_DIR}/decode.py" record …`,
`python3 "${CLAUDE_PLUGIN_ROOT}/config.py" show`).
Input: the user passes, in free text, one or more expressions in the language they
are learning that they couldn't read, optionally with their own hunch at the
meaning (e.g.
`/aha "it cost an arm and a leg" — I thought it's about an arm and a leg`). Parse
out each phrase and the user's hunch yourself.
Steps:
1. Run `python3 "${CLAUDE_PLUGIN_ROOT}/config.py" show` (it prints `<config><row><first_language>…</first_language><learning_language>…</learning_language><explanation_language>…</explanation_language></row></config>`). The expression is in
`learning_language`; write `meaning` and `takeaway` in `explanation_language`.
2. For EACH expression the user brought:
a. If it is literal / there is nothing to explain → say so to the user and DO NOT
record it.
b. If it is just an unknown single word (not an idiom, not a grammar pattern) →
explain it and suggest `/loot <word>`; DO NOT record a decode row.
c. Otherwise classify it:
- `fixed` — a set expression whose meaning is NOT compositional → the action is
"memorize". The slug is the canonical phrase, lowercase (e.g. `break the ice`).
- `method` — it IS derivable via a grammar pattern / part of speech the user is
missing → the action is "learn the rule". The slug is the RULE, not the phrase
(e.g. `present-perfect-passive`), so the same rule aggregates across phrases.
Teach it INLINE: the verdict, the real meaning, for `method` the rule and how it
is derived, and — comparing with the user's hunch — exactly where their read
went wrong.
d. Record it with ONE call. Put each field's value between its tags VERBATIM —
values may span lines; never escape anything (the quoted `<<'SL_IN'` stops the
shell from touching it). The body and the closing `SL_IN` MUST start at
column 0 (an indented `SL_IN` will not close the heredoc):
```bash
python3 "${CLAUDE_SKILL_DIR}/decode.py" record <<'SL_IN'
<slug>the canonical slug</slug>
<type>fixed or method</type>
<expression>the phrase</expression>
<meaning>the real meaning</meaning>
<takeaway>fixed → memorize: set phrase; method → rule: how</takeaway>
<learner_wrote>the user's guess/hunch (empty if none given)</learner_wrote>
<context>where it appeared (from this conversation or the user)</context>
SL_IN
```
e. If the command exits non-zero, tell the user that item failed to save (show the
error) but keep your inline explanation — the teaching is not lost.
3. Close with a one-line note of what was saved (e.g. `saved: 2 (1 fixed, 1 method)`),
or say nothing was saved if every item was literal / a vocab word.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!