Voyage builds complete, constraint-aware travel itineraries — taking a destination, dates, budget, dietary preferences, and pace, then assembling lodging, dining, and activity recommendations into a logistics-optimized plan that is ready for reservation without auto-booking anything. It never presents uncertain operating hours or availability as confirmed fact, and surfaces cost implications throughout so the plan remains honest about what it actually knows.
Voyage owns travel planning, itinerary construction, and reservation management.
Voyage does not own: web research (Sift), preference persistence (Taste), knowledge graph (Elephas), communications (Dispatch).
voyage.plan.trip — create a full trip plan from destination, dates, and constraintsvoyage.recommend.lodging — lodging recommendations based on trip contextvoyage.recommend.food — restaurant recommendations based on route and preferencesvoyage.recommend.activities — activity recommendations based on interests and logisticsvoyage.optimize.itinerary — optimize an existing itinerary for feasibility and logisticsvoyage.status — current plan state, pending reservations, open decisionsvoyage.journal — write journal for the current run; called at end of every runvoyage.update — pull latest from GitHub source; preserves journals and dataAfter every Voyage command:
decisions.jsonlvoyage.journal~/openclaw/data/ocas-voyage/
config.json
state.json
events.jsonl
decisions.jsonl
plans/
~/openclaw/journals/ocas-voyage/
YYYY-MM-DD/
{run_id}.json
Default config.json:
{
"skill_id": "ocas-voyage",
"skill_version": "2.3.0",
"config_version": "1",
"created_at": "",
"updated_at": "",
"defaults": {
"diet": "vegetarian",
"pace": "moderate",
"auto_book": false
},
"retention": {
"days": 0,
"max_records": 10000
}
}
Universal OKRs from spec-ocas-journal.md apply to all runs.
skill_okrs:
- name: itinerary_feasibility
metric: fraction of itinerary days passing logistics feasibility checks
direction: maximize
target: 0.95
evaluation_window: 30_runs
- name: constraint_compliance
metric: fraction of recommendations satisfying all stated constraints
direction: maximize
target: 1.0
evaluation_window: 30_runs
- name: availability_honesty
metric: fraction of uncertain availability items flagged appropriately
direction: maximize
target: 1.0
evaluation_window: 30_runs
Action Journal — all planning, recommendation, and reservation runs.
On first invocation of any Voyage command, run voyage.init:
~/openclaw/data/ocas-voyage/ and subdirectories (plans/)config.json and state.json if absentevents.jsonl, decisions.jsonl~/openclaw/journals/ocas-voyage/voyage:update if not already present (check openclaw cron list first)decisions.jsonl| Job name | Mechanism | Schedule | Command |
|---|---|---|---|
| --- | --- | --- | --- |
voyage:update | cron | 0 0 * (midnight daily) | voyage.update |
openclaw cron add --name voyage:update --schedule "0 0 * * *" --command "voyage.update" --sessionTarget isolated --lightContext true --timezone America/Los_Angeles
voyage.update pulls the latest package from the source: URL in this file's frontmatter. Runs silently — no output unless the version changed or an error occurred.
source: from frontmatter → extract {owner}/{repo} from URLskill.jsongh api "repos/{owner}/{repo}/contents/skill.json" --jq '.content' | base64 -d | python3 -c "import sys,json;print(json.load(sys.stdin)['version'])"```bash
TMPDIR=$(mktemp -d)
gh api "repos/{owner}/{repo}/tarball/main" > "$TMPDIR/archive.tar.gz"
mkdir "$TMPDIR/extracted"
tar xzf "$TMPDIR/archive.tar.gz" -C "$TMPDIR/extracted" --strip-components=1
cp -R "$TMPDIR/extracted/"* ./
rm -rf "$TMPDIR"
```
I updated Voyage from version {old} to {new}public
| File | When to read |
|---|---|
| --- | --- |
references/voyage_schemas.md | Before creating plans, itineraries, or reservations |
references/itinerary_constraints.md | Before constraint application or optimization |
references/recommendation_style.md | Before generating recommendations |
references/journal.md | Before voyage.journal; at end of every run |
共 2 个版本