skill-researcher-litreview — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited skill-researcher-litreview (Agent Skill) and scored it 83/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 4 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 4 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Three flows for someone running a literature review: break a topic into atomic reading and synthesis tasks, record a paper and its authorship so the graph remembers it, and ask the graph what a given author has written. The trigger phrases are unambiguous on purpose — they will not steal activation from adhd-daily-planner, the eng-manager-1on1 decomposition flow, or any general-purpose recall.
This skill supports the act of reading and synthesising deeply. It is not a tool for consuming more papers per hour. It does not summarise abstracts, does not generate "key insights" from titles, and does not invent papers an author did not write. The deliverables are scaffolding for your own reading and your own synthesis — not a substitute for either.
This skill is also not a citation manager. It does not export BibTeX, does not store PDFs, does not deduplicate against a remote catalogue, and does not integrate with Word or LaTeX. Use Zotero, Mendeley, or Paperpile for those jobs. The graph here remembers paper + author + authorship as plain facts so the skill can recall what _you_ have recorded — that is its only scope.
Activate when the user's message contains one of the trigger phrases verbatim. The trigger phrase determines which of the three flows runs:
start a lit review on <topic> / start a literature review on <topic> / begin a lit review on <topic> / begin a literature review on <topic> → Flow A: lit-review decomposition.add a paper: <title>, <authors>, <year> / record a paper: <title>, <authors>, <year> → Flow B: record paper.recall papers by <author> / papers by <author> / what has <author> written / what has <author> published → Flow C: recall by author.Do not activate on partial matches (I might do a lit review someday), past tense (I started a lit review last month), or generic literature mentions (literature shows that...). Do not activate if another skill is already running its flow in this turn; let it finish.
The user says some variant of start a lit review on embodied cognition in HCI. Goal: a list of atomic reading and synthesis tasks that scaffold the review, generated by neurodock-task-fractionator. No invented seed papers, no opinions about the field.
on is the topic. Trim. Treat the parsed string verbatim — do not normalise capitalisation, do not expand abbreviations (HCI stays HCI).P10D (ten working blocks of 4h, ≈ 40h of reading and synthesis). The task-fractionator interprets P10D per ADR 0003 §3.The goal argument is a structured prompt that asks for atomic reading and synthesis tasks specifically. Verbatim:
Literature review on: <topic>. Break this into atomic reading and synthesis tasks. Include tasks for identifying seed papers, reading in batches, extracting claims, mapping disagreements between sources, and synthesising themes. Do not invent paper titles or author names.The topic is broader than fits in the default budget. Try a narrower scope, or pass a longer time budget. Stop.The user says add a paper: <title>, <authors>, <year>. Goal: persist the paper, each author, and the authorship relationships as facts in the cognitive graph. No invention beyond what the user typed.
add a paper: (or record a paper:) on commas. The grammar: add a paper: <title>, <author_1> [and <author_2> [and <author_3>...]], <year>I could not parse a year from the last segment. Try: "add a paper: <title>, <author>, <year>".and (with spaces) to get the individual author strings. If the segment contains no and, treat the whole thing as a single author.record_fact once to tag the paper: {
"subject": { "type": "concept", "name": "<title>" },
"predicate": "tagged",
"object": { "literal": "paper" }
}We use type: "concept" for the paper because the v0.1.0 entity-type vocabulary does not include a dedicated "paper" type; concept is the closest fit and the tagged: paper fact makes the role explicit. (See "Decisions flagged" in README.md.)
record_fact once more to tag the year on the same paper subject: {
"subject": { "type": "concept", "name": "<title>" },
"predicate": "tagged",
"object": { "literal": "year:<year>" }
}record_fact once: {
"subject": { "type": "concept", "name": "<title>" },
"predicate": "belongs_to",
"object": { "type": "person", "name": "<author>" }
}This creates the author entity (auto-created by record_fact per the v0.1.0 contract) and the authorship edge. The semantic of belongs_to here is "the paper belongs to the authors who wrote it" — the closest fit in the v0.1.0 eight-predicate vocabulary.
The user says recall papers by <author>. Goal: ask the graph for everything that author has been recorded as authoring, then render a bibliography. No paper appears in the output that is not in the graph's response.
by (for recall papers by and papers by) or between what has and written/ published is the author. Trim. Treat verbatim.recall_entity({ "name_or_alias": "<parsed name>" }).resolution.method is alias, fuzzy, or embedding, surface the resolved entity name and the resolution score before continuing. Ask one question: I read "<parsed name>" as the entity "<resolved>" (<method> match, score <score>). Continue? Wait for confirmation. Do not assume.No author named "<parsed name>" is recorded in the graph. If you've added papers by this author under a different name, try that name. Stop.recall_entity's neighbours[], keep only entries where relationship == "belongs_to" and the neighbour's entity type is concept. These are the candidate papers — each is a concept entity whose belongs_to edge points to this author.facts[] for a tagged predicate with object literal matching year:<YYYY>. If no year is recorded, render the year as n.d. (no date). _Do not invent a year._ If recall_entity does not return paper-side facts (because neighbours are summary entries only), call recall_entity({ "name_or_alias": "<paper title>" }) once per candidate to fetch the year.Strict "Answer First". First sentence ≤ 100 characters.
Lit-review plan — <topic>. <N> atomic tasks across reading and synthesis.
### Reading
- <task title> (<estimated_minutes> min)
Acceptance: <first acceptance criterion>
- ...
### Synthesis
- <task title> (<estimated_minutes> min)
Acceptance: <first acceptance criterion>
- ...
These tasks scaffold your review. I did not pick seed papers or name authors — that's the first task.Rules:
### Reading and ### Synthesis based on tags from decompose (reading, synthesis). If a task has neither tag, place it under ### Reading as a default. If decompose returned no tags at all, render all tasks under a single ### Tasks section instead.decompose result.Recorded: "<title>" (<year>), by <author_1>[, <author_2>, ... and <author_N>].
Graph entries: 1 paper, <N> author(s), <N+2> facts.Rules:
and. A single author appears alone.N + 2 because: 1 tagged: paper, 1 tagged: year:<year>, and N belongs_to edges (one per author).Add another? or Want me to tag this with a topic?.Papers by <author> (<N> recorded):
- <author>. (<year>). <title>.
- <author>. (<year>). <title>.
- <author>. (n.d.). <title>.
These are the papers I have on file for <author>. I did not search anywhere external.Rules:
<author>. (<year>). <title>. — one paper per bullet. This is deliberately ad-hoc: see "Decisions flagged" in README.md.n.d. sort last.Empty-recall fallback (entity exists but has no belongs_to paper neighbours):
<author> is in the graph, but no papers are recorded for them yet. Use "add a paper:" to record one.The defining failure mode for this skill is a Flow C response that lists a paper the graph did not return. This MUST NOT happen.
recall_entity's response filtered per step 5.The graph is what I can see. If a paper is missing, add it with "add a paper:" and it will appear next time. Do not invent.recall_entity invocation per Flow C turn.decompose outside Flow A.record_fact outside Flow B.recall_entity outside Flow C.Bender E. in one session and Emily M. Bender in another, those are two entities until the user explicitly aliases them.consume, crush, power through, read more papers per week, optimise your reading, 10x your literature review.See tests/:
tests/01-start-litreview.md — Flow A on "embodied cognition in HCI" with a 10-day decomposition budget.tests/02-record-paper.md — Flow B recording a single paper with two co-authors.tests/03-recall-by-author.md — Flow C asserting that no paper appears in the output that the graph did not return.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.