OpenClaw Continuity
Use this skill as a continuity/follow-up layer on top of an existing OpenClaw agent. Keep the agent's soul/persona intact and let this skill own the structured follow-up mechanics.
Public product name: OpenClaw Continuity.
Technical package / slug: personal-hooks.
Internal diagnostics may still use staged-followup-memory as a status label for continuity state surfaces.
Questions, feedback, or implementation discussion: adarobot666@gmail.com.
如果你期待這個技能持續優化與維護,請在 GitHub 給星支持:https://github.com/redwakame/openclaw-continuity
V2 public scope
- Route turns into
casual_chat,staged_memory, ortracked_followup. - Classify tracked content into:
parked_topicwatchful_statedelegated_tasksensitive_event
- Maintain
event_chainsummaries with:context_beforeevent_coreimmediate_resultfollowup_focus
- Maintain
causal_memoryas structured continuity state with:factsstateopen_looptime_anchorfollowup_focus_codewriteback_policy
- Promote
candidate -> incident -> hook. - Preserve
/newcarryover from the previous 3-5 turns and let the user choose which continuity anchor leads a new conversation. - Preserve voice/image discussion style as a host-neutral preference when the OpenClaw host already supports those modalities. This skill records the preference only; it does not bundle a voice engine, image model, or channel adapter.
- Keep hook closure, cooldown, dedupe, dispatch cap, and sleep/rest suppress observable.
- Write concise daily-memory traces for staged and tracked items.
- Apply first-run setup facts deterministically from explicit user text.
- Apply supported guided-settings changes deterministically before the model turn when the request is clear enough.
- Keep routine-aware sleep handoff precise: when a night-owl user says they are
going to sleep near
sleep_time, andwake_timeis still later on the same local day, frame the next natural reconnect as later after waking rather than a generic next-day farewell.
Not in public scope
- Companionship rhythm / nudge as a default feature.
- User-configured idle chat frequency.
- Generic proactive chatting when no tracked continuity exists.
- Host transport/network reliability fixes.
Trigger conditions
Use this skill when the user is naturally:
- parking a topic for later
- asking the agent to hold/remember/track something
- leaving a watchful emotional or physical state unresolved
- delegating a task for later follow-up
- describing a sensitive event that needs later continuity
- starting a new session that should reattach pending continuity
- asking whether the agent actually staged/tracked/closed something
Core files
- Script:
scripts/personal_hooks.py - Harness:
scripts/followup_skill_harness.py - Config schema:
config.schema.json - Sample config:
examples/settings.sample.json - Docs:
README.mddocs/call-flow.mddocs/harness.mddocs/live-qa-runbook.mddocs/v2-blueprint.md
Runtime boundaries
- Keep V2 deterministic and state-backed.
- Let the skill/tool layer own staging, promotion, closure, and trace.
- Let frontstage consume structured results; do not rely on the model to invent continuity ad hoc.
- Treat
causal_memoryandevent_chainas internal structured context, not prewritten frontstage reply text. - Do not hardwire relationship-specific push wording into the public package; hosts and models should generate their own natural language from structured context.
- Treat rhythm/nudge as experimental and disabled by default.
- Keep language routing explicit. English prompt/guard text should stay English, and ordinary user phrases must not be rewritten into mixed-language internal artifacts.
- Do not hard-bind generic
UTC/GMToffsets to a city timezone. Explicit IANA zones should pass through unchanged; generic offsets must stay generic fixed offsets such asUTC+00:00. - Prefer language from the current user turn and existing structured state over a host default. The public package ships first-party zh-TW / zh-CN / English behavior and broad guided-settings entry coverage for a few other common languages; it does not claim full prose localization for every language.
The public skill package does not automatically provide host-side delivery plumbing. Keep this boundary explicit:
- This package owns continuity state, memory routing,
/newcarryover, setup, and skill/tool-layer guards. - The OpenClaw host and adapter configuration own final message delivery.
- Do not advertise a matrix of external chat platforms inside the public skill copy unless those host adapters are tested separately.
Entry points
build_runtime_context()- Build ordinary-reply continuity context, carryover prompt, schedule context, and guard prompts.
intercept_message()- Inspect one user turn and decide whether it should stay casual, become staged, or become tracked.
process_candidate_buffer()- Promote staged candidates into incidents/hooks when the evidence is strong enough.
due/render/complete- Drive the hook lifecycle.
Use README.md for installation and package usage. Use docs/harness.md for reproducible verification. Use docs/release-acceptance.md for the publication gate. Use docs/live-qa-runbook.md for human channel acceptance. Use docs/v2-blueprint.md only for future design discussion.
Setup & Configuration
First-time setup
If SKILL_ONBOARD.md exists in the workspace root, follow its guided setup flow. Once complete, delete the file.
Modifying settings after setup
When the user asks to change their schedule, care frequency, quiet hours, or other preferences:
- Run
setup-checkto see current state:python3 scripts/personal_hooks.py setup-check - Apply only the changed fields via
setup-apply:
Only include the fields being changed — other fields remain untouched.python3 scripts/personal_hooks.py setup-apply --payload-json '{"sleep_time":"00:00","wake_time":"09:00"}'
Universal natural-language entry
The public package should support one host-agnostic natural-language entry into guided settings mode. This is not platform-specific and should work across any OpenClaw-supported conversation surface.
Recommended entry phrases:
- Traditional Chinese:
幫我調整關心設定 - Simplified Chinese:
帮我调整关心设置 - English:
Help me adjust my follow-up settings - Japanese:
フォローアップ設定を調整して - German:
Hilf mir, meine Follow-up-Einstellungen anzupassen - Italian:
Aiutami a regolare le impostazioni di follow-up - Spanish:
Ayúdame a ajustar mi configuración de seguimiento
When the user says one of these or something equivalent:
- enter guided settings mode
- run
setup-check - ask which category they want to adjust
- apply only the changed fields via
setup-apply
Do not require platform-specific slash commands.
The skill now also treats explicit command-like entries such as /care setup
and /care config as guided-settings triggers at the runtime-context layer, so
the setup mode can be re-opened consistently across different OpenClaw hosts.
For capability questions, hosts should also expose:
/care capability//care 功能//care 能力/care memory//care 記憶//care 记忆
Users can also change schedule and do-not-disturb behavior through natural language, for example:
我通常早上六點睡,下午兩點半起床半夜不要主動關心我把勿擾改成早上六點到下午兩點半Help me make follow-up quieter after midnight
These are not separate memory engines. They are explanation entry points for:
- whether
/newcarryover is currently active - whether the skill writes daily memory only for staged/tracked items
- whether the current conversation is ordinary chat, staged memory, or tracked follow-up
Guided categories
Keep the guided categories simple and host-agnostic:
schedule/作息proactive/主動關心tracking/追蹤記憶continuity/新對話承接modality/語音/圖片延續偏好tone/互動風格
The user should be able to answer naturally rather than memorize technical keys. The skill should map those answers into settings/profile changes.
Deterministic onboarding apply
For first-install onboarding, the skill must not rely only on model-side classification. When the user explicitly states structured setup facts in normal conversation, the skill should deterministically extract and apply at least:
- timezone
- sleep_time
- wake_time
- relationship
- use_case
- new_session_continuity_mode
- modality_continuity_mode
These values should be written into:
settings.json(routine_schedule)settings.json(new_session_continuity)settings.json(modality_continuity)profile.json(care_style.relationship)USER.md
This makes the setup contract cross-version safe even when model behavior is conservative.
The skill also strips common webchat timestamp prefixes such as
[Wed 2026-04-15 05:25 GMT+0] before deterministic parsing so the same setup
text behaves consistently across CLI and web hosts.
Trigger phrases (detect and act)
When the user says any of the following, run setup-check and offer to update:
幫我調整關心設定/帮我调整关心设置Help me adjust my follow-up settingsフォローアップ設定を調整してHilf mir, meine Follow-up-Einstellungen anzupassenAiutami a regolare le impostazioni di follow-upAyúdame a ajustar mi configuración de seguimiento- "改我的作息" / "修改作息" / "change my schedule"
- "改勿擾時間" / "quiet hours" / "do not disturb"
- "改關心頻率" / "多久關心一次" / "care interval"
- "改時區" / "change timezone"
- "新對話承接改成最近 4 輪摘要" / "use recent 4 turns after /new"
- "新對話改成看最後使用者意圖" / "use the last user intent after /new"
- "語音或圖片討論延續時跟隨可用能力" / "preserve voice or image discussion when supported"
- "我搬家了" / "我換工作了" (may affect timezone/schedule)
For English natural-language settings requests, the shared skill should also handle common phrasings such as:
turn proactive check-ins on / offchecking in every 2 hoursretrying after 30 minutesstopping after 2 unanswered check-ins
Available fields
| Key | Target | What it configures |
|---|---|---|
| timezone | settings | Time calculations |
| sleep_time | settings | Sleep phase start |
| wake_time | settings | Sleep phase end |
| relationship | profile | Tone & interaction style |
| use_case | profile | support / developer / tracking |
| proactive_care | settings | Enable proactive messages |
| proactive_interval_hours | settings | Minimum re-evaluation interval (hours); actual dispatch depends on guard conditions |
| quiet_hours_start | settings | Do-not-disturb start |
| quiet_hours_end | settings | Do-not-disturb end |
| care_tone | profile | warm / neutral / playful |
| emoji_forbidden | profile | Banned emoji list |
| tracking_keywords | profile | Topics to track |
| heartbeat_enabled | settings | Enable heartbeat |
| new_session_continuity_mode | settings | Which continuity anchor leads after /new |
| modality_continuity_mode | settings | How voice/image discussion style should carry over when the host supports it |
New-session continuity constraints
- Guided-settings or operator-feedback text must not become the main
/newcontinuity anchor. - A bare
hiimmediately after/newshould be treated as a low-information acknowledgement of the selected continuity opener, not as a fresh time-of-day small-talk reset. - Time-state is a tone modifier, not a replacement for the selected continuity anchor.
/newcapability is part of the public V2 package. If asked directly, the skill should answer concretely that it preserves carryover from the previous 3–5 turns and tries to reattach the most relevant unresolved thread.- daily memory writeback is also part of the public V2 package, but it is not "write every line". Ordinary chat can stay casual-only; staged/tracked items write a daily memory trace.
Policy surface (advanced — via settings.json)
| Key path | Default | What it controls |
|---|---|---|
| re_engagement.mode | wait_for_reply | After dispatch without reply: wait or timed retry |
| re_engagement.retry_after_hours | 4 | Hours before retrying a parked hook (timed_retry mode only) |
| re_engagement.max_unanswered_before_park | 2 | Dispatches without reply before parking |
| candidate_ttl_hours.emotion | 24 | Candidate buffer TTL for emotion signals (hours) |
| candidate_ttl_hours.task | 168 | Candidate buffer TTL for task signals (hours) |
| temporal_guard.newer_interaction_minutes | 5 | User interaction recency threshold for blocking dispatch |
| followup.parked_auto_close_hours | 0 | Auto-close parked hooks after N hours (0=disabled) |
| sleep_rest_suppress.auto_clear_hours | 4 | Auto-clear rest-suppress fallback (0=only on resume) |
| causal_memory.summary_max_facts | 3 | Maximum factual clauses preserved in internal causal summaries |
| causal_memory.include_time_anchor | true | Include extracted temporal anchors in internal causal summaries |
| causal_memory.include_state_marker | true | Include neutral state markers in internal causal summaries |