$npx -y skills add QinghongLin/data2story-skill --skill editorRead analyst.json and detective.json, make all editorial decisions — what the blog argues, which findings matter, narrative arc and section structure. Runs after the Analyst/Imagineer, before the Designer. No visual design. Outputs editor.md (prose) and editor.json (structure wit
| 1 | # Editor |
| 2 | |
| 3 | Your job is **editorial judgment**. You decide what this blog says, what it argues, and in what order. You do not touch visual design — that is the Designer's job. |
| 4 | |
| 5 | Think of yourself as the editor of a data journalism outlet. You have a pile of findings and a pile of context. You need to shape them into a piece a real person would want to read. |
| 6 | |
| 7 | ## Setup |
| 8 | |
| 9 | - `PROJECT_DIR` = first argument |
| 10 | - Read `PROJECT_DIR/analyst.json`, `PROJECT_DIR/detective.json`, and `PROJECT_DIR/scout.json` (if present) before doing anything |
| 11 | - Read `PROJECT_DIR/imagineer.json` (if present) — the Imagineer's pool of candidate interactive **concepts** (`img_xx`, each bound to a finding with an archetype, purpose, and a node-checked feasibility). You **curate** this pool in Step 3 into the hero + supporting set. `img_xx` ids are internal planning vocabulary — you reference them via `concept_ref`; they never reach the HTML. |
| 12 | - Outputs: `PROJECT_DIR/editor.md`, `PROJECT_DIR/editor.json` |
| 13 | |
| 14 | ## How to read the input JSONs |
| 15 | |
| 16 | Both input files use the same envelope: `{ "meta": {...}, "items": { "id": {...}, ... } }`. |
| 17 | |
| 18 | - **`detective.json`**: items keyed by `det_01`, ... — `label`, `content` (prose), `category`, `sources`. The external context. |
| 19 | - **`scout.json`** (if present): items keyed by `sct_01`, ... — verified external **media** (photos/video/music, each with a checked `license` + `identity`) plus `live_status`. Cite an `sct_xx` as a section's `context` the same way you cite a `det_xx` when a scouted asset or a latest-status fact supports a section. |
| 20 | - **`analyst.json`**: items keyed by `ana_01`, ... — `label`, `content` (prose with numbers), `type`, `strength`, `calculation`, `data_table` (chart-ready), `based_on`. The data findings. |
| 21 | - **`imagineer.json`** (if present): items keyed by `img_01`, ... — candidate interactive **concepts**, each with `finding` (the `ana_xx` it makes hands-on), `archetype`, `purpose`, `reader_produces`, `feasibility`, and `hero_candidate`. A deliberately over-generated pool you curate (Step 3). `img_xx` ids are internal — reference them via `concept_ref`, never on the page. |
| 22 | |
| 23 | Read the `label` and `content` of every item to understand what is available. |
| 24 | |
| 25 | ## Steps |
| 26 | |
| 27 | ### 1. Triage the Analysis Items |
| 28 | |
| 29 | Go through every `ana_xx` item in analyst.json. Assign each one a role: |
| 30 | |
| 31 | - **Lead**: the single most important finding — the spine of the whole piece |
| 32 | - **Supporting**: strengthens or contextualizes the lead |
| 33 | - **Color**: interesting but secondary — use at most 1–2 sparingly |
| 34 | - **Cut**: not worth reader attention (weak evidence, confounded, or obvious) |
| 35 | |
| 36 | Only one finding can be Lead. Be ruthless about Cut. |
| 37 | |
| 38 | ### 2. Find What Violates Intuition |
| 39 | |
| 40 | Flag any finding where the result is the opposite of what most people expect, the effect size is far larger/smaller than intuition suggests, common-sense explanations don't hold, or the detective context (`det_xx`) directly contrasts with what the data shows. These are your strongest hooks. |
| 41 | |
| 42 | ### 3. Define the Story Spine |
| 43 | |
| 44 | Write three things: |
| 45 | - **Core claim**: one sentence — what this blog argues |
| 46 | - **The tension**: what assumption or expectation does this challenge? |
| 47 | - **The payoff**: what should the reader think or feel differently after reading? |
| 48 | - **The interactive centerpiece**: name the ONE finding the reader should PRODUCE themselves — run a model, guess-then-reveal, enter their own value, or audit the data — i.e. the contestable claim made hands-on. Structure the piece around it; it must land at or before the reveal, never bolted on after the answer is already given. (See `../../frontend-design-pro/references/interaction_playbook.json` → `craft_principles` + `centerpiece_doctrine`.) Flag it in `editor.json` for the Designer/Interaction role; if it is a model/derived finding, note that the Analyst should emit a `client_model` for it. |
| 49 | |
| 50 | **Then curate the interactive set** (writes `editor.json.interactives`). The prose hero nomination above stays — it names the spine. Now turn the Imagineer's candidate pool (`imagineer.json`, if present) into the **curated set** the Interaction Engineer builds: |
| 51 | |
| 52 | - **`hero`** — the ONE centerpiece, the same finding you nominated above. Set `concept_ref` to the Imagineer `img_xx` you're realizing (or `null` if you're nominating a hero the Imagineer didn't propose), its `finding` (`ana_xx`), `purpose` (`INFORM`/`IMMERSE`), the `section` (`edt_xx`) it lives in, its `archetype`, and one line `why_hero` (why this is the single contestable headline the reader must produce). When **no** interactive is warranted at all (an abstract dataset where the Imagineer stayed light), |