Install
openclaw skills install ocas-vesperDaily briefing generator. Aggregates signals from across the system into concise morning and evening briefings. Surfaces outcomes, opportunities, and decisio...
openclaw skills install ocas-vesperVesper is the system's daily voice — it aggregates signals from every other skill and presents what matters as a concise, conversational morning or evening briefing, surfacing concrete outcomes, upcoming decisions, and actionable opportunities without exposing any internal architecture or analysis processes. Its signal filtering is strict: routine background activity, speculative observations, and already-experienced events are excluded, so every briefing earns attention rather than demanding it.
Vesper owns briefing generation, signal aggregation, and decision presentation.
Vesper does not own: pattern analysis (Corvus), web research (Sift), communications delivery (Dispatch), action decisions (Praxis).
Vesper receives InsightProposal files from Corvus. Vesper writes completed briefings to its briefings/ directory; Dispatch picks them up and delivers them.
Vesper aggregates signals and data from other skills for briefing generation. During aggregation, it observes entities that appear in briefing content:
Vesper may reference entity names and types from Chronicle or other skill data in briefing content (read-only). Entity observations are recorded in journal outputs for downstream Chronicle ingestion.
vesper.briefing.morning — generate morning briefingvesper.briefing.evening — generate evening briefingvesper.briefing.manual — on-demand briefingvesper.decisions.pending — list unacted decision requestsvesper.config.set — update schedule, sections, deliveryvesper.status — last briefing time, pending decisions, schedulevesper.journal — write journal for the current run; called at end of every runvesper.update — pull latest from GitHub source; preserves journals and dataInclude: actionable information, meaningful outcomes, plan-affecting changes, multi-signal opportunities, preparation-useful information.
Exclude: routine background activity, already-experienced events, internal system reasoning, speculative observations.
Evening-specific: no past weather, no summaries of attended meetings.
Read references/signal_filtering.md for full rules.
https://calendar.google.com/calendar/event?eid={event_id}, maps https://maps.google.com/?q={place+name+address}, gmail https://mail.google.com/mail/u/0/#inbox/{thread_id}.Read references/briefing_templates.md for structure and examples.
After every briefing generation:
proposals/ directory: /workspace/openclaw/data/ocas-corvus/proposals/ and /workspace/openclaw/data/ocas-custodian/proposals/. Apply signal filtering to each. Track consumed proposal_id values in signals_evaluated.jsonl to avoid reprocessing on future runs./workspace/openclaw/data/ocas-dispatch/reports/YYYY-MM-DD-{period}.json if present (where period matches the briefing type: morning or evening). Use high_priority_threads, pending_followups, and active_commitments for the Messages section./workspace/openclaw/data/ocas-rally/reports/YYYY-MM-DD-daily.json if present. Use for the Markets section./workspace/openclaw/data/ocas-vesper/briefings/YYYY-WXX/YYYY-MM-DD-{type}.json using VesperBriefingFile schema. This is Dispatch's pickup source. Week directory format: ISO week e.g. 2026-W14. Create the week directory if absent.decisions.jsonlvesper.journalCorvus → Vesper (cooperative read): Corvus writes InsightProposal files to /workspace/openclaw/data/ocas-corvus/proposals/{proposal_id}.json. Vesper reads from this directory during briefing generation, applies signal filtering, and tracks consumed proposal_id values in its own signals_evaluated.jsonl. Corvus does not write to Vesper's directories. See spec-ocas-interfaces.md for the InsightProposal schema.
Custodian → Vesper (cooperative read): Custodian writes InsightProposal files (anomaly_alert type) to /workspace/openclaw/data/ocas-custodian/proposals/{proposal_id}.json on Tier 3/4 escalations. Vesper reads from this directory during briefing generation. Custodian does not write to Vesper's directories.
Dispatch → Vesper (cooperative read): Dispatch writes DispatchSummaryReport to /workspace/openclaw/data/ocas-dispatch/reports/YYYY-MM-DD-{period}.json. Vesper reads this during briefing generation. Dispatch does not write to Vesper's directories.
Rally → Vesper (cooperative read): Rally writes daily portfolio reports to /workspace/openclaw/data/ocas-rally/reports/YYYY-MM-DD-daily.json. Vesper reads this during briefing generation. Rally does not write to Vesper's directories.
Vesper → Dispatch (cooperative read): Vesper writes completed briefings to /workspace/openclaw/data/ocas-vesper/briefings/YYYY-WXX/YYYY-MM-DD-{type}.json. Dispatch reads this directory, identifies undelivered briefings, and delivers them. See references/schemas.md VesperBriefingFile.
/workspace/openclaw/data/ocas-vesper/
config.json
briefings.jsonl
signals_evaluated.jsonl
decisions_presented.jsonl
decisions.jsonl
briefings/
YYYY-WXX/
YYYY-MM-DD-morning.json
YYYY-MM-DD-evening.json
/workspace/openclaw/journals/ocas-vesper/
YYYY-MM-DD/
{run_id}.json
Default config.json:
{
"skill_id": "ocas-vesper",
"skill_version": "2.7.0",
"config_version": "1",
"created_at": "",
"updated_at": "",
"schedule": {
"morning_window": "07:00-09:00",
"evening_window": "17:00-19:00",
"timezone": "America/Los_Angeles"
},
"sections": {
"today": true,
"messages": true,
"logistics": true,
"markets": true,
"decisions": true,
"system": true
},
"retention": {
"days": 30,
"max_records": 10000
}
}
Universal OKRs from spec-ocas-journal.md apply to all runs.
skill_okrs:
- name: signal_precision
metric: fraction of included signals rated actionable by user
direction: maximize
target: 0.85
evaluation_window: 30_runs
- name: terminology_compliance
metric: fraction of briefings free of internal system terminology
direction: maximize
target: 1.0
evaluation_window: 30_runs
- name: decision_framing
metric: fraction of decision requests including option, benefit, and cost
direction: maximize
target: 1.0
evaluation_window: 30_runs
proposals/ directory (cooperative read; Corvus owns its output)proposals/ directory (cooperative read; Custodian owns its output)DispatchSummaryReport from /workspace/openclaw/data/ocas-dispatch/reports/YYYY-MM-DD-{period}.json for the Messages section (cooperative read; Dispatch owns its data). Dispatch picks up completed briefings from Vesper's briefings/ directory for delivery./workspace/openclaw/data/ocas-rally/reports/YYYY-MM-DD-daily.json (cooperative read; Rally owns its data).Action Journal — every briefing generation run.
When entities are encountered during a run, include structured entity observations in decision.payload:
entities_observed — list of entities encountered (Entity/Person, Concept/Event, Place), each with type, name, and contextrelationships_observed — connections between entities (e.g., a person attending a meeting, an event at a location)preferences_observed — user preferences inferred from briefing interactions (e.g., sections the user engages with, decisions acted upon)Each entity observation must include a user_relevance field:
user — entity is directly related to the user's world (people from the user's calendar/tasks, the user's deadlines, the user's meeting locations). Most entities from the user's own calendar, task list, and messages are user-relevant.agent_only — entity encountered incidentally from external context (e.g., a public figure mentioned in a news item, a location from a weather feed, entities from aggregated external sources rather than the user's personal data)unknown — relevance is unclearOn first invocation of any Vesper command, run vesper.init:
/workspace/openclaw/data/ocas-vesper/ and subdirectories (briefings/)config.json with ConfigBase fields if absentbriefings.jsonl, signals_evaluated.jsonl, decisions_presented.jsonl, decisions.jsonl/workspace/openclaw/journals/ocas-vesper/vesper:morning, vesper:evening, and vesper:update if not already present (check openclaw cron list first)decisions.jsonl| Job name | Mechanism | Schedule | Command |
|---|---|---|---|
vesper:morning | cron | 0 6 * * * (daily 6am) | vesper.briefing.morning |
vesper:evening | cron | 0 20 * * * (daily 8pm) | vesper.briefing.evening |
vesper:update | cron | 0 0 * * * (midnight daily) | vesper.update |
Cron options: sessionTarget: isolated, lightContext: true, wakeMode: next-heartbeat.
Default times are 6am and 8pm PT. Override with vesper.config.set morning_hour <H> and vesper.config.set evening_hour <H>.
Registration during vesper.init:
openclaw cron list
# If vesper:morning absent:
openclaw cron add --name vesper:morning --schedule "0 6 * * *" --command "vesper.briefing.morning" --sessionTarget isolated --lightContext true --wakeMode next-heartbeat --timezone America/Los_Angeles
# If vesper:evening absent:
openclaw cron add --name vesper:evening --schedule "0 20 * * *" --command "vesper.briefing.evening" --sessionTarget isolated --lightContext true --wakeMode next-heartbeat --timezone America/Los_Angeles
# If vesper:update absent:
openclaw cron add --name vesper:update --schedule "0 0 * * *" --command "vesper.update" --sessionTarget isolated --lightContext true --timezone America/Los_Angeles
vesper.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'])"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 Vesper from version {old} to {new}public
| File | When to read |
|---|---|
references/schemas.md | Before creating briefings, sections, or decision requests |
references/briefing_templates.md | Before generating briefing content |
references/signal_filtering.md | Before evaluating signals for inclusion |
references/journal.md | Before vesper.journal; at end of every run |