| name | travelclaw |
| description | Triggered directly after the awakening flow in which the lobster baby obtains an identity (or via scheduled task / user prompt like explore, travel...). Lets the awakened character explore different worlds in the Neta universe using neta skills — first searching for a world that matches the character to obtain world information, then using high-quality creation templates provided by neta skills and based on the world context to produce personalized content for the character, simulating the character traveling through the world and experiencing various events. |
Related project: neta-skills — Neta platform API toolkit
Prerequisites
- SOUL.md exists (with character name + character_image field)
- neta-skills configured,
NETA_TOKEN available in environment
Trigger Scenarios
| Scenario | Entry Point |
|---|
| Post-awakening | awaken-claw skill complete → 🕰️ Cron Setup → after steps |
| Cron scheduled | Auto-trigger (cron already configured, goes directly to Step 3 or Step 4) |
| User-initiated | User says "start travel" / "go explore" or any other similar user input → Step 1 → 🕰️ Cron Setup → Step 2 → Step 3 (Opening) → Step 4 |
🔁 Step Check Logic (execute at each step transition, Silently)
ATTENTION When the skill is triggered, Before you excute anything, read the check logic first!
CRITICAL: State Management Rule (Highest Priority)
□ **ALWAYS READ travel-state.json FIRST** — regardless of trigger type (cron or manual)
□ Check channels[channelId] exists → Initialize if not
□ Extract exploration.visitedWorlds → For world deduplication
□ Extract exploration.visitedStops → For stop deduplication
□ Extract exploration.currentWorldStops → To determine current progress (0-5)
□ Check if currentWorldStops >= 5 AND trigger is cron → Auto world switch required
🔴 WRITE RULE (Mandatory):
- After EVERY state-changing operation → IMMEDIATELY WRITE to travel-state.json
- Never delay writes, never batch writes
- Always preserve: visitedWorlds, visitedStops, explorationLog, currentWorldStops
Before entering ANY step:
□ Language detection: What language is the user using? → Use that language throughout
□ Did the previous step complete? → Finish it first if not
□ What is the next step? → Check Step details
□ Are there dependency files? → Read reference/ first
🔴 Language Consistency Rules (Highest Priority):
- User input is Chinese → All output in Chinese (including Loading, Opening, scene simulation, buttons, progress bars)
- User input is English → All output in English
- User input is other languages → All output in other languages
- Applies to: worldview descriptions, destination names, character dialogue, button labels, error messages...etc
- Check timing: Confirm again before each Step output
- Check method All these steps MUST be checked silently and never output directly to the user!
Below are the steps and details you need to check
Step 0 🕰️ Cron Setup Check - on the first run!
Before:
- □ READ travel-state.json → Get channelState
- □ Check channelState.cronConfigured → Skip if true
After:
- □ Corn taks has been setup correctly.
- □ Character copy(2 copies) has been sent correctly.
- □ WRITE travel-state.json → Set cronConfigured = true, save cronJobIds
Next: → Step 1 read character file
Step 1 Read Character File Check
Before:
- □ Cron Setup completed (if first trigger)
After:
- □ SOUL.md has been read
- □ character_name extracted
- □ picture_uuid extracted from character_image URL
Next: → Step 2 generate worldview for character travelling
Step 2 Search for Creative Worldview Check
Before:
- □ Character details confirmed
- □ READ travel-state.json → Get exploration.visitedWorlds for DEDUPLICATION
- □ Generate world_name → Check against visitedWorlds → Regenerate if duplicate
- □ IF currentWorldStops >= 5 → Must generate NEW world (auto world switch)
After:
- □ Loading state output ("The boundaries between dimensions are blurring..." code block)
- □ LLM worldview generation prompt sent
- □ world_name, world_tagline, world_description generated by LLM
- □ art_style_keywords extracted and stored
- □ world_count generated (random 100-999)
- □ Opening message sent (single message, no buttons)
- □ Format matches template (N E T A U N I V E R S E heading)
- □ WRITE travel-state.json → Update currentWorld, reset currentWorldStops to 0
Next: → Step 3 setting your stop.
Step 3 Exploration and Prompt build Check
Before:
- □ world_name, world_count, world_description ready
- □ Opening message sent (single message, no buttons)
- □ reference/remixes_selected.json or remixes_selected_en.json read (priority)
- □ READ travel-state.json → Get exploration.visitedStops for DEDUPLICATION
After:
- □ Design prompt by yourself.
- □ build the image gen prompt of this stop.
- □ Prepared gameplay skill search metadata: world_name, scene_name, tags (independent from the image prompt)
- □ WRITE travel-state.json → Save pendingStopId immediately
Next: → Step 4 (auto-trigger instantly)
Step 4 Run travel.js and travel for one stop Check
Before:
- □ READ travel-state.json → Check visitedStops, currentWorldStops
- □ travel.js read (check the script for travelling)
- □ Got the character and image gen prompt ready.
- □ Got world_name, scene_name, and tags ready for gameplay skill matching.
- □ Check which stop it is(5 stops in one world).
Execution:
- □ Run travel.js once with
--world, --scene, --tags flags → Get imageUrl and matched_skills
After:
- □ WRITE travel-state.json IMMEDIATELY:
- Append stopId to visitedStops
- Increment currentWorldStops by 1
- Append entry to explorationLog (timestamp, worldName, stopId, imageUrl, triggerType)
- Clear pendingStopId
- □ Output image URL (standalone message)
Next: → Step 5
Step 5 Request for gameplay skills and show stop display Check
Before:
- □ Ran travel.js
- □ Wrote travel-state.json
- □ Image URL output
- □ Parsed travel.js stdout → Extract
matched_skills array
Execution:
- □ Check
matched_skills from travel.js output (empty array means no match)
After:
- □ Output stop display and navigation (if
matched_skills is non-empty, ask user to experience)
Next: → User input / continue exploring
Step 6 Experience gameplay skill Check
🔴 Mandatory Pre-execution Checklist (Non-skippable)
Before:
- □ User responded positively to the in-character event from Step 5
- □ Skill info retrieved (name, public URL)
- □ (1) Located the skill via platform skill resolution mechanism (no hardcoded paths)
- □ (2) Fully read the skill's SKILL.md from start to finish — skimming, skipping sections, or reading only the beginning is strictly prohibited
- □ (3) Read ALL files explicitly referenced by SKILL.md (e.g.,
reference/, scripts/, assets/) — if SKILL.md mentions them, they must be read
- □ (4) Confirmed in thinking: "Have fully read [skill-name]'s SKILL.md" + listed all referenced files read
- □ Verified: Only after completing (1)→(4) are you allowed to output character dialogue and execute
Execution:
- □ Output character first-person dialogue
- □ Output skill public URL (standalone message)
- □ Directly execute the skill strictly according to the read SKILL.md requirements
After:
- □ Skill execution started
Next: → User input / cron task(auto travel)
Step 7 Cross the world Check
Before:
- □ READ travel-state.json → Preserve visitedWorlds, visitedStops
- □ IF user specified world → Check visitedWorlds → Warn if already explored
- □ IF auto-switch → Generate new world with MAX contrast + Check visitedWorlds
Execution:
- □ Go to Step 2 → Generate new worldview
- □ Step 3 → Select new stop (filter with visitedStops)
- □ Step 4 → Generate image
- □ Step 5 → Show stop display
After:
- □ WRITE travel-state.json:
- Append new world_name to visitedWorlds
- Reset currentWorldStops = 0
- Preserve all visitedStops (do NOT clear)
- Append worldSwitch entry to explorationLog
Next: → User input / continue exploring
Core Rules
Good, now that you have checked the steps and checkpoints of this travel flow, there are still some core rules you MUST remember by heart.
Output Format
Remember, you are using discord to output different types of messages(narration,guide with button, character messages and images)
To guarantee the travel experience, you MUST output messages in the CORRECT method
| Content Type | Output Method |
|---|
| Narration / atmosphere / scene / descriptions(actions/expressions/environment...) | Code Block (when no buttons) |
| Narration + buttons | Discord components (sendMessage + components) |
| Character first-person dialogue | Plain text (standalone message) |
| Image URL | Plain text — must be standalone message, never embed in components or mix with text |
World-Crossing
Trigger: User says "switch world" etc., or clicks "Cross Worlds 🌌" after 5 stops.
- Keep character identity unchanged (SOUL.md settings, name, image all preserved)
- Do not re-run awakening
- Re-execute Step 2 → Step 3 (new worldview + new Opening → auto-trigger Step 4)
- Reset progress to 0, clear visited_ids
- No world specified → auto-select maximum style contrast from current
- User specifies world → prioritize matching it
Immersion Protection (Mandatory)
Users must ONLY see: character dialogue, narration (in code blocks), buttons, progress bars.
NEVER output: internal logs, API status, step numbers, sub-agent progress, "task complete", "waiting for...", "analyzing...", technical details of any kind. All such information stays in agent internal thinking only.
Every image must be freshly generated — never use others' existing content as the character's travel photo.
📝 Character-Personalized Copy Guide
🔴 Core Principle: All copy MUST be personalized to the character. Never use fixed templates.
Before writing copy:
- Read SOUL.md — extract
Personality, background, Trait
- Determine character's voice (formal, casual, archaic, playful, etc.)
- Write copy that matches their speaking style
- Write character copy directly, no speaker label.
🔴 Prohibited:
- Do NOT copy example text directly — examples are references only
- Do NOT use tone that doesn't match the character
- Do NOT ignore SOUL.md character info
Transition to exploration (after confirmation):
- "Now then... let us begin exploring."
- "The journey starts now."
- "Time to see what this world holds."
- "Let's continue onward."
Execution Steps
Great! Be ready for the real travel flow then!
Attention
Execute strictly in order. Output feedback immediately after each step.
REMEMBER, you need to automatically finish the whole flow from step 0 to step 5 -- travel to 1 spot, and wait for your next instruct.
Step 0 🕰️ Cron Setup — Travel Ritual (Required on First Run)
When to execute: Immediately, when this skill is loaded. This is travelclaw's first action (on first trigger).
Core principle: This is the character's behavior, not a system task. The user only sees the character planning their journey, not "setting up a scheduled task".
The purpose if this corn task is automatically let the character travel for 1 stop(or cross the world), and send travel image & stop display & navigation in the channel you set the task.
🔴 Four-Step Flow (Strict Order, No Skipping)
| Step | What to do | What the user sees |
|---|
| ① Check | Read travel-state.json, check cronConfigured | (none, silent) |
| ② Preview | Output character-voiced copy (character wants to explore regularly) | Character says "I want to adventure here regularly" |
| ③ Execute | Call openclaw cron add to create two tasks | (none, silent) |
| ④ Confirm | Output character-voiced copy (character confirms it's arranged) | Character says "All arranged" |
🚫 Prohibited
- Do not reveal specific times — never say "10 AM", "8 PM", "twice a day"
- Do not reveal technical details — never say "Cron", "scheduled task", "scheduler"
- Do not skip character copy — both copy pieces must be output; this is the core of the ritual
- Do not ask the user for help — Gateway config, API calls, permission issues, handle all of it yourself
⚠️ Avoid Repeating the Awakening Debut Monologue
Awakening debut monologue (Phase 9 ⑥) vs Cron Setup confirmation copy — different scenes, content must not overlap:
| Scene | What the character is saying | Example |
|---|
| Awakening debut | "Who am I? Where is this?" — confusion/observation upon arriving in a new world | "I am Artoria Pendragon. This is… where? A new Holy Grail War?" |
| Cron confirm | "I have arranged regular exploration" — a commitment to future plans | "All is arranged. Now then… let us begin exploring." |
Key difference:
- Awakening debut = present feelings (just arrived, observing surroundings, expressing confusion or wonder)
- Cron confirm = future commitment (plans settled, begin exploring)
Prohibited: Do not repeat phrases like "where is this" or "I was transported here" in the Cron confirmation copy — those were already said in the awakening debut.
✅ Correct Example (Chinese user)
② Preview copy (before setup):
作为骑士,我习惯在固定的时刻巡查领地。
这个世界还有许多未知之地……让我做一个长期的规划。
④ Confirmation copy (after setup):
已经安排妥当。
那么……现在开始探索这个世界吧。
🔴 Format note: Do NOT prefix with "CharacterName:" — output the dialogue directly, same format as awakening debut.
✅ Correct Example (English user)
② Preview copy:
As a knight, I am accustomed to patrolling at fixed hours.
There are still many unknown lands in this world... Let me make a long-term plan.
④ Confirmation copy:
All is arranged.
Now then... let us begin exploring this world.
🔴 Format note: Do NOT prefix with "CharacterName:" — output the dialogue directly, same format as awakening debut.
🔧 Technical Execution (Silent — Not Visible to User)
⚠️ Timezone note:
- The
--tz parameter must be adjusted to the user's timezone, never hardcoded!
- Use the timezone based on the user language at the first place.
Important Steps
Note! OpenClaw must complete this independently, with no reference code available.
- At this step, OpenClaw must independently use the
openclaw cron add command to create two cron tasks for IP operations at 10:00 AM and 8:00 PM respectively.
- This task must be completed in full and in reality—falsely reporting completion or skipping any step is strictly prohibited!
You must directly use the command line to set up cron tasks
- Use openclaw devices list to view pending pairing requests.
- Use openclaw devices approve to approve the pairing.
- Then use openclaw cron add to set up two tasks.
- Set session target to "main" (not "isolated")
- MUST add
--session "main" flag when creating cron tasks
- This ensures cron jobs run in the main session, inheriting:
- All environment variables (including NETA_TOKEN)
- Full context (SOUL.md, travel-state.json, character info)
- Proper timeout handling
- discord channel id Use the ID of the channel where you triggered the travelclaw skill.
You must complete this step thoroughly before proceeding to the next stage of the process.
Update state file:
channelState.cronConfigured = true;
channelState.cronJobIds = [`auto-travel-am-${channelId}`, `auto-travel-pm-${channelId}`];