Agent skill

Paper Narrative

by aipoch in aipoch/open-science

Judge and reshape the story told by an entire paper figure deck.

Apache-2.0Auto-check passedResearch & Science

Install Paper Narrative

skills CLI
$ npx skills add aipoch/open-science --skill paper-narrative -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install aipoch/open-science paper-narrative --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/aipoch/open-science.git skills-src && mkdir -p .claude/skills && cp -r skills-src/resources/skills/paper-narrative .claude/skills/paper-narrative && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
paper-narrative
GitHub stars
5.5k
Token cost
~4.4k tokens
SKILL.md length
1,437 words
Files
3
Skills in repo
8
Repo updated
First seen
Licence
Apache-2.0

At a glance

Judge and reshape the story told by an entire paper figure deck.

  • Works in 4 steps: Reason from manuscript and captions → Review the full deck as a handling editor → Hand the reviewed arc to figure-composer → …
  • Revising a paper to derive a grounded brief from the manuscript and captions
  • SKILL.md covers Open-Science Notebook call, Required inputs and trust labels, 1. Reason from manuscript and… and 2. Review the full deck as a…, plus 3 more sections
  • Runs Python scripts from its folder

What it does

Paper Narrative is an agent skill from aipoch/open-science. Judge and reshape the story told by an entire paper figure deck. Use when writing or revising a paper to derive a grounded brief from the manuscript and captions, review the full deck as a handling editor, and hand an ordered figure arc to figure-composer.

Its SKILL.md is about 4.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `kernel.py` and `open-science.json`).

It sits in Research & Science, covering Reproducible research. The repository describes itself as: The open-source AI research workbench for scientific research and agent workflows. Local-first, model-agnostic desktop app with extensible skills, MCP tools and connectors… The licence is Apache-2.0.

When your agent uses it

  • Revising a paper to derive a grounded brief from the manuscript and captions
  • Review the full deck as a handling editor
  • Hand an ordered figure arc to figure-composer

Example prompts

  • “/paper-narrative”

Requirements

  • Python 3

Workflow steps

4 steps, taken from the step headings in SKILL.md.

  1. Reason from manuscript and captions
  2. Review the full deck as a handling editor
  3. Hand the reviewed arc to figure-composer
  4. Re-review and converge

What it can do on your machine

Read from SKILL.md and the folder at commit 95544c7. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships script files (Python), which the agent can run.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Paper Narrative loads about 4.4k tokens when it runs. Until then it costs about 69 tokens; SKILL.md has 1,437 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~69
When it runs · the whole SKILL.md, loaded when a task matches
~4.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from aipoch/open-science at commit 95544c7, republished under its Apache-2.0 licence (© aipoch). 1,437 words, ~4,400 tokens.

Download SKILL.mdSave it as .claude/skills/paper-narrative/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.
name
paper-narrative
description
Judge and reshape the story told by an entire paper figure deck. Use when writing or revising a paper to derive a grounded brief from the manuscript and captions, review the full deck as a handling editor, and hand an ordered figure arc to `figure-composer`.
license
Apache-2.0

Paper Narrative — manuscript → brief → figure arc → editorial loop

paper-narrative is the outermost figure workflow. It judges the paper-level story before figure-composer designs any one figure. The inputs are the work itself: a manuscript (or abstract), figure captions, and the current full deck.

Open-Science Notebook call

Every notebook_execute request whose code uses a function named in this skill includes this skill ID:

json
{ "kernelSkillIds": ["paper-narrative"], "code": "print(paper_brief_schema())" }

kernelSkillIds contains the skill ID; function calls belong in code. This request is complete as written: call the named functions directly and do not add an import or discovery step.

Required inputs and trust labels

Keep these inputs distinct throughout the workflow:

  • manuscriptVersionId: immutable manuscript Artifact Version (an abstract-only manuscript is allowed) and the reviewed manuscript text read from it.
  • abstractText: reviewed abstract text when available; use it for bounded brief reasoning while retaining the full manuscript Version as source provenance.
  • captionsVersionId: immutable captions Artifact Version and the reviewed per-figure caption or claim text read from it.
  • deckVersionId: immutable deck Artifact Version containing every current figure in review order.
  • rulesVersionId: immutable design-rules Artifact Version, used only as a reference so the editor judges story rather than visual craft.
  • figureDataVersionIds: immutable data Artifact Versions grouped by figure.
  • figureWidthMmByFigure: reviewed positive venue width for each figure; the downstream composer must not invent this physical output constraint.

