tencent/skillhone-synthesis
Use this skill to synthesize closed-form, automatically verifiable benchmark Q/A by exploring a tool environment, building a reusable exploration graph, and mining multiple hard questions from that graph. Use for: building a benchmark, writing eval items, generating evaluation data, closed-form QA, verifiable-answer datasets, synthesising eval data. Applies to any domain with callable tools. Do not use for open-ended writing, subjective scoring, or pure labeling.
npx skills add https://github.com/Tencent/SkillHone --skill skillhone-synthesis
This skill builds a generic closed-form Q/A dataset from real tool use.
Closed-form means each question has one intended answer, and the answer can be checked by code: exact match, regex, numeric tolerance, enum, or JSON field checks. The final benchmark should not require a human or an LLM judge for basic grading.
The central idea is simple:
The skill is domain-agnostic. Concrete task files, tool wrappers, and domain examples live outside this skill.
The task description is the source of truth for both the solver prompt and the
verifier. When a task spec uses words such as "must", "must not", "required",
"forbidden", "output format", "validation", "quality", or "acceptance", treat
those clauses as benchmark requirements.
For every requirement in the task spec that can be checked mechanically, the
generated verifier should include a corresponding scores key. This includes
artifact constraints such as file names, raw-vs-wrapped output, syntax validity,
compile/render success, required fields, banned strings, shape/count limits,
style tokens, fixed palettes, local-only dependencies, and any other observable
property of the submitted answer.
Do not reduce the verifier to only the gold answer. If the task says the output
must have a particular structure or quality, that structure or quality should be
scored directly whenever it is observable from the answer or from local helper
tools. Subjective requirements may be approximated by deterministic proxies, but
clearly subjective-only preferences should not be silently converted into a pass.
Ask for these if they are missing:
Do not infer hidden tools or hidden datasets. If the task needs live data, the Cartographer must collect it through the provided tools.
A simple question usually has one of these shapes:
A hard question usually forces at least one real operation:
A broken question is not a hard question. Drop or repair it if it is ambiguous, unstable, subjective, unverifiable, or impossible to answer from the collected graph.
Example:
The second question is not hard because the entities are obscure. It is hard because the solver must resolve a set, apply constraints, rank, traverse a relation, and return a precise terminal value.
| Stage | Agent | Purpose | Tool access |
|---|---|---|---|
| 1 | Cartographer | Explore with tools and build a graph plus reasoning walks. | Yes |
| 2 | Miner | Convert walks into Q/A candidates and verification snippets. | No |
| 3 | Validator | Reject candidates that are not answerable, unique, stable, executable, or hard enough. | Sometimes |
| 4 | Deduper | Remove duplicate shapes and produce final files. | No |
The Cartographer is the only stage that should gather new facts. Miner and Deduper are pure over saved artifacts. Validator may run the system-under-test solver when an empirical difficulty gate is requested.
The graph stores reusable evidence:
A single good graph should support several distinct questions. Reusing a graph is the point: if the Miner prompt improves, the graph can be mined again without new tool calls.
See references/exploration_graph.md for the minimal format.
Use a small number of clear transformations rather than many decorative layers:
Do not build difficulty by listing forbidden entities or by adding arbitrary trivia. The question should feel like a realistic analysis task.
See references/difficulty_traps.md and references/layerwise_obfuscation.md for short examples.
The final benchmark has two files:
final.jsonl contains only the fields the grader needs:
{"question": "...", "verification": "answer = open('answer.txt').read().strip()\ngold = 'GOLD'\nscores = {'exact': _normalize(answer) == _normalize(gold)}"}
final.meta.jsonl keeps debugging metadata in the same order:
{"answer": "GOLD", "answer_type": "string", "seed_id": "segment_a", "walk_id": "walk_001", "difficulty": "hard"}
Keep graph artifacts under graph/<seed_id>/ and, when useful, in the shared exploration library for future re-mining.
Every candidate must pass these gates:
constraints, not just the terminal gold value.
See references/verification_format.md for snippet templates.
Take tencent/skillhone-synthesis from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.