Basic Cohub abilities. Most agents already have these mounted; listed here for reference.
Platform Published by the Neta team.
Official Made by the Neta team.
Verified Reviewed by the Neta team.
Community Shared by a Cohub user. Not reviewed — read SKILL.md before you use it.
clue-room
Community@xixi/clue-room
Community skill — not reviewed. It was shared by 西西 and has not been checked by Neta. Read SKILL.md below before letting an agent use it.
Use it in Cohub
Paste this into your agent's chat — it fetches the skill and follows it.
Use the skill: clue-room. Run `npx -y @neta-art/neta-search-cli@latest skills use @xixi/clue-room --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 @xixi/clue-room
Summary
Turn one secret place into a small web page where the player finds the story by looking through ordinary objects.
Pick a room, desk, inbox or phone gallery and a secret. You get a page with 4 to 7 everyday things to look at.
Each object opens one step at a time: how it looks, a detail that feels off, then what it really means.
One object stays locked until the player has understood enough of the others, so there is a natural order to follow.
The exit, such as a door or a final message, only appears once everything has been understood. Opening it plays the ending.
Works best with a character who is hiding something. At the end, the player can leave one short line that stays on their own device.
SKILL.md
# Clue Room
A place holds a handful of ordinary things. None of them announces itself. Each opens in two or three layers: the surface, the detail you notice second, and the meaning you only get after both. One object refuses until enough of the others have been read. The exit — a door, a sent message, a final letter — does not exist until every trace has been understood.
Read this file fully before generating anything or writing files. Resolve relative paths from this skill's directory.
## Language
Reply in the user's language, whatever language this file is in. This holds for every message of the run, above all the final handover; translate what the scripts print, don't paste it. All visible text — room intro, trace titles, layer copy, locked hints, ending, the reply placeholder — follows the user's language; lines the user supplied stay as written.
## When to use / when not
Use when the user wants discovery through objects, not dialogue or choices: a private room, a desk, an inbox, a phone gallery, a locker. This skill makes one web Work.
Not for a chat roleplay (`create-roleplay`), a branching game (`create-avg`), a clue hunt with scoring or a win/lose state, or a single illustration. For those, say what this skill makes and stop.
## Inputs
| Item | Required | Counts as given when |
|---|---|---|
| Place | yes | A named room / inbox / gallery in the world, or the user describes where the player is standing. "A room" alone does not count. |
| Traces | yes | 4–7 objects or messages, each with something the character would hide. Fewer than 4 makes the ending unearned. |
| Secret | yes | One sentence the whole room is about. Without it the layers become decoration. |
| Skin | no — default `room` | `room` for spatial hotspots; `inbox` for folders and letters. |
| Reply | no — default on | Whether the player can leave one line at the end. |
Ask once, in one message, if the place, the traces or the secret is missing, then stop. If all three are given, build.
## The mechanic, in numbers
- **Traces:** 5 is the default, 4–7 the range. Each has 2–3 layers. Layer 1 is what anyone sees; layer 2 is a detail that does not fit; layer 3 is what it means. Never put the meaning in layer 1.
- **Reading:** clicking a trace reveals exactly one new layer and keeps the previous ones visible. A trace is *read* only when its last layer has been shown. Progress counts read traces, not clicks.
- **The locked one:** at most one trace has `unlockAfter: n`. It opens after `n` other traces are fully read; before that, its title is visible but its layers are replaced by one refusal line. This creates sequence without a key inventory.
- **The exit:** hidden until every trace is read. In `room` it is a door hotspot at the edge; in `inbox` it is a final message at the top of the list. Clicking it plays the ending.
- **The reply:** after the ending, one optional input lets the player leave a single line. It is saved locally and shown on the ending card, never sent anywhere. Keep it under 60 characters.
- **Spatial layout:** background 1536×1024 (3:2); hotspots are percentages `[x, y, w, h]` measured from the top-left. Marker 22 px, panel `max-height: 62vh`, copy 16 px / 1.9.
- **Skin switch:** `room` and `inbox` share the same trace data and reveal logic. Only the shell changes. Do not fork the content.
## Steps
1. **Read the character and the place.** `neta atom list` → `neta atom get`. Collect the one secret, then five objects that could carry it without stating it. Write `$RUN/secret.md` with the secret in one sentence and why each object is evidence.
2. **Write the layers.** For each trace, write three lines: surface / misfit / meaning. The third line is the only place the secret is allowed to show. Keep each layer under 90 characters so it fits the panel.
3. **Write the plan.** `$RUN/plan.json` per `references/plan-schema.md`. In `room`, every trace needs `spot`; in `inbox`, every trace needs `folder` and `subject`.
4. **Make the scene.** One background image in `room` mode (3:2, empty surfaces where hotspots will sit, no text). In `inbox` mode, no image is required.
```bash
node scripts/gen.mjs --kind image --state $RUN/gen-bg.json --prompt "<scene prompt>" \
--work-title "<Work title>" --param aspect_ratio=3:2 --param image_size=1K --models "<fallbacks>"
```
Rerun while `generating`/`busy`; never resubmit by hand.
5. **Validate and build.**
```bash
node scripts/build.mjs --plan $RUN/plan.json --assets $RUN --out $RUN/site --lang <locale> --check
node /mods/neta/neta work init web works/webs/<slug> --title "<title>"
node scripts/build.mjs --plan $RUN/plan.json --assets $RUN --out works/webs/<slug> --lang <locale>
```
6. **Walk the room.** Serve it and check: a trace shows one layer per click, the locked trace refuses before its threshold and opens after, the exit is absent until all are read, reload restores read layers, the ending shows the reply input, 375 px width does not clip the panel. Write `$RUN/qa.md`.
7. **Publish and hand over.** See Deliver.
`$RUN` = `_runs/clue-room/<timestamp>/`.
## Deliver
One browser web Work.
1. Publish: `node /mods/neta/neta work publish web works/webs/<slug> --title "<same title>"`.
2. Open the published entry, read one trace and confirm the exit is still hidden.
3. In the user's language, state the number of traces, layers, which one is locked and what the exit is.
4. **Hand over with a card — the run is not delivered until this step is done.** One `interaction-components` card on its own line, target `{ "type": "work", "workId": "<id>" }`, the id from the publish output (fallback: `cohubWorkId` in `works/webs/<slug>/meta.json`). Never a made-up id, a folder path, or a `world-file` link to `index.html`.
## Out of scope
- Do not change world settings, delete files that existed before the run, or edit memory, character cards, installed scripts or existing Works.
- Do not add scoring, timers, fail states, inventory or multiple endings. The piece is about understanding, not winning.
- Do not generate one image per trace by default; one background is the budget. Close-ups are optional and only when the user asks.
- Make only the requested Work; do not act on your own next-step suggestions.
## When to stop
- No place, no traces or no secret: ask once, then stop.
- More than seven traces: say the room gets crowded, propose five now plus a second room, and let the user decide. Do not silently cut.
- Asked for a clue game with a culprit to catch: say this skill makes an emotional exploration and stop.
## Gotchas
- Counting clicks instead of completed traces makes the exit appear while a layer is still unread. Track `shown` per trace and compare with `layers.length`.
- The locked trace that reveals its layer count in the refusal line spoils the shape. Show only the refusal and the number of other traces still missing.
- In `room` mode a hotspot with `w`/`h` under 4% is untappable on a phone. Keep the minimum at 6% × 6%, even if the object is smaller.
- On `inbox`, the same trace opened from two folders must share read state by `id`; key the store on the trace id, not the list index.
- A background with baked-in highlights under the hotspots makes the markers look like stickers. Ask for flat, even light in the hotspot areas.