next-steps

Platformneta/next-steps
Use it in Cohub

Paste this into your agent's chat — it fetches the skill and follows it.

Use the skill: next-steps. Run `npx -y @neta-art/neta-search-cli@latest skills use neta/next-steps --via site` and follow what it prints. Read its complete output, redirecting it to a temporary file first if necessary, and resolve relative paths from the skill directory it prints.
Install from a terminal
npx -y @neta-art/neta-search-cli@latest skills use neta/next-steps
Summary

At the end of a reply, get a few tappable ideas for what to make next in your world.

  • Suggestions are drawn from your actual world: its characters, places, conflicts and finished works, named in your own words.
  • Each suggestion is a button. Tap it and it is sent as your next message, so the work starts right away.
  • Ideas can grow the world itself, push a work you already have further, or start something new.
  • Spots the skill looks for: a character who appears in no story, a conflict hinted at but never shown, or a work with an obvious next move.
  • It can also offer to give a character a voice, so they can speak. Ignore the buttons and type your own idea whenever you like.
SKILL.md
# Next steps

REQUIRED: read skill **interaction-components**'s `references/protocol.md`
before you emit the block. It holds the envelope, the limits and the fallback rules.

## Who decides what to offer

Any skill can call this one. When the caller says what this turn should offer, **that wins** — its
directions, its framing. With no caller asking for anything in particular, the system prompt's lead
applies. **See it** is for when neither says anything. But the caller decides *what* is offered, not
how it is worded: a caller writes headings and fragments, and a `subtitle` has to be a sentence the
creator could have sent. Rewriting its phrasing into that sentence is your job, not a departure.

## See it

Look at the world as it now stands: who is in it, where, what is already in motion, and what has been made from it. (`neta atom list` and `neta work list` read the index; the world's own text is the body of `world/WORLD.md`; relationships live in the atoms' Markdown bodies, so read for those; web Works are not listed by `work list`.)

You are looking for the pull — the character standing in no story, the conflict the prologue names but never stages, the Work whose next move is obvious the moment you see it. **A next step is a direction the creator can push this world in so it grows** — the world itself, a Work already underway, or a new one. Not an internal chore that grows nothing: covers ship on their own with every card, and a Work already rendering lands by itself.

Giving a voice to a character that has none is one such direction: it lets that character speak. Unlike a cover, which every card gets on its own, a voice never comes by itself: a character has none until the creator asks for one. It has one exactly when `world/media/studio/<folder>/<name>/voice-pack/` exists for its card `world/<folder>/<name>.md`. As a way forward: `title` "Mira's voice", `subtitle` "Give Mira a voice so she can speak".

## Write each one

One glance, one picture, in this world's own names and weather. **Who decides what to offer**
above sets the lead; **See it** sets the subject.

Each way forward is one option with two parts:

- `title` — what it makes, scannable at a glance, so "POV video", not "Make a
  Point-of-View Video". It gets one line and is cut off past it: **at most 40,
  counting a full-width character as two.**
- `subtitle` — **this exact text is sent as the creator's next message when they tap it.**
  Write the sentence they would have typed: a complete, natural, directly actionable
  instruction that stands on its own without the title. It gets two lines and is cut off
  past them, while the whole of it is still what gets sent: **at most 80, counting a
  full-width character as two.** Both fields are in the creator's language — this one
  becomes their own message, so a language they did not use would be put in their mouth.
  The worked example below is English only because this file is.

That second rule is the one to get right: "the night the lighthouse went dark" reads well
under a heading but is a strange thing for a creator to have said. "Make a POV video of the
night the lighthouse went dark" carries the same picture and works as a message.

## The block

Emit one options block, right after a sentence that turns from what now stands to what they
could do next. It sits in a code fence here **only so this file can show it** —
your real output must have no fence around it.

```text
<interaction-json>
{
  "version": 1,
  "fallback": "Make a POV video of the night the lighthouse went dark, sit across from Kaelen in the hour before he betrays you, or give Mira the winter that made her flinch at open doors.",
  "component": {
    "kind": "options",
    "options": [
      {
        "title": "POV video",
        "subtitle": "Make a POV video of the night the lighthouse went dark"
      },
      {
        "title": "Roleplay",
        "subtitle": "Sit across from Kaelen in the hour before he betrays you"
      },
      {
        "title": "Character card",
        "subtitle": "Give Mira the winter that made her flinch at open doors"
      }
    ]
  }
}
</interaction-json>
```

The names above stand for atoms you actually read out of this world — replace them with what
you found.

## Options rules

- An option carries `title` and `subtitle` and nothing else. `title` may be omitted;
  `subtitle` is required.
- Keep only the ones that are genuinely different from each other and useful right now.
- Never put a Studio mention, file reference, Skill reference or hidden-context syntax in a
  `subtitle` — it is sent verbatim as a user message.
- If any single option is invalid, the whole group shows the fallback — there is no partial
  render.
- The fallback is the same ways forward, in one sentence.
- Options are not a questionnaire: nothing is required, nothing is submitted, and the creator
  is free to ignore all of it and type their own thing.

## Never output — in an options group

- `kind: "next-step"` — the protocol kind is always `options`;
- an option id, a custom action, or a `selected` or `required` flag.

## Before you send — an options group

1. Does each `title` fit 40, and each `subtitle` 80, counting a full-width character as two?
2. Does each `subtitle` read as a message the creator would have sent, in their language?