From skill-concierge
See the retrieval-flywheel status and trigger an incremental utterance-generation run. Use this skill when the user asks about the flywheel, "how many skills have utterances / triggers", "flywheel coverage", "which skills are missing utterances", "is the LLM endpoint configured/reachable", or wants to "generate triggers", "run the flywheel", "refresh utterances", or "index the new skills' utterances". The flywheel is the utterance layer (ADR-0026) that teaches the retriever how users actually ask for a skill (EN+VN), lifting recall. Runs scripts/flywheel.py — status mode (default, read-only) prints endpoint config + reachability and per-skill utterance coverage (N/M covered, and the missing skills by name); --generate runs the incremental generator (only new/changed skills hit the LLM) then reindexes so the new points go live, printing before/after coverage. Generation fails loud if the LLM endpoint is unreachable.
How this skill is triggered — by the user, by Claude, or both
Slash command
/skill-concierge:flywheel [--generate] [--rate <seconds>][--generate] [--rate <seconds>]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Surface and drive the **retrieval flywheel** — the utterance layer (ADR-0026). For each
Surface and drive the retrieval flywheel — the utterance layer (ADR-0026). For each
indexed skill the flywheel stores short, LLM-generated "how a user actually asks for this"
phrases (English + Vietnamese) under llm_triggers in eval/triggers.json; those phrases
lift retrieval recall. Generation is offline and incremental — the generator
content-hashes each skill, so only new or changed skills ever hit the LLM. Skills with no
utterances still work (graceful fallback to description+body retrieval); the flywheel just
makes them easier to find.
This skill is the seamless surface for two things: seeing where the flywheel stands, and running an incremental generation pass.
Status (default, read-only) — endpoint config + reachability and per-skill coverage:
python3 "$CLAUDE_PLUGIN_ROOT/scripts/flywheel.py"
It prints:
FLYWHEEL_LLM_ENDPOINT + model, whether an API key is
set, the schema mode, and a live ping() reachability result.N/M indexed skills have utterances; K missing, then the missing skills
by name. Indexed names come from the live Qdrant claude_skills index (kind=base);
covered = a non-empty llm_triggers.triggers in eval/triggers.json.Generate (--generate) — fill utterances for new/changed skills, then reindex:
python3 "$CLAUDE_PLUGIN_ROOT/scripts/flywheel.py" --generate
It preflights the endpoint with ping() and fails loud if unreachable (pointing at
the provider-setup doc — do not generate against a dead endpoint). On success it runs BOTH
incremental generators — the eval scenarios (llm_eval_gen.py) and the utterance triggers
(llm_triggers.py), under the engine venv — then skill-search --reindex so the new
utterance points land live, and prints before/after coverage. Only new/changed skills call
the LLM (each generator content-hashes the description), so re-running when nothing changed
is cheap and safe. Every run is recorded to the global manifest (below).
Flags: --triggers-only skips the measurement-only scenario pass (triggers are what serve
retrieval); --limit <N> caps how many skills are processed in one pass; --rate <seconds>
spaces out LLM calls when sharing a busy endpoint.
You usually do not need to run --generate by hand. The auto_flywheel SessionStart
hook (ADR-0027, gated SKILL_AUTO_FLYWHEEL, default ON) does it for you: when an endpoint is
configured and reachable, on session start it detects skills missing utterances, generates for
just those, and reindexes — detached and non-blocking (it never delays the session), throttled
(AUTO_FLYWHEEL_THROTTLE_S, default 6h) and capped per run (AUTO_FLYWHEEL_MAX_PER_RUN, default 25).
If no endpoint is configured or it's unreachable, the hook is a silent no-op — the graceful
description+body fallback is untouched.
Because the run is a background process, its results are written to a global manifest at
~/.claude/skill-concierge/flywheel-manifest.json — timestamp, endpoint+model, per-skill status,
totals, coverage, last error (last 20 runs). Any agent or the user can read it to verify what the
flywheel did, without watching a live process. Status mode (above) prints the last run from it, and
doctor reports it too.
--generate fails loud. Configure a provider first; the three
documented setups (LM-Studio, Ollama, OpenAI-compatible gateway) live in
references/flywheel-llm-providers.md. The four FLYWHEEL_LLM_* env vars belong in
~/.claude/settings.json env (durable). Status mode still works — it just reports NO.--generate points you at the skill-concierge:setup skill,
which builds the venv. After a reindex, retrieval picks up the new points immediately (no
restart needed).Doctor's check_flywheel() reports the same coverage + reachability inside the normal health
workflow; this skill is the place to act on it.
Guides collaborative design exploration before implementation: explores context, asks clarifying questions, proposes approaches, and writes a design doc for user approval.
Creates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.
Reference for writing and editing skills with predictable behavior, covering invocation models, description writing, and information hierarchy.
npx claudepluginhub thinhkhuat/skill-concierge --plugin skill-concierge