Peer Review
K-Dense-AI/claude-scientific-writer
Prepare evidence-bounded, constructive peer-review drafts and structured manuscript assessments.
Judge and reshape the story told by an entire paper figure deck.
$ npx skills add aipoch/open-science --skill paper-narrative -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install aipoch/open-science paper-narrative --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "paper-narrative" agent skill from https://github.com/aipoch/open-science/tree/main/resources/skills/paper-narrative into .claude/skills/paper-narrative/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "paper-narrative", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/aipoch/open-science/tree/main/resources/skills/paper-narrativeType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add aipoch/open-science --skill paper-narrative -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install aipoch/open-science paper-narrative --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aipoch/open-science.git skills-src && mkdir -p .agents/skills && cp -r skills-src/resources/skills/paper-narrative .agents/skills/paper-narrative && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "paper-narrative" agent skill from https://github.com/aipoch/open-science/tree/main/resources/skills/paper-narrative into .agents/skills/paper-narrative/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "paper-narrative", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add aipoch/open-science --skill paper-narrative -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install aipoch/open-science paper-narrative --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aipoch/open-science.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/resources/skills/paper-narrative .cursor/skills/paper-narrative && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "paper-narrative" agent skill from https://github.com/aipoch/open-science/tree/main/resources/skills/paper-narrative into .cursor/skills/paper-narrative/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "paper-narrative", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/aipoch/open-science.git --path resources/skills/paper-narrative--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add aipoch/open-science --skill paper-narrative -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install aipoch/open-science paper-narrative --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aipoch/open-science.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/resources/skills/paper-narrative .gemini/skills/paper-narrative && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "paper-narrative" agent skill from https://github.com/aipoch/open-science/tree/main/resources/skills/paper-narrative into .gemini/skills/paper-narrative/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "paper-narrative", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install aipoch/open-science paper-narrativeInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add aipoch/open-science --skill paper-narrative -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/aipoch/open-science.git skills-src && mkdir -p .github/skills && cp -r skills-src/resources/skills/paper-narrative .github/skills/paper-narrative && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "paper-narrative" agent skill from https://github.com/aipoch/open-science/tree/main/resources/skills/paper-narrative into .github/skills/paper-narrative/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "paper-narrative", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add aipoch/open-science --skill paper-narrative -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install aipoch/open-science paper-narrative --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/aipoch/open-science.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/resources/skills/paper-narrative .opencode/skills/paper-narrative && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "paper-narrative" agent skill from https://github.com/aipoch/open-science/tree/main/resources/skills/paper-narrative into .opencode/skills/paper-narrative/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "paper-narrative", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
paper-narrativeJudge 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. 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.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 95544c7. It shows what the files ask for, not the result of running them.
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.
Ships script files (Python), which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
The full file from aipoch/open-science at commit 95544c7, republished under its Apache-2.0 licence (© aipoch). 1,437 words, ~4,400 tokens.
.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.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.
Every notebook_execute request whose code uses a function named in this skill
includes this skill ID:
{ "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.
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.
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:
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.
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:
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.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:
one_line claim;to_fig matches the arc figure and every
moved-out panel whose from_fig matches it, so the source composition removes
the transferred material;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.
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:
// 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]])
)// 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:
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.
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:
review.hook_verdict.would_send_for_review === 'yes' &&
review.figure_moves.length === 0 &&
review.missing_panels.length === 0Do 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.
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 throughfigure-composerwhile 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
SKILL.md and 2 other files in resources/skills/paper-narrative of aipoch/open-science.
Open the folder on GitHubat commit 95544c7
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Paper Narrative this skillaipoch/open-science | 5.5k | — | ~4.4k | Automated safety check: Pass | Apache-2.0 | |
| Peer ReviewK-Dense-AI/claude-scientific-writer | 2.4k | 2 repos | ~3.1k | Automated safety check: Notes | MIT | |
| CHARLS Paper Reproduction Guidexjtulyc/MedgeClaw | 617 | 1 repos | ~1.8k | Automated safety check: Pass | None | |
| Add Bactopia Toolbactopia/bactopia | 522 | — | ~4.1k | Automated safety check: Pass | MIT | |
| Modeling Code and Result Contractsyushui2022/MathModel-Skill | 453 | — | ~1.4k | Automated safety check: Pass | MIT | |
| Light Research OrchestratorLight0305/Light-skills | 640 | — | ~3.8k | Automated safety check: Pass | MIT |
K-Dense-AI/claude-scientific-writer
Prepare evidence-bounded, constructive peer-review drafts and structured manuscript assessments.
xjtulyc/MedgeClaw
Guides an agent through reproducing papers built on the CHARLS health and retirement survey, from variable mapping to cognition, depression and isolation scores.
bactopia/bactopia
Scaffold a complete Bactopia Tool across all three tiers -- module, subworkflow, and workflow entry point under workflows/bactopia-tools/.
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.
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.
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.
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.
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.
aipoch/open-science
Handles /Customize requests by sending Skill work to the internal skill-creator and managing Specialist agents through the JavaScript host.agents SDK.
aipoch/open-science
Publication-grade correctness and legibility rules for final-deliverable scientific figures, not exploratory plots.
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.
aipoch/open-science
Compose one publication-grade multi-panel figure. An agent skill from aipoch/open-science.
Categories
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.
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.
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.
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.
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.
Going by SKILL.md and its folder, Paper Narrative needs Python for the scripts in its folder. Our summary lists: Python 3.
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.
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.
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.
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.
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.
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.