paper-narrative
Judge and reshape the story told by an entire paper figure deck
Install / Use
npx skills add aipoch/open-science --skill paper-narrativeInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
AutomationSupported Platforms
Our assessment of paper-narrative
paper-narrative scores 93/100 on our quality scale, 445th of 1,657 Automation skills we index (top 27%).
Its SKILL.md is 17 KB long, well organised into 8 sections with 7 code examples: a thorough specification that gives an agent plenty to work with.
With 4,918 GitHub stars, it is one of the more widely adopted skills in the catalogue.
Maintenance, license and trust
- The repository was last updated 2 days ago, so paper-narrative is actively maintained.
- It is released under the Apache-2.0 license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands.
Automated pattern scan on 2026-09-27. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
paper-narrative compared with similar skills
All 4 of these similar skills score higher than paper-narrative; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| paper-narrative (this skill)by aipoch | 93 | 4.9k | 2d ago | SKILL.md |
| Agent-Reachby Panniantong | 100 | 85.6k | 11d ago | CLAUDE.md |
| rufloby ruvnet | 100 | 73.3k | today | CLAUDE.md |
| Scraplingby D4Vinci | 100 | 83.9k | today | MCP Server |
| algorithmic-artby anthropics | 100 | 177.9k | 4d ago | SKILL.md |
Frequently asked questions
- How do I install paper-narrative?
- Run
npx skills add aipoch/open-science --skill paper-narrative. The install tabs above show the steps for each supported agent. - Which AI agents does paper-narrative work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is paper-narrative safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. It is Apache-2.0-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is paper-narrative still maintained?
- The repository was last updated 2 days ago, so paper-narrative is actively maintained.
Skill content
View source on GitHubname: 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:
{ "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:
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:
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:
- that entry's exact reviewed
one_lineclaim; - every reviewed moved-in panel whose
to_figmatches the arc figure and every moved-out panel whosefrom_figmatches it, so the source composition removes the transferred material; - the immutable data Artifact Version references grounding the claim and moved panels; and
- any accepted missing-panel analysis result after it has actually been run and published as an Artifact Version; and
- the reviewed physical
width_mmfor 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 === a
Truncated for display — read the full file on GitHub.
Related Skills
Agent-Reach
85.6kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
ruflo
73.3k🌊 The original agent harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, federation, vector RAG integration, and native Claude Code / Codex / Hermes and many more Integrated
Scrapling
83.9k🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
algorithmic-art
177.9kCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