Manuscript, captions, deck, and data are source inputs. Every brief, review, arc, move, omission, and proposed analysis is model-generated and requires human review. Never describe generated text as manuscript evidence or source data. Preserve the input Version identities when publishing or delegating downstream work.

1. Reason from manuscript and captions

Load the reviewed manuscript/abstract and captions content into the JavaScript control-plane request. Obtain paper_brief_schema() in Python first. Then call the current tool-less Host model and require JSON only:

javascript
const briefSchema = paperBriefSchemaFromNotebook
const Ajv2020 = require('ajv/dist/2020').default
const validateBrief = new Ajv2020({ allErrors: true }).compile(briefSchema)
const briefSourceText = abstractText || manuscriptText
let repair = ''
let brief
for (let attempt = 1; attempt <= 2; attempt += 1) {
  const prompt =
    `Return JSON only. The complete paper_brief JSON Schema is:\n${JSON.stringify(briefSchema)}\n` +
    `Manuscript Artifact Version: ${manuscriptVersionId}\n` +
    `Captions Artifact Version: ${captionsVersionId}\n` +
    `Reviewed abstract/manuscript source:\n${briefSourceText}\n\nCaptions/claims:\n${captionsText}\n\n` +
    `Pitch is the grandest supportable one-sentence claim, not the method. ` +
    `Vision is the killer application: what readers can now do. ` +
    `Name the audience and the single most-arresting image.` +
    repair
  if (Buffer.byteLength(prompt, 'utf8') > 64 * 1024) {
    throw new Error(
      'paper brief prompt exceeds host.llm 64 KiB UTF-8 limit; provide a reviewed abstract or shorter captions'
    )
  }
  const briefDraft = await host.llm(prompt)
  if (briefDraft.stopReason !== 'end_turn') {
    throw new Error(`paper brief inference stopped with ${briefDraft.stopReason}`)
  }
  let candidate
  let problem
  try {
    candidate = JSON.parse(briefDraft.text)
    if (validateBrief(candidate)) {
      brief = candidate
      break
    }
    problem = JSON.stringify(validateBrief.errors)
  } catch (error) {
    problem = error instanceof Error ? error.message : String(error)
  }
  if (attempt === 2) throw new Error('invalid paper brief after corrective retry')
  repair =
    `\nPrevious response was invalid: ${problem}. Repair it and return JSON only. ` +
    `Previous response:\n${briefDraft.text.slice(0, 8000)}`
}

host.llm does not enforce a caller-provided schema. The code therefore checks the UTF-8 request budget, requires stopReason === "end_turn", parses JSON, and validates with the same bundled Ajv 2020 implementation used elsewhere in the control plane. Prefer the reviewed abstract because a full manuscript commonly exceeds the hard 64 KiB prompt limit; never silently truncate source text. If a corrective retry still fails, stop. Do not fill missing required fields with guesses. After validation, attach the immutable figure/data references from the source claim table. Then review every field — pitch, vision, audience, most-arresting asset, and every figure claim — before continuing. Fix unsupported wording explicitly; never silently treat the first model draft as approved.

2. Review the full deck as a handling editor

Generate the task with narrative_review_task(reviewedBrief, deckVersionId, rulesVersionId) and obtain narrative_review_schema() in Python. Dispatch one reviewer from repl_execute. All three work inputs are explicit alongside the deck; the schema makes the expected model result reviewable:

javascript
const collectStructuredBatch = async (requests) => {
  const receipts = await host.delegate(requests, { wait: false })
  const children = await host.collect(
    receipts.children.map(({ frameId, attemptId }) => ({ frameId, attemptId })),
    { returnWhen: 'all', timeoutSeconds: 1800 }
  )
  return children.map((child) => {
    if (!child || child.status !== 'completed' || child.error) {
      throw new Error(
        `delegated workflow failed: ${child?.error ?? child?.status ?? 'missing child'}`
      )
    }
    if (child.structuredOutputUnsatisfied || child.structuredOutput === undefined) {
      throw new Error('delegated workflow returned no schema-valid structuredOutput')
    }
    return child.structuredOutput
  })
}

