Agent skill

Interaction

by QinghongLin in QinghongLin/data2story-skill

Build the curated interactive SET the Editor approved: the ONE narrative-bound hero centerpiece (an explorable/scrollytelling that makes the reader PRODUCE the lead finding) PLUS the ranked…

MITAuto-check: notes

Install Interaction

skills CLI
$ npx skills add QinghongLin/data2story-skill --skill interaction -a claude-code

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

GitHub CLI
$ gh skill install QinghongLin/data2story-skill interaction --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/QinghongLin/data2story-skill.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/data2story-pro/interaction .claude/skills/interaction && 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
interaction
GitHub stars
156
Token cost
~3k tokens
SKILL.md length
1,174 words
Files
2 (incl. references)
Skills in repo
31
Repo updated
First seen
Licence
MIT

At a glance

Build the curated interactive SET the Editor approved: the ONE narrative-bound hero centerpiece (an explorable/scrollytelling that makes the reader PRODUCE the lead finding) PLUS the ranked…

  • Works in 4 steps: Confirm the hero + enumerate the… → Design the manipulate → recompute →… → Scrollytelling + transitions → …
  • SKILL.md covers Setup, Step 1 — Confirm the hero +…, Step 2 — Design the manipulate… and Step 3 — Scrollytelling +…, plus 2 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Interaction is an agent skill from QinghongLin/data2story-skill. Build the curated interactive SET the Editor approved: the ONE narrative-bound hero centerpiece (an explorable/scrollytelling that makes the reader PRODUCE the lead finding) PLUS the ranked supporting playgrounds — each bound to a distinct finding — to the same three-layer-number standard, plus animation/transition craft. Consumes editor.json.interactives + imagineer.json + the Analyst's clientmodel. Outputs interaction.json (centerpiece + supporting[] + playtesthandoff) for the Programmer; may reach back into…

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/interaction_recipes.json`).

The repository describes itself as: Data Journalist Agent: Transforming Data into Verifiable Multimodal Story. The licence is MIT.

Example prompts

  • “/interaction”

Requirements

  • Pre-approved tools (allowed-tools): Bash(*), Read, Write, Edit, Glob

Workflow steps

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

  1. Confirm the hero + enumerate the approved supporting set
  2. Design the manipulate → recompute → payoff loop (for the hero AND each supporting)
  3. Scrollytelling + transitions
  4. Verify the whole set is buildable

What it can do on your machine

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

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Bash(*)
    • Read
    • Write
    • Edit
    • Glob

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are json).

    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

Interaction loads about 3k tokens when it runs, and up to ~6.2k if it reads all its reference files. Until then it costs about 148 tokens; SKILL.md has 1,174 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~148
When it runs · the whole SKILL.md, loaded when a task matches
~3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~6.2k

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: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Bash(*), Read, Write, Edit, Glob

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 QinghongLin/data2story-skill at commit 63a55c1, republished under its MIT licence (© QinghongLin). 1,174 words, ~3,012 tokens.

Download SKILL.mdSave it as .claude/skills/interaction/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
interaction
description
Build the curated interactive SET the Editor approved: the ONE narrative-bound hero centerpiece (an explorable/scrollytelling that makes the reader PRODUCE the lead finding) PLUS the ranked supporting playgrounds — each bound to a distinct finding — to the same three-layer-number standard, plus animation/transition craft. Consumes editor.json.interactives + imagineer.json + the Analyst's client_model. Outputs interaction.json (centerpiece + supporting[] + playtest_handoff) for the Programmer; may reach back into the Editor's spine when the lead finding should be hands-on.
allowed-tools
Bash(*), Read, Write, Edit, Glob
argument-hint
PROJECT_DIR

Interaction Engineer

Your job is the single thing that lifts a competent multimodal article to Pudding-grade: turn the story's contestable claims into playgrounds the reader operates — they run the model / guess / enter their own value, and the finding becomes something they produced, not just read. You own the hero centerpiece interaction AND the curated supporting set the Editor approved (editor.json.interactives) — one earned hero plus any number of supporting playgrounds, each bound to a distinct finding — plus scrollytelling + transition craft. You do not redo the Designer's per-section visuals, and you build nothing the Editor didn't curate.

Setup

  • PROJECT_DIR = first argument.
  • Read: editor.md + editor.json (the spine + editor.json.interactives = the curated hero + ranked supporting[] you build — the binding curation, not a hint), imagineer.json (the candidate concept pool; each supporting/hero entry's concept_ref points at an img_xx here, with its archetype/reader_produces/feasibility/sketch), analyst.json (findings + the client_model), designer.json (theme + per-section plan), detective.json (context). If editor.json.interactives is absent (older spine), fall back to the Editor's prose centerpiece nomination and build the hero only.
  • Read the playbook ../../frontend-design-pro/references/interaction_playbook.json in full — craft_principles, centerpiece_doctrine, universal_engine, recipes, portability_rules. Follow it.
  • Read the role-local references/interaction_recipes.json for harvested patterns this role owns that extend the shared playbook — including the E1 interactive-hero verify-coexistence recipe (the highest-value reusable rule: an interactive element that COEXISTS with the Verify layer over a provenance container — role=link sub-targets out of the Verify allow-list + every feature handler early-returns under verify-on + feature code never stopPropagation).
  • Output: PROJECT_DIR/interaction.json. You MAY also Edit editor.json/designer.json to mark the centerpiece slot.

Step 1 — Confirm the hero + enumerate the approved supporting set

The hero centerpiece. Use the Editor's interactives.hero (or, if absent, its prose-designated centerpiece finding). If none was designated, or a stronger one exists, nominate it: the one contestable claim the reader should produce themselves. This is your single licence to touch the Editor's spine — record the change + why in interaction.json.spine_change.

The supporting set. Take editor.json.interactives.supporting[] as your build list — each entry names a finding (a distinct ana_xx), a purpose, a section, an archetype, and a concept_ref into imagineer.json. Build only these; do not invent a playground the Editor didn't curate, and do not drop one without a recorded reason. If a curated entry fails the earned_test below (its finding duplicates the hero or another supporting, or it can't be made buildable/feasible), don't silently build it weakly — flag it back rather than ship a duplicate or a dead control.

Pick the mechanism for each (hero + every supporting) (interaction_playbook → interaction_taxonomy):

  • explorable_recompute — DEFAULT when a client_model exists (model/derived headline): the reader changes an input and the output re-derives live.
  • guess_then_reveal (data-bound) / personal_input — for "you assume X but actually Y".
  • scrollytelling — when the argument is a sequence/funnel.

Step 2 — Design the manipulate → recompute → payoff loop (for the hero AND each supporting)

Specify this loop for the hero and for every approved supporting playground. For each: the reader's controls (sliders/dropdowns/guess); what recomputes (which client_model function + inputs, or the data_table it reads); the live output (which chart updates + how it animates); the payoff (the realization). A supporting playground's loop is the same standard as the hero's, scoped to its own distinct finding.

  • It must land at or before the reveal — the reader's action IS the reveal, not an illustration after the prose already gave the answer.
  • Play first — minimize reading before the control. The manipulable control (slider/dropdown/guess input) must be reachable with MINIMAL reading: place it EARLY in the centerpiece section, before long expository prose or any param/specimen/"how it works" block, so the reader can manipulate it immediately and PRODUCE the finding. High entry friction (a paragraph + a params block before the reader reaches the slider) is a craft failure — front-load the control, keep instructions to a one-line affordance, and let any longer explanation follow the play. The payoff still lands at/before the reveal.
  • At rest, show the exact published numbers (from the analyst data_table/forecast); on interaction, recompute via the client_model and show the delta ("your scenario vs the model").
  • ONE earned hero centerpiece + the approved supporting set, each earned — restraint is "every playground earns its place," not "only one." A playground earns its place by the earned_test: it is bound to a distinct finding the reader produces/feels (no two share one) AND it passes playtest (control → state → readout actually fires) AND it is not a duplicate of another. Build NOTHING the Editor didn't curate; an unearned widget is a pile, not abundance. Specify graceful degradation (page still makes its point if JS fails) + keyboard accessibility for every element.
  • Engagement floor (now hard). On a resolved descriptive topic (is_visual:false AND is_computational:false) the engagement floor is hard — shipping zero interactives now blocks at the contract gate (missing_engagement_floor) unless an honest engagement_blocker is recorded. A simple personal_input/sortable on a descriptive finding (where the reader lands, sorting the catalog themselves) is the canonical satisfier; build the one the Editor curated rather than leaving the page interaction-free.
Show full SKILL.md (373 more words)Show less

Step 3 — Scrollytelling + transitions

If the spine is sequential/funnel, spec a sticky-graphic scrollytelling using the playbook engine (position:sticky + IntersectionObserver + a steps[] of functions). Otherwise spec the key animated transitions for the centerpiece (D3 transitions; never hard pops). For transition timing/easing, use the motion tokens in ../../frontend-design-pro/references/motion.json rather than hardcoding durations.

Step 4 — Verify the whole set is buildable

For the hero and every supporting explorable, confirm the client_model exists and works — node a quick call (e.g. simulate()) so the spec you hand the Programmer is real. Note the exact functions + input shape per element. The Imagineer's feasibility is a hint, not a guarantee — re-check anything you'll actually build; if a curated supporting entry won't run (model missing/errors), flag it back rather than ship a dead control. Then write the playtest_handoff block (below) so the Playtester can drive every built id.

Output — interaction.json

Keep centerpiece (the hero — unchanged shape, id: "int_01"); ADD a sibling supporting[] array (one entry per approved supporting playground) and a playtest_handoff block listing every built id for the Playtester.

json
{
  "centerpiece": {
    "id": "int_01", "based_on": ["ana_xx"], "section": "edt_xx",
    "mechanism": "explorable_recompute",
    "reader_produces": "the finding the reader generates themselves (e.g. 'nudge a team's Elo and watch the champion odds re-derive')",
    "controls": ["range slider: team Elo ±, dropdown: which team", "button: re-run N sims"],
    "client_model": { "file": "code/client_model.js", "fn": "simulate", "inputs": "(nSims, {team: deltaElo})" },
    "at_rest": "show published champion odds (Argentina 26.3% …)",
    "on_interact": "recompute via client_model; animate bars; show delta vs published",
    "payoff": "the reader sees the headline is contingent — they produced it",
    "placement": "at/before the reveal in edt_xx",
    "degradation": "static published chart if JS off", "a11y": "keyboard-operable controls"
  },
  "supporting": [
    {
      "id": "int_02", "role": "supporting", "concept_ref": "img_02", "based_on": ["ana_05"],
      "section": "edt_05", "mechanism": "guess_then_reveal",
      "reader_produces": "guess the gap, feel the correction when the real value lands",
      "controls": ["slider: your guess"],
      "client_model": null,
      "at_rest": "static real-value bar from ana_05",
      "on_interact": "draw guess+real bar from the data_table",
      "payoff": "the correction lands — the reader's intuition was off",
      "degradation": "static real-value bar",
      "a11y": "keyboard slider with label",
      "verify": { "kind": "computation", "recompute": "data_table", "three_layer": true }
    }
  ],
  "scrollytelling": null,
  "transitions": ["champion bars: D3 transition 600ms on recompute"],
  "spine_change": null,
  "playtest_handoff": {
    "build_ids": ["int_01", "int_02"],
    "per_id": {
      "int_02": {
        "expect_control_reachable": true,
        "expect_recompute": true,
        "readout_selector": "[data-play-out=int_02]",
        "oracle": null,
        "degradation_path": "static real-value bar from ana_05"
      }
    }
  }
}
  • supporting[] — one object per approved supporting playground. Each carries its own id (int_NN), role: "supporting", concept_ref (the img_xx, or null), a distinct based_on (["ana_NN"]), its section, mechanism, reader_produces, controls, client_model (or null), at_rest, on_interact, payoff, degradation, a11y, and a verify block (kind: computation|fact; recompute: client_model|data_table; three_layer: true). [] when only the hero is built.
  • playtest_handoff — REQUIRED: build_ids lists EVERY built id (centerpiece + every supporting[].id); per_id gives the Playtester each element's expectations (expect_control_reachable, expect_recompute, the non-provenance readout_selector = [data-play-out=int_NN] or null, an oracle if the recompute has a known target, and the degradation_path).

Tell the Programmer to tag each built element data-int="int_NN" + data-ana="ana_NN" for traceability (the hero is int_01; each supporting its own int_NN), and optionally data-play-out="int_NN" on that element's live readout (a non-provenance hook the Playtester reads to catch chart-only changes the whole-container innerText diff misses — it is in no validate tuple/schema). Build only the curated set; tag nothing the Editor didn't approve.

Done when the Programmer can read interaction.json and build the curated SET — the hero centerpiece (the reader produces the lead finding, powered by the client_model) plus every approved supporting playground, each bound to a distinct finding and earning its place — with a playtest_handoff the Playtester can drive end to end.

© QinghongLin, MIT. 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 1 other file (references) in skills/data2story-pro/interaction of QinghongLin/data2story-skill.

  • SKILL.md
  • references/interaction_recipes.json

Open the folder on GitHubat commit 63a55c1

Compare with similar skills

Interaction 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.

Interaction compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Interaction this skillQinghongLin/data2story-skill156—~3kAutomated safety check: NotesMIT
MCP Server Builderanthropics/skills180k64 repos~2.3kAutomated safety check: PassApache-2.0
Vercel Composition Patternssupabase/supabase111k59 repos~726Automated safety check: PassMIT
Finishing a Development Branchobra/superpowers296k5 repos~1.9kAutomated safety check: PassMIT
Hook Development for Claude Code Pluginsanthropics/claude-plugins-official38k11 repos~4.1kAutomated safety check: NotesApache-2.0
Agent Browser CLIvercel-labs/agent-browser44k24 repos~864Automated safety check: PassApache-2.0

Similar skills

  • MCP Server Builder

    anthropics/skills

    Official

    Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.

    180k GitHub starsUsed in 64 repos~2.3k tokens
    Agent WorkflowsAuto-check passed
  • Official

    React composition patterns that scale. An agent skill from supabase/supabase.

    111k GitHub starsUsed in 59 repos~726 tokens
    DevelopmentAuto-check passed
  • Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.

    296k GitHub starsUsed in 5 repos~1.9k tokens
    DevelopmentAuto-check passed
  • Hook Development for Claude Code Plugins

    anthropics/claude-plugins-official

    Official

    Explains how to write Claude Code plugin hooks, both prompt-based checks and bash commands, for events such as PreToolUse, Stop and SessionStart.

    38k GitHub starsUsed in 11 repos~4.1k tokens
    Agent WorkflowsAuto-check: notes
  • Agent Browser CLI

    vercel-labs/agent-browser

    Official

    Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking…

    44k GitHub starsUsed in 24 repos~864 tokens
    Productivity & AutomationAuto-check passed
  • Typescript Advanced Types

    rolling-scopes/rsschool-app

    Master TypeScript's advanced type system including generics, conditional types, mapped types, template literals, and utility types for building type-safe applications.

    10k GitHub starsUsed in 25 repos~4.2k tokens
    DevelopmentAuto-check passed

More from QinghongLin/data2story-skill

All 31 skills in this repo
  • Inspector

    QinghongLin/data2story-skill

    Run sentence-level traceability verification on a Data2Story blog (verify.py - verifier.json), then emit the in-page Inspector panel (the reader-facing runnable verifier) + the verify/ artifacts…

    156 GitHub starsUsed in 1 repo~3.1k tokens
    Auto-check: notes
  • Auditor

    QinghongLin/data2story-skill

    Audit a generated Data2Story blog for build correctness across ALL modalities by ACTUALLY RENDERING it in a real headless browser (when available) — catching blank/0-width charts, broken/oversized…

    156 GitHub stars~6.4k tokensUpdated 3 mo ago
    Auto-check: notes
  • Critic

    QinghongLin/data2story-skill

    Review a finished Data2Story blog against the 5 quality rubric dimensions (visualdesign, narrativepacing, datamethodtransparency, claimdataalignment, insightvalue), score each 1-7 with on-page…

    156 GitHub stars~4.7k tokensUpdated 3 mo ago
    Auto-check: notes
  • Detective

    QinghongLin/data2story-skill

    Research external context for a dataset — domain background, history, related studies, and why this data matters.

    156 GitHub stars~2.4k tokensUpdated 3 mo ago
    Auto-check: notes
  • Openrouter Text2music

    QinghongLin/data2story-skill

    Generate music (NOT speech) via OpenRouter using Google Lyria 3 Pro.

    156 GitHub starsUsed in 1 repo~407 tokens
    Auto-check passed
  • Inspector

    QinghongLin/data2story-skill

    Run sentence-level traceability verification on a blog, then generate viewer.html with interactive evidence panel.

    156 GitHub stars~697 tokensUpdated 3 mo ago
    Auto-check: notes

Questions about Interaction

What does Interaction do?

Build the curated interactive SET the Editor approved: the ONE narrative-bound hero centerpiece (an explorable/scrollytelling that makes the reader PRODUCE the lead finding) PLUS the ranked…. Interaction is an agent skill from QinghongLin/data2story-skill. Build the curated interactive SET the Editor approved: the ONE narrative-bound hero centerpiece (an explorable/scrollytelling that makes the reader PRODUCE the lead finding) PLUS the ranked supporting playgrounds — each bound to a distinct finding — to the same three-layer-number standard, plus animation/transition craft.

How do I install Interaction in Claude Code?

Run `npx skills add QinghongLin/data2story-skill --skill interaction -a claude-code`. Or copy the skill folder (skills/data2story-pro/interaction in QinghongLin/data2story-skill) into .claude/skills/interaction in your project. Claude Code loads it when a task matches its description.

How do I install Interaction in Codex?

Run `npx skills add QinghongLin/data2story-skill --skill interaction -a codex`. Or copy the skill folder (skills/data2story-pro/interaction in QinghongLin/data2story-skill) into .agents/skills/interaction in your project. Codex loads it when a task matches its description.

Can I use Interaction 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 QinghongLin/data2story-skill --skill interaction -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/interaction, .gemini/skills/interaction, .github/skills/interaction and .opencode/skills/interaction in your project.

What does Interaction need to run?

SKILL.md names no scripts, command-line tools or credentials: Interaction is instructions for the agent only. Its frontmatter pre-approves these tools: Bash(*), Read, Write, Edit, Glob.

Does Interaction 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 Interaction safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Interaction use?

Interaction is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Interaction use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.2k tokens, read only when the agent opens those files.

What are the alternatives to Interaction?

Skills that share tags, products or a category with Interaction: MCP Server Builder (anthropics/skills, 180k stars), Vercel Composition Patterns (supabase/supabase, 111k stars), Finishing a Development Branch (obra/superpowers, 296k stars) and Hook Development for Claude Code Plugins (anthropics/claude-plugins-official, 38k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Interaction?

QinghongLin (a GitHub user) maintains it in QinghongLin/data2story-skill, which has 156 GitHub stars. The repository holds 31 skills in this directory. The repository was last updated on July 5, 2026.

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