Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Runs multi-source research across GitHub, HN, Reddit, arXiv, and Semantic Scholar. Use when surveying a technical topic across multiple channels.
.claude/skills/athola-research/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-23 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 95% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 16% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 32% | 0% |
Run a full multi-source research session: classify the domain, dispatch parallel agents, synthesize findings, and output a formatted report.
tome:dig)tome:synthesize)Run the domain classifier on the topic:
pythonfrom tome.scripts.domain_classifier import classify result = classify(topic) # result.domain, result.triz_depth, result.channel_weights
If confidence < 0.6 the classifier abstains and refines rather than rejecting: result.candidates lists the domains that had keyword support, triz_depth becomes the deepest of those candidates, and channel_weights is a support-weighted blend. Coverage widens on ambiguity instead of narrowing, because a topic spanning several vocabularies is exactly what the cross-domain channel is for.
Report the abstention to the user with the candidate list and let them override the domain. Do not treat a refined plan as a failure; treat it as the classifier declining to guess.
When candidates is empty the topic produced no keyword hits at all. That stays on the cheap two-channel plan, since there is nothing to refine toward and escalating noise wastes budget. If the topic is genuinely researchable, the vocabulary in _DOMAIN_KEYWORDS is missing it: say so rather than forcing a domain.
pythonfrom tome.scripts.research_planner import plan research_plan = plan(result) # research_plan.channels, research_plan.weights, research_plan.triz_depth
pythonfrom tome.session import SessionManager mgr = SessionManager(Path.cwd()) session = mgr.create(topic, result.domain, result.triz_depth, research_plan.channels)
Launch research agents in parallel using the Agent tool. Use this mapping:
| Channel | Agent Type | Prompt Includes | |---------|-----------|-----------------| | code | tome:code-searcher | topic | | discourse | tome:discourse-scanner | topic, domain, subreddits | | academic | tome:literature-reviewer | topic, domain | | triz | tome:triz-analyst | topic, domain, triz_depth |
Rules:
research_plan.channels
research_plan.channels AND triz_depth != "light"
(parallel, not sequential)
Each agent prompt must include:
triz_depth for triz)
After all agents return:
merging anything:
python from tome.synthesis.quality import parse_envelope
for envelope in agent_envelopes: # one per dispatched agent session.query_log.extend(parse_envelope(envelope))
This is the step that makes an empty channel readable. Findings record what was found; the query log records what was looked for, and without it a channel that errored and a channel that searched a thin topic are the same thing: no findings. Skip this and every channel in the report reads unknown.
tome.synthesis.merger.merge_findings()tome.synthesis.ranker.rank_findings()pythonfrom tome.output.report import format_report, format_brief, format_transcript # Default to report format output = format_report(session) # Save to docs/research/ output_path = f"docs/research/{session.id}-{slug}.md"
Save the session state:
pythonmgr.save(session)
Display a brief summary to the user:
tome.synthesis.frontier.frontier_verdict(session). It is the report's own answer to "did we find little because there is little, or because the search went badly"
from tome.synthesis.quality.channel_outcomes(session): ok, empty, error, rate_limited, degraded, or unknown
tome.synthesis.frontier.frontier_stories(session). Each is a gap with its evidence, and each arrives undecided. Ask the user to mark it act, defer, or decline. Do not decide for them, and do not file an issue for a story they have not marked: nothing in a search record says what is worth this project's time. On defer, file it with minister:create-issue so it survives the session. On act the work starts now and needs no issue. On decline record nothing.
The three retrieval channels run a positive control before their topic queries, so INCONCLUSIVE now means something specific rather than "controls do not exist yet". Read it as one of two things: a channel failed its canary and is blind, or a channel searched without running one. Both are named in the verdict's evidence, and both produce a story under Research Stories.
triz runs no control and is excluded from the verdict. It generates analogies rather than retrieving prior work, so its output is not evidence about what has been published and its findings are not counted toward coverage.
State plainly which channels did not return cleanly. A summary that reports "3 findings" without saying two channels were rate-limited invites the reader to treat a half-run search as a finding about the topic.
Then offer interactive refinement: "Use /tome:dig \"subtopic\" to explore specific areas."
manual research approaches
rather than generating an empty report
| Flag | Format | Function | |------|--------|----------| | (default) | report | format_report() | | --format brief | brief | format_brief() | | --format transcript | transcript | format_transcript() |
< 0.6, user confirmation is requested before proceeding
agents dispatched only when their channels are in the plan; all eligible agents sent in a single parallel message
docs/research/{session.id}-{slug}.md aftersynthesis regardless of whether all agents succeeded
the path to the saved report
suggested; an empty report is never generated
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-09 | fail→fail | 13,523 | 5,441 | -60% | 1 | 1 | 0% | 2,257 | 2,712 | +20% | 0 | 0 | — |
case-23 | fail→pass | 18,289 | 6,262 | -66% | 1 | 1 | 0% | 1,848 | 2,731 | +48% | 0 | 0 | — |
case-01 | fail→fail | 41,366 | 10,475 | -75% | 1 | 1 | 0% | 6,199 | 2,374 | -62% | 0 | 0 | — |
case-02 | fail→fail | 26,364 | 7,470 | -72% | 1 | 1 | 0% | 4,361 | 2,139 | -51% | 0 | 0 | — |
case-03 | fail→fail | 39,468 | 9,392 | -76% | 1 | 1 | 0% | 6,192 | 2,321 | -63% | 0 | 0 | — |
case-04 | fail→pass | 18,278 | 4,652 | -75% | 1 | 1 | 0% | 2,780 | 2,474 | -11% | 0 | 0 | — |
case-05 | fail→pass | 7,606 | 3,383 | -56% | 1 | 1 | 0% | 1,125 | 2,198 | +95% | 0 | 0 | — |
case-06 | fail→fail | 19,272 | 7,128 | -63% | 1 | 1 | 0% | 2,982 | 2,118 | -29% | 0 | 0 | — |
case-07 | fail→pass | 13,576 | 3,803 | -72% | 1 | 1 | 0% | 2,120 | 2,449 | +16% | 0 | 0 | — |
case-08 | fail→pass | 12,808 | 4,345 | -66% | 1 | 1 | 0% | 1,886 | 2,484 | +32% | 0 | 0 | — |
case-10 | fail→pass | 14,799 | 3,636 | -75% | 1 | 1 | 0% | 1,489 | 2,399 | +61% | 0 | 0 | — |
case-11 | fail→pass | 10,770 | 2,867 | -73% | 1 | 1 | 0% | 1,468 | 2,269 | +55% | 0 | 0 | — |
case-12 | fail→fail | 6,412 | 2,664 | -58% | 1 | 1 | 0% | 870 | 2,231 | +156% | 0 | 0 | — |
case-13 | fail→pass | 8,230 | 2,649 | -68% | 1 | 1 | 0% | 1,109 | 2,208 | +99% | 0 | 0 | — |
case-14 | fail→pass | 10,855 | 3,381 | -69% | 1 | 1 | 0% | 1,500 | 2,196 | +46% | 0 | 0 | — |
case-15 | fail→fail | 7,463 | 4,243 | -43% | 1 | 1 | 0% | 1,198 | 2,420 | +102% | 0 | 0 | — |
case-16 | fail→pass | 8,775 | 7,878 | -10% | 1 | 1 | 0% | 755 | 2,960 | +292% | 0 | 0 | — |
case-17 | pass→pass | 12,810 | 7,709 | -40% | 1 | 1 | 0% | 1,835 | 3,008 | +64% | 0 | 0 | — |
case-18 | fail→pass | 12,625 | 6,302 | -50% | 1 | 1 | 0% | 1,896 | 2,698 | +42% | 0 | 0 | — |
case-24 | pass→pass | 7,100 | 3,653 | -49% | 1 | 1 | 0% | 1,024 | 2,442 | +138% | 0 | 0 | — |
case-19 | pass→pass | 11,850 | 6,080 | -49% | 1 | 1 | 0% | 1,689 | 2,886 | +71% | 0 | 0 | — |
case-20 | fail→pass | 29,490 | 7,721 | -74% | 1 | 1 | 0% | 2,715 | 2,773 | +2% | 0 | 0 | — |
case-21 | fail→fail | 7,519 | 1,802 | -76% | 1 | 1 | 0% | 1,207 | 1,991 | +65% | 0 | 0 | — |
case-22 | fail→pass | 16,837 | 3,506 | -79% | 1 | 1 | 0% | 829 | 2,344 | +183% | 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. 24 cases were attempted, and 19 counted toward the lift figure. The other 5 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 +54 percentage points is the difference between those two pass rates over the 19 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
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.