let narrativeRound = 1
const request = {
  name: `paper-narrative-editor-r${narrativeRound}`,
  task: reviewTask,
  inputs: [manuscriptVersionId, captionsVersionId, deckVersionId, rulesVersionId],
  outputSchema: reviewSchema
}
const [review] = await collectStructuredBatch([request])

Require a completed child and a schema-valid result. Human-review the result as an editorial recommendation, not a fact extraction. Preserve all of the original narrative judgments:

  • hook_verdict: whether Figure 1 alone earns external review, why, what it is, and what it should become.
  • arc: hook → mechanism → evidence → application; off-arc material moves to supplement unless a reviewed exception is justified.
  • figure_moves: panels whose correct figure changes, with the reason.
  • missing_panels: what to show, the concrete analysis to run, and the closest source-data hint. Search existing project artifacts before proposing new work.
  • kill_list: content to demote to supplement/caption or delete.
  • boldest_defensible_fig1: the strongest supportable Figure 1 claim, never a merely louder unsupported claim.

3. Hand the reviewed arc to figure-composer

After human review, build root-level composition specifications only for arc figures that actually need a visual revision. A figure needs recomposition when it gains or loses a moved panel, receives an accepted missing-panel analysis, has no existing composite_vid, or its reviewed claim/layout differs from the current figure. Record any additional human-approved layout changes in explicitlyReviewedRecomposeFigures; do not treat a new narrative order alone as a reason to redraw a figure. Reuse the exact existing composite_vid for every untouched figure. Do not delegate the whole figure-composer: delegated children cannot call host.delegate, while the composer must fan out panel workers. Remain in the Main/root agent, load figure-composer, and complete its workflow for each changed specification in review order. Each specification must include:

  1. that entry's exact reviewed one_line claim;
  2. every reviewed moved-in panel whose to_fig matches the arc figure and every moved-out panel whose from_fig matches it, so the source composition removes the transferred material;
  3. the immutable data Artifact Version references grounding the claim and moved panels; and
  4. any accepted missing-panel analysis result after it has actually been run and published as an Artifact Version; and
  5. the reviewed physical width_mm for that figure.

Build inputs as an order-preserving union: the target figure's source-data Versions, every moved item's from_fig source-data Versions, and the published missing-analysis Versions for the target. Deduplicate identities. A brief figure's composite_vid identifies rendered figure output; it is not source data and must never be substituted for these input references.

After the human decision and analysis run, keep the independently reviewed acceptedMissingPanelRecommendations. Populate publishedMissingAnalysisVersionIdsByRecommendation only from successful Artifact writes, then map every accepted recommendation to its published Version. Each resolved entry carries the reviewed target_fig, what_to_show, and exact version_id. Fail closed if any accepted recommendation has no verified published Version; never derive redraws directly from all model-proposed review.missing_panels.

Show full SKILL.md (570 more words)Show less

For accepted kill_list actions on panels/content inside a retained arc figure, record a reviewed target_fig in acceptedKillActions, retaining the exact what, why, and demote_to. Whole-figure removals are represented by omission from the reviewed arc and do not enter this composition queue. Verify their removal from the rebuilt deck and publish any reviewed supplement/caption destination before treating those whole-figure actions as complete. Do not infer affected figures from free text or apply rejected recommendations. Pass these actions to the composer: remove the content from its original panel, and retain demoted material in the reviewed supplement or caption destination before publishing. Track those destination changes together with the composition.

Initialize currentFiguresByKey and currentDataVersionIdsByFigure once before the first review round, then retain and update them across every round. Build the complete changed-figure queue without slicing it. The stable arc index prevents sanitized or truncated figure keys from colliding, while the round keeps panel/reviewer delegate names unique across narrative rounds:

javascript
// Initialize once, outside the review/recompose loop.
const currentFiguresByKey = new Map(brief.figures.map((figure) => [figure.key, figure]))
const currentDataVersionIdsByFigure = new Map(
  Object.entries(figureDataVersionIds).map(([key, versions]) => [key, [...versions]])
)
javascript
// Recompute these values after each human-reviewed narrative result. The Map is
// populated from actual successful write_artifact_file results and keyed by the
// exact accepted recommendation object.
const acceptedPublishedMissingAnalyses = acceptedMissingPanelRecommendations.map(
  (recommendation) => {
    const version_id = publishedMissingAnalysisVersionIdsByRecommendation.get(recommendation)
    if (typeof version_id !== 'string' || !version_id) {
      throw new Error(
        `accepted missing-panel analysis has no published Version: ${recommendation.what_to_show}`
      )
    }
    return { ...recommendation, version_id }
  }
)
for (const action of acceptedKillActions) {
  if (!review.arc.some((item) => item.fig === action.target_fig)) {
    throw new Error(`accepted kill action needs an arc figure: ${action.target_fig}`)
  }
}
const changedFigures = new Set([
  ...acceptedKillActions.map((action) => action.target_fig),
  ...review.figure_moves.flatMap((move) => [move.from_fig, move.to_fig]),
  ...acceptedPublishedMissingAnalyses.map((analysis) => analysis.target_fig),
  ...review.arc
    .filter((item) => {
      const existing = currentFiguresByKey.get(item.fig)
      return !existing?.composite_vid || existing.claim !== item.one_line
    })
    .map((item) => item.fig),
  ...explicitlyReviewedRecomposeFigures
])
const compositionQueue = review.arc.flatMap((item, arcIndex) => {
  if (!changedFigures.has(item.fig)) return []
  const movedIn = review.figure_moves.filter((move) => move.to_fig === item.fig)
  const movedOut = review.figure_moves.filter((move) => move.from_fig === item.fig)
  const missingAnalyses = acceptedPublishedMissingAnalyses.filter(
    (analysis) => analysis.target_fig === item.fig
  )
  const sourceInputs = [
    ...(currentDataVersionIdsByFigure.get(item.fig) ?? []),
    ...movedIn.flatMap((move) => currentDataVersionIdsByFigure.get(move.from_fig) ?? []),
    ...missingAnalyses.map((analysis) => analysis.version_id)
  ]
  const width_mm = figureWidthMmByFigure[item.fig]
  if (!Number.isFinite(width_mm) || width_mm <= 0) {
    throw new Error(`missing positive width_mm for ${item.fig}`)
  }
  const figureKey = String(item.fig)
    .normalize('NFC')
    .replace(/[^\p{L}\p{N}-]+/gu, '-')
    .replace(/^-+|-+$/g, '')
    .slice(0, 12)
  if (!figureKey) throw new Error(`figure key cannot form a delegate prefix: ${item.fig}`)
  return [
    {
      figure: item.fig,
      claim: item.one_line,
      movedInPanels: movedIn.map((move) => move.what),
      movedOutPanels: movedOut.map((move) => move.what),
      killActions: acceptedKillActions.filter((action) => action.target_fig === item.fig),
      dataVersionIds: [...new Set(sourceInputs)],
      width_mm,
      delegatePrefix: `paper-r${narrativeRound}-${String(arcIndex + 1).padStart(2, '0')}-${figureKey}`
    }
  ]
})

For every queued entry, pass its claim, data summaries/Version IDs, width_mm, delegatePrefix, moved-in/out panels, and accepted killActions into the root figure-composer workflow. Incorporate these content changes into its outline and verify them against the final output, including supplement/caption destinations. Record the accepted composite Version ID only after the producer child's structured output matches its finalized figure.png Artifact and the independent reviewer accepts that same Version. Never accept a model-proposed or merely non-empty string as the composite identity. After each accepted composition, update both persistent maps using the queue entry and that validated Version ID:

javascript
currentFiguresByKey.set(entry.figure, {
  key: entry.figure,
  claim: entry.claim,
  composite_vid: acceptedCompositeVersionId
})
currentDataVersionIdsByFigure.set(entry.figure, [...entry.dataVersionIds])

Retain these maps across rounds. Previously transferred data and accepted analysis Versions must still ground later redraws, even when the current review proposes no further move or analysis. Do not update either map after a failed publication. The composer itself sends panel workers in waves of four. Once every queued entry has a verified composite Version, build and publish a new deck from the mapped Versions in complete arc order, including reused untouched Versions. Retain its immutable rebuiltDeckVersionId, and include that exact identity in the next review request's inputs. Never invent an identity, hard-code the next revision, omit queue entries beyond the first four, or substitute a redrawn Version for an untouched figure.

The producer's notebook request records the composer's collected delegated panel Versions through artifactVersionInputs. The application resolves those identities and persists them as inputFiles with artifact-version source kind; callers supply identities only and never paths or provenance metadata.

4. Re-review and converge

Review the rebuilt full deck again with the manuscript and captions identities still present in inputs: [manuscriptVersionId, captionsVersionId, rebuiltDeckVersionId, rulesVersionId]. Apply and verify all accepted content actions, including kill actions and their supplement/caption destinations, before checking convergence. A failed or unapplied accepted action leaves the workflow unfinished even if the editorial condition below is true. Editorial convergence is exactly:

javascript
review.hook_verdict.would_send_for_review === 'yes' &&
  review.figure_moves.length === 0 &&
  review.missing_panels.length === 0

Do not erase a kill list or weaken an arc merely to satisfy convergence. If the condition is false, human-review the new recommendations, run accepted missing analyses, increment narrativeRound, and rebuild only the newly affected figures with new delegate prefixes while retaining untouched composite Version identities. Stop and report an unresolved editorial disagreement when the evidence cannot support the desired hook.

Minimal invocation

Load paper-narrative. Manuscript: @manuscript.tex. Captions: @captions.md. Deck: @all_figures.pdf. Derive the brief, ask me to review model-generated judgments, reshape only affected arc figures through figure-composer while reusing every untouched composite Version, and re-review until the explicit convergence condition is met or the evidence blocks it.

© aipoch, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 2 other files in resources/skills/paper-narrative of aipoch/open-science.

  • SKILL.md
  • kernel.py
  • open-science.json

Open the folder on GitHubat commit 95544c7

Compare with similar skills

Paper Narrative next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Paper Narrative compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Paper Narrative this skillaipoch/open-science5.5k—~4.4kAutomated safety check: PassApache-2.0
Peer ReviewK-Dense-AI/claude-scientific-writer2.4k2 repos~3.1kAutomated safety check: NotesMIT
CHARLS Paper Reproduction Guidexjtulyc/MedgeClaw6171 repos~1.8kAutomated safety check: PassNone
Add Bactopia Toolbactopia/bactopia522—~4.1kAutomated safety check: PassMIT
Modeling Code and Result Contractsyushui2022/MathModel-Skill453—~1.4kAutomated safety check: PassMIT
Light Research OrchestratorLight0305/Light-skills640—~3.8kAutomated safety check: PassMIT

Similar skills

  • Peer Review

    K-Dense-AI/claude-scientific-writer

    Prepare evidence-bounded, constructive peer-review drafts and structured manuscript assessments.

    2.4k GitHub starsUsed in 2 repos~3.1k tokens
    Research & ScienceAuto-check: notes
  • Guides an agent through reproducing papers built on the CHARLS health and retirement survey, from variable mapping to cognition, depression and isolation scores.

    617 GitHub starsUsed in 1 repo~1.8k tokens
    Research & ScienceAuto-check passed
  • Add Bactopia Tool

    bactopia/bactopia

    Scaffold a complete Bactopia Tool across all three tiers -- module, subworkflow, and workflow entry point under workflows/bactopia-tools/.

    522 GitHub stars~4.1k tokensUpdated 2 mo ago
    Research & ScienceAuto-check passed
  • Modeling Code and Result Contracts

    yushui2022/MathModel-Skill

    Generates result-evidence contracts, tables and runnable q1 to q3 modeling code scaffolds for a math modeling paper from a model route, a data plan and cleaned data.

    453 GitHub stars~1.4k tokensUpdated 2 days ago
    Research & ScienceAuto-check passed
  • Light Research Orchestrator

    Light0305/Light-skills

    Coordinates and recovers multi-stage Light research projects from a single passport file, with checkpoints, stale-work tracking and rerouting only when you approve.

    640 GitHub stars~3.8k tokensUpdated 3 mo ago
    Research & ScienceAuto-check passed
  • HypoGeniC Hypothesis Generation

    K-Dense-AI/scientific-agent-skills

    Plans and audits runs of the HypoGeniC and HypoRefine packages, which propose hypotheses from labeled text datasets, with local checks before any model call.

    48k GitHub starsUsed in 1 repo~3.6k tokens
    Research & ScienceAuto-check: notes

More from aipoch/open-science

All 8 skills in this repo
  • Open-Science Skill Creator

    aipoch/open-science

    Creates, revises, evaluates and publishes skills in the Open-Science app through its native host.skills composer, with optional test prompts and benchmarks.

    5.5k GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • Compute Environment Setup

    aipoch/open-science

    Prepares setup instructions and a named activation file for a user-managed software environment on an Open-Science SSH or Slurm compute host.

    5.5k GitHub stars~2.6k tokensUpdated today
    Auto-check passed
  • Handles /Customize requests by sending Skill work to the internal skill-creator and managing Specialist agents through the JavaScript host.agents SDK.

    5.5k GitHub stars~2.7k tokensUpdated today
    Auto-check passed
  • Figure Style

    aipoch/open-science

    Publication-grade correctness and legibility rules for final-deliverable scientific figures, not exploratory plots.

    5.5k GitHub stars~5.1k tokensUpdated today
    Auto-check passed
  • Open-Science Host Inspection

    aipoch/open-science

    Teaches an agent to inspect Open-Science's JavaScript control REPL, check which host.* calls are allowed, and find project files, sessions and agent frames.

    5.5k GitHub stars~3.8k tokensUpdated today
    Auto-check passed
  • Figure Composer

    aipoch/open-science

    Compose one publication-grade multi-panel figure. An agent skill from aipoch/open-science.

    5.5k GitHub stars~2.9k tokensUpdated today
    Auto-check passed

Questions about Paper Narrative

What does Paper Narrative do?

Judge and reshape the story told by an entire paper figure deck. Paper Narrative is an agent skill from aipoch/open-science. Judge and reshape the story told by an entire paper figure deck.

When should I use Paper Narrative?

Paper Narrative fits situations like: revising a paper to derive a grounded brief from the manuscript and captions; review the full deck as a handling editor; hand an ordered figure arc to figure-composer.

How do I install Paper Narrative in Claude Code?

Run `npx skills add aipoch/open-science --skill paper-narrative -a claude-code`. Or copy the skill folder (resources/skills/paper-narrative in aipoch/open-science) into .claude/skills/paper-narrative in your project. Claude Code loads it when a task matches its description.

How do I install Paper Narrative in Codex?

Run `npx skills add aipoch/open-science --skill paper-narrative -a codex`. Or copy the skill folder (resources/skills/paper-narrative in aipoch/open-science) into .agents/skills/paper-narrative in your project. Codex loads it when a task matches its description.

Can I use Paper Narrative in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add aipoch/open-science --skill paper-narrative -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/paper-narrative, .gemini/skills/paper-narrative, .github/skills/paper-narrative and .opencode/skills/paper-narrative in your project.

What does Paper Narrative need to run?

Going by SKILL.md and its folder, Paper Narrative needs Python for the scripts in its folder. Our summary lists: Python 3.

Does Paper Narrative access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Paper Narrative safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Paper Narrative use?

Paper Narrative is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Paper Narrative use?

About 4.4k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Paper Narrative?

Skills that share tags, products or a category with Paper Narrative: Peer Review (K-Dense-AI/claude-scientific-writer, 2.4k stars), CHARLS Paper Reproduction Guide (xjtulyc/MedgeClaw, 617 stars), Add Bactopia Tool (bactopia/bactopia, 522 stars) and Modeling Code and Result Contracts (yushui2022/MathModel-Skill, 453 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Paper Narrative?

aipoch (a GitHub organization) maintains it in aipoch/open-science, which has 5,500 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on October 9, 2026.

Source: aipoch/open-science on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.