{"id":"bb47ae14-3d46-41e7-b83b-3a5715b35a47","entityType":"agent","slug":"clawhub-redwakame-openclaw-continuity","name":"OpenClaw Continuity","canonicalUrl":"https://www.xpersona.co/agent/clawhub-redwakame-openclaw-continuity","canonicalPath":"/agent/clawhub-redwakame-openclaw-continuity","generatedAt":"2026-10-11T03:55:07.758Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T23:53:54.056Z","emptyReason":null},"description":"Structured continuity and follow-up skill for OpenClaw agents. Use when an agent needs to decide whether natural user dialogue should stay as casual chat, be... Skill: OpenClaw Continuity Owner: redwakame Summary: Structured continuity and follow-up skill for OpenClaw agents. Use when an agent needs to decide whether natural user dialogue should stay as casual chat, be... Tags: carryover:2.0.21, continuity:2.0.21, follow-up:2.0.21, latest:2.0.21, memory:2.0.21 Version history: v2.0.21 | 2026-04-27T23:58:39.524Z | user OpenClaw Continuity 2.0.21 - Fixed ClawHub registry metad","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s1752d2d37r7kps0axxb1k71gx83k8rj:openclaw-continuity","sourceUrl":"https://clawhub.ai/redwakame/openclaw-continuity","homepage":"https://clawhub.ai/redwakame/skills/openclaw-continuity","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/redwakame/openclaw-continuity","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/redwakame/skills/openclaw-continuity","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Structured continuity and follow-up skill for OpenClaw agents. Use when an agent needs to decide whether natural user dialogue should stay as casual chat, be..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T23:53:54.056Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T23:53:54.056Z","emptyReason":null},"stars":null,"forks":null,"downloads":1226,"packageName":null,"latestVersion":"2.0.21","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T23:53:53.948Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T23:53:54.056Z","lastCrawledAt":"2026-10-10T23:53:53.948Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T23:53:53.948Z","lastVerifiedAt":null,"highlights":[{"version":"2.0.21","createdAt":"2026-04-27T23:58:39.524Z","changelog":"OpenClaw Continuity 2.0.21 - Fixed ClawHub registry metadata parsing by using valid YAML frontmatter and the official metadata.openclaw.requires/envVars shape. - Removed wording/SVG terms that could trigger unrelated crypto capability labels in the public bundle. - No runtime behavior changes. Follow-up regression harness remains 14/14 pass; public upload remains portable and excludes host addons, web_live, local state, and private data.","fileCount":50,"zipByteSize":344550},{"version":"2.0.20","createdAt":"2026-04-27T23:28:52.079Z","changelog":"OpenClaw Continuity 2.0.20 - Improved documentation on required environment variables, including descriptions and sensitivity flags, for both generic and platform-specific metadata sections. - No code changes; SKILL.md was updated to clarify environment setup and requirements. - Enhanced clarity and consistency for setup validation across platforms (darwin, linux).","fileCount":49,"zipByteSize":343167},{"version":"2.0.19","createdAt":"2026-04-27T23:08:03.028Z","changelog":"2.0.19 - Move ClawHub runtime requirements to top-level frontmatter `requires` while keeping `metadata.openclaw` / `metadata.clawdbot` / `metadata.clawdis` aliases, so registry scanners can see python3 and OPENCLAW_STATE_DIR / OPENCLAW_CONFIG_PATH. - No runtime behavior changes. Follow-up harness remains 14/14 pass. - Public upload folder includes only portable skill files; host addons, web_live, local state, and private data are excluded.","fileCount":49,"zipByteSize":343014},{"version":"2.0.18","createdAt":"2026-04-27T22:49:04.470Z","changelog":"Broaden runtime requirements metadata for ClawHub scanners by declaring python3 and OPENCLAW_STATE_DIR / OPENCLAW_CONFIG_PATH at metadata top-level plus openclaw/clawdbot/clawdis aliases. No runtime behavior changes; harness remains 14/14 pass.","fileCount":50,"zipByteSize":343273},{"version":"2.0.17","createdAt":"2026-04-27T22:33:24.568Z","changelog":"Fix ClawHub runtime metadata format by using official metadata.openclaw YAML frontmatter for python3 and OPENCLAW_STATE_DIR / OPENCLAW_CONFIG_PATH requirements. No runtime behavior changes; harness remains 14/14 pass.","fileCount":50,"zipByteSize":343232},{"version":"2.0.16","createdAt":"2026-04-27T22:23:29.115Z","changelog":"Product documentation refresh with four setup/settings comic panels, complete feature coverage, guided setup details, natural-language and command setting examples, and portable skill-core packaging. Host/channel delivery remains adapter-owned; Telegram/TG is shown only as a minimal host-connected showcase.","fileCount":50,"zipByteSize":343178},{"version":"2.0.15","createdAt":"2026-04-26T23:00:07.234Z","changelog":"Align ClawHub top-level runtime metadata schema; keep portable-core ClawHub bundle and same-day wake handoff guard.","fileCount":46,"zipByteSize":334708},{"version":"2.0.14","createdAt":"2026-04-26T22:50:27.016Z","changelog":"Publish a portable-core ClawHub bundle while keeping host-only operator templates in GitHub source; includes the same-day wake handoff guard and aligned runtime metadata.","fileCount":46,"zipByteSize":334494}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s1752d2d37r7kps0axxb1k71gx83k8rj:openclaw-continuity","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-redwakame-openclaw-continuity/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-redwakame-openclaw-continuity/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-redwakame-openclaw-continuity/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-redwakame-openclaw-continuity/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-redwakame-openclaw-continuity/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-redwakame-openclaw-continuity/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T03:55:07.749Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-redwakame-openclaw-continuity/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-redwakame-openclaw-continuity/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-redwakame-openclaw-continuity/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-redwakame-openclaw-continuity/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T23:53:54.056Z","emptyReason":null},"readme":"Skill: OpenClaw Continuity\n\nOwner: redwakame\n\nSummary: Structured continuity and follow-up skill for OpenClaw agents. Use when an agent needs to decide whether natural user dialogue should stay as casual chat, be...\n\nTags: carryover:2.0.21, continuity:2.0.21, follow-up:2.0.21, latest:2.0.21, memory:2.0.21\n\nVersion history:\n\nv2.0.21 | 2026-04-27T23:58:39.524Z | user\n\nOpenClaw Continuity 2.0.21\n\n- Fixed ClawHub registry metadata parsing by using valid YAML frontmatter and the official metadata.openclaw.requires/envVars shape.\n- Removed wording/SVG terms that could trigger unrelated crypto capability labels in the public bundle.\n- No runtime behavior changes. Follow-up regression harness remains 14/14 pass; public upload remains portable and excludes host addons, web_live, local state, and private data.\n\nv2.0.20 | 2026-04-27T23:28:52.079Z | user\n\nOpenClaw Continuity 2.0.20\n\n- Improved documentation on required environment variables, including descriptions and sensitivity flags, for both generic and platform-specific metadata sections.\n- No code changes; SKILL.md was updated to clarify environment setup and requirements.\n- Enhanced clarity and consistency for setup validation across platforms (darwin, linux).\n\nv2.0.19 | 2026-04-27T23:08:03.028Z | user\n\n2.0.19\n- Move ClawHub runtime requirements to top-level frontmatter `requires` while keeping `metadata.openclaw` / `metadata.clawdbot` / `metadata.clawdis` aliases, so registry scanners can see python3 and OPENCLAW_STATE_DIR / OPENCLAW_CONFIG_PATH.\n- No runtime behavior changes. Follow-up harness remains 14/14 pass.\n- Public upload folder includes only portable skill files; host addons, web_live, local state, and private data are excluded.\n\nv2.0.18 | 2026-04-27T22:49:04.470Z | user\n\nBroaden runtime requirements metadata for ClawHub scanners by declaring python3 and OPENCLAW_STATE_DIR / OPENCLAW_CONFIG_PATH at metadata top-level plus openclaw/clawdbot/clawdis aliases. No runtime behavior changes; harness remains 14/14 pass.\n\nv2.0.17 | 2026-04-27T22:33:24.568Z | user\n\nFix ClawHub runtime metadata format by using official metadata.openclaw YAML frontmatter for python3 and OPENCLAW_STATE_DIR / OPENCLAW_CONFIG_PATH requirements. No runtime behavior changes; harness remains 14/14 pass.\n\nv2.0.16 | 2026-04-27T22:23:29.115Z | user\n\nProduct documentation refresh with four setup/settings comic panels, complete feature coverage, guided setup details, natural-language and command setting examples, and portable skill-core packaging. Host/channel delivery remains adapter-owned; Telegram/TG is shown only as a minimal host-connected showcase.\n\nv2.0.15 | 2026-04-26T23:00:07.234Z | user\n\nAlign ClawHub top-level runtime metadata schema; keep portable-core ClawHub bundle and same-day wake handoff guard.\n\nv2.0.14 | 2026-04-26T22:50:27.016Z | user\n\nPublish a portable-core ClawHub bundle while keeping host-only operator templates in GitHub source; includes the same-day wake handoff guard and aligned runtime metadata.\n\nv2.0.13 | 2026-04-26T22:38:45.009Z | user\n\nAlign ClawHub registry metadata with SKILL.md runtime requirements; includes the same-day wake handoff guard from v2.0.12.\n\nv2.0.12 | 2026-04-26T22:21:27.873Z | user\n\nFix routine-aware same-day wake handoff for night-owl schedules; add harness coverage, install placement diagram, and clearer natural-language settings guidance.\n\nv2.0.10 | 2026-04-20T21:27:50.576Z | user\n\nRefined the public core package to avoid host-level config/session/cron path bindings while keeping contextual follow-up, routine-aware behavior, and in-chat controls intact.\n\nv2.0.9 | 2026-04-20T21:22:14.901Z | user\n\nCopy-only refresh: clearer public positioning for in-chat controls, routine and do-not-disturb features, and contextual follow-up instead of generic cron-style messaging.\n\nv2.0.8 | 2026-04-20T19:01:51.885Z | user\n\nTightened the public core package to require an explicit OPENCLAW_STATE_DIR instead of autodiscovering workspace paths.\n\nv2.0.7 | 2026-04-20T18:54:18.900Z | user\n\nRefined the English-first and Chinese-second public copy without changing the continuity core behavior.\n\nv2.0.6 | 2026-04-19T17:22:05.726Z | user\n\nClarify core runtime metadata for the public core-only package without changing continuity behavior.\n\nv2.0.5 | 2026-04-19T15:31:54.286Z | user\n\nRepackaged the ClawHub distribution as a core-only continuity skill. Removed optional host-side addons and credential-oriented embedding paths from the ClawHub bundle while keeping the time-aware continuity core intact.\n\nv2.0.4 | 2026-04-19T15:22:35.488Z | user\n\n**Major update: Host integrations, docs, and supplementary files removed. Core continuity logic now stands alone.**\n\n- Removed 51 files including host-specific addons, documentation, and publishing assets.\n- Now provides only the core time-aware continuity and follow-up logic for OpenClaw agents.\n- Host-specific delivery, transport glue, and channel adapters are no longer bundled.\n- Package description, name, and scope clarified as the standalone continuity core.\n- Natural-language settings and core continuity features remain intact.\n\nv2.0.3 | 2026-04-19T13:56:03.704Z | user\n\nv2.0.3\n- corrected the public contact email to adarobot666@gmail.com\n- fixed a frontstage leak where internal staging markers could appear in follow-up messages\n- kept the shared core validation green (14/14 harness pass)\n\nv2.0.1 | 2026-04-19T12:33:55.931Z | user\n\nEnglish: corrected the public contact email to adarobot@gmail.com; stabilized live checker delivery; prevented empty-provenance internal runtime replies from leaking to Telegram; improved release metadata and packaging.\n\n中文：修正公開聯絡信箱為 adarobot@gmail.com；穩定 live checker 發送路徑；避免無來源的 internal runtime reply 洩漏到 Telegram；同步更新發佈 metadata 與打包內容。\n\nv2.0.0 | 2026-04-18T23:17:51.389Z | user\n\nOpenClaw Continuity 2.0.0 – Major Release\n\n- Introduces structured continuity and follow-up for OpenClaw agents, with deterministic handling of chat, staged memory, and tracked follow-up.\n- Adds support for managing parked topics, watchful states, delegated tasks, sensitive events, and candidate→incident→hook promotion.\n- Implements explicit carryover, closure/cooldown, deduplication, dispatch cap, and daily-memory tracing for tracked items.\n- Provides deterministic onboarding and guided-settings adjustment via natural language or explicit command triggers (e.g., `/care setup`).\n- Clarifies runtime boundaries, with host-side responsibility for delivery, heartbeat glue, and transport integration.\n- Expands language support for guided settings entry, covers explicit time zone handling, and ensures deterministic, state-backed continuity.\n\nArchive index:\n\nArchive v2.0.21: 50 files, 344550 bytes\n\nFiles: _meta.json (139b), assets/publish/comic-01-setup-wizard.svg (4951b), assets/publish/comic-02-adjust-anytime.svg (3817b), assets/publish/comic-03-natural-language-settings.svg (3950b), assets/publish/comic-04-command-settings.svg (3812b), assets/publish/continuity-architecture.svg (5207b), assets/publish/hero-continuity-en.svg (6567b), assets/publish/hero-continuity-zh.svg (6552b), assets/publish/install-placement-en.svg (1850b), assets/publish/product-story-bilingual.svg (6303b), AUDIT.md (2784b), config.schema.json (8031b), CONTRIBUTING.md (901b), docs/call-flow.md (1142b), docs/channel-boundary-stopgap.md (2298b), docs/harness.md (2139b), docs/host-boundary.md (6715b), docs/host-operator-settings.md (10923b), docs/install.md (8110b), docs/live-qa-runbook.md (1135b), docs/publish-copy.md (10021b), docs/release-acceptance.md (3756b), docs/routine-schedule.md (2205b), docs/upgrade-pre-analysis.md (9581b), docs/v2-architecture.md (9031b), docs/v2-blueprint.md (1088b), docs/v2-known-limits.md (1524b), docs/v2-status.md (2648b), docs/v2-validation-summary.md (2967b), examples/harness-report.sample.json (934b), examples/jobs.sample.json (17b), examples/openclaw.sample.json (461b), examples/profile.sample.json (1102b), examples/settings.sample.json (1987b), package.json (1538b), README.md (12002b), references/modules.md (841b), references/templates.md (1111b), requirements.txt (18b), scripts/event_store.py (46618b), scripts/file_output_sop.py (2254b), scripts/followup_skill_harness.py (66044b), scripts/install_local.sh (1693b), scripts/personal_hooks.py (1079911b), scripts/proactive_control.py (12179b), scripts/semantic_config.py (8636b), SECURITY.md (662b), skill-card.md (2678b), SKILL.md (15285b), validation/rc-verdict.json (2725b)\n\nFile v2.0.21:SKILL.md\n\n---\nname: personal-hooks\ndescription: >-\n  Structured continuity and follow-up skill for OpenClaw agents. Use when an\n  agent needs to decide whether natural user dialogue should stay as casual\n  chat, become staged memory, or become tracked follow-up with carryover,\n  closure, cooldown, sleep/rest suppress, routine-aware wording, quiet-hours\n  behavior, traceability, and release-grade frontstage safety guards. This\n  package is not a generic cron sender. It uses context, causal state, and\n  explicit lifecycle rules to decide whether care or follow-up should appear at\n  all. It covers parked topics, watchful states, delegated tasks, sensitive\n  events, candidate to incident to hook flow, /new carryover, deterministic\n  onboarding/guided settings, and time-aware continuity guards. It does not\n  include always-on idle/social nudging as a default feature.\nversion: 2.0.21\nhomepage: https://github.com/redwakame/openclaw-continuity\nos:\n  - darwin\n  - linux\nrequires:\n  bins:\n    - python3\n  env:\n    - OPENCLAW_STATE_DIR\n    - OPENCLAW_CONFIG_PATH\nmetadata:\n  openclaw:\n    os:\n      - darwin\n      - linux\n    requires:\n      bins:\n        - python3\n      env:\n        - OPENCLAW_STATE_DIR\n        - OPENCLAW_CONFIG_PATH\n    envVars:\n      - name: OPENCLAW_STATE_DIR\n        description: \"Required path to the dedicated OpenClaw state directory used by this skill for continuity state.\"\n        required: true\n      - name: OPENCLAW_CONFIG_PATH\n        description: \"Required path to the OpenClaw config file used for setup validation.\"\n        required: true\n---\n\n# OpenClaw Continuity\n\nUse 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.\n\nPublic product name: `OpenClaw Continuity`.\nTechnical package / slug: `personal-hooks`.\nInternal diagnostics may still use `staged-followup-memory` as a status label for continuity state surfaces.\nQuestions, feedback, or implementation discussion: `adarobot666@gmail.com`.\n如果你期待這個技能持續優化與維護，請在 GitHub 給星支持：https://github.com/redwakame/openclaw-continuity\n\n## V2 public scope\n\n- Route turns into `casual_chat`, `staged_memory`, or `tracked_followup`.\n- Classify tracked content into:\n  - `parked_topic`\n  - `watchful_state`\n  - `delegated_task`\n  - `sensitive_event`\n- Maintain `event_chain` summaries with:\n  - `context_before`\n  - `event_core`\n  - `immediate_result`\n  - `followup_focus`\n- Maintain `causal_memory` as structured continuity state with:\n  - `facts`\n  - `state`\n  - `open_loop`\n  - `time_anchor`\n  - `followup_focus_code`\n  - `writeback_policy`\n- Promote `candidate -> incident -> hook`.\n- Preserve `/new` carryover from the previous 3-5 turns and let the user\n  choose which continuity anchor leads a new conversation.\n- Preserve voice/image discussion style as a host-neutral preference when the\n  OpenClaw host already supports those modalities. This skill records the\n  preference only; it does not bundle a voice engine, image model, or channel\n  adapter.\n- Keep hook closure, cooldown, dedupe, dispatch cap, and sleep/rest suppress observable.\n- Write concise daily-memory traces for staged and tracked items.\n- Apply first-run setup facts deterministically from explicit user text.\n- Apply supported guided-settings changes deterministically before the model turn\n  when the request is clear enough.\n- Keep routine-aware sleep handoff precise: when a night-owl user says they are\n  going to sleep near `sleep_time`, and `wake_time` is still later on the same\n  local day, frame the next natural reconnect as later after waking rather than\n  a generic next-day farewell.\n\n## Not in public scope\n\n- Companionship rhythm / nudge as a default feature.\n- User-configured idle chat frequency.\n- Generic proactive chatting when no tracked continuity exists.\n- Host transport/network reliability fixes.\n\n## Trigger conditions\n\nUse this skill when the user is naturally:\n\n- parking a topic for later\n- asking the agent to hold/remember/track something\n- leaving a watchful emotional or physical state unresolved\n- delegating a task for later follow-up\n- describing a sensitive event that needs later continuity\n- starting a new session that should reattach pending continuity\n- asking whether the agent actually staged/tracked/closed something\n\n## Core files\n\n- Script: `scripts/personal_hooks.py`\n- Harness: `scripts/followup_skill_harness.py`\n- Config schema: `config.schema.json`\n- Sample config: `examples/settings.sample.json`\n- Docs:\n  - `README.md`\n  - `docs/call-flow.md`\n  - `docs/harness.md`\n  - `docs/live-qa-runbook.md`\n  - `docs/v2-blueprint.md`\n\n## Runtime boundaries\n\n- Keep V2 deterministic and state-backed.\n- Let the skill/tool layer own staging, promotion, closure, and trace.\n- Let frontstage consume structured results; do not rely on the model to invent continuity ad hoc.\n- Treat `causal_memory` and `event_chain` as internal structured context, not prewritten frontstage reply text.\n- Do not hardwire relationship-specific push wording into the public package; hosts and models should generate their own natural language from structured context.\n- Treat rhythm/nudge as experimental and disabled by default.\n- Keep language routing explicit. English prompt/guard text should stay English,\n  and ordinary user phrases must not be rewritten into mixed-language internal\n  artifacts.\n- Do not hard-bind generic `UTC/GMT` offsets to a city timezone. Explicit IANA\n  zones should pass through unchanged; generic offsets must stay generic fixed\n  offsets such as `UTC+00:00`.\n- Prefer language from the current user turn and existing structured state over\n  a host default. The public package ships first-party zh-TW / zh-CN / English\n  behavior and broad guided-settings entry coverage for a few other common\n  languages; it does not claim full prose localization for every language.\n\nThe public skill package does **not** automatically provide host-side delivery\nplumbing. Keep this boundary explicit:\n\n- This package owns continuity state, memory routing, `/new` carryover, setup,\n  and skill/tool-layer guards.\n- The OpenClaw host and adapter configuration own final message delivery.\n- Do not advertise a matrix of external chat platforms inside the public skill\n  copy unless those host adapters are tested separately.\n\n## Entry points\n\n- `build_runtime_context()`\n  - Build ordinary-reply continuity context, carryover prompt, schedule context, and guard prompts.\n- `intercept_message()`\n  - Inspect one user turn and decide whether it should stay casual, become staged, or become tracked.\n- `process_candidate_buffer()`\n  - Promote staged candidates into incidents/hooks when the evidence is strong enough.\n- `due` / `render` / `complete`\n  - Drive the hook lifecycle.\n\nUse `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.\n\n## Setup & Configuration\n\n### First-time setup\nIf `SKILL_ONBOARD.md` exists in the workspace root, follow its guided setup flow. Once complete, delete the file.\n\n### Modifying settings after setup\nWhen the user asks to change their schedule, care frequency, quiet hours, or other preferences:\n\n1. Run `setup-check` to see current state:\n   ```bash\n   python3 scripts/personal_hooks.py setup-check\n   ```\n2. Apply only the changed fields via `setup-apply`:\n   ```bash\n   python3 scripts/personal_hooks.py setup-apply --payload-json '{\"sleep_time\":\"00:00\",\"wake_time\":\"09:00\"}'\n   ```\n   Only include the fields being changed — other fields remain untouched.\n\n### Universal natural-language entry\n\nThe public package should support one host-agnostic natural-language entry into\nguided settings mode. This is not platform-specific and should work across any\nOpenClaw-supported conversation surface.\n\nRecommended entry phrases:\n\n- Traditional Chinese: `幫我調整關心設定`\n- Simplified Chinese: `帮我调整关心设置`\n- English: `Help me adjust my follow-up settings`\n- Japanese: `フォローアップ設定を調整して`\n- German: `Hilf mir, meine Follow-up-Einstellungen anzupassen`\n- Italian: `Aiutami a regolare le impostazioni di follow-up`\n- Spanish: `Ayúdame a ajustar mi configuración de seguimiento`\n\nWhen the user says one of these or something equivalent:\n\n1. enter guided settings mode\n2. run `setup-check`\n3. ask which category they want to adjust\n4. apply only the changed fields via `setup-apply`\n\nDo not require platform-specific slash commands.\n\nThe skill now also treats explicit command-like entries such as `/care setup`\nand `/care config` as guided-settings triggers at the runtime-context layer, so\nthe setup mode can be re-opened consistently across different OpenClaw hosts.\n\nFor capability questions, hosts should also expose:\n\n- `/care capability` / `/care 功能` / `/care 能力`\n- `/care memory` / `/care 記憶` / `/care 记忆`\n\nUsers can also change schedule and do-not-disturb behavior through natural\nlanguage, for example:\n\n- `我通常早上六點睡，下午兩點半起床`\n- `半夜不要主動關心我`\n- `把勿擾改成早上六點到下午兩點半`\n- `Help me make follow-up quieter after midnight`\n\nThese are not separate memory engines. They are explanation entry points for:\n\n- whether `/new` carryover is currently active\n- whether the skill writes daily memory only for staged/tracked items\n- whether the current conversation is ordinary chat, staged memory, or tracked follow-up\n\n### Guided categories\n\nKeep the guided categories simple and host-agnostic:\n\n- `schedule` / `作息`\n- `proactive` / `主動關心`\n- `tracking` / `追蹤記憶`\n- `continuity` / `新對話承接`\n- `modality` / `語音／圖片延續偏好`\n- `tone` / `互動風格`\n\nThe user should be able to answer naturally rather than memorize technical keys.\nThe skill should map those answers into settings/profile changes.\n\n### Deterministic onboarding apply\n\nFor first-install onboarding, the skill must not rely only on model-side\nclassification. When the user explicitly states structured setup facts in normal\nconversation, the skill should deterministically extract and apply at least:\n\n- timezone\n- sleep_time\n- wake_time\n- relationship\n- use_case\n- new_session_continuity_mode\n- modality_continuity_mode\n\nThese values should be written into:\n\n- `settings.json` (`routine_schedule`)\n- `settings.json` (`new_session_continuity`)\n- `settings.json` (`modality_continuity`)\n- `profile.json` (`care_style.relationship`)\n- `USER.md`\n\nThis makes the setup contract cross-version safe even when model behavior is\nconservative.\n\nThe skill also strips common webchat timestamp prefixes such as\n`[Wed 2026-04-15 05:25 GMT+0]` before deterministic parsing so the same setup\ntext behaves consistently across CLI and web hosts.\n\n### Trigger phrases (detect and act)\nWhen the user says any of the following, run `setup-check` and offer to update:\n- `幫我調整關心設定` / `帮我调整关心设置`\n- `Help me adjust my follow-up settings`\n- `フォローアップ設定を調整して`\n- `Hilf mir, meine Follow-up-Einstellungen anzupassen`\n- `Aiutami a regolare le impostazioni di follow-up`\n- `Ayúdame a ajustar mi configuración de seguimiento`\n- \"改我的作息\" / \"修改作息\" / \"change my schedule\"\n- \"改勿擾時間\" / \"quiet hours\" / \"do not disturb\"\n- \"改關心頻率\" / \"多久關心一次\" / \"care interval\"\n- \"改時區\" / \"change timezone\"\n- \"新對話承接改成最近 4 輪摘要\" / \"use recent 4 turns after /new\"\n- \"新對話改成看最後使用者意圖\" / \"use the last user intent after /new\"\n- \"語音或圖片討論延續時跟隨可用能力\" / \"preserve voice or image discussion when supported\"\n- \"我搬家了\" / \"我換工作了\" (may affect timezone/schedule)\n\nFor English natural-language settings requests, the shared skill should also\nhandle common phrasings such as:\n\n- `turn proactive check-ins on / off`\n- `checking in every 2 hours`\n- `retrying after 30 minutes`\n- `stopping after 2 unanswered check-ins`\n\n### Available fields\n| Key | Target | What it configures |\n|-----|--------|-------------------|\n| timezone | settings | Time calculations |\n| sleep_time | settings | Sleep phase start |\n| wake_time | settings | Sleep phase end |\n| relationship | profile | Tone & interaction style |\n| use_case | profile | support / developer / tracking |\n| proactive_care | settings | Enable proactive messages |\n| proactive_interval_hours | settings | Minimum re-evaluation interval (hours); actual dispatch depends on guard conditions |\n| quiet_hours_start | settings | Do-not-disturb start |\n| quiet_hours_end | settings | Do-not-disturb end |\n| care_tone | profile | warm / neutral / playful |\n| emoji_forbidden | profile | Banned emoji list |\n| tracking_keywords | profile | Topics to track |\n| heartbeat_enabled | settings | Enable heartbeat |\n| new_session_continuity_mode | settings | Which continuity anchor leads after `/new` |\n| modality_continuity_mode | settings | How voice/image discussion style should carry over when the host supports it |\n\n### New-session continuity constraints\n\n- Guided-settings or operator-feedback text must not become the main `/new`\n  continuity anchor.\n- A bare `hi` immediately after `/new` should be treated as a low-information\n  acknowledgement of the selected continuity opener, not as a fresh time-of-day\n  small-talk reset.\n- Time-state is a tone modifier, not a replacement for the selected continuity\n  anchor.\n- `/new` capability is part of the public V2 package. If asked directly, the\n  skill should answer concretely that it preserves carryover from the previous\n  3–5 turns and tries to reattach the most relevant unresolved thread.\n- daily memory writeback is also part of the public V2 package, but it is not\n  \"write every line\". Ordinary chat can stay casual-only; staged/tracked items\n  write a daily memory trace.\n\n### Policy surface (advanced — via settings.json)\n| Key path | Default | What it controls |\n|----------|---------|-----------------|\n| re_engagement.mode | wait_for_reply | After dispatch without reply: wait or timed retry |\n| re_engagement.retry_after_hours | 4 | Hours before retrying a parked hook (timed_retry mode only) |\n| re_engagement.max_unanswered_before_park | 2 | Dispatches without reply before parking |\n| candidate_ttl_hours.emotion | 24 | Candidate buffer TTL for emotion signals (hours) |\n| candidate_ttl_hours.task | 168 | Candidate buffer TTL for task signals (hours) |\n| temporal_guard.newer_interaction_minutes | 5 | User interaction recency threshold for blocking dispatch |\n| followup.parked_auto_close_hours | 0 | Auto-close parked hooks after N hours (0=disabled) |\n| sleep_rest_suppress.auto_clear_hours | 4 | Auto-clear rest-suppress fallback (0=only on resume) |\n| causal_memory.summary_max_facts | 3 | Maximum factual clauses preserved in internal causal summaries |\n| causal_memory.include_time_anchor | true | Include extracted temporal anchors in internal causal summaries |\n| causal_memory.include_state_marker | true | Include neutral state markers in internal causal summaries |\n\nFile v2.0.21:README.md\n\n# OpenClaw Continuity\n\nMake OpenClaw remember the right thing, reconnect the right topic after `/new`,\nand follow up naturally without leaking internal state into chat.\n\n`OpenClaw Continuity` is the public product name for the `personal-hooks` skill\npackage. It is a **skill-layer continuity engine** for an existing OpenClaw\nagent: it does not replace the agent's persona, and it does not bundle a\nchat-platform adapter.\n\n![OpenClaw Continuity product story](assets/publish/product-story-bilingual.svg)\n\n## Four Quick Comics\n\nThese four panels show the parts that matter most after someone installs the\nskill: guided setup, later adjustment, natural-language setting changes, and\nprecise command changes.\n\n![Install and setup wizard](assets/publish/comic-01-setup-wizard.svg)\n\n![Adjust settings anytime](assets/publish/comic-02-adjust-anytime.svg)\n\n![Natural-language setting changes](assets/publish/comic-03-natural-language-settings.svg)\n\n![Precise command setting changes](assets/publish/comic-04-command-settings.svg)\n\n## For Everyone\n\nMost agents can answer a message. The harder part is remembering what still\nmatters after an interruption, a delayed reply, or a new conversation.\n\nOpenClaw Continuity helps an agent:\n\n- keep ordinary chat light\n- stage \"let's talk about this later\" without losing it\n- track important follow-up without chasing every casual sentence\n- reconnect the right topic after `/new`\n- understand time with sleep/wake and routine context\n- let the user adjust behavior in natural language\n\n中文簡介：\n\nOpenClaw Continuity 是替 OpenClaw 補上「延續感、時間感、關心與追蹤」的技能包。\n它不是單純排程發訊息，也不是把所有對話都硬塞進記憶。它會分辨哪些只是一般聊天，\n哪些要暫存，哪些真的需要追蹤，並在新開對話時接回使用者選定的承接方式。\n\n## What It Feels Like\n\nExample:\n\n```text\nUser: I need to pause this repo release check. Let's continue later.\nAgent: Got it. I will keep the release check as the thread to continue.\n\n/new\n\nAgent: I still have the release check thread. Do you want to pick it up from\nthe last user intent, the follow-up focus, or the recent conversation summary?\n```\n\n中文例子：\n\n```text\n使用者：這個技能上架檢查先放著，晚點再接。\nAgent：好，我先把這段接住，不會當成一般閒聊丟掉。\n\n/new\n\nAgent：前面那段技能上架檢查我還接得住。現在要從最後意圖、追蹤焦點，\n還是最近 4 輪摘要開始？\n```\n\nThe exact wording still belongs to the host agent's persona. This skill supplies\nthe structured continuity state that makes the answer possible.\n\n## Minimal Telegram/TG Showcase\n\nTelegram/TG can be used as a small live showcase **when your OpenClaw host is\nalready connected to Telegram**. The skill does not bundle a Telegram adapter or\nbot setup; it only supplies the continuity behavior that the host sends through\nits normal reply pipeline.\n\nDemo flow:\n\n```text\nTG user: 這個上架檢查先放著，晚點再接。\nAgent: 好，我先幫你接住這條線，不會當成普通閒聊丟掉。\n\nTG user: /new\nAgent: 前面那個上架檢查我還接得住。要從最近 4 輪、最後意圖，還是追蹤焦點接？\n\nTG user: 新對話改成看最後使用者意圖。\nAgent: 已更新。之後新對話會優先從最後使用者意圖承接。\n```\n\nWhat this demonstrates:\n\n- `/new` carryover\n- staged memory instead of forced tracking\n- natural-language settings update\n- frontstage text stays user-facing, not internal runtime text\n\n## Core Features\n\n- **New conversation carryover**\n  `/new` can reconnect the right previous thread instead of starting from a blank greeting.\n\n- **User-selectable `/new` continuity mode**\n  The user can choose which anchor should lead a new conversation:\n  `recent_4_turns_first`, `last_user_intent_first`, `followup_focus_first`,\n  `assistant_commitment_first`, or `balanced`.\n\n- **Ordinary chat / staged memory / tracked follow-up**\n  The runtime separates casual chat from staged memory and formally tracked events.\n\n- **Four tracked event types**\n  `parked_topic`, `watchful_state`, `delegated_task`, and `sensitive_event`.\n\n- **Structured event chain**\n  Keeps `context_before`, `event_core`, `immediate_result`, and\n  `followup_focus` inspectable.\n\n- **Assistant commitment tracking**\n  If the assistant promised to check, remember, or come back to something, that\n  commitment can become part of the continuity state.\n\n- **Time-aware wording**\n  Uses elapsed time, day boundary, sleep/wake boundary, and routine phase as\n  support. Time context does not replace the selected main thread.\n\n- **Care and follow-up controls**\n  Closure, cooldown, dedupe, dispatch cap, quiet hours, and sleep/rest suppress\n  are explicit settings instead of hidden model guesses.\n\n- **Daily-memory writeback**\n  Staged and tracked items write concise traces from structured continuity\n  state, not from improvised frontstage text.\n\n- **Guided setup**\n  First install can ask for timezone, sleep/wake time, relationship/use case,\n  `/new` continuity mode, and voice/image continuity preference.\n\n- **Natural-language settings**\n  Users can say things like \"make follow-up quieter after midnight\" or\n  \"新對話改成看最後使用者意圖\" and the skill maps that to settings.\n\n## What Is In Scope\n\nThis package defines the skill behavior:\n\n- state-backed continuity\n- `/new` reattachment\n- staging and tracked follow-up\n- routine/time context\n- setup wizard and settings updates\n- frontstage safety guards at the skill/tool layer\n- release harness and acceptance checks\n\n## What Is Not In Scope\n\nThis package does not claim a list of external chat platforms. Channel delivery\nbelongs to the OpenClaw host and its adapter configuration.\n\nThat boundary is intentional: the same skill can run through the ordinary\nOpenClaw reply pipeline without becoming tied to one chat surface.\n\n## Setup Wizard\n\nFirst install can enter guided setup when required fields or first-run preference\nfields are missing.\n\n![Install and setup wizard](assets/publish/comic-01-setup-wizard.svg)\n\nThe setup flow covers:\n\n- `timezone`\n- `sleep_time`\n- `wake_time`\n- `relationship`\n- `use_case`\n- `new_session_continuity_mode`\n- `modality_continuity_mode`\n\nThe two newest user-facing choices are:\n\n```json\n{\n  \"new_session_continuity\": {\n    \"mode\": \"recent_4_turns_first\"\n  },\n  \"modality_continuity\": {\n    \"enabled\": true,\n    \"mode\": \"preserve_when_supported\",\n    \"voice_reply_on_voice_thread\": true,\n    \"image_context_carryover\": true\n  }\n}\n```\n\n`modality_continuity` is host-neutral. It only expresses a preference. It does\nnot add a voice engine, image model, or channel adapter to this skill package.\n\n## Change Settings Later\n\n![Adjust settings anytime](assets/publish/comic-02-adjust-anytime.svg)\n\nNatural language:\n\n![Natural-language setting changes](assets/publish/comic-03-natural-language-settings.svg)\n\n```text\nHelp me adjust my follow-up settings.\nMake follow-up quieter after midnight.\nUse the last user intent when a new conversation starts.\n新對話承接改成最近 4 輪摘要。\n把主動關心改保守一點。\n半夜不要主動追蹤我。\n```\n\nCommand-style:\n\n![Precise command setting changes](assets/publish/comic-04-command-settings.svg)\n\n```bash\npython3 scripts/personal_hooks.py setup-check\npython3 scripts/personal_hooks.py setup-apply --payload-json '{\"new_session_continuity_mode\":\"last_user_intent_first\"}'\npython3 scripts/personal_hooks.py setup-apply --payload-json '{\"modality_continuity_mode\":\"preserve_when_supported\"}'\npython3 scripts/personal_hooks.py setup-apply --payload-json '{\"sleep_time\":\"23:00\",\"wake_time\":\"07:00\"}'\n```\n\nSupported `/new` continuity modes:\n\n| Mode | What leads the next conversation |\n| --- | --- |\n| `recent_4_turns_first` | Compact recent 4-turn summary |\n| `last_user_intent_first` | Last user-side intent from compact anchor turns |\n| `followup_focus_first` | `event_chain.followup_focus` |\n| `assistant_commitment_first` | Prior assistant promise/commitment |\n| `balanced` | Runtime chooses the best anchor for the user's opening message |\n\n## Install\n\nCopy or symlink this folder into an OpenClaw workspace:\n\n```text\nopenclaw-workspace/\n  skills/\n    personal-hooks/\n      SKILL.md\n      scripts/\n      docs/\n      examples/\n```\n\nInstall the Python dependency:\n\n```bash\npython3 -m pip install -r requirements.txt\n```\n\nInitialize:\n\n```bash\npython3 /path/to/openclaw-workspace/skills/personal-hooks/scripts/personal_hooks.py init\n```\n\nOptional installer:\n\n```bash\nbash scripts/install_local.sh /path/to/openclaw-workspace/skills link\n```\n\nClawHub-style install:\n\n```bash\nopenclaw skills install openclaw-continuity\n```\n\nnpm-style fetch from GitHub:\n\n```bash\nnpm install github:redwakame/openclaw-continuity#v2.0.21\n```\n\n## Verify\n\nRun the regression harness:\n\n```bash\npython3 /path/to/openclaw-workspace/skills/personal-hooks/scripts/followup_skill_harness.py --absence-minutes 3\n```\n\nExpected result:\n\n```json\n{\n  \"summary\": {\n    \"pass_count\": 14,\n    \"fail_count\": 0\n  }\n}\n```\n\nQuick manual behavior check:\n\n1. Ask the agent to hold a topic for later.\n2. Start `/new`.\n3. Confirm it reconnects the selected continuity anchor instead of generic small talk.\n4. Ask to change setup, for example: `新對話改成看最後使用者意圖`.\n\n## Technical Map\n\nImportant files:\n\n- `SKILL.md`: trigger rules and runtime boundary\n- `scripts/personal_hooks.py`: main runtime\n- `scripts/followup_skill_harness.py`: regression harness\n- `config.schema.json`: settings schema\n- `examples/settings.sample.json`: sample settings\n- `docs/install.md`: installation details\n- `docs/host-operator-settings.md`: operator settings\n- `docs/release-acceptance.md`: release gate\n- `docs/publish-copy.md`: GitHub / ClawHub copy source\n\nMain runtime surfaces:\n\n- `build_runtime_context()`: builds carryover, schedule, setup, and guard prompts\n- `intercept_message()`: routes the user turn into casual/staged/tracked state\n- `process_candidate_buffer()`: promotes candidate state to incidents/hooks\n- `setup-check` / `setup-apply`: guided configuration commands\n- `frontstage-guard`: skill/tool-layer output safety guard\n\n## Public V2 Includes\n\n- `casual_chat / staged_memory / tracked_followup` routing\n- `parked_topic`\n- `watchful_state`\n- `delegated_task`\n- `sensitive_event`\n- `candidate -> incident -> hook` promotion\n- structured `event_chain`\n- structured `causal_memory`\n- `/new` carryover\n- user-selectable `/new` continuity mode\n- assistant commitment support\n- routine/time context as support-only signal\n- quiet hours\n- sleep/rest suppress\n- cooldown\n- closure\n- dedupe\n- dispatch cap\n- daily-memory writeback\n- deterministic onboarding\n- guided settings\n- natural-language settings changes\n- host-neutral modality preference\n- regression harness\n\n## 中文功能總覽\n\n- 一般聊天、暫存記憶、正式追蹤分流\n- `/new` 後接回正確主題\n- 可選新對話承接方式：最近 4 輪、最後使用者意圖、因果跟進焦點、助手承諾、綜合判斷\n- 作息與時間感只當輔助，不搶主線\n- 可用自然語言調整設定\n- 可用指令精準修改設定\n- 關心與追蹤有冷卻、退場、去重、上限與勿擾\n- 暫存/追蹤內容可寫回 daily memory trace\n- 技能層保持平台中立，不把通訊渠道寫死進技能定義\n\n## Contact\n\nIf you are interested in this package, run into a problem, or want to exchange\nideas about OpenClaw continuity, feel free to contact me:\n\n- `adarobot666@gmail.com`\n\nIf you are satisfied with this skill package, please star the GitHub repository\nas encouragement. I will keep pushing improvements, maintenance, and new\nfeatures.\n\n如果你對這個技能包有興趣、使用時遇到問題，或想交流 OpenClaw continuity\n相關想法，歡迎聯繫我：\n\n- `adarobot666@gmail.com`\n\n如果你滿意這個技能包，也歡迎在 GitHub 給一顆星作為鼓勵。我會持續推動\n優化、維護與新功能追加。\n\nFile v2.0.21:_meta.json\n\n{\n  \"ownerId\": \"kn77md9ahr1tc0zvhm9pvda7w9822n9k\",\n  \"slug\": \"openclaw-continuity\",\n  \"version\": \"2.0.21\",\n  \"publishedAt\": 1777334319524\n}\n\nFile v2.0.21:references/modules.md\n\n# V2 module map\n\n## Core\n\n- continuity routing\n- staged memory promotion\n- tracked follow-up\n- carryover\n- closure consistency\n- frontstage safety\n\n## State layer\n\n- `profile.json`\n- `user_model.json`\n- `emotion_state.json`\n- `persona_state.json`\n- `memory_rank.json`\n- `autonomy_state.json`\n- `settings.json`\n\n## Event layer\n\n- `candidate_buffer.json`\n- `incidents.json`\n- `hooks.json`\n- `session_memory_staging.json`\n\n## Trace layer\n\n- `followup_trace.jsonl`\n- `candidate_buffer_audit.jsonl`\n- `session_memory_staging_audit.jsonl`\n- `hook_completion_audit.jsonl`\n- `frontstage_guard_log.jsonl`\n\n## Public V2 tracked event types\n\n- `parked_topic`\n- `watchful_state`\n- `delegated_task`\n- `sensitive_event`\n\n## Optional and host-boundary items\n\n- host delivery concerns\n- provider/network transport concerns\n- optional rhythm or nudge layers\n\nFile v2.0.21:references/templates.md\n\n# Frontstage notes\n\nThis file stays intentionally small. V2 does not own persona design; it protects continuity-facing frontstage behavior and keeps internal reasoning out of user-visible text.\n\n## V2 frontstage rules\n\n- keep frontstage text in natural Traditional Chinese\n- avoid exposing hook, schedule, checker, runtime, or internal-source language to the user\n- avoid unresolved fragments that require the user to guess what `這個` or `that` refers to\n- avoid false closure when no concrete continuity anchor exists\n- apply sleep/rest suppress only to follow-up behavior, not to ordinary user-facing replies\n\n## V2 follow-up tone boundaries\n\n- `emotional_followup`: accompany first, ask lightly\n- `health_followup`: check condition gently, do not sound like generic health advice\n- `progress_followup`: continue a parked task or topic without sounding like a manager reminder\n- `tomorrow_check`: light next-step reminder with human warmth\n\n## Optional note\n\nRhythm or nudge variants belong to optional layers. They are not part of the public V2 default unless a host explicitly enables and supports them.\n\nFile v2.0.21:AUDIT.md\n\n# Audit Guide\n\nThis repository is the public V2 package for `personal-hooks`, an OpenClaw\nskill for structured continuity, tracking, and follow-up.\n\nIt is:\n\n- an OpenClaw skill package\n- a state-backed continuity and follow-up layer\n- host-neutral at the core package boundary\n\nIt is not:\n\n- a one-click full host distribution\n- a generic transport or polling package\n- an always-on idle/social nudging package by default\n\n## One-line status\n\nPublic package identity is V2. Publication should be judged against\n`docs/release-acceptance.md` and the current V2 validation set.\n\nFor current release state, read:\n\n- `docs/v2-status.md`\n- `docs/v2-validation-summary.md`\n- `docs/v2-known-limits.md`\n- `docs/release-acceptance.md`\n\n## What the public V2 package covers\n\n- routing between `casual_chat`, `staged_memory`, and `tracked_followup`\n- four tracked event types:\n  - `parked_topic`\n  - `watchful_state`\n  - `delegated_task`\n  - `sensitive_event`\n- incremental `event_chain` updates\n- structured `causal_memory`\n- `candidate -> incident -> hook` promotion\n- `/new` carryover and continuity reattach\n- active hook / closure lifecycle\n- sleep/rest suppress\n- dedupe / cooldown / dispatch cap\n- frontstage guard and outbound stopgap integration points\n- regression harness and live QA guidance\n\n## What the public V2 package does not claim\n\n- default idle/social rhythm nudging\n- channel/network delivery reliability\n- host-specific transport glue\n- persona ownership\n\n## Experimental or opt-in areas\n\n- `experimental.rhythm_nudge.*`\n- design-only notes under `docs/v2-blueprint.md`\n\n## Recommended review order\n\n1. `README.md`\n2. `SKILL.md`\n3. `config.schema.json`\n4. `docs/call-flow.md`\n5. `docs/harness.md`\n6. `docs/release-acceptance.md`\n7. `scripts/personal_hooks.py`\n\n## Important file map\n\nCore package files:\n\n- `README.md`\n- `SKILL.md`\n- `config.schema.json`\n- `scripts/personal_hooks.py`\n- `scripts/followup_skill_harness.py`\n- `scripts/web_live_runner.mjs`\n\nSupporting documentation:\n\n- `docs/call-flow.md`\n- `docs/harness.md`\n- `docs/live-qa-runbook.md`\n- `docs/release-acceptance.md`\n- `docs/v2-blueprint.md`\n\nReference material:\n\n- `references/modules.md`\n- `references/templates.md`\n\nExamples:\n\n- `examples/settings.sample.json`\n- `examples/harness-report.sample.json`\n\n## Minimal verification\n\n```bash\npython3 scripts/personal_hooks.py init\npython3 scripts/personal_hooks.py capability-state-show\npython3 scripts/followup_skill_harness.py --absence-minutes 3\n```\n\nFor sandbox isolation, see `docs/harness.md`.\n\n## Current package-level limits\n\n- frontstage warmth and personality still depend on the host agent/model\n- carryover remains intentionally short and structured, not full transcript replay\n- host glue for live heartbeat / outbound interception remains opt-in\n\nFile v2.0.21:CONTRIBUTING.md\n\n# Contributing\n\n## Guardrails\n\n- Keep the public package V2-only.\n- Keep host glue optional and the core skill host-neutral.\n- Prefer config flags and traceability over hidden behavior.\n- Preserve staged/tracked/closure semantics unless a bug fix clearly requires otherwise.\n- Maintain both frontstage invariants together:\n  - valid user-facing text must still deliver\n  - internal/tool/fragment residue must not leak\n\n## Before proposing changes\n\n1. Check whether the change belongs in the portable skill core or an optional host addon.\n2. If it changes follow-up semantics, explain the runtime effect on staging, tracking, closure, and frontstage delivery.\n3. Prefer deterministic checks before live verification.\n\n## Validation\n\n- run a minimal smoke check\n- run the targeted harness when a change touches the continuity/follow-up path\n- do not rely on subjective frontstage feel as the only proof\n\nFile v2.0.21:docs/call-flow.md\n\n# Call Flow\n\n## Main runtime path\n\n1. `intercept_message()`\n   - inspect the incoming user text\n   - classify it as casual, staged, or tracked-worthy\n   - write candidate / incident / hook state when needed\n\n2. `process_candidate_buffer()`\n   - re-evaluate staged candidates\n   - promote qualified continuity into incidents/hooks\n\n3. `build_runtime_context()`\n   - collect pending topics\n   - collect carryover for `/new`\n   - add schedule context and continuity guards\n\n4. ordinary reply generation\n   - the host OpenClaw agent uses the runtime context to generate frontstage text\n\n5. `due` / `render` / `complete`\n   - evaluate pending hooks\n   - render due follow-up text\n   - mark closure / completion\n\n## State flow\n\n`casual_chat` -> no tracked state required\n\n`staged_memory`\n- `session_memory_staging.json`\n- `candidate_buffer.json`\n- concise daily-memory trace\n\n`tracked_followup`\n- `incidents.json`\n- `hooks.json`\n- clearer daily-memory trace\n\n## Traceability\n\nKey files:\n\n- `followup_trace.jsonl`\n- `candidate_buffer_audit.jsonl`\n- `session_memory_staging_audit.jsonl`\n- `hook_completion_audit.jsonl`\n- `frontstage_guard_log.jsonl`\n\nFile v2.0.21:docs/channel-boundary-stopgap.md\n\n# Channel Boundary Stopgap\n\nThis document covers the **channel boundary stopgap** for two classes of outbound\nleakage that the public skill alone cannot fully stop:\n\n1. `<final> ... </final>` tags appearing in user-visible output\n2. heartbeat/internal narration reaching outbound delivery\n\nThese are **host integration** concerns. They are not part of the public\nskill's portable logic, but a host using this skill should wire a final\noutbound defense.\n\n## What belongs in the public skill\n\nThe skill may:\n\n- reduce meta / narration in model-facing output\n- keep runtime-context structured\n- strip obvious internal wording during generation\n\nThe skill should **not** own:\n\n- channel-specific outbound interception\n- gateway runtime persistence behavior\n- platform-specific delivery routing\n- language-specific personal preferences such as Simplified→Traditional rewrite\n\n## Recommended channel boundary stopgap\n\nAt the host layer, add a final outbound guard with these behaviors:\n\n1. Strip `<final>` wrappers before outbound send\n2. Strip heartbeat narration prefixes such as:\n   - `This is another heartbeat poll...`\n   - `Looking at the autoseed output...`\n   - `Still no response...`\n3. Keep the final message short and frontstage-safe\n4. Apply the same logic to:\n   - `message_sending`\n   - heartbeat delivery persistence (for example `lastHeartbeatText`)\n\n## Why this is outside the skill core\n\nThe skill runs during generation, but heartbeat delivery and final outbound\npayloads may be resolved later by gateway/runtime code. If the host does not\nintercept the final payload, raw narration can still leak even when the skill\nalready cleaned the generated text.\n\n## Minimum validation\n\nFor a new host, verify all of the following:\n\n1. `message_sending` fires on outbound delivery\n2. `<final>` does not appear in the user-visible message\n3. heartbeat/internal narration does not appear in the user-visible message\n4. persisted heartbeat text (for example `lastHeartbeatText`) matches the final\n   delivered text, not the raw pre-sanitize narration\n\n## Release note\n\nThis stopgap is included as **boundary guidance**, not as a public skill promise.\nThe public package is allowed to ship the guidance and validation steps without\nclaiming it can guarantee all host frontstage safety by itself.\n\nFile v2.0.21:docs/harness.md\n\n# Harness\n\n## Goal\n\nReproduce V2 continuity/follow-up behavior in a sandbox without mutating live state.\n\n## Entry point\n\n```bash\npython3 scripts/followup_skill_harness.py --absence-minutes 3\n```\n\n## What it verifies\n\n- casual vs staged vs tracked routing\n- four tracked event types\n- event_chain incremental update\n- candidate -> incident -> hook flow\n- `/new` carryover flags\n- active hook / closure\n- shortened absence dispatch in sandbox mode\n- simulated user reply continuity\n- schedule-context presence in runtime context\n- frontstage-oriented continuity prompts remain structured and compact\n\n## Recommended neutrality checks before release\n\nAdd at least one sandbox run for each of these:\n\n- zh-TW onboarding with an explicit IANA timezone such as `Europe/Berlin`\n- English onboarding with the same explicit IANA timezone\n- generic offset onboarding such as `UTC+0` / `GMT+0` and confirm the stored\n  value stays a generic fixed offset (for example `UTC+00:00`), not a city zone\n- `/new` followed by a bare `hi` / `嗨` and confirm continuity stays thread-led\n  rather than collapsing into generic time-of-day chatter\n\n## Sandbox override\n\nThe harness uses env overrides so it can run against temporary state:\n\n- `PERSONAL_HOOKS_DATA_DIR`\n- `PERSONAL_HOOKS_MEMORY_DIR`\n- `PERSONAL_HOOKS_SESSIONS_INDEX_PATH`\n- `PERSONAL_HOOKS_JOBS_PATH`\n- `PERSONAL_HOOKS_OPENCLAW_CONFIG_PATH`\n- `PERSONAL_HOOKS_SETTINGS_PATH`\n\n## Preconditions\n\n- Python 3\n- writable temp directory\n- optional OpenClaw-compatible config if you want embedding fallback enabled\n\n## Portable usage\n\nThe release package does not assume any specific live agent workspace.\n\nUseful overrides:\n\n- `PERSONAL_HOOKS_SCRIPT_PATH`\n- `PERSONAL_HOOKS_OPENCLAW_CONFIG_PATH`\n- `PERSONAL_HOOKS_SOURCE_DATA_DIR`\n- `PERSONAL_HOOKS_SOURCE_MEMORY_DIR`\n- `PERSONAL_HOOKS_SOURCE_JOBS_PATH`\n- `PERSONAL_HOOKS_REPORT_DIR`\n- `PERSONAL_HOOKS_TEST_SESSION_KEY`\n\nIf you do not provide source data directories, the harness seeds a clean sandbox from package defaults.\n\n## Output\n\n- timestamped JSON report\n- case-level pass/fail\n- state deltas\n- carryover flags\n- hook counts\n- timing summaries\n\nFile v2.0.21:docs/host-boundary.md\n\n# Host Boundary — Skill/Shared vs Host/Live\n\n## Purpose\n\nThis document clarifies what belongs to the **public skill** (shared, portable)\nand what belongs to the **host gateway / adapter** (private, instance-specific).\nA public skill cannot claim it automatically guarantees channel frontstage\nsafety; the host must wire its own adapter hooks. See also\n[`channel-boundary-stopgap.md`](channel-boundary-stopgap.md) for the minimal\nchannel-boundary stopgap used to suppress `<final>` leakage and weird heartbeat\ntext, and [`host-operator-settings.md`](host-operator-settings.md) for the\noperator knobs that should be configured at the host/runtime level.\n\n---\n\n## Layer 1 — Skill / Shared (A-class)\n\nThese files ship with the skill and contain **no host-specific references**.\n\n| Path | Role |\n|------|------|\n| `scripts/personal_hooks.py` | Frontstage guard: strips narration, enforces HEARTBEAT.md |\n| `scripts/followup_skill_harness.py` | Follow-up scheduling harness |\n| `scripts/web_live_runner.mjs` | Web live-check runner |\n| `HEARTBEAT.md` (workspace optional) | Model-facing heartbeat instructions when the host keeps a heartbeat checklist |\n| `config.schema.json` | Skill configuration schema |\n| `docs/*` | Documentation |\n\n**Rule**: No host-specific IDs, no gateway port numbers, no channel destination IDs, no agent IDs\nin this layer. Temp-dir prefixes use `ph-` (personal-hooks).\n\n---\n\n## Layer 2 — Host / Adapter (B-class)\n\nThese files live **outside** the skill directory, in the gateway's plugin tree.\nThey are instance-specific and NOT part of the public skill.\n\n| Path (relative to stateDir) | Role |\n|------------------------------|------|\n| `workspace/plugins/personal-hooks-host-adapter/index.ts` | Adapter: wires `message_sending` + `before_message_write` hooks |\n| `openclaw.json` | Gateway config incl. `agents.defaults.heartbeat` |\n\n**What the adapter does that the skill cannot**:\n\n1. **`message_sending` hook** — intercepts ALL outbound (including heartbeat)\n   inside `deliverOutboundPayloads`. This is the last line of defense against\n   dirty narration reaching the outbound channel adapter. The skill's `personal_hooks.py` only\n   runs during model generation; it cannot intercept the delivery pipeline.\n\n2. **`before_message_write` hook** — strips session content for persistence.\n   This does NOT affect outbound delivery (they are independent paths).\n\n3. **`agents.defaults.heartbeat`** — gateway-level config required for the\n   heartbeat outbound adapter to resolve. Without it, heartbeat delivery\n   fails with \"Outbound not configured for the selected channel\".\n\n4. **`heartbeat.isolatedSession = true`** — gateway-level config that keeps\n   background heartbeat runs out of the main direct-conversation session.\n   Without it, heartbeat prompts / dispatch context / internal narration can\n   re-enter the same continuity store used by ordinary user replies.\n\n5. **new-session startup bootstrap** — when a host starts a fresh `/new` or\n   `/reset` session and no real human text exists yet, the host must not\n   synthesize a fake user utterance just to drive startup logic. The safe\n   startup path is:\n   - run `runtime-context --user-text \"/new\" --is-new-session`\n   - use trusted carryover/pending-topic state for internal bootstrap only\n   - if the runtime injects a startup bootstrap block as a pseudo-`user` turn,\n     treat it as internal control context, not as real human text\n   - wait for the first actual human message before any `preagent-sync`\n   - do **not** turn bootstrap text into fake user input\n   - `/new` may still open from trusted carryover / pending-topic / tracked-followup / schedule context when the timing/safety context justifies it\n   - do **not** resume pending topics on the user's behalf from fabricated user text\n\nIf a host fabricates text such as a greeting or rest phrase and feeds it into\n`preagent-sync`, the skill will treat that text as real user input. This can\nmisfire sleep/rest suppression, erase the true continuity anchor, and distort\nnew-session behavior.\n\n## Simple host/operator summary\n\nIf someone installs the public skill package, they get the shared continuity\nmechanism. They do **not** automatically get every host/live integration.\n\nThe missing host pieces are usually:\n\n- **Channel adapter / outbound last-defense**\n  - the final outbound interception layer before channel delivery\n- **gateway hook wiring**\n  - the lifecycle hookup that makes the skill run at the right reply stages\n- **live heartbeat host glue**\n  - heartbeat scheduling/isolation/delivery wiring for reliable background\n    follow-up\n\nThis is intentional. The public package stays portable; host/runtime integration\nremains opt-in.\n\n---\n\n## Why the skill alone is not enough\n\n```\nModel generates reply\n       │\n       ▼\npersonal_hooks.py strips narration  ← Skill layer (A)\n       │\n       ▼\nbefore_message_write persists       ← Adapter layer (B), session only\n       │\n       ▼\nresolveHeartbeatReplyPayload        ← Gateway internal, uses RAW replyResult\n       │\n       ▼\ndeliverOutboundPayloads             ← Gateway internal\n       │\n       ▼\nmessage_sending hook intercepts     ← Adapter layer (B), last defense\n       │\n       ▼\nChannel adapter send\n```\n\nThe gateway's `resolveHeartbeatReplyPayload` reads from the **raw** model\nresult, not the hooked session content. So even if the skill's Python guard\nstrips narration perfectly, a dirty heartbeat reply can still leak through\nunless the adapter's `message_sending` hook catches it.\n\nAlso: if heartbeat shares the same session key as the direct user thread,\nbackground heartbeat text can pollute carryover / staging / continuity even\nwhen the visible outbound message is clean. The correct host fix is to set\n`heartbeat.isolatedSession=true`, which moves heartbeat runs to\n`<sessionKey>:heartbeat` while still allowing outbound delivery to the same user.\n\n---\n\n## Deployment checklist for a new host\n\n1. Install skill to `workspace/skills/personal-hooks/`\n2. Wire a host adapter at `workspace/plugins/personal-hooks-host-adapter/`\n3. Configure `agents.defaults.heartbeat` in `openclaw.json`\n4. Set `heartbeat.isolatedSession=true` for any host that uses background heartbeat pushes\n5. Verify `message_sending` hook fires: look for `message_sending MODIFY` in gateway logs\n6. Verify heartbeat delivery: check channel-delivery ACK entries after first tick\n7. Verify heartbeat runs are using `:heartbeat` isolated sessions instead of the main direct session\n8. Verify `<final>` tags and heartbeat narration are stripped from final outbound text\n9. Verify `/new` startup does **not** invent fake user text before the first\n   real human message\n\nFile v2.0.21:docs/host-operator-settings.md\n\n# Host Operator Settings\n\nThis document is for host operators who want to tune:\n\n- how long tracked state should live\n- how routine schedule should be applied\n- how quiet / rest / work-time behavior should be applied\n- which knobs belong to the portable skill, and which still belong to host/live\n\nThe public package stays skill-first. Host-specific delivery or persona choices\nshould still live outside the portable core.\n\n## 0. Causal memory boundary: what the public skill should and should not do\n\nThe public package should:\n\n- extract causal structure from recent conversation\n- preserve continuity facts, user state, unresolved loops, and time anchors\n- write structured continuity state into staging / tracked follow-up / daily-memory paths\n- give the model enough internal context to continue naturally later\n\nThe public package should **not**:\n\n- hardcode role-specific push wording\n- prewrite what one specific host should say\n- assume one host role, one language, or one chat platform\n\nIn other words:\n\n- the skill owns structured continuity state\n- the model owns natural language generation\n- the host owns delivery, persona, and platform specifics\n\n## 0.5. Host-agnostic settings entry\n\nThe public package should expose one simple natural-language entry into guided\nsettings mode, without binding the skill to one specific chat platform or any other single\nexternal platform.\n\nRecommended multilingual entry phrases:\n\n- Traditional Chinese: `幫我調整關心設定`\n- Simplified Chinese: `帮我调整关心设置`\n- English: `Help me adjust my follow-up settings`\n- Japanese: `フォローアップ設定を調整して`\n- German: `Hilf mir, meine Follow-up-Einstellungen anzupassen`\n- Italian: `Aiutami a regolare le impostazioni di follow-up`\n- Spanish: `Ayúdame a ajustar mi configuración de seguimiento`\n\nThis entry should open a guided update flow, not directly mutate everything at\nonce. A host should:\n\n1. run `setup-check`\n2. identify which category the user wants to change\n3. apply only changed fields through `setup-apply`\n\nRecommended guided categories:\n\n- `schedule`\n- `proactive`\n- `tracking`\n- `tone`\n\nImportant boundary:\n\n- host/user can adjust policy values\n- host/user should **not** directly tune causal extraction logic, continuity\n  core rules, or daily-memory promotion internals\n\n## 1. Tracking lifetime: what expires, and where to change it\n\nThere is no single \"memory TTL\" knob. Different layers have different lifetimes.\n\n### Causal memory summary behavior\n\nThis is the public, host-agnostic operator surface for how much structured\ncontinuity state is preserved in internal summaries. It affects the skill's\ninternal continuity context, not frontstage wording.\n\nPublic settings (in `causal_memory`):\n\n- `summary_max_facts`: default `3`\n- `include_time_anchor`: default `true`\n- `include_state_marker`: default `true`\n\nThese control:\n\n- how many factual clauses are retained in normalized continuity summaries\n- whether time anchors such as `today`, `tonight`, `21:00`, or `Monday` stay visible\n- whether neutral state markers such as `busy`, `tired`, or `sick` remain available to the model\n\nThis is useful for multilingual hosts because it keeps structure explicit\nwithout forcing one frontstage phrasing style.\n\n### Candidate staging TTL\n\nCandidate staging is the short-term holding area before a topic is promoted into\nformal incident/event tracking.\n\nPublic settings (in `candidate_ttl_hours`):\n\n- `emotion`: 24 hours\n- `support`: 24 hours\n- `task`: 168 hours (7 days)\n- `preference`: 168 hours (7 days)\n\nConfigurable via `settings.json` → `candidate_ttl_hours.*`.\n\n### Carryover lifetime\n\nCarryover controls how much of the last session can be pulled into a new\nsession.\n\nPublic setting:\n\n- `carryover.max_turns`\n\nDefault sample value:\n\n- `5`\n\nWhere to change it:\n\n- host runtime settings file\n- start from `examples/settings.sample.json`\n\nRelevant files:\n\n- `examples/settings.sample.json`\n- `config.schema.json`\n\n### Dispatch cooldown / follow-up lifetime\n\nThese determine how often follow-up **may** dispatch. The interval is a minimum re-evaluation window, not a guaranteed send frequency. Actual dispatch also depends on: whether the user has re-engaged, followup_state guards, cooldown, dispatch cap, quiet hours, and sleep/rest suppress.\n\nPublic settings:\n\n- `dispatch.cooldown_minutes`\n- `dispatch.cap`\n- `proactive_chat.interval_hours`\n- `proactive_chat.cooldown_minutes`\n- `proactive_chat.max_proactive_per_day`\n\nDefault sample values:\n\n- `dispatch.cooldown_minutes = 180`\n- `dispatch.cap = 3`\n- `proactive_chat.interval_hours = 3`\n- `proactive_chat.cooldown_minutes = 180`\n- `proactive_chat.max_proactive_per_day = 2`\n\n### Re-engagement policy\n\nControls what happens after a dispatch receives no user reply.\n\nPublic settings (in `re_engagement`):\n\n- `mode`: `\"wait_for_reply\"` (default) — park after `max_unanswered_before_park` dispatches; only user reply unparks. `\"timed_retry\"` — automatically retry parked hooks after `retry_after_hours` even without reply.\n- `retry_after_hours`: `4` (default) — hours to wait before retrying a parked hook (only used when `mode=timed_retry`)\n- `max_unanswered_before_park`: `2` (default) — how many dispatches without reply before the hook is parked\n\n### Parked hook auto-close\n\nPublic setting (in `followup`):\n\n- `followup.parked_auto_close_hours`: `0` (default, disabled) — if > 0, parked hooks are auto-cancelled after this many hours since last dispatch\n\n### Temporal guard\n\nControls how recently a user must have interacted for dispatch guards to allow/block.\n\nPublic setting (in `temporal_guard`):\n\n- `temporal_guard.newer_interaction_minutes`: `5` (default) — if user interacted this many minutes after the proactive anchor, block dispatch as \"newer-user-interaction\"\n\n### Rest-suppress lifetime\n\nWhen the user says they want to sleep or rest, the skill can suppress follow-up\nfor a fixed duration.\n\nPublic settings:\n\n- `sleep_rest_suppress.duration_hours`: `10` (default) — how long rest-suppress lasts\n- `sleep_rest_suppress.auto_clear_hours`: `4` (default) — auto-clear rest-suppress after this many hours even without explicit resume. Set to `0` to disable auto-clear.\n\n### Same-type cooldown\n\nThere is also an internal same-type cooldown used by the skill to avoid\nrepeating the same kind of incident too often.\n\nCurrent internal default:\n\n- `same_type_cooldown_hours = 6`\n\nThis is currently a code-level default, not a public schema field.\n\n## 2. Routine schedule: how to make the host apply sleep/wake timing\n\nUse `routine_schedule` when the host knows the user's rough daily pattern and\nwants proactive timing to come from a stable schedule instead of memory guesswork.\n\nMain fields:\n\n- `routine_schedule.enabled`\n- `routine_schedule.timezone`\n- `routine_schedule.sleep_time`\n- `routine_schedule.wake_time`\n- `routine_schedule.wake_window_minutes`\n- `routine_schedule.phases.sleep.proactive_enabled`\n- `routine_schedule.phases.sleep.wake_seed_enabled`\n- `routine_schedule.phases.wake_window.proactive_enabled`\n- `routine_schedule.phases.wake_window.wake_seed_enabled`\n- `routine_schedule.phases.wake_window.interval_hours`\n- `routine_schedule.phases.active_day.proactive_enabled`\n- `routine_schedule.phases.active_day.wake_seed_enabled`\n- `routine_schedule.phases.active_day.interval_hours`\n\nTypical use:\n\n- set `enabled=true`\n- set `timezone`\n- set one sleep time and one wake time\n- decide whether wake-window should allow proactive and wake-seed\n- decide active-day interval separately from wake-window\n\nSee also:\n\n- `docs/routine-schedule.md`\n\n## 3. Quiet mode: how to suppress proactive messages at fixed times\n\nUse `proactive_chat.quiet_hours` when the host wants a stable blocked window.\n\nPublic fields:\n\n- `proactive_chat.quiet_hours.start`\n- `proactive_chat.quiet_hours.end`\n\nBehavior:\n\n- if `start == end`, quiet-hours is effectively disabled\n- if `start < end`, the blocked window is same-day\n- if `start > end`, the blocked window crosses midnight\n\nExamples:\n\n- `23 -> 7` means quiet overnight\n- `9 -> 18` means quiet during workday\n- `99 -> 99` is not a portable public convention; prefer disabling or using the\n  same start/end value instead\n\n## 4. Work-time behavior: what is public, what is still host/live\n\nThere are two different ways to model \"working hours\":\n\n### A. Stable work hours\n\nUse:\n\n- `proactive_chat.quiet_hours`\n\nThis is the portable public way if the user usually does not want proactive\nmessages during fixed work hours.\n\n### B. Dynamic \"I am currently working\" state\n\nThis is a host/live concern.\n\nThe live system may maintain a dynamic work-DND state when the user explicitly\nsays they are working, focused, or busy. That is not yet a portable public\nschema block in RC.\n\nFor public packaging, the honest rule is:\n\n- fixed work windows -> use `quiet_hours`\n- dynamic current work state -> host/live extension\n\n## 5. Rest / sleep phrases\n\nThe public skill already supports rest/sleep suppression logic.\n\nHost operators should know:\n\n- this is not the same as quiet-hours\n- quiet-hours is a clock-based block\n- rest-suppress is a user-state block\n\nRecommended split:\n\n- use `quiet_hours` for stable clock windows\n- use `sleep_rest_suppress` for explicit \"I want to sleep/rest now\"\n\n## 6. Minimum host workflow\n\nFor a portable install, the simplest order is:\n\n1. copy or symlink the skill package into `skills/personal-hooks/`\n2. create a writable runtime settings file from `examples/settings.sample.json`\n3. tune:\n   - `carryover.max_turns`\n   - `new_session_continuity.mode`\n   - `modality_continuity.mode`\n   - `dispatch.cooldown_minutes`\n   - `proactive_chat.*`\n   - `routine_schedule.*`\n   - `sleep_rest_suppress.duration_hours`\n4. initialize the skill\n5. verify continuity and follow-up in the host's ordinary reply pipeline\n\nIf the host also uses heartbeat-driven proactive pushes, add one more host-side\nrule:\n\n- set `heartbeat.isolatedSession=true`\n\nWhy this matters:\n\n- heartbeat can legitimately deliver to the same user/channel\n- but it should not reuse the same session key for background generation\n- otherwise heartbeat prompts and dispatch context can leak back into ordinary\n  continuity / carryover / staging state\n\nRecommended host heartbeat shape:\n\n```json\n{\n  \"heartbeat\": {\n    \"every\": \"30m\",\n    \"target\": \"direct-channel\",\n    \"to\": \"[CHANNEL_DESTINATION]\",\n    \"directPolicy\": \"allow\",\n    \"lightContext\": true,\n    \"isolatedSession\": true\n  }\n}\n```\n\nBefore enabling it in production, verify the session/transcript behavior on the\nexact OpenClaw version you are running. Heartbeat isolation is useful, but host\nimplementations and transcript handling can differ by version.\n\n## 7. What is still not fully portable\n\nThe following should still be treated as host/live integration work:\n\n- dynamic work-DND state\n- channel-specific outbound delivery rules\n- final outbound cleanup such as `<final>` / heartbeat leakage interception\n\nArchive v2.0.20: 49 files, 343167 bytes\n\nFiles: _meta.json (139b), assets/publish/comic-01-setup-wizard.svg (4951b), assets/publish/comic-02-adjust-anytime.svg (3817b), assets/publish/comic-03-natural-language-settings.svg (3950b), assets/publish/comic-04-command-settings.svg (3812b), assets/publish/continuity-architecture.svg (5213b), assets/publish/hero-continuity-en.svg (6567b), assets/publish/hero-continuity-zh.svg (6552b), assets/publish/install-placement-en.svg (1850b), assets/publish/product-story-bilingual.svg (6303b), AUDIT.md (2784b), config.schema.json (8031b), CONTRIBUTING.md (901b), docs/call-flow.md (1142b), docs/channel-boundary-stopgap.md (2298b), docs/harness.md (2139b), docs/host-boundary.md (6693b), docs/host-operator-settings.md (10923b), docs/install.md (8106b), docs/live-qa-runbook.md (1135b), docs/publish-copy.md (10021b), docs/release-acceptance.md (3756b), docs/routine-schedule.md (2205b), docs/upgrade-pre-analysis.md (9567b), docs/v2-architecture.md (9024b), docs/v2-blueprint.md (1088b), docs/v2-known-limits.md (1524b), docs/v2-status.md (2648b), docs/v2-validation-summary.md (2967b), examples/harness-report.sample.json (934b), examples/jobs.sample.json (17b), examples/openclaw.sample.json (461b), examples/profile.sample.json (1102b), examples/settings.sample.json (1987b), package.json (1538b), README.md (12002b), references/modules.md (841b), references/templates.md (1111b), requirements.txt (18b), scripts/event_store.py (46618b), scripts/file_output_sop.py (2254b), scripts/followup_skill_harness.py (66044b), scripts/install_local.sh (1693b), scripts/personal_hooks.py (1079911b), scripts/proactive_control.py (12179b), scripts/semantic_config.py (8636b), SECURITY.md (662b), SKILL.md (16876b), validation/rc-verdict.json (2725b)\n\nFile v2.0.20:SKILL.md\n\n---\nname: personal-hooks\ndescription: Structured continuity and follow-up skill for OpenClaw agents. Use when an agent needs to decide whether natural user dialogue should stay as casual chat, become staged memory, or become tracked follow-up with carryover, closure, cooldown, sleep/rest suppress, routine-aware wording, quiet-hours behavior, traceability, and release-grade frontstage safety guards. This package is not a generic cron sender: it uses context, causal state, and explicit lifecycle rules to decide whether care or follow-up should appear at all. It covers parked topics, watchful states, delegated tasks, sensitive events, candidate→incident→hook flow, /new carryover, deterministic onboarding/guided settings, and time-aware continuity guards. It does not include always-on idle/social nudging as a default feature.\nversion: 2.0.20\nhomepage: https://github.com/redwakame/openclaw-continuity\nos:\n  - darwin\n  - linux\nenv:\n  - name: OPENCLAW_STATE_DIR\n    description: \"Required path to the dedicated OpenClaw state directory used by this skill for continuity state.\"\n    required: true\n    sensitive: true\n  - name: OPENCLAW_CONFIG_PATH\n    description: \"Required path to the OpenClaw config file used for setup validation.\"\n    required: true\n    sensitive: true\nrequires:\n  bins:\n    - python3\n  env:\n    - OPENCLAW_STATE_DIR\n    - OPENCLAW_CONFIG_PATH\nmetadata:\n  os:\n    - darwin\n    - linux\n  requires:\n    bins:\n      - python3\n    env:\n      - OPENCLAW_STATE_DIR\n      - OPENCLAW_CONFIG_PATH\n  openclaw:\n    os:\n      - darwin\n      - linux\n    env:\n      - name: OPENCLAW_STATE_DIR\n        description: \"Required path to the dedicated OpenClaw state directory used by this skill for continuity state.\"\n        required: true\n        sensitive: true\n      - name: OPENCLAW_CONFIG_PATH\n        description: \"Required path to the OpenClaw config file used for setup validation.\"\n        required: true\n        sensitive: true\n    requires:\n      bins:\n        - python3\n      env:\n        - OPENCLAW_STATE_DIR\n        - OPENCLAW_CONFIG_PATH\n  clawdbot:\n    os:\n      - darwin\n      - linux\n    env:\n      - name: OPENCLAW_STATE_DIR\n        description: \"Required path to the dedicated OpenClaw state directory used by this skill for continuity state.\"\n        required: true\n        sensitive: true\n      - name: OPENCLAW_CONFIG_PATH\n        description: \"Required path to the OpenClaw config file used for setup validation.\"\n        required: true\n        sensitive: true\n    requires:\n      bins:\n        - python3\n      env:\n        - OPENCLAW_STATE_DIR\n        - OPENCLAW_CONFIG_PATH\n  clawdis:\n    os:\n      - darwin\n      - linux\n    env:\n      - name: OPENCLAW_STATE_DIR\n        description: \"Required path to the dedicated OpenClaw state directory used by this skill for continuity state.\"\n        required: true\n        sensitive: true\n      - name: OPENCLAW_CONFIG_PATH\n        description: \"Required path to the OpenClaw config file used for setup validation.\"\n        required: true\n        sensitive: true\n    requires:\n      bins:\n        - python3\n      env:\n        - OPENCLAW_STATE_DIR\n        - OPENCLAW_CONFIG_PATH\n---\n\n# OpenClaw Continuity\n\nUse 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.\n\nPublic product name: `OpenClaw Continuity`.\nTechnical package / slug: `personal-hooks`.\nInternal diagnostics may still use `staged-followup-memory` as a status label for continuity state surfaces.\nQuestions, feedback, or implementation discussion: `adarobot666@gmail.com`.\n如果你期待這個技能持續優化與維護，請在 GitHub 給星支持：https://github.com/redwakame/openclaw-continuity\n\n## V2 public scope\n\n- Route turns into `casual_chat`, `staged_memory`, or `tracked_followup`.\n- Classify tracked content into:\n  - `parked_topic`\n  - `watchful_state`\n  - `delegated_task`\n  - `sensitive_event`\n- Maintain `event_chain` summaries with:\n  - `context_before`\n  - `event_core`\n  - `immediate_result`\n  - `followup_focus`\n- Maintain `causal_memory` as structured continuity state with:\n  - `facts`\n  - `state`\n  - `open_loop`\n  - `time_anchor`\n  - `followup_focus_code`\n  - `writeback_policy`\n- Promote `candidate -> incident -> hook`.\n- Preserve `/new` carryover from the previous 3-5 turns and let the user\n  choose which continuity anchor leads a new conversation.\n- Preserve voice/image discussion style as a host-neutral preference when the\n  OpenClaw host already supports those modalities. This skill records the\n  preference only; it does not bundle a voice engine, image model, or channel\n  adapter.\n- Keep hook closure, cooldown, dedupe, dispatch cap, and sleep/rest suppress observable.\n- Write concise daily-memory traces for staged and tracked items.\n- Apply first-run setup facts deterministically from explicit user text.\n- Apply supported guided-settings changes deterministically before the model turn\n  when the request is clear enough.\n- Keep routine-aware sleep handoff precise: when a night-owl user says they are\n  going to sleep near `sleep_time`, and `wake_time` is still later on the same\n  local day, frame the next natural reconnect as later after waking rather than\n  a generic next-day farewell.\n\n## Not in public scope\n\n- Companionship rhythm / nudge as a default feature.\n- User-configured idle chat frequency.\n- Generic proactive chatting when no tracked continuity exists.\n- Host transport/network reliability fixes.\n\n## Trigger conditions\n\nUse this skill when the user is naturally:\n\n- parking a topic for later\n- asking the agent to hold/remember/track something\n- leaving a watchful emotional or physical state unresolved\n- delegating a task for later follow-up\n- describing a sensitive event that needs later continuity\n- starting a new session that should reattach pending continuity\n- asking whether the agent actually staged/tracked/closed something\n\n## Core files\n\n- Script: `scripts/personal_hooks.py`\n- Harness: `scripts/followup_skill_harness.py`\n- Config schema: `config.schema.json`\n- Sample config: `examples/settings.sample.json`\n- Docs:\n  - `README.md`\n  - `docs/call-flow.md`\n  - `docs/harness.md`\n  - `docs/live-qa-runbook.md`\n  - `docs/v2-blueprint.md`\n\n## Runtime boundaries\n\n- Keep V2 deterministic and state-backed.\n- Let the skill/tool layer own staging, promotion, closure, and trace.\n- Let frontstage consume structured results; do not rely on the model to invent continuity ad hoc.\n- Treat `causal_memory` and `event_chain` as internal structured context, not prewritten frontstage reply text.\n- Do not hardwire relationship-specific push wording into the public package; hosts and models should generate their own natural language from structured context.\n- Treat rhythm/nudge as experimental and disabled by default.\n- Keep language routing explicit. English prompt/guard text should stay English,\n  and ordinary user phrases must not be rewritten into mixed-language internal\n  artifacts.\n- Do not hard-bind generic `UTC/GMT` offsets to a city timezone. Explicit IANA\n  zones should pass through unchanged; generic offsets must stay generic fixed\n  offsets such as `UTC+00:00`.\n- Prefer language from the current user turn and existing structured state over\n  a host default. The public package ships first-party zh-TW / zh-CN / English\n  behavior and broad guided-settings entry coverage for a few other common\n  languages; it does not claim full prose localization for every language.\n\nThe public skill package does **not** automatically provide host-side delivery\nplumbing. Keep this boundary explicit:\n\n- This package owns continuity state, memory routing, `/new` carryover, setup,\n  and skill/tool-layer guards.\n- The OpenClaw host and adapter configuration own final message delivery.\n- Do not advertise a matrix of external chat platforms inside the public skill\n  copy unless those host adapters are tested separately.\n\n## Entry points\n\n- `build_runtime_context()`\n  - Build ordinary-reply continuity context, carryover prompt, schedule context, and guard prompts.\n- `intercept_message()`\n  - Inspect one user turn and decide whether it should stay casual, become staged, or become tracked.\n- `process_candidate_buffer()`\n  - Promote staged candidates into incidents/hooks when the evidence is strong enough.\n- `due` / `render` / `complete`\n  - Drive the hook lifecycle.\n\nUse `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.\n\n## Setup & Configuration\n\n### First-time setup\nIf `SKILL_ONBOARD.md` exists in the workspace root, follow its guided setup flow. Once complete, delete the file.\n\n### Modifying settings after setup\nWhen the user asks to change their schedule, care frequency, quiet hours, or other preferences:\n\n1. Run `setup-check` to see current state:\n   ```bash\n   python3 scripts/personal_hooks.py setup-check\n   ```\n2. Apply only the changed fields via `setup-apply`:\n   ```bash\n   python3 scripts/personal_hooks.py setup-apply --payload-json '{\"sleep_time\":\"00:00\",\"wake_time\":\"09:00\"}'\n   ```\n   Only include the fields being changed — other fields remain untouched.\n\n### Universal natural-language entry\n\nThe public package should support one host-agnostic natural-language entry into\nguided settings mode. This is not platform-specific and should work across any\nOpenClaw-supported conversation surface.\n\nRecommended entry phrases:\n\n- Traditional Chinese: `幫我調整關心設定`\n- Simplified Chinese: `帮我调整关心设置`\n- English: `Help me adjust my follow-up settings`\n- Japanese: `フォローアップ設定を調整して`\n- German: `Hilf mir, meine Follow-up-Einstellungen anzupassen`\n- Italian: `Aiutami a regolare le impostazioni di follow-up`\n- Spanish: `Ayúdame a ajustar mi configuración de seguimiento`\n\nWhen the user says one of these or something equivalent:\n\n1. enter guided settings mode\n2. run `setup-check`\n3. ask which category they want to adjust\n4. apply only the changed fields via `setup-apply`\n\nDo not require platform-specific slash commands.\n\nThe skill now also treats explicit command-like entries such as `/care setup`\nand `/care config` as guided-settings triggers at the runtime-context layer, so\nthe setup mode can be re-opened consistently across different OpenClaw hosts.\n\nFor capability questions, hosts should also expose:\n\n- `/care capability` / `/care 功能` / `/care 能力`\n- `/care memory` / `/care 記憶` / `/care 记忆`\n\nUsers can also change schedule and do-not-disturb behavior through natural\nlanguage, for example:\n\n- `我通常早上六點睡，下午兩點半起床`\n- `半夜不要主動關心我`\n- `把勿擾改成早上六點到下午兩點半`\n- `Help me make follow-up quieter after midnight`\n\nThese are not separate memory engines. They are explanation entry points for:\n\n- whether `/new` carryover is currently active\n- whether the skill writes daily memory only for staged/tracked items\n- whether the current conversation is ordinary chat, staged memory, or tracked follow-up\n\n### Guided categories\n\nKeep the guided categories simple and host-agnostic:\n\n- `schedule` / `作息`\n- `proactive` / `主動關心`\n- `tracking` / `追蹤記憶`\n- `continuity` / `新對話承接`\n- `modality` / `語音／圖片延續偏好`\n- `tone` / `互動風格`\n\nThe user should be able to answer naturally rather than memorize technical keys.\nThe skill should map those answers into settings/profile changes.\n\n### Deterministic onboarding apply\n\nFor first-install onboarding, the skill must not rely only on model-side\nclassification. When the user explicitly states structured setup facts in normal\nconversation, the skill should deterministically extract and apply at least:\n\n- timezone\n- sleep_time\n- wake_time\n- relationship\n- use_case\n- new_session_continuity_mode\n- modality_continuity_mode\n\nThese values should be written into:\n\n- `settings.json` (`routine_schedule`)\n- `settings.json` (`new_session_continuity`)\n- `settings.json` (`modality_continuity`)\n- `profile.json` (`care_style.relationship`)\n- `USER.md`\n\nThis makes the setup contract cross-version safe even when model behavior is\nconservative.\n\nThe skill also strips common webchat timestamp prefixes such as\n`[Wed 2026-04-15 05:25 GMT+0]` before deterministic parsing so the same setup\ntext behaves consistently across CLI and web hosts.\n\n### Trigger phrases (detect and act)\nWhen the user says any of the following, run `setup-check` and offer to update:\n- `幫我調整關心設定` / `帮我调整关心设置`\n- `Help me adjust my follow-up settings`\n- `フォローアップ設定を調整して`\n- `Hilf mir, meine Follow-up-Einstellungen anzupassen`\n- `Aiutami a regolare le impostazioni di follow-up`\n- `Ayúdame a ajustar mi configuración de seguimiento`\n- \"改我的作息\" / \"修改作息\" / \"change my schedule\"\n- \"改勿擾時間\" / \"quiet hours\" / \"do not disturb\"\n- \"改關心頻率\" / \"多久關心一次\" / \"care interval\"\n- \"改時區\" / \"change timezone\"\n- \"新對話承接改成最近 4 輪摘要\" / \"use recent 4 turns after /new\"\n- \"新對話改成看最後使用者意圖\" / \"use the last user intent after /new\"\n- \"語音或圖片討論延續時跟隨可用能力\" / \"preserve voice or image discussion when supported\"\n- \"我搬家了\" / \"我換工作了\" (may affect timezone/schedule)\n\nFor English natural-language settings requests, the shared skill should also\nhandle common phrasings such as:\n\n- `turn proactive check-ins on / off`\n- `checking in every 2 hours`\n- `retrying after 30 minutes`\n- `stopping after 2 unanswered check-ins`\n\n### Available fields\n| Key | Target | What it configures |\n|-----|--------|-------------------|\n| timezone | settings | Time calculations |\n| sleep_time | settings | Sleep phase start |\n| wake_time | settings | Sleep phase end |\n| relationship | profile | Tone & interaction style |\n| use_case | profile | support / developer / tracking |\n| proactive_care | settings | Enable proactive messages |\n| proactive_interval_hours | settings | Minimum re-evaluation interval (hours); actual dispatch depends on guard conditions |\n| quiet_hours_start | settings | Do-not-disturb start |\n| quiet_hours_end | settings | Do-not-disturb end |\n| care_tone | profile | warm / neutral / playful |\n| emoji_forbidden | profile | Banned emoji list |\n| tracking_keywords | profile | Topics to track |\n| heartbeat_enabled | settings | Enable heartbeat |\n| new_session_continuity_mode | settings | Which continuity anchor leads after `/new` |\n| modality_continuity_mode | settings | How voice/image discussion style should carry over when the host supports it |\n\n### New-session continuity constraints\n\n- Guided-settings or operator-feedback text must not become the main `/new`\n  continuity anchor.\n- A bare `hi` immediately after `/new` should be treated as a low-information\n  acknowledgement of the selected continuity opener, not as a fresh time-of-day\n  small-talk reset.\n- Time-state is a tone modifier, not a replacement for the selected continuity\n  anchor.\n- `/new` capability is part of the public V2 package. If asked directly, the\n  skill should answer concretely that it preserves carryover from the previous\n  3–5 turns and tries to reattach the most relevant unresolved thread.\n- daily memory writeback is also part of the public V2 package, but it is not\n  \"write every line\". Ordinary chat can stay casual-only; staged/tracked items\n  write a daily memory trace.\n\n### Policy surface (advanced — via settings.json)\n| Key path | Default | What it controls |\n|----------|---------|-----------------|\n| re_engagement.mode | wait_for_reply | After dispatch without reply: wait or timed retry |\n| re_engagement.retry_after_hours | 4 | Hours before retrying a parked hook (timed_retry mode only) |\n| re_engagement.max_unanswered_before_park | 2 | Dispatches without reply before parking |\n| candidate_ttl_hours.emotion | 24 | Candidate buffer TTL for emotion signals (hours) |\n| candidate_ttl_hours.task | 168 | Candidate buffer TTL for task signals (hours) |\n| temporal_guard.newer_interaction_minutes | 5 | User interaction recency threshold for blocking dispatch |\n| followup.parked_auto_close_hours | 0 | Auto-close parked hooks after N hours (0=disabled) |\n| sleep_rest_suppress.auto_clear_hours | 4 | Auto-clear rest-suppress fallback (0=only on resume) |\n| causal_memory.summary_max_facts | 3 | Maximum factual clauses preserved in internal causal summaries |\n| causal_memory.include_time_anchor | true | Include extracted temporal anchors in internal causal summaries |\n| causal_memory.include_state_marker | true | Include neutral state markers in internal causal summaries |\n\nFile v2.0.20:README.md\n\n# OpenClaw Continuity\n\nMake OpenClaw remember the right thing, reconnect the right topic after `/new`,\nand follow up naturally without leaking internal state into chat.\n\n`OpenClaw Continuity` is the public product name for the `personal-hooks` skill\npackage. It is a **skill-layer continuity engine** for an existing OpenClaw\nagent: it does not replace the agent's persona, and it does not bundle a\nchat-platform adapter.\n\n![OpenClaw Continuity product story](assets/publish/product-story-bilingual.svg)\n\n## Four Quick Comics\n\nThese four panels show the parts that matter most after someone installs the\nskill: guided setup, later adjustment, natural-language setting changes, and\nprecise command changes.\n\n![Install and setup wizard](assets/publish/comic-01-setup-wizard.svg)\n\n![Adjust settings anytime](assets/publish/comic-02-adjust-anytime.svg)\n\n![Natural-language setting changes](assets/publish/comic-03-natural-language-settings.svg)\n\n![Precise command setting changes](assets/publish/comic-04-command-settings.svg)\n\n## For Everyone\n\nMost agents can answer a message. The harder part is remembering what still\nmatters after an interruption, a delayed reply, or a new conversation.\n\nOpenClaw Continuity helps an agent:\n\n- keep ordinary chat light\n- stage \"let's talk about this later\" without losing it\n- track important follow-up without chasing every casual sentence\n- reconnect the right topic after `/new`\n- understand time with sleep/wake and routine context\n- let the user adjust behavior in natural language\n\n中文簡介：\n\nOpenClaw Continuity 是替 OpenClaw 補上「延續感、時間感、關心與追蹤」的技能包。\n它不是單純排程發訊息，也不是把所有對話都硬塞進記憶。它會分辨哪些只是一般聊天，\n哪些要暫存，哪些真的需要追蹤，並在新開對話時接回使用者選定的承接方式。\n\n## What It Feels Like\n\nExample:\n\n```text\nUser: I need to pause this repo release check. Let's continue later.\nAgent: Got it. I will keep the release check as the thread to continue.\n\n/new\n\nAgent: I still have the release check thread. Do you want to pick it up from\nthe last user intent, the follow-up focus, or the recent conversation summary?\n```\n\n中文例子：\n\n```text\n使用者：這個技能上架檢查先放著，晚點再接。\nAgent：好，我先把這段接住，不會當成一般閒聊丟掉。\n\n/new\n\nAgent：前面那段技能上架檢查我還接得住。現在要從最後意圖、追蹤焦點，\n還是最近 4 輪摘要開始？\n```\n\nThe exact wording still belongs to the host agent's persona. This skill supplies\nthe structured continuity state that makes the answer possible.\n\n## Minimal Telegram/TG Showcase\n\nTelegram/TG can be used as a small live showcase **when your OpenClaw host is\nalready connected to Telegram**. The skill does not bundle a Telegram adapter or\nbot setup; it only supplies the continuity behavior that the host sends through\nits normal reply pipeline.\n\nDemo flow:\n\n```text\nTG user: 這個上架檢查先放著，晚點再接。\nAgent: 好，我先幫你接住這條線，不會當成普通閒聊丟掉。\n\nTG user: /new\nAgent: 前面那個上架檢查我還接得住。要從最近 4 輪、最後意圖，還是追蹤焦點接？\n\nTG user: 新對話改成看最後使用者意圖。\nAgent: 已更新。之後新對話會優先從最後使用者意圖承接。\n```\n\nWhat this demonstrates:\n\n- `/new` carryover\n- staged memory instead of forced tracking\n- natural-language settings update\n- frontstage text stays user-facing, not internal runtime text\n\n## Core Features\n\n- **New conversation carryover**\n  `/new` can reconnect the right previous thread instead of starting from a blank greeting.\n\n- **User-selectable `/new` continuity mode**\n  The user can choose which anchor should lead a new conversation:\n  `recent_4_turns_first`, `last_user_intent_first`, `followup_focus_first`,\n  `assistant_commitment_first`, or `balanced`.\n\n- **Ordinary chat / staged memory / tracked follow-up**\n  The runtime separates casual chat from staged memory and formally tracked events.\n\n- **Four tracked event types**\n  `parked_topic`, `watchful_state`, `delegated_task`, and `sensitive_event`.\n\n- **Structured event chain**\n  Keeps `context_before`, `event_core`, `immediate_result`, and\n  `followup_focus` inspectable.\n\n- **Assistant commitment tracking**\n  If the assistant promised to check, remember, or come back to something, that\n  commitment can become part of the continuity state.\n\n- **Time-aware wording**\n  Uses elapsed time, day boundary, sleep/wake boundary, and routine phase as\n  support. Time context does not replace the selected main thread.\n\n- **Care and follow-up controls**\n  Closure, cooldown, dedupe, dispatch cap, quiet hours, and sleep/rest suppress\n  are explicit settings instead of hidden model guesses.\n\n- **Daily-memory writeback**\n  Staged and tracked items write concise traces from structured continuity\n  state, not from improvised frontstage text.\n\n- **Guided setup**\n  First install can ask for timezone, sleep/wake time, relationship/use case,\n  `/new` continuity mode, and voice/image continuity preference.\n\n- **Natural-language settings**\n  Users can say things like \"make follow-up quieter after midnight\" or\n  \"新對話改成看最後使用者意圖\" and the skill maps that to settings.\n\n## What Is In Scope\n\nThis package defines the skill behavior:\n\n- state-backed continuity\n- `/new` reattachment\n- staging and tracked follow-up\n- routine/time context\n- setup wizard and settings updates\n- frontstage safety guards at the skill/tool layer\n- release harness and acceptance checks\n\n## What Is Not In Scope\n\nThis package does not claim a list of external chat platforms. Channel delivery\nbelongs to the OpenClaw host and its adapter configuration.\n\nThat boundary is intentional: the same skill can run through the ordinary\nOpenClaw reply pipeline without becoming tied to one chat surface.\n\n## Setup Wizard\n\nFirst install can enter guided setup when required fields or first-run preference\nfields are missing.\n\n![Install and setup wizard](assets/publish/comic-01-setup-wizard.svg)\n\nThe setup flow covers:\n\n- `timezone`\n- `sleep_time`\n- `wake_time`\n- `relationship`\n- `use_case`\n- `new_session_continuity_mode`\n- `modality_continuity_mode`\n\nThe two newest user-facing choices are:\n\n```json\n{\n  \"new_session_continuity\": {\n    \"mode\": \"recent_4_turns_first\"\n  },\n  \"modality_continuity\": {\n    \"enabled\": true,\n    \"mode\": \"preserve_when_supported\",\n    \"voice_reply_on_voice_thread\": true,\n    \"image_context_carryover\": true\n  }\n}\n```\n\n`modality_continuity` is host-neutral. It only expresses a preference. It does\nnot add a voice engine, image model, or channel adapter to this skill package.\n\n## Change Settings Later\n\n![Adjust settings anytime](assets/publish/comic-02-adjust-anytime.svg)\n\nNatural language:\n\n![Natural-language setting changes](assets/publish/comic-03-natural-language-settings.svg)\n\n```text\nHelp me adjust my follow-up settings.\nMake follow-up quieter after midnight.\nUse the last user intent when a new conversation starts.\n新對話承接改成最近 4 輪摘要。\n把主動關心改保守一點。\n半夜不要主動追蹤我。\n```\n\nCommand-style:\n\n![Precise command setting changes](assets/publish/comic-04-command-settings.svg)\n\n```bash\npython3 scripts/personal_hooks.py setup-check\npython3 scripts/personal_hooks.py setup-apply --payload-json '{\"new_session_continuity_mode\":\"last_user_intent_first\"}'\npython3 scripts/personal_hooks.py setup-apply --payload-json '{\"modality_continuity_mode\":\"preserve_when_supported\"}'\npython3 scripts/personal_hooks.py setup-apply --payload-json '{\"sleep_time\":\"23:00\",\"wake_time\":\"07:00\"}'\n```\n\nSupported `/new` continuity modes:\n\n| Mode | What leads the next conversation |\n| --- | --- |\n| `recent_4_turns_first` | Compact recent 4-turn summary |\n| `last_user_intent_first` | Last user-side intent from compact anchor turns |\n| `followup_focus_first` | `event_chain.followup_focus` |\n| `assistant_commitment_first` | Prior assistant promise/commitment |\n| `balanced` | Runtime chooses the best anchor for the user's opening message |\n\n## Install\n\nCopy or symlink this folder into an OpenClaw workspace:\n\n```text\nopenclaw-workspace/\n  skills/\n    personal-hooks/\n      SKILL.md\n      scripts/\n      docs/\n      examples/\n```\n\nInstall the Python dependency:\n\n```bash\npython3 -m pip install -r requirements.txt\n```\n\nInitialize:\n\n```bash\npython3 /path/to/openclaw-workspace/skills/personal-hooks/scripts/personal_hooks.py init\n```\n\nOptional installer:\n\n```bash\nbash scripts/install_local.sh /path/to/openclaw-workspace/skills link\n```\n\nClawHub-style install:\n\n```bash\nopenclaw skills install openclaw-continuity\n```\n\nnpm-style fetch from GitHub:\n\n```bash\nnpm install github:redwakame/openclaw-continuity#v2.0.20\n```\n\n## Verify\n\nRun the regression harness:\n\n```bash\npython3 /path/to/openclaw-workspace/skills/personal-hooks/scripts/followup_skill_harness.py --absence-minutes 3\n```\n\nExpected result:\n\n```json\n{\n  \"summary\": {\n    \"pass_count\": 14,\n    \"fail_count\": 0\n  }\n}\n```\n\nQuick manual behavior check:\n\n1. Ask the agent to hold a topic for later.\n2. Start `/new`.\n3. Confirm it reconnects the selected continuity anchor instead of generic small talk.\n4. Ask to change setup, for example: `新對話改成看最後使用者意圖`.\n\n## Technical Map\n\nImportant files:\n\n- `SKILL.md`: trigger rules and runtime boundary\n- `scripts/personal_hooks.py`: main runtime\n- `scripts/followup_skill_harness.py`: regression harness\n- `config.schema.json`: settings schema\n- `examples/settings.sample.json`: sample settings\n- `docs/install.md`: installation details\n- `docs/host-operator-settings.md`: operator settings\n- `docs/release-acceptance.md`: release gate\n- `docs/publish-copy.md`: GitHub / ClawHub copy source\n\nMain runtime surfaces:\n\n- `build_runtime_context()`: builds carryover, schedule, setup, and guard prompts\n- `intercept_message()`: routes the user turn into casual/staged/tracked state\n- `process_candidate_buffer()`: promotes candidate state to incidents/hooks\n- `setup-check` / `setup-apply`: guided configuration commands\n- `frontstage-guard`: skill/tool-layer output safety guard\n\n## Public V2 Includes\n\n- `casual_chat / staged_memory / tracked_followup` routing\n- `parked_topic`\n- `watchful_state`\n- `delegated_task`\n- `sensitive_event`\n- `candidate -> incident -> hook` promotion\n- structured `event_chain`\n- structured `causal_memory`\n- `/new` carryover\n- user-selectable `/new` continuity mode\n- assistant commitment support\n- routine/time context as support-only signal\n- quiet hours\n- sleep/rest suppress\n- cooldown\n- closure\n- dedupe\n- dispatch cap\n- daily-memory writeback\n- deterministic onboarding\n- guided settings\n- natural-language settings changes\n- host-neutral modality preference\n- regression harness\n\n## 中文功能總覽\n\n- 一般聊天、暫存記憶、正式追蹤分流\n- `/new` 後接回正確主題\n- 可選新對話承接方式：最近 4 輪、最後使用者意圖、因果跟進焦點、助手承諾、綜合判斷\n- 作息與時間感只當輔助，不搶主線\n- 可用自然語言調整設定\n- 可用指令精準修改設定\n- 關心與追蹤有冷卻、退場、去重、上限與勿擾\n- 暫存/追蹤內容可寫回 daily memory trace\n- 技能層保持平台中立，不把通訊渠道寫死進技能定義\n\n## Contact\n\nIf you are interested in this package, run into a problem, or want to exchange\nideas about OpenClaw continuity, feel free to contact me:\n\n- `adarobot666@gmail.com`\n\nIf you are satisfied with this skill package, please star the GitHub repository\nas encouragement. I will keep pushing improvements, maintenance, and new\nfeatures.\n\n如果你對這個技能包有興趣、使用時遇到問題，或想交流 OpenClaw continuity\n相關想法，歡迎聯繫我：\n\n- `adarobot666@gmail.com`\n\n如果你滿意這個技能包，也歡迎在 GitHub 給一顆星作為鼓勵。我會持續推動\n優化、維護與新功能追加。\n\nFile v2.0.20:_meta.json\n\n{\n  \"ownerId\": \"kn77md9ahr1tc0zvhm9pvda7w9822n9k\",\n  \"slug\": \"openclaw-continuity\",\n  \"version\": \"2.0.20\",\n  \"publishedAt\": 1777332532079\n}\n\nFile v2.0.20:references/modules.md\n\n# V2 module map\n\n## Core\n\n- continuity routing\n- staged memory promotion\n- tracked follow-up\n- carryover\n- closure consistency\n- frontstage safety\n\n## State layer\n\n- `profile.json`\n- `user_model.json`\n- `emotion_state.json`\n- `persona_state.json`\n- `memory_rank.json`\n- `autonomy_state.json`\n- `settings.json`\n\n## Event layer\n\n- `candidate_buffer.json`\n- `incidents.json`\n- `hooks.json`\n- `session_memory_staging.json`\n\n## Trace layer\n\n- `followup_trace.jsonl`\n- `candidate_buffer_audit.jsonl`\n- `session_memory_staging_audit.jsonl`\n- `hook_completion_audit.jsonl`\n- `frontstage_guard_log.jsonl`\n\n## Public V2 tracked event types\n\n- `parked_topic`\n- `watchful_state`\n- `delegated_task`\n- `sensitive_event`\n\n## Optional and host-boundary items\n\n- host delivery concerns\n- provider/network transport concerns\n- optional rhythm or nudge layers\n\nFile v2.0.20:references/templates.md\n\n# Frontstage notes\n\nThis file stays intentionally small. V2 does not own persona design; it protects continuity-facing frontstage behavior and keeps internal reasoning out of user-visible text.\n\n## V2 frontstage rules\n\n- keep frontstage text in natural Traditional Chinese\n- avoid exposing hook, schedule, checker, runtime, or internal-source language to the user\n- avoid unresolved fragments that require the user to guess what `這個` or `that` refers to\n- avoid false closure when no concrete continuity anchor exists\n- apply sleep/rest suppress only to follow-up behavior, not to ordinary user-facing replies\n\n## V2 follow-up tone boundaries\n\n- `emotional_followup`: accompany first, ask lightly\n- `health_followup`: check condition gently, do not sound like generic health advice\n- `progress_followup`: continue a parked task or topic without sounding like a manager reminder\n- `tomorrow_check`: light next-step reminder with human warmth\n\n## Optional note\n\nRhythm or nudge variants belong to optional layers. They are not part of the public V2 default unless a host explicitly enables and supports them.\n\nFile v2.0.20:AUDIT.md\n\n# Audit Guide\n\nThis repository is the public V2 package for `personal-hooks`, an OpenClaw\nskill for structured continuity, tracking, and follow-up.\n\nIt is:\n\n- an OpenClaw skill package\n- a state-backed continuity and follow-up layer\n- host-neutral at the core package boundary\n\nIt is not:\n\n- a one-click full host distribution\n- a generic transport or polling package\n- an always-on idle/social nudging package by default\n\n## One-line status\n\nPublic package identity is V2. Publication should be judged against\n`docs/release-acceptance.md` and the current V2 validation set.\n\nFor current release state, read:\n\n- `docs/v2-status.md`\n- `docs/v2-validation-summary.md`\n- `docs/v2-known-limits.md`\n- `docs/release-acceptance.md`\n\n## What the public V2 package covers\n\n- routing between `casual_chat`, `staged_memory`, and `tracked_followup`\n- four tracked event types:\n  - `parked_topic`\n  - `watchful_state`\n  - `delegated_task`\n  - `sensitive_event`\n- incremental `event_chain` updates\n- structured `causal_memory`\n- `candidate -> incident -> hook` promotion\n- `/new` carryover and continuity reattach\n- active hook / closure lifecycle\n- sleep/rest suppress\n- dedupe / cooldown / dispatch cap\n- frontstage guard and outbound stopgap integration points\n- regression harness and live QA guidance\n\n## What the public V2 package does not claim\n\n- default idle/social rhythm nudging\n- channel/network delivery reliability\n- host-specific transport glue\n- persona ownership\n\n## Experimental or opt-in areas\n\n- `experimental.rhythm_nudge.*`\n- design-only notes under `docs/v2-blueprint.md`\n\n## Recommended review order\n\n1. `README.md`\n2. `SKILL.md`\n3. `config.schema.json`\n4. `docs/call-flow.md`\n5. `docs/harness.md`\n6. `docs/release-acceptance.md`\n7. `scripts/personal_hooks.py`\n\n## Important file map\n\nCore package files:\n\n- `README.md`\n- `SKILL.md`\n- `config.schema.json`\n- `scripts/personal_hooks.py`\n- `scripts/followup_skill_harness.py`\n- `scripts/web_live_runner.mjs`\n\nSupporting documentation:\n\n- `docs/call-flow.md`\n- `docs/harness.md`\n- `docs/live-qa-runbook.md`\n- `docs/release-acceptance.md`\n- `docs/v2-blueprint.md`\n\nReference material:\n\n- `references/modules.md`\n- `references/templates.md`\n\nExamples:\n\n- `examples/settings.sample.json`\n- `examples/harness-report.sample.json`\n\n## Minimal verification\n\n```bash\npython3 scripts/personal_hooks.py init\npython3 scripts/personal_hooks.py capability-state-show\npython3 scripts/followup_skill_harness.py --absence-minutes 3\n```\n\nFor sandbox isolation, see `docs/harness.md`.\n\n## Current package-level limits\n\n- frontstage warmth and personality still depend on the host agent/model\n- carryover remains intentionally short and structured, not full transcript replay\n- host glue for live heartbeat / outbound interception remains opt-in\n\nFile v2.0.20:CONTRIBUTING.md\n\n# Contributing\n\n## Guardrails\n\n- Keep the public package V2-only.\n- Keep host glue optional and the core skill host-neutral.\n- Prefer config flags and traceability over hidden behavior.\n- Preserve staged/tracked/closure semantics unless a bug fix clearly requires otherwise.\n- Maintain both frontstage invariants together:\n  - valid user-facing text must still deliver\n  - internal/tool/fragment residue must not leak\n\n## Before proposing changes\n\n1. Check whether the change belongs in the portable skill core or an optional host addon.\n2. If it changes follow-up semantics, explain the runtime effect on staging, tracking, closure, and frontstage delivery.\n3. Prefer deterministic checks before live verification.\n\n## Validation\n\n- run a minimal smoke check\n- run the targeted harness when a change touches the continuity/follow-up path\n- do not rely on subjective frontstage feel as the only proof\n\nFile v2.0.20:docs/call-flow.md\n\n# Call Flow\n\n## Main runtime path\n\n1. `intercept_message()`\n   - inspect the incoming user text\n   - classify it as casual, staged, or tracked-worthy\n   - write candidate / incident / hook state when needed\n\n2. `process_candidate_buffer()`\n   - re-evaluate staged candidates\n   - promote qualified continuity into incidents/hooks\n\n3. `build_runtime_context()`\n   - collect pending topics\n   - collect carryover for `/new`\n   - add schedule context and continuity guards\n\n4. ordinary reply generation\n   - the host OpenClaw agent uses the runtime context to generate frontstage text\n\n5. `due` / `render` / `complete`\n   - evaluate pending hooks\n   - render due follow-up text\n   - mark closure / completion\n\n## State flow\n\n`casual_chat` -> no tracked state required\n\n`staged_memory`\n- `session_memory_staging.json`\n- `candidate_buffer.json`\n- concise daily-memory trace\n\n`tracked_followup`\n- `incidents.json`\n- `hooks.json`\n- clearer daily-memory trace\n\n## Traceability\n\nKey files:\n\n- `followup_trace.jsonl`\n- `candidate_buffer_audit.jsonl`\n- `session_memory_staging_audit.jsonl`\n- `hook_completion_audit.jsonl`\n- `frontstage_guard_log.jsonl`\n\nFile v2.0.20:docs/channel-boundary-stopgap.md\n\n# Channel Boundary Stopgap\n\nThis document covers the **channel boundary stopgap** for two classes of outbound\nleakage that the public skill alone cannot fully stop:\n\n1. `<final> ... </final>` tags appearing in user-visible output\n2. heartbeat/internal narration reaching outbound delivery\n\nThese are **host integration** concerns. They are not part of the public\nskill's portable logic, but a host using this skill should wire a final\noutbound defense.\n\n## What belongs in the public skill\n\nThe skill may:\n\n- reduce meta / narration in model-facing output\n- keep runtime-context structured\n- strip obvious internal wording during generation\n\nThe skill should **not** own:\n\n- channel-specific outbound interception\n- gateway runtime persistence behavior\n- platform-specific delivery routing\n- language-specific personal preferences such as Simplified→Traditional rewrite\n\n## Recommended channel boundary stopgap\n\nAt the host layer, add a final outbound guard with these behaviors:\n\n1. Strip `<final>` wrappers before outbound send\n2. Strip heartbeat narration prefixes such as:\n   - `This is another heartbeat poll...`\n   - `Looking at the autoseed output...`\n   - `Still no response...`\n3. Keep the final message short and frontstage-safe\n4. Apply the same logic to:\n   - `message_sending`\n   - heartbeat delivery persistence (for example `lastHeartbeatText`)\n\n## Why this is outside the skill core\n\nThe skill runs during generation, but heartbeat delivery and final outbound\npayloads may be resolved later by gateway/runtime code. If the host does not\nintercept the final payload, raw narration can still leak even when the skill\nalready cleaned the generated text.\n\n## Minimum validation\n\nFor a new host, verify all of the following:\n\n1. `message_sending` fires on outbound delivery\n2. `<final>` does not appear in the user-visible message\n3. heartbeat/internal narration does not appear in the user-visible message\n4. persisted heartbeat text (for example `lastHeartbeatText`) matches the final\n   delivered text, not the raw pre-sanitize narration\n\n## Release note\n\nThis stopgap is included as **boundary guidance**, not as a public skill promise.\nThe public package is allowed to ship the guidance and validation steps without\nclaiming it can guarantee all host frontstage safety by itself.\n\nFile v2.0.20:docs/harness.md\n\n# Harness\n\n## Goal\n\nReproduce V2 continuity/follow-up behavior in a sandbox without mutating live state.\n\n## Entry point\n\n```bash\npython3 scripts/followup_skill_harness.py --absence-minutes 3\n```\n\n## What it verifies\n\n- casual vs staged vs tracked routing\n- four tracked event types\n- event_chain incremental update\n- candidate -> incident -> hook flow\n- `/new` carryover flags\n- active hook / closure\n- shortened absence dispatch in sandbox mode\n- simulated user reply continuity\n- schedule-context presence in runtime context\n- frontstage-oriented continuity prompts remain structured and compact\n\n## Recommended neutrality checks before release\n\nAdd at least one sandbox run for each of these:\n\n- zh-TW onboarding with an explicit IANA timezone such as `Europe/Berlin`\n- English onboarding with the same explicit IANA timezone\n- generic offset onboarding such as `UTC+0` / `GMT+0` and confirm the stored\n  value stays a generic fixed offset (for example `UTC+00:00`), not a city zone\n- `/new` followed by a bare `hi` / `嗨` and confirm continuity stays thread-led\n  rather than collapsing into generic time-of-day chatter\n\n## Sandbox override\n\nThe harness uses env overrides so it can run against temporary state:\n\n- `PERSONAL_HOOKS_DATA_DIR`\n- `PERSONAL_HOOKS_MEMORY_DIR`\n- `PERSONAL_HOOKS_SESSIONS_INDEX_PATH`\n- `PERSONAL_HOOKS_JOBS_PATH`\n- `PERSONAL_HOOKS_OPENCLAW_CONFIG_PATH`\n- `PERSONAL_HOOKS_SETTINGS_PATH`\n\n## Preconditions\n\n- Python 3\n- writable temp directory\n- optional OpenClaw-compatible config if you want embedding fallback enabled\n\n## Portable usage\n\nThe release package does not assume any specific live agent workspace.\n\nUseful overrides:\n\n- `PERSONAL_HOOKS_SCRIPT_PATH`\n- `PERSONAL_HOOKS_OPENCLAW_CONFIG_PATH`\n- `PERSONAL_HOOKS_SOURCE_DATA_DIR`\n- `PERSONAL_HOOKS_SOURCE_MEMORY_DIR`\n- `PERSONAL_HOOKS_SOURCE_JOBS_PATH`\n- `PERSONAL_HOOKS_REPORT_DIR`\n- `PERSONAL_HOOKS_TEST_SESSION_KEY`\n\nIf you do not provide source data directories, the harness seeds a clean sandbox from package defaults.\n\n## Output\n\n- timestamped JSON report\n- case-level pass/fail\n- state deltas\n- carryover flags\n- hook counts\n- timing summaries\n\nFile v2.0.20:docs/host-boundary.md\n\n# Host Boundary — Skill/Shared vs Host/Live\n\n## Purpose\n\nThis document clarifies what belongs to the **public skill** (shared, portable)\nand what belongs to the **host gateway / bridge** (private, instance-specific).\nA public skill cannot claim it automatically guarantees channel frontstage\nsafety; the host must wire its own bridge hooks. See also\n[`channel-boundary-stopgap.md`](channel-boundary-stopgap.md) for the minimal\nchannel-boundary stopgap used to suppress `<final>` leakage and weird heartbeat\ntext, and [`host-operator-settings.md`](host-operator-settings.md) for the\noperator knobs that should be configured at the host/runtime level.\n\n---\n\n## Layer 1 — Skill / Shared (A-class)\n\nThese files ship with the skill and contain **no host-specific references**.\n\n| Path | Role |\n|------|------|\n| `scripts/personal_hooks.py` | Frontstage guard: strips narration, enforces HEARTBEAT.md |\n| `scripts/followup_skill_harness.py` | Follow-up scheduling harness |\n| `scripts/web_live_runner.mjs` | Web live-check runner |\n| `HEARTBEAT.md` (workspace optional) | Model-facing heartbeat instructions when the host keeps a heartbeat checklist |\n| `config.schema.json` | Skill configuration schema |\n| `docs/*` | Documentation |\n\n**Rule**: No host-specific IDs, no gateway port numbers, no channel destination IDs, no agent IDs\nin this layer. Temp-dir prefixes use `ph-` (personal-hooks).\n\n---\n\n## Layer 2 — Host / Bridge (B-class)\n\nThese files live **outside** the skill directory, in the gateway's plugin tree.\nThey are instance-specific and NOT part of the public skill.\n\n| Path (relative to stateDir) | Role |\n|------------------------------|------|\n| `workspace/plugins/personal-hooks-bridge/index.ts` | Bridge: wires `message_sending` + `before_message_write` hooks |\n| `openclaw.json` | Gateway config incl. `agents.defaults.heartbeat` |\n\n**What the bridge does that the skill cannot**:\n\n1. **`message_sending` hook** — intercepts ALL outbound (including heartbeat)\n   inside `deliverOutboundPayloads`. This is the last line of defense against\n   dirty narration reaching the outbound channel adapter. The skill's `personal_hooks.py` only\n   runs during model generation; it cannot intercept the delivery pipeline.\n\n2. **`before_message_write` hook** — strips session content for persistence.\n   This does NOT affect outbound delivery (they are independent paths).\n\n3. **`agents.defaults.heartbeat`** — gateway-level config required for the\n   heartbeat outbound adapter to resolve. Without it, heartbeat delivery\n   fails with \"Outbound not configured for the selected channel\".\n\n4. **`heartbeat.isolatedSession = true`** — gateway-level config that keeps\n   background heartbeat runs out of the main direct-conversation session.\n   Without it, heartbeat prompts / dispatch context / internal narration can\n   re-enter the same continuity store used by ordinary user replies.\n\n5. **new-session startup bootstrap** — when a host starts a fresh `/new` or\n   `/reset` session and no real human text exists yet, the host must not\n   synthesize a fake user utterance just to drive startup logic. The safe\n   startup path is:\n   - run `runtime-context --user-text \"/new\" --is-new-session`\n   - use trusted carryover/pending-topic state for internal bootstrap only\n   - if the runtime injects a startup bootstrap block as a pseudo-`user` turn,\n     treat it as internal control context, not as real human text\n   - wait for the first actual human message before any `preagent-sync`\n   - do **not** turn bootstrap text into fake user input\n   - `/new` may still open from trusted carryover / pending-topic / tracked-followup / schedule context when the timing/safety context justifies it\n   - do **not** resume pending topics on the user's behalf from fabricated user text\n\nIf a host fabricates text such as a greeting or rest phrase and feeds it into\n`preagent-sync`, the skill will treat that text as real user input. This can\nmisfire sleep/rest suppression, erase the true continuity anchor, and distort\nnew-session behavior.\n\n## Simple host/operator summary\n\nIf someone installs the public skill package, they get the shared continuity\nmechanism. They do **not** automatically get every host/live integration.\n\nThe missing host pieces are usually:\n\n- **Channel bridge / outbound last-defense**\n  - the final outbound interception layer before channel delivery\n- **gateway hook wiring**\n  - the lifecycle hookup that makes the skill run at the right reply stages\n- **live heartbeat host glue**\n  - heartbeat scheduling/isolation/delivery wiring for reliable background\n    follow-up\n\nThis is intentional. The public package stays portable; host/runtime integration\nremains opt-in.\n\n---\n\n## Why the skill alone is not enough\n\n```\nModel generates reply\n       │\n       ▼\npersonal_hooks.py strips narration  ← Skill layer (A)\n       │\n       ▼\nbefore_message_write persists       ← Bridge layer (B), session only\n       │\n       ▼\nresolveHeartbeatReplyPayload        ← Gateway internal, uses RAW replyResult\n       │\n       ▼\ndeliverOutboundPayloads             ← Gateway internal\n       │\n       ▼\nmessage_sending hook intercepts     ← Bridge layer (B), last defense\n       │\n       ▼\nChannel adapter send\n```\n\nThe gateway's `resolveHeartbeatReplyPayload` reads from the **raw** model\nresult, not the hooked session content. So even if the skill's Python guard\nstrips narration perfectly, a dirty heartbeat reply can still leak through\nunless the bridge's `message_sending` hook catches it.\n\nAlso: if heartbeat shares the same session key as the direct user thread,\nbackground heartbeat text can pollute carryover / staging / continuity even\nwhen the visible outbound message is clean. The correct host fix is to set\n`heartbeat.isolatedSession=true`, which moves heartbeat runs to\n`<sessionKey>:heartbeat` while still allowing outbound delivery to the same user.\n\n---\n\n## Deployment checklist for a new host\n\n1. Install skill to `workspace/skills/personal-hooks/`\n2. Wire a host bridge at `workspace/plugins/personal-hooks-bridge/`\n3. Configure `agents.defaults.heartbeat` in `openclaw.json`\n4. Set `heartbeat.isolatedSession=true` for any host that uses background heartbeat pushes\n5. Verify `message_sending` hook fires: look for `message_sending MODIFY` in gateway logs\n6. Verify heartbeat delivery: check channel-delivery ACK entries after first tick\n7. Verify heartbeat runs are using `:heartbeat` isolated sessions instead of the main direct session\n8. Verify `<final>` tags and heartbeat narration are stripped from final outbound text\n9. Verify `/new` startup does **not** invent fake user text before the first\n   real human message\n\nFile v2.0.20:docs/host-operator-settings.md\n\n# Host Operator Settings\n\nThis document is for host operators who want to tune:\n\n- how long tracked state should live\n- how routine schedule should be applied\n- how quiet / rest / work-time behavior should be applied\n- which knobs belong to the portable skill, and which still belong to host/live\n\nThe public package stays skill-first. Host-specific delivery or persona choices\nshould still live outside the portable core.\n\n## 0. Causal memory boundary: what the public skill should and should not do\n\nThe public package should:\n\n- extract causal structure from recent conversation\n- preserve continuity facts, user state, unresolved loops, and time anchors\n- write structured continuity state into staging / tracked follow-up / daily-memory paths\n- give the model enough internal context to continue naturally later\n\nThe public package should **not**:\n\n- hardcode role-specific push wording\n- prewrite what one specific host should say\n- assume one host role, one language, or one chat platform\n\nIn other words:\n\n- the skill owns structured continuity state\n- the model owns natural language generation\n- the host owns delivery, persona, and platform specifics\n\n## 0.5. Host-agnostic settings entry\n\nThe public package should expose one simple natural-language entry into guided\nsettings mode, without binding the skill to one specific chat platform or any other single\nexternal platform.\n\nRecommended multilingual entry phrases:\n\n- Traditional Chinese: `幫我調整關心設定`\n- Simplified Chinese: `帮我调整关心设置`\n- English: `Help me adjust my follow-up settings`\n- Japanese: `フォローアップ設定を調整して`\n- German: `Hilf mir, meine Follow-up-Einstellungen anzupassen`\n- Italian: `Aiutami a regolare le impostazioni di follow-up`\n- Spanish: `Ayúdame a ajustar mi configuración de seguimiento`\n\nThis entry should open a guided update flow, not directly mutate everything at\nonce. A host should:\n\n1. run `setup-check`\n2. identify which category the user wants to change\n3. apply only changed fields through `setup-apply`\n\nRecommended guided categories:\n\n- `schedule`\n- `proactive`\n- `tracking`\n- `tone`\n\nImportant boundary:\n\n- host/user can adjust policy values\n- host/user should **not** directly tune causal extraction logic, continuity\n  core rules, or daily-memory promotion internals\n\n## 1. Tracking lifetime: what expires, and where to change it\n\nThere is no single \"memory TTL\" knob. Different layers have different lifetimes.\n\n### Causal memory summary behavior\n\nThis is the public, host-agnostic operator surface for how much structured\ncontinuity state is preserved in internal summaries. It affects the skill's\ninternal continuity context, not frontstage wording.\n\nPublic settings (in `causal_memory`):\n\n- `summary_max_facts`: default `3`\n- `include_time_anchor`: default `true`\n- `include_state_marker`: default `true`\n\nThese control:\n\n- how many factual clauses are retained in normalized continuity summaries\n- whether time anchors such as `today`, `tonight`, `21:00`, or `Monday` stay visible\n- whether neutral state markers such as `busy`, `tired`, or `sick` remain available to the model\n\nThis is useful for multilingual hosts because it keeps structure explicit\nwithout forcing one frontstage phrasing style.\n\n### Candidate staging TTL\n\nCandidate staging is the short-term holding area before a topic is promoted into\nformal incident/event tracking.\n\nPublic settings (in `candidate_ttl_hours`):\n\n- `emotion`: 24 hours\n- `support`: 24 hours\n- `task`: 168 hours (7 days)\n- `preference`: 168 hours (7 days)\n\nConfigurable via `settings.json` → `candidate_ttl_hours.*`.\n\n### Carryover lifetime\n\nCarryover controls how much of the last session can be pulled into a new\nsession.\n\nPublic setting:\n\n- `carryover.max_turns`\n\nDefault sample value:\n\n- `5`\n\nWhere to change it:\n\n- host runtime settings file\n- start from `examples/settings.sample.json`\n\nRelevant files:\n\n- `examples/settings.sample.json`\n- `config.schema.json`\n\n### Dispatch cooldown / follow-up lifetime\n\nThese determine how often follow-up **may** dispatch. The interval is a minimum re-evaluation window, not a guaranteed send frequency. Actual dispatch also depends on: whether the user has re-engaged, followup_state guards, cooldown, dispatch cap, quiet hours, and sleep/rest suppress.\n\nPublic settings:\n\n- `dispatch.cooldown_minutes`\n- `dispatch.cap`\n- `proactive_chat.interval_hours`\n- `proactive_chat.cooldown_minutes`\n- `proactive_chat.max_proactive_per_day`\n\nDefault sample values:\n\n- `dispatch.cooldown_minutes = 180`\n- `dispatch.cap = 3`\n- `proactive_chat.interval_hours = 3`\n- `proactive_chat.cooldown_minutes = 180`\n- `proactive_chat.max_proactive_per_day = 2`\n\n### Re-engagement policy\n\nControls what happens after a dispatch receives no user reply.\n\nPublic settings (in `re_engagement`):\n\n- `mode`: `\"wait_for_reply\"` (default) — park after `max_unanswered_before_park` dispatches; only user reply unparks. `\"timed_retry\"` — automatically retry parked hooks after `retry_after_hours` even without reply.\n- `retry_after_hours`: `4` (default) — hours to wait before retrying a parked hook (only used when `mode=timed_retry`)\n- `max_unanswered_before_park`: `2` (default) — how many dispatches without reply before the hook is parked\n\n### Parked hook auto-close\n\nPublic setting (in `followup`):\n\n- `followup.parked_auto_close_hours`: `0` (default, disabled) — if > 0, parked hooks are auto-cancelled after this many hours since last dispatch\n\n### Temporal guard\n\nControls how recently a user must have interacted for dispatch guards to allow/block.\n\nPublic setting (in `temporal_guard`):\n\n- `temporal_guard.newer_interaction_minutes`: `5` (default) — if user interacted this many minutes after the proactive anchor, block dispatch as \"newer-user-interaction\"\n\n### Rest-suppress lifetime\n\nWhen the user says they want to sleep or rest, the skill can suppress follow-up\nfor a fixed duration.\n\nPublic settings:\n\n- `sleep_rest_suppress.duration_hours`: `10` (default) — how long rest-suppress lasts\n- `sleep_rest_suppress.auto_clear_hours`: `4` (default) — auto-clear rest-suppress after this many hours even without explicit resume. Set to `0` to disable auto-clear.\n\n### Same-type cooldown\n\nThere is also an internal same-type cooldown used by the skill to avoid\nrepeating the same kind of incident too often.\n\nCurrent internal default:\n\n- `same_type_cooldown_hours = 6`\n\nThis is currently a code-level default, not a public schema field.\n\n## 2. Routine schedule: how to make the host apply sleep/wake timing\n\nUse `routine_schedule` when the host knows the user's rough daily pattern and\nwants proactive timing to come from a stable schedule instead of memory guesswork.\n\nMain fields:\n\n- `routine_schedule.enabled`\n- `routine_schedule.timezone`\n- `routine_schedule.sleep_time`\n- `routine_schedule.wake_time`\n- `routine_schedule.wake_window_minutes`\n- `routine_schedule.phases.sleep.proactive_enabled`\n- `routine_schedule.phases.sleep.wake_seed_enabled`\n- `routine_schedule.phases.wake_window.proactive_enabled`\n- `routine_schedule.phases.wake_window.wake_seed_enabled`\n- `routine_schedule.phases.wake_window.interval_hours`\n- `routine_schedule.phases.active_day.proactive_enabled`\n- `routine_schedule.phases.active_day.wake_seed_enabled`\n- `routine_schedule.phases.active_day.interval_hours`\n\nTypical use:\n\n- set `enabled=true`\n- set `timezone`\n- set one sleep time and one wake time\n- decide whether wake-window should allow proactive and wake-seed\n- decide active-day interval separately from wake-window\n\nSee also:\n\n- `docs/routine-schedule.md`\n\n## 3. Quiet mode: how to suppress proactive messages at fixed times\n\nUse `proactive_chat.quiet_hours` when the host wants a stable blocked window.\n\nPublic fields:\n\n- `proactive_chat.quiet_hours.start`\n- `proactive_chat.quiet_hours.end`\n\nBehavior:\n\n- if `start == end`, quiet-hours is effectively disabled\n- if `start < end`, the blocked window is same-day\n- if `start > end`, the blocked window crosses midnight\n\nExamples:\n\n- `23 -> 7` means quiet overnight\n- `9 -> 18` means quiet during workday\n- `99 -> 99` is not a portable public convention; prefer disabling or using the\n  same start/end value instead\n\n## 4. Work-time behavior: what is public, what is still host/live\n\nThere are two different ways to model \"working hours\":\n\n### A. Stable work hours\n\nUse:\n\n- `proactive_chat.quiet_hours`\n\nThis is the portable public way if the user usually does not want proactive\nmessages during fixed work hours.\n\n### B. Dynamic \"I am currently working\" state\n\nThis is a host/live concern.\n\nThe live system may maintain a dynamic work-DND state when the user explicitly\nsays they are working, focused, or busy. That is not yet a portable public\nschema block in RC.\n\nFor public packaging, the honest rule is:\n\n- fixed work windows -> use `quiet_hours`\n- dynamic current work state -> host/live extension\n\n## 5. Rest / sleep phrases\n\nThe public skill already supports rest/sleep suppression logic.\n\nHost operators should know:\n\n- this is not the same as quiet-hours\n- quiet-hours is a clock-based block\n- rest-suppress is a user-state block\n\nRecommended split:\n\n- use `quiet_hours` for stable clock windows\n- use `sleep_rest_suppress` for explicit \"I want to sleep/rest now\"\n\n## 6. Minimum host workflow\n\nFor a portable install, the simplest order is:\n\n1. copy or symlink the skill package into `skills/personal-hooks/`\n2. create a writable runtime settings file from `examples/settings.sample.json`\n3. tune:\n   - `carryover.max_turns`\n   - `new_session_continuity.mode`\n   - `modality_continuity.mode`\n   - `dispatch.cooldown_minutes`\n   - `proactive_chat.*`\n   - `routine_schedule.*`\n   - `sleep_rest_suppress.duration_hours`\n4. initialize the skill\n5. verify continuity and follow-up in the host's ordinary reply pipeline\n\nIf the host also uses heartbeat-driven proactive pushes, add one more host-side\nrule:\n\n- set `heartbeat.isolatedSession=true`\n\nWhy this matters:\n\n- heartbeat can legitimately deliver to the same user/channel\n- but it should not reuse the same session key for background generation\n- otherwise heartbeat prompts and dispatch context can leak back into ordinary\n  continuity / carryover / staging state\n\nRecommended host heartbeat shape:\n\n```json\n{\n  \"heartbeat\": {\n    \"every\": \"30m\",\n    \"target\": \"direct-channel\",\n    \"to\": \"[CHANNEL_DESTINATION]\",\n    \"directPolicy\": \"allow\",\n    \"lightContext\": true,\n    \"isolatedSession\": true\n  }\n}\n```\n\nBefore enabling it in production, verify the session/transcript behavior on the\nexact OpenClaw version you are running. Heartbeat isolation is useful, but host\nimplementations and transcript handling can differ by version.\n\n## 7. What is still not fully portable\n\nThe following should still be treated as host/live integration work:\n\n- dynamic work-DND state\n- channel-specific outbound delivery rules\n- final outbound cleanup such as `<final>` / heartbeat leakage interception\n\nArchive v2.0.19: 49 files, 343014 bytes\n\nFiles: _meta.json (139b), assets/publish/comic-01-setup-wizard.svg (4951b), assets/publish/comic-02-adjust-anytime.svg (3817b), assets/publish/comic-03-natural-language-settings.svg (3950b), assets/publish/comic-04-command-settings.svg (3812b), assets/publish/continuity-architecture.svg (5213b), assets/publish/hero-continuity-en.svg (6567b), assets/publish/hero-continuity-zh.svg (6552b), assets/publish/install-placement-en.svg (1850b), assets/publish/product-story-bilingual.svg (6303b), AUDIT.md (2784b), config.schema.json (8031b), CONTRIBUTING.md (901b), docs/call-flow.md (1142b), docs/channel-boundary-stopgap.md (2298b), docs/harness.md (2139b), docs/host-boundary.md (6693b), docs/host-operator-settings.md (10923b), docs/install.md (8106b), docs/live-qa-runbook.md (1135b), docs/publish-copy.md (10021b), docs/release-acceptance.md (3756b), docs/routine-schedule.md (2205b), docs/upgrade-pre-analysis.md (9567b), docs/v2-architecture.md (9024b), docs/v2-blueprint.md (1088b), docs/v2-known-limits.md (1524b), docs/v2-status.md (2648b), docs/v2-validation-summary.md (2967b), examples/harness-report.sample.json (934b), examples/jobs.sample.json (17b), examples/openclaw.sample.json (461b), examples/profile.sample.json (1102b), examples/settings.sample.json (1987b), package.json (1538b), README.md (12002b), references/modules.md (841b), references/templates.md (1111b), requirements.txt (18b), scripts/event_store.py (46618b), scripts/file_output_sop.py (2254b), scripts/followup_skill_harness.py (66044b), scripts/install_local.sh (1693b), scripts/personal_hooks.py (1079911b), scripts/proactive_control.py (12179b), scripts/semantic_config.py (8636b), SECURITY.md (662b), SKILL.md (15380b), validation/rc-verdict.json (2725b)\n\nFile v2.0.19:SKILL.md\n\n---\nname: personal-hooks\ndescription: Structured continuity and follow-up skill for OpenClaw agents. Use when an agent needs to decide whether natural user dialogue should stay as casual chat, become staged memory, or become tracked follow-up with carryover, closure, cooldown, sleep/rest suppress, routine-aware wording, quiet-hours behavior, traceability, and release-grade frontstage safety guards. This package is not a generic cron sender: it uses context, causal state, and explicit lifecycle rules to decide whether care or follow-up should appear at all. It covers parked topics, watchful states, delegated tasks, sensitive events, candidate→incident→hook flow, /new carryover, deterministic onboarding/guided settings, and time-aware continuity guards. It does not include always-on idle/social nudging as a default feature.\nversion: 2.0.19\nhomepage: https://github.com/redwakame/openclaw-continuity\nos:\n  - darwin\n  - linux\nrequires:\n  bins:\n    - python3\n  env:\n    - OPENCLAW_STATE_DIR\n    - OPENCLAW_CONFIG_PATH\nmetadata:\n  os:\n    - darwin\n    - linux\n  requires:\n    bins:\n      - python3\n    env:\n      - OPENCLAW_STATE_DIR\n      - OPENCLAW_CONFIG_PATH\n  openclaw:\n    os:\n      - darwin\n      - linux\n    requires:\n      bins:\n        - python3\n      env:\n        - OPENCLAW_STATE_DIR\n        - OPENCLAW_CONFIG_PATH\n  clawdbot:\n    os:\n      - darwin\n      - linux\n    requires:\n      bins:\n        - python3\n      env:\n        - OPENCLAW_STATE_DIR\n        - OPENCLAW_CONFIG_PATH\n  clawdis:\n    os:\n      - darwin\n      - linux\n    requires:\n      bins:\n        - python3\n      env:\n        - OPENCLAW_STATE_DIR\n        - OPENCLAW_CONFIG_PATH\n---\n\n# OpenClaw Continuity\n\nUse 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.\n\nPublic product name: `OpenClaw Continuity`.\nTechnical package / slug: `personal-hooks`.\nInternal diagnostics may still use `staged-followup-memory` as a status label for continuity state surfaces.\nQuestions, feedback, or implementation discussion: `adarobot666@gmail.com`.\n如果你期待這個技能持續優化與維護，請在 GitHub 給星支持：https://github.com/redwakame/openclaw-continuity\n\n## V2 public scope\n\n- Route turns into `casual_chat`, `staged_memory`, or `tracked_followup`.\n- Classify tracked content into:\n  - `parked_topic`\n  - `watchful_state`\n  - `delegated_task`\n  - `sensitive_event`\n- Maintain `event_chain` summaries with:\n  - `context_before`\n  - `event_core`\n  - `immediate_result`\n  - `followup_focus`\n- Maintain `causal_memory` as structured continuity state with:\n  - `facts`\n  - `state`\n  - `open_loop`\n  - `time_anchor`\n  - `followup_focus_code`\n  - `writeback_policy`\n- Promote `candidate -> incident -> hook`.\n- Preserve `/new` carryover from the previous 3-5 turns and let the user\n  choose which continuity anchor leads a new conversation.\n- Preserve voice/image discussion style as a host-neutral preference when the\n  OpenClaw host already supports those modalities. This skill records the\n  preference only; it does not bundle a voice engine, image model, or channel\n  adapter.\n- Keep hook closure, cooldown, dedupe, dispatch cap, and sleep/rest suppress observable.\n- Write concise daily-memory traces for staged and tracked items.\n- Apply first-run setup facts deterministically from explicit user text.\n- Apply supported guided-settings changes deterministically before the model turn\n  when the request is clear enough.\n- Keep routine-aware sleep handoff precise: when a night-owl user says they are\n  going to sleep near `sleep_time`, and `wake_time` is still later on the same\n  local day, frame the next natural reconnect as later after waking rather than\n  a generic next-day farewell.\n\n## Not in public scope\n\n- Companionship rhythm / nudge as a default feature.\n- User-configured idle chat frequency.\n- Generic proactive chatting when no tracked continuity exists.\n- Host transport/network reliability fixes.\n\n## Trigger conditions\n\nUse this skill when the user is naturally:\n\n- parking a topic for later\n- asking the agent to hold/remember/track something\n- leaving a watchful emotional or physical state unresolved\n- delegating a task for later follow-up\n- describing a sensitive event that needs later continuity\n- starting a new session that should reattach pending continuity\n- asking whether the agent actually staged/tracked/closed something\n\n## Core files\n\n- Script: `scripts/personal_hooks.py`\n- Harness: `scripts/followup_skill_harness.py`\n- Config schema: `config.schema.json`\n- Sample config: `examples/settings.sample.json`\n- Docs:\n  - `README.md`\n  - `docs/call-flow.md`\n  - `docs/harness.md`\n  - `docs/live-qa-runbook.md`\n  - `docs/v2-blueprint.md`\n\n## Runtime boundaries\n\n- Keep V2 deterministic and state-backed.\n- Let the skill/tool layer own staging, promotion, closure, and trace.\n- Let frontstage consume structured results; do not rely on the model to invent continuity ad hoc.\n- Treat `causal_memory` and `event_chain` as internal structured context, not prewritten frontstage reply text.\n- Do not hardwire relationship-specific push wording into the public package; hosts and models should generate their own natural language from structured context.\n- Treat rhythm/nudge as experimental and disabled by default.\n- Keep language routing explicit. English prompt/guard text should stay English,\n  and ordinary user phrases must not be rewritten into mixed-language internal\n  artifacts.\n- Do not hard-bind generic `UTC/GMT` offsets to a city timezone. Explicit IANA\n  zones should pass through unchanged; generic offsets must stay generic fixed\n  offsets such as `UTC+00:00`.\n- Prefer language from the current user turn and existing structured state over\n  a host default. The public package ships first-party zh-TW / zh-CN / English\n  behavior and broad guided-settings entry coverage for a few other common\n  languages; it does not claim full prose localization for every language.\n\nThe public skill package does **not** automatically provide host-side delivery\nplumbing. Keep this boundary explicit:\n\n- This package owns continuity state, memory routing, `/new` carryover, setup,\n  and skill/tool-layer guards.\n- The OpenClaw host and adapter configuration own final message delivery.\n- Do not advertise a matrix of external chat platforms inside the public skill\n  copy unless those host adapters are tested separately.\n\n## Entry points\n\n- `build_runtime_context()`\n  - Build ordinary-reply continuity context, carryover prompt, schedule context, and guard prompts.\n- `intercept_message()`\n  - Inspect one user turn and decide whether it should stay casual, become staged, or become tracked.\n- `process_candidate_buffer()`\n  - Promote staged candidates into incidents/hooks when the evidence is strong enough.\n- `due` / `render` / `complete`\n  - Drive the hook lifecycle.\n\nUse `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.\n\n## Setup & Configuration\n\n### First-time setup\nIf `SKILL_ONBOARD.md` exists in the workspace root, follow its guided setup flow. Once complete, delete the file.\n\n### Modifying settings after setup\nWhen the user asks to change their schedule, care frequency, quiet hours, or other preferences:\n\n1. Run `setup-check` to see current state:\n   ```bash\n   python3 scripts/personal_hooks.py setup-check\n   ```\n2. Apply only the changed fields via `setup-apply`:\n   ```bash\n   python3 scripts/personal_hooks.py setup-apply --payload-json '{\"sleep_time\":\"00:00\",\"wake_time\":\"09:00\"}'\n   ```\n   Only include the fields being changed — other fields remain untouched.\n\n### Universal natural-language entry\n\nThe public package should support one host-agnostic natural-language entry into\nguided settings mode. This is not platform-specific and should work across any\nOpenClaw-supported conversation surface.\n\nRecommended entry phrases:\n\n- Traditional Chinese: `幫我調整關心設定`\n- Simplified Chinese: `帮我调整关心设置`\n- English: `Help me adjust my follow-up settings`\n- Japanese: `フォローアップ設定を調整して`\n- German: `Hilf mir, meine Follow-up-Einstellungen anzupassen`\n- Italian: `Aiutami a regolare le impostazioni di follow-up`\n- Spanish: `Ayúdame a ajustar mi configuración de seguimiento`\n\nWhen the user says one of these or something equivalent:\n\n1. enter guided settings mode\n2. run `setup-check`\n3. ask which category they want to adjust\n4. apply only the changed fields via `setup-apply`\n\nDo not require platform-specific slash commands.\n\nThe skill now also treats explicit command-like entries such as `/care setup`\nand `/care config` as guided-settings triggers at the runtime-context layer, so\nthe setup mode can be re-opened consistently across different OpenClaw hosts.\n\nFor capability questions, hosts should also expose:\n\n- `/care capability` / `/care 功能` / `/care 能力`\n- `/care memory` / `/care 記憶` / `/care 记忆`\n\nUsers can also change schedule and do-not-disturb behavior through natural\nlanguage, for example:\n\n- `我通常早上六點睡，下午兩點半起床`\n- `半夜不要主動關心我`\n- `把勿擾改成早上六點到下午兩點半`\n- `Help me make follow-up quieter after midnight`\n\nThese are not separate memory engines. They are explanation entry points for:\n\n- whether `/new` carryover is currently active\n- whether the skill writes daily memory only for staged/tracked items\n- whether the current conversation is ordinary chat, staged memory, or tracked follow-up\n\n### Guided categories\n\nKeep the guided categories simple and host-agnostic:\n\n- `schedule` / `作息`\n- `proactive` / `主動關心`\n- `tracking` / `追蹤記憶`\n- `continuity` / `新對話承接`\n- `modality` / `語音／圖片延續偏好`\n- `tone` / `互動風格`\n\nThe user should be able to answer naturally rather than memorize technical keys.\nThe skill should map those answers into settings/profile changes.\n\n### Deterministic onboarding apply\n\nFor first-install onboarding, the skill must not rely only on model-side\nclassification. When the user explicitly states structured setup facts in normal\nconversation, the skill should deterministically extract and apply at least:\n\n- timezone\n- sleep_time\n- wake_time\n- relationship\n- use_case\n- new_session_continuity_mode\n- modality_continuity_mode\n\nThese values should be written into:\n\n- `settings.json` (`routine_schedule`)\n- `settings.json` (`new_session_continuity`)\n- `settings.json` (`modality_continuity`)\n- `profile.json` (`care_style.relationship`)\n- `USER.md`\n\nThis makes the setup contract cross-version safe even when model behavior is\nconservative.\n\nThe skill also strips common webchat timestamp prefixes such as\n`[Wed 2026-04-15 05:25 GMT+0]` before deterministic parsing so the same setup\ntext behaves consistently across CLI and web hosts.\n\n### Trigger phrases (detect and act)\nWhen the user says any of the following, run `setup-check` and offer to update:\n- `幫我調整關心設定` / `帮我调整关心设置`\n- `Help me adjust my follow-up settings`\n- `フォローアップ設定を調整して`\n- `Hilf mir, meine Follow-up-Einstellungen anzupassen`\n- `Aiutami a regolare le impostazioni di follow-up`\n- `Ayúdame a ajustar mi configuración de seguimiento`\n- \"改我的作息\" / \"修改作息\" / \"change my schedule\"\n- \"改勿擾時間\" / \"quiet hours\" / \"do not disturb\"\n- \"改關心頻率\" / \"多久關心一次\" / \"care interval\"\n- \"改時區\" / \"change timezone\"\n- \"新對話承接改成最近 4 輪摘要\" / \"use recent 4 turns after /new\"\n- \"新對話改成看最後使用者意圖\" / \"use the last user intent after /new\"\n- \"語音或圖片討論延續時跟隨可用能力\" / \"preserve voice or image discussion when supported\"\n- \"我搬家了\" / \"我換工作了\" (may affect timezone/schedule)\n\nFor English natural-language settings requests, the shared skill should also\nhandle common phrasings such as:\n\n- `turn proactive check-ins on / off`\n- `checking in every 2 hours`\n- `retrying after 30 minutes`\n- `stopping after 2 unanswered check-ins`\n\n### Available fields\n| Key | Target | What it configures |\n|-----|--------|-------------------|\n| timezone | settings | Time calculations |\n| sleep_time | settings | Sleep phase start |\n| wake_time | settings | Sleep phase end |\n| relationship | profile | Tone & interaction style |\n| use_case | profile | support / developer / tracking |\n| proactive_care | settings | Enable proactive messages |\n| proactive_interval_hours | settings | Minimum re-evaluation interval (hours); actual dispatch depends on guard conditions |\n| quiet_hours_start | settings | Do-not-disturb start |\n| quiet_hours_end | settings | Do-not-disturb end |\n| care_tone | profile | warm / neutral / playful |\n| emoji_forbidden | profile | Banned emoji list |\n| tracking_keywords | profile | Topics to track |\n| heartbeat_enabled | settings | Enable heartbeat |\n| new_session_continuity_mode | settings | Which continuity anchor leads after `/new` |\n| modality_continuity_mode | settings | How voice/image discussion style should carry over when the host supports it |\n\n### New-session continuity constraints\n\n- Guided-settings or operator-feedback text must not become the main `/new`\n  continuity anchor.\n- A bare `hi` immediately after `/new` should be treated as a low-information\n  acknowledgement of the selected continuity opener, not as a fresh time-of-day\n  small-talk reset.\n- Time-state is a tone modifier, not a replacement for the selected continuity\n  anchor.\n- `/new` capability is part of the public V2 package. If asked directly, the\n  skill should answer concretely that it preserves carryover from the previous\n  3–5 turns and tries to reattach the most relevant unresolved thread.\n- daily memory writeback is also part of the public V2 package, but it is not\n  \"write every line\". Ordinary chat can stay casual-only; staged/tracked items\n  write a daily memory trace.\n\n### Policy surface (advanced — via settings.json)\n| Key path | Default | What it controls |\n|----------|---------|-----------------|\n| re_engagement.mode | wait_for_reply | After dispatch without reply: wait or timed retry |\n| re_engagement.retry_after_hours | 4 | Hours before retrying a parked hook (timed_retry mode only) |\n| re_engagement.max_unanswered_before_park | 2 | Dispatches without reply before parking |\n| candidate_ttl_hours.emotion | 24 | Candidate buffer TTL for emotion signals (hours) |\n| candidate_ttl_hours.task | 168 | Candidate buffer TTL for task signals (hours) |\n| temporal_guard.newer_interaction_minutes | 5 | User interaction recency threshold for blocking dispatch |\n| followup.parked_auto_close_hours | 0 | Auto-close parked hooks after N hours (0=disabled) |\n| sleep_rest_suppress.auto_clear_hours | 4 | Auto-clear rest-suppress fallback (0=only on resume) |\n| causal_memory.summary_max_facts | 3 | Maximum factual clauses preserved in internal causal summaries |\n| causal_memory.include_time_anchor | true | Include extracted temporal anchors in internal causal summaries |\n| causal_memory.include_state_marker | true | Include neutral state markers in internal causal summaries |\n\nFile v2.0.19:README.md\n\n# OpenClaw Continuity\n\nMake OpenClaw remember the right thing, reconnect the right topic after `/new`,\nand follow up naturally without leaking internal state into chat.\n\n`OpenClaw Continuity` is the public product name for the `personal-hooks` skill\npackage. It is a **skill-layer continuity engine** for an existing OpenClaw\nagent: it does not replace the agent's persona, and it does not bundle a\nchat-platform adapter.\n\n![OpenClaw Continuity product story](assets/publish/product-story-bilingual.svg)\n\n## Four Quick Comics\n\nThese four panels show the parts that matter most after someone installs the\nskill: guided setup, later adjustment, natural-language setting changes, and\nprecise command changes.\n\n![Install and setup wizard](assets/publish/comic-01-setup-wizard.svg)\n\n![Adjust settings anytime](assets/publish/comic-02-adjust-anytime.svg)\n\n![Natural-language setting changes](assets/publish/comic-03-natural-language-settings.svg)\n\n![Precise command setting changes](assets/publish/comic-04-command-settings.svg)\n\n## For Everyone\n\nMost agents can answer a message. The harder part is remembering what still\nmatters after an interruption, a delayed reply, or a new conversation.\n\nOpenClaw Continuity helps an agent:\n\n- keep ordinary chat light\n- stage \"let's talk about this later\" without losing it\n- track important follow-up without chasing every casual sentence\n- reconnect the right topic after `/new`\n- understand time with sleep/wake and routine context\n- let the user adjust behavior in natural language\n\n中文簡介：\n\nOpenClaw Continuity 是替 OpenClaw 補上「延續感、時間感、關心與追蹤」的技能包。\n它不是單純排程發訊息，也不是把所有對話都硬塞進記憶。它會分辨哪些只是一般聊天，\n哪些要暫存，哪些真的需要追蹤，並在新開對話時接回使用者選定的承接方式。\n\n## What It Feels Like\n\nExample:\n\n```text\nUser: I need to pause this repo release check. Let's continue later.\nAgent: Got it. I will keep the release check as the thread to continue.\n\n/new\n\nAgent: I still have the release check thread. Do you want to pick it up from\nthe last user intent, the follow-up focus, or the recent conversation summary?\n```\n\n中文例子：\n\n```text\n使用者：這個技能上架檢查先放著，晚點再接。\nAgent：好，我先把這段接住，不會當成一般閒聊丟掉。\n\n/new\n\nAgent：前面那段技能上架檢查我還接得住。現在要從最後意圖、追蹤焦點，\n還是最近 4 輪摘要開始？\n```\n\nThe exact wording still belongs to the host agent's persona. This skill supplies\nthe structured continuity state that makes the answer possible.\n\n## Minimal Telegram/TG Showcase\n\nTelegram/TG can be used as a small live showcase **when your OpenClaw host is\nalready connected to Telegram**. The skill does not bundle a Telegram adapter or\nbot setup; it only supplies the continuity behavior that the host sends through\nits normal reply pipeline.\n\nDemo flow:\n\n```text\nTG user: 這個上架檢查先放著，晚點再接。\nAgent: 好，我先幫你接住這條線，不會當成普通閒聊丟掉。\n\nTG user: /new\nAgent: 前面那個上架檢查我還接得住。要從最近 4 輪、最後意圖，還是追蹤焦點接？\n\nTG user: 新對話改成看最後使用者意圖。\nAgent: 已更新。之後新對話會優先從最後使用者意圖承接。\n```\n\nWhat this demonstrates:\n\n- `/new` carryover\n- staged memory instead of forced tracking\n- natural-language settings update\n- frontstage text stays user-facing, not internal runtime text\n\n## Core Features\n\n- **New conversation carryover**\n  `/new` can reconnect the right previous thread instead of starting from a blank greeting.\n\n- **User-selectable `/new` continuity mode**\n  The user can choose which anchor should lead a new conversation:\n  `recent_4_turns_first`, `last_user_intent_first`, `followup_focus_first`,\n  `assistant_commitment_first`, or `balanced`.\n\n- **Ordinary chat / staged memory / tracked follow-up**\n  The runtime separates casual chat from staged memory and formally tracked events.\n\n- **Four tracked event types**\n  `parked_topic`, `watchful_state`, `delegated_task`, and `sensitive_event`.\n\n- **Structured event chain**\n  Keeps `context_before`, `event_core`, `immediate_result`, and\n  `followup_focus` inspectable.\n\n- **Assistant commitment tracking**\n  If the assistant promised to check, remember, or come back to something, that\n  commitment can become part of the continuity state.\n\n- **Time-aware wording**\n  Uses elapsed time, day boundary, sleep/wake boundary, and routine phase as\n  support. Time context does not replace the selected main thread.\n\n- **Care and follow-up controls**\n  Closure, cooldown, dedupe, dispatch cap, quiet hours, and sleep/rest suppress\n  are explicit settings instead of hidden model guesses.\n\n- **Daily-memory writeback**\n  Staged and tracked items write concise traces from structured continuity\n  state, not from improvised frontstage text.\n\n- **Guided setup**\n  First install can ask for timezone, sleep/wake time, relationship/use case,\n  `/new` continuity mode, and voice/image continuity preference.\n\n- **Natural-language settings**\n  Users can say things like \"make follow-up quieter after midnight\" or\n  \"新對話改成看最後使用者意圖\" and the skill maps that to settings.\n\n## What Is In Scope\n\nThis package defines the skill behavior:\n\n- state-backed continuity\n- `/new` reattachment\n- staging and tracked follow-up\n- routine/time context\n- setup wizard and settings updates\n- frontstage safety guards at the skill/tool layer\n- release harness and acceptance checks\n\n## What Is Not In Scope\n\nThis package does not claim a list of external chat platforms. Channel delivery\nbelongs to the OpenClaw host and its adapter configuration.\n\nThat boundary is intentional: the same skill can run through the ordinary\nOpenClaw reply pipeline without becoming tied to one chat surface.\n\n## Setup Wizard\n\nFirst install can enter guided setup when required fields or first-run preference\nfields are missing.\n\n![Install and setup wizard](assets/publish/comic-01-setup-wizard.svg)\n\nThe setup flow covers:\n\n- `timezone`\n- `sleep_time`\n- `wake_time`\n- `relationship`\n- `use_case`\n- `new_session_continuity_mode`\n- `modality_continuity_mode`\n\nThe two newest user-facing choices are:\n\n```json\n{\n  \"new_session_continuity\": {\n    \"mode\": \"recent_4_turns_first\"\n  },\n  \"modality_continuity\": {\n    \"enabled\": true,\n    \"mode\": \"preserve_when_supported\",\n    \"voice_reply_on_voice_thread\": true,\n    \"image_context_carryover\": true\n  }\n}\n```\n\n`modality_continuity` is host-neutral. It only expresses a preference. It does\nnot add a voice engine, image model, or channel adapter to this skill package.\n\n## Change Settings Later\n\n![Adjust settings anytime](assets/publish/comic-02-adjust-anytime.svg)\n\nNatural language:\n\n![Natural-language setting changes](assets/publish/comic-03-natural-language-settings.svg)\n\n```text\nHelp me adjust my follow-up settings.\nMake follow-up quieter after midnight.\nUse the last user intent when a new conversation starts.\n新對話承接改成最近 4 輪摘要。\n把主動關心改保守一點。\n半夜不要主動追蹤我。\n```\n\nCommand-style:\n\n![Precise command setting changes](assets/publish/comic-04-command-settings.svg)\n\n```bash\npython3 scripts/personal_hooks.py setup-check\npython3 scripts/personal_hooks.py setup-apply --payload-json '{\"new_session_continuity_mode\":\"last_user_intent_first\"}'\npython3 scripts/personal_hooks.py setup-apply --payload-json '{\"modality_continuity_mode\":\"preserve_when_supported\"}'\npython3 scripts/personal_hooks.py setup-apply --payload-json '{\"sleep_time\":\"23:00\",\"wake_time\":\"07:00\"}'\n```\n\nSupported `/new` continuity modes:\n\n| Mode | What leads the next conversation |\n| --- | --- |\n| `recent_4_turns_first` | Compact recent 4-turn summary |\n| `last_user_intent_first` | Last user-side intent from compact anchor turns |\n| `followup_focus_first` | `event_chain.followup_focus` |\n| `assistant_commitment_first` | Prior assistant promise/commitment |\n| `balanced` | Runtime chooses the best anchor for the user's opening message |\n\n## Install\n\nCopy or symlink this folder into an OpenClaw workspace:\n\n```text\nopenclaw-workspace/\n  skills/\n    personal-hooks/\n      SKILL.md\n      scripts/\n      docs/\n      examples/\n```\n\nInstall the Python dependency:\n\n```bash\npython3 -m pip install -r requirements.txt\n```\n\nInitialize:\n\n```bash\npython3 /path/to/openclaw-workspace/skills/personal-hooks/scripts/personal_hooks.py init\n```\n\nOptional installer:\n\n```bash\nbash scripts/install_local.sh /path/to/openclaw-workspace/skills link\n```\n\nClawHub-style install:\n\n```bash\nopenclaw skills install openclaw-continuity\n```\n\nnpm-style fetch from GitHub:\n\n```bash\nnpm install github:redwakame/openclaw-continuity#v2.0.19\n```\n\n## Verify\n\nRun the regression harness:\n\n```bash\npython3 /path/to/openclaw-workspace/skills/personal-hooks/scripts/followup_skill_harness.py --absence-minutes 3\n```\n\nExpected result:\n\n```json\n{\n  \"summary\": {\n    \"pass_count\": 14,\n    \"fail_count\": 0\n  }\n}\n```\n\nQuick manual behavior check:\n\n1. Ask the agent to hold a topic for later.\n2. Start `/new`.\n3. Confirm it reconnects the selected continuity anchor instead of generic small talk.\n4. Ask to change setup, for example: `新對話改成看最後使用者意圖`.\n\n## Technical Map\n\nImportant files:\n\n- `SKILL.md`: trigger rules and runtime boundary\n- `scripts/personal_hooks.py`: main runtime\n- `scripts/followup_skill_harness.py`: regression harness\n- `config.schema.json`: settings schema\n- `examples/settings.sample.json`: sample settings\n- `docs/install.md`: installation details\n- `docs/host-operator-settings.md`: operator settings\n- `docs/release-acceptance.md`: release gate\n- `docs/publish-copy.md`: GitHub / ClawHub copy source\n\nMain runtime surfaces:\n\n- `build_runtime_context()`: builds carryover, schedule, setup, and guard prompts\n- `intercept_message()`: routes the user turn into casual/staged/tracked state\n- `process_candidate_buffer()`: promotes candidate state to incidents/hooks\n- `setup-check` / `setup-apply`: guided configuration commands\n- `frontstage-guard`: skill/tool-layer output safety guard\n\n## Public V2 Includes\n\n- `casual_chat / staged_memory / tracked_followup` routing\n- `parked_topic`\n- `watchful_state`\n- `delegated_task`\n- `sensitive_event`\n- `candidate -> incident -> hook` promotion\n- structured `event_chain`\n- structured `causal_memory`\n- `/new` carryover\n- user-selectable `/new` continuity mode\n- assistant commitment support\n- routine/time context as support-only signal\n- quiet hours\n- sleep/rest suppress\n- cooldown\n- closure\n- dedupe\n- dispatch cap\n- daily-memory writeback\n- deterministic onboarding\n- guided settings\n- natural-language settings changes\n- host-neutral modality preference\n- regression harness\n\n## 中文功能總覽\n\n- 一般聊天、暫存記憶、正式追蹤分流\n- `/new` 後接回正確主題\n- 可選新對話承接方式：最近 4 輪、最後使用者意圖、因果跟進焦點、助手承諾、綜合判斷\n- 作息與時間感只當輔助，不搶主線\n- 可用自然語言調整設定\n- 可用指令精準修改設定\n- 關心與追蹤有冷卻、退場、去重、上限與勿擾\n- 暫存/追蹤內容可寫回 daily memory trace\n- 技能層保持平台中立，不把通訊渠道寫死進技能定義\n\n## Contact\n\nIf you are interested in this package, run into a problem, or want to exchange\nideas about OpenClaw continuity, feel free to contact me:\n\n- `adarobot666@gmail.com`\n\nIf you are satisfied with this skill package, please star the GitHub repository\nas encouragement. I will keep pushing improvements, maintenance, and new\nfeatures.\n\n如果你對這個技能包有興趣、使用時遇到問題，或想交流 OpenClaw continuity\n相關想法，歡迎聯繫我：\n\n- `adarobot666@gmail.com`\n\n如果你滿意這個技能包，也歡迎在 GitHub 給一顆星作為鼓勵。我會持續推動\n優化、維護與新功能追加。\n\nFile v2.0.19:_meta.json\n\n{\n  \"ownerId\": \"kn77md9ahr1tc0zvhm9pvda7w9822n9k\",\n  \"slug\": \"openclaw-continuity\",\n  \"version\": \"2.0.19\",\n  \"publishedAt\": 1777331283028\n}\n\nFile v2.0.19:references/modules.md\n\n# V2 module map\n\n## Core\n\n- continuity routing\n- staged memory promotion\n- tracked follow-up\n- carryover\n- closure consistency\n- frontstage safety\n\n## State layer\n\n- `profile.json`\n- `user_model.json`\n- `emotion_state.json`\n- `persona_state.json`\n- `memory_rank.json`\n- `autonomy_state.json`\n- `settings.json`\n\n## Event layer\n\n- `candidate_buffer.json`\n- `incidents.json`\n- `hooks.json`\n- `session_memory_staging.json`\n\n## Trace layer\n\n- `followup_trace.jsonl`\n- `candidate_buffer_audit.jsonl`\n- `session_memory_staging_audit.jsonl`\n- `hook_completion_audit.jsonl`\n- `frontstage_guard_log.jsonl`\n\n## Public V2 tracked event types\n\n- `parked_topic`\n- `watchful_state`\n- `delegated_task`\n- `sensitive_event`\n\n## Optional and host-boundary items\n\n- host delivery concerns\n- provider/network transport concerns\n- optional rhythm or nudge layers\n\nFile v2.0.19:references/templates.md\n\n# Frontstage notes\n\nThis file stays intentionally small. V2 does not own persona design; it protects continuity-facing frontstage behavior and keeps internal reasoning out of user-visible text.\n\n## V2 frontstage rules\n\n- keep frontstage text in natural Traditional Chinese\n- avoid exposing hook, schedule, checker, runtime, or internal-source language to the user\n- avoid unresolved fragments that require the user to guess what `這個` or `that` refers to\n- avoid false closure when no concrete continuity anchor exists\n- apply sleep/rest suppress only to follow-up behavior, not to ordinary user-facing replies\n\n## V2 follow-up tone boundaries\n\n- `emotional_followup`: accompany first, ask lightly\n- `health_followup`: check condition gently, do not sound like generic health advice\n- `progress_followup`: continue a parked task or topic without sounding like a manager reminder\n- `tomorrow_check`: light next-step reminder with human warmth\n\n## Optional note\n\nRhythm or nudge variants belong to optional layers. They are not part of the public V2 default unless a host explicitly enables and supports them.\n\nFile v2.0.19:AUDIT.md\n\n# Audit Guide\n\nThis repository is the public V2 package for `personal-hooks`, an OpenClaw\nskill for structured continuity, tracking, and follow-up.\n\nIt is:\n\n- an OpenClaw skill package\n- a state-backed continuity and follow-up layer\n- host-neutral at the core package boundary\n\nIt is not:\n\n- a one-click full host distribution\n- a generic transport or polling package\n- an always-on idle/social nudging package by default\n\n## One-line status\n\nPublic package identity is V2. Publication should be judged against\n`docs/release-acceptance.md` and the current V2 validation set.\n\nFor current release state, read:\n\n- `docs/v2-status.md`\n- `docs/v2-validation-summary.md`\n- `docs/v2-known-limits.md`\n- `docs/release-acceptance.md`\n\n## What the public V2 package covers\n\n- routing between `casual_chat`, `staged_memory`, and `tracked_followup`\n- four tracked event types:\n  - `parked_topic`\n  - `watchful_state`\n  - `delegated_task`\n  - `sensitive_event`\n- incremental `event_chain` updates\n- structured `causal_memory`\n- `candidate -> incident -> hook` promotion\n- `/new` carryover and continuity reattach\n- active hook / closure lifecycle\n- sleep/rest suppress\n- dedupe / cooldown / dispatch cap\n- frontstage guard and outbound stopgap integration points\n- regression harness and live QA guidance\n\n## What the public V2 package does not claim\n\n- default idle/social rhythm nudging\n- channel/network delivery reliability\n- host-specific transport glue\n- persona ownership\n\n## Experimental or opt-in areas\n\n- `experimental.rhythm_nudge.*`\n- design-only notes under `docs/v2-blueprint.md`\n\n## Recommended review order\n\n1. `README.md`\n2. `SKILL.md`\n3. `config.schema.json`\n4. `docs/call-flow.md`\n5. `docs/harness.md`\n6. `docs/relea\n\nArchive v2.0.18: 50 files, 343273 bytes\n\nFiles: _meta.json (139b), assets/publish/comic-01-setup-wizard.svg (4951b), assets/publish/comic-02-adjust-anytime.svg (3817b), assets/publish/comic-03-natural-language-settings.svg (3950b), assets/publish/comic-04-command-settings.svg (3812b), assets/publish/continuity-architecture.svg (5213b), assets/publish/hero-continuity-en.svg (6567b), assets/publish/hero-continuity-zh.svg (6552b), assets/publish/install-placement-en.svg (1850b), assets/publish/product-story-bilingual.svg (6303b), AUDIT.md (2784b), config.schema.json (8031b), CONTRIBUTING.md (901b), docs/call-flow.md (1142b), docs/channel-boundary-stopgap.md (2298b), docs/harness.md (2139b), docs/host-boundary.md (6693b), docs/host-operator-settings.md (10923b), docs/install.md (8106b), docs/live-qa-runbook.md (1135b), docs/publish-copy.md (10021b), docs/release-acceptance.md (3756b), docs/routine-schedule.md (2205b), docs/upgrade-pre-analysis.md (9567b), docs/v2-architecture.md (9024b), docs/v2-blueprint.md (1088b), docs/v2-known-limits.md (1524b), docs/v2-status.md (2648b), docs/v2-validation-summary.md (2967b), examples/harness-report.sample.json (934b), examples/jobs.sample.json (17b), examples/openclaw.sample.json (461b), examples/profile.sample.json (1102b), examples/settings.sample.json (1987b), package.json (1538b), README.md (12002b), references/modules.md (841b), references/templates.md (1111b), requirements.txt (18b), scripts/event_store.py (46618b), scripts/file_output_sop.py (2254b), scripts/followup_skill_harness.py (66044b), scripts/install_local.sh (1693b), scripts/personal_hooks.py (1079911b), scripts/proactive_control.py (12179b), scripts/semantic_config.py (8636b), SECURITY.md (662b), SHA256SUMS.txt (206b), SKILL.md (15264b), validation/rc-verdict.json (2725b)\n\nArchive v2.0.17: 50 files, 343232 bytes\n\nFiles: _meta.json (139b), assets/publish/comic-01-setup-wizard.svg (4951b), assets/publish/comic-02-adjust-anytime.svg (3817b), assets/publish/comic-03-natural-language-settings.svg (3950b), assets/publish/comic-04-command-settings.svg (3812b), assets/publish/continuity-architecture.svg (5213b), assets/publish/hero-continuity-en.svg (6567b), assets/publish/hero-continuity-zh.svg (6552b), assets/publish/install-placement-en.svg (1850b), assets/publish/product-story-bilingual.svg (6303b), AUDIT.md (2784b), config.schema.json (8031b), CONTRIBUTING.md (901b), docs/call-flow.md (1142b), docs/channel-boundary-stopgap.md (2298b), docs/harness.md (2139b), docs/host-boundary.md (6693b), docs/host-operator-settings.md (10923b), docs/install.md (8106b), docs/live-qa-runbook.md (1135b), docs/publish-copy.md (10021b), docs/release-acceptance.md (3756b), docs/routine-schedule.md (2205b), docs/upgrade-pre-analysis.md (9567b), docs/v2-architecture.md (9024b), docs/v2-blueprint.md (1088b), docs/v2-known-limits.md (1524b), docs/v2-status.md (2648b), docs/v2-validation-summary.md (2967b), examples/harness-report.sample.json (934b), examples/jobs.sample.json (17b), examples/openclaw.sample.json (461b), examples/profile.sample.json (1102b), examples/settings.sample.json (1987b), package.json (1538b), README.md (12002b), references/modules.md (841b), references/templates.md (1111b), requirements.txt (18b), scripts/event_store.py (46618b), scripts/file_output_sop.py (2254b), scripts/followup_skill_harness.py (66044b), scripts/install_local.sh (1693b), scripts/personal_hooks.py (1079911b), scripts/proactive_control.py (12179b), scripts/semantic_config.py (8636b), SECURITY.md (662b), SHA256SUMS.txt (206b), SKILL.md (14803b), validation/rc-verdict.json (2725b)\n\nArchive v2.0.16: 50 files, 343178 bytes\n\nFiles: _meta.json (139b), assets/publish/comic-01-setup-wizard.svg (4951b), assets/publish/comic-02-adjust-anytime.svg (3817b), assets/publish/comic-03-natural-language-settings.svg (3950b), assets/publish/comic-04-command-settings.svg (3812b), assets/publish/continuity-architecture.svg (5213b), assets/publish/hero-continuity-en.svg (6567b), assets/publish/hero-continuity-zh.svg (6552b), assets/publish/install-placement-en.svg (1850b), assets/publish/product-story-bilingual.svg (6303b), AUDIT.md (2784b), config.schema.json (8031b), CONTRIBUTING.md (901b), docs/call-flow.md (1142b), docs/channel-boundary-stopgap.md (2298b), docs/harness.md (2139b), docs/host-boundary.md (6693b), docs/host-operator-settings.md (10923b), docs/install.md (8106b), docs/live-qa-runbook.md (1135b), docs/publish-copy.md (9875b), docs/release-acceptance.md (3756b), docs/routine-schedule.md (2205b), docs/upgrade-pre-analysis.md (9567b), docs/v2-architecture.md (9024b), docs/v2-blueprint.md (1088b), docs/v2-known-limits.md (1524b), docs/v2-status.md (2648b), docs/v2-validation-summary.md (2967b), examples/harness-report.sample.json (934b), examples/jobs.sample.json (17b), examples/openclaw.sample.json (461b), examples/profile.sample.json (1102b), examples/settings.sample.json (1987b), package.json (1538b), README.md (12002b), references/modules.md (841b), references/templates.md (1111b), requirements.txt (18b), scripts/event_store.py (46618b), scripts/file_output_sop.py (2254b), scripts/followup_skill_harness.py (66044b), scripts/install_local.sh (1693b), scripts/personal_hooks.py (1079911b), scripts/proactive_control.py (12179b), scripts/semantic_config.py (8636b), SECURITY.md (662b), SHA256SUMS.txt (206b), SKILL.md (14854b), validation/rc-verdict.json (2725b)\n\nArchive v2.0.15: 46 files, 334708 bytes\n\nFiles: _meta.json (139b), assets/publish/continuity-architecture.svg (5213b), assets/publish/hero-continuity-en.svg (6568b), assets/publish/hero-continuity-zh.svg (6552b), assets/publish/install-placement-en.svg (1850b), AUDIT.md (2819b), config.schema.json (7007b), CONTRIBUTING.md (901b), docs/call-flow.md (1142b), docs/harness.md (2154b), docs/host-boundary.md (6984b), docs/host-frontstage-stopgap.md (2261b), docs/host-operator-settings.md (10992b), docs/host-voice-integration.md (2728b), docs/install.md (8447b), docs/live-qa-runbook.md (1135b), docs/publish-copy.md (14853b), docs/release-acceptance.md (3705b), docs/routine-schedule.md (2213b), docs/upgrade-pre-analysis.md (9562b), docs/v2-architecture.md (9024b), docs/v2-blueprint.md (1088b), docs/v2-known-limits.md (1524b), docs/v2-status.md (2635b), docs/v2-validation-summary.md (2930b), examples/harness-report.sample.json (934b), examples/jobs.sample.json (17b), examples/openclaw.sample.json (439b), examples/profile.sample.json (1102b), examples/settings.sample.json (1787b), package.json (1270b), README.md (22511b), references/modules.md (841b), references/templates.md (1111b), requirements.txt (18b), scripts/event_store.py (46612b), scripts/file_output_sop.py (2296b), scripts/followup_skill_harness.py (64820b), scripts/install_local.sh (1682b), scripts/personal_hooks.py (1061507b), scripts/proactive_control.py (12179b), scripts/semantic_config.py (8636b), SECURITY.md (662b), SHA256SUMS.txt (206b), SKILL.md (14200b), val...","readmeExcerpt":"Skill: OpenClaw Continuity Owner: redwakame Summary: Structured continuity and follow-up skill for OpenClaw agents. Use when an agent needs to decide whether natural user dialogue should stay as casual chat, be... Tags: carryover:2.0.21, continuity:2.0.21, follow-up:2.0.21, latest:2.0.21, memory:2.0.21 Version history: v2.0.21 | 2026-04-27T23:58:39.524Z | user OpenClaw Continuity 2.0.21 - Fixed ClawHub registry metad","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"python3 scripts/personal_hooks.py setup-check"},{"language":"bash","snippet":"python3 scripts/personal_hooks.py setup-apply --payload-json '{\"sleep_time\":\"00:00\",\"wake_time\":\"09:00\"}'"},{"language":"text","snippet":"User: I need to pause this repo release check. Let's continue later.\nAgent: Got it. I will keep the release check as the thread to continue.\n\n/new\n\nAgent: I still have the release check thread. Do you want to pick it up from\nthe last user intent, the follow-up focus, or the recent conversation summary?"},{"language":"text","snippet":"使用者：這個技能上架檢查先放著，晚點再接。\nAgent：好，我先把這段接住，不會當成一般閒聊丟掉。\n\n/new\n\nAgent：前面那段技能上架檢查我還接得住。現在要從最後意圖、追蹤焦點，\n還是最近 4 輪摘要開始？"},{"language":"text","snippet":"TG user: 這個上架檢查先放著，晚點再接。\nAgent: 好，我先幫你接住這條線，不會當成普通閒聊丟掉。\n\nTG user: /new\nAgent: 前面那個上架檢查我還接得住。要從最近 4 輪、最後意圖，還是追蹤焦點接？\n\nTG user: 新對話改成看最後使用者意圖。\nAgent: 已更新。之後新對話會優先從最後使用者意圖承接。"},{"language":"json","snippet":"{\n  \"new_session_continuity\": {\n    \"mode\": \"recent_4_turns_first\"\n  },\n  \"modality_continuity\": {\n    \"enabled\": true,\n    \"mode\": \"preserve_when_supported\",\n    \"voice_reply_on_voice_thread\": true,\n    \"image_context_carryover\": true\n  }\n}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: personal-hooks\ndescription: >-\n  Structured continuity and follow-up skill for OpenClaw agents. Use when an\n  agent needs to decide whether natural user dialogue should stay as casual\n  chat, become staged memory, or become tracked follow-up with carryover,\n  closure, cooldown, sleep/rest suppress, routine-aware wording, quiet-hours\n  behavior, traceability, and release-grade frontstage safety guards. This\n  package is not a generic cron sender. It uses context, causal state, and\n  explicit lifecycle rules to decide whether care or follow-up should appear at\n  all. It covers parked topics, watchful states, delegated tasks, sensitive\n  events, candidate to incident to hook flow, /new carryover, deterministic\n  onboarding/guided settings, and time-aware continuity guards. It does not\n  include always-on idle/social nudging as a default feature.\nversion: 2.0.21\nhomepage: https://github.com/redwakame/openclaw-continuity\nos:\n  - darwin\n  - linux\nrequires:\n  bins:\n    - python3\n  env:\n    - OPENCLAW_STATE_DIR\n    - OPENCLAW_CONFIG_PATH\nmetadata:\n  openclaw:\n    os:\n      - darwin\n      - linux\n    requires:\n      bins:\n        - python3\n      env:\n        - OPENCLAW_STATE_DIR\n        - OPENCLAW_CONFIG_PATH\n    envVars:\n      - name: OPENCLAW_STATE_DIR\n        description: \"Required path to the dedicated OpenClaw state directory used by this skill for continuity state.\"\n        required: true\n      - name: OPENCLAW_CONFIG_PATH\n        description: \"Required path to the OpenClaw config file used for setup validation.\"\n        required: true\n---\n\n# OpenClaw Continuity\n\nUse 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.\n\nPublic product name: `OpenClaw Continuity`.\nTechnical package / slug: `personal-hooks`.\nInternal diagnostics may still use `staged-followup-memory` as a status label for continuity state surfaces.\nQuestions, feedback, or implementation discussion: `adarobot666@gmail.com`.\n如果你期待這個技能持續優化與維護，請在 GitHub 給星支持：https://github.com/redwakame/openclaw-continuity\n\n## V2 public scope\n\n- Route turns into `casual_chat`, `staged_memory`, or `tracked_followup`.\n- Classify tracked content into:\n  - `parked_topic`\n  - `watchful_state`\n  - `delegated_task`\n  - `sensitive_event`\n- Maintain `event_chain` summaries with:\n  - `context_before`\n  - `event_core`\n  - `immediate_result`\n  - `followup_focus`\n- Maintain `causal_memory` as structured continuity state with:\n  - `facts`\n  - `state`\n  - `open_loop`\n  - `time_anchor`\n  - `followup_focus_code`\n  - `writeback_policy`\n- Promote `candidate -> incident -> hook`.\n- Preserve `/new` carryover from the previous 3-5 turns and let the user\n  choose which continuity anchor leads a new conversation.\n- Preserve voice/image discussion style as a host-neutral preference when the\n  OpenClaw host already supports those modalities. This skill records the\n  preference only; it does not bund"},{"path":"README.md","content":"# OpenClaw Continuity\n\nMake OpenClaw remember the right thing, reconnect the right topic after `/new`,\nand follow up naturally without leaking internal state into chat.\n\n`OpenClaw Continuity` is the public product name for the `personal-hooks` skill\npackage. It is a **skill-layer continuity engine** for an existing OpenClaw\nagent: it does not replace the agent's persona, and it does not bundle a\nchat-platform adapter.\n\n![OpenClaw Continuity product story](assets/publish/product-story-bilingual.svg)\n\n## Four Quick Comics\n\nThese four panels show the parts that matter most after someone installs the\nskill: guided setup, later adjustment, natural-language setting changes, and\nprecise command changes.\n\n![Install and setup wizard](assets/publish/comic-01-setup-wizard.svg)\n\n![Adjust settings anytime](assets/publish/comic-02-adjust-anytime.svg)\n\n![Natural-language setting changes](assets/publish/comic-03-natural-language-settings.svg)\n\n![Precise command setting changes](assets/publish/comic-04-command-settings.svg)\n\n## For Everyone\n\nMost agents can answer a message. The harder part is remembering what still\nmatters after an interruption, a delayed reply, or a new conversation.\n\nOpenClaw Continuity helps an agent:\n\n- keep ordinary chat light\n- stage \"let's talk about this later\" without losing it\n- track important follow-up without chasing every casual sentence\n- reconnect the right topic after `/new`\n- understand time with sleep/wake and routine context\n- let the user adjust behavior in natural language\n\n中文簡介：\n\nOpenClaw Continuity 是替 OpenClaw 補上「延續感、時間感、關心與追蹤」的技能包。\n它不是單純排程發訊息，也不是把所有對話都硬塞進記憶。它會分辨哪些只是一般聊天，\n哪些要暫存，哪些真的需要追蹤，並在新開對話時接回使用者選定的承接方式。\n\n## What It Feels Like\n\nExample:\n\n```text\nUser: I need to pause this repo release check. Let's continue later.\nAgent: Got it. I will keep the release check as the thread to continue.\n\n/new\n\nAgent: I still have the release check thread. Do you want to pick it up from\nthe last user intent, the follow-up focus, or the recent conversation summary?\n```\n\n中文例子：\n\n```text\n使用者：這個技能上架檢查先放著，晚點再接。\nAgent：好，我先把這段接住，不會當成一般閒聊丟掉。\n\n/new\n\nAgent：前面那段技能上架檢查我還接得住。現在要從最後意圖、追蹤焦點，\n還是最近 4 輪摘要開始？\n```\n\nThe exact wording still belongs to the host agent's persona. This skill supplies\nthe structured continuity state that makes the answer possible.\n\n## Minimal Telegram/TG Showcase\n\nTelegram/TG can be used as a small live showcase **when your OpenClaw host is\nalready connected to Telegram**. The skill does not bundle a Telegram adapter or\nbot setup; it only supplies the continuity behavior that the host sends through\nits normal reply pipeline.\n\nDemo flow:\n\n```text\nTG user: 這個上架檢查先放著，晚點再接。\nAgent: 好，我先幫你接住這條線，不會當成普通閒聊丟掉。\n\nTG user: /new\nAgent: 前面那個上架檢查我還接得住。要從最近 4 輪、最後意圖，還是追蹤焦點接？\n\nTG user: 新對話改成看最後使用者意圖。\nAgent: 已更新。之後新對話會優先從最後使用者意圖承接。\n```\n\nWhat this demonstrates:\n\n- `/new` carryover\n- staged memory instead of forced tracking\n- natural-language settings update\n- frontstage text stays user-facing, not internal runtime text\n\n## Core Features\n\n- **New convers"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn77md9ahr1tc0zvhm9pvda7w9822n9k\",\n  \"slug\": \"openclaw-continuity\",\n  \"version\": \"2.0.21\",\n  \"publishedAt\": 1777334319524\n}"},{"path":"references/modules.md","content":"# V2 module map\n\n## Core\n\n- continuity routing\n- staged memory promotion\n- tracked follow-up\n- carryover\n- closure consistency\n- frontstage safety\n\n## State layer\n\n- `profile.json`\n- `user_model.json`\n- `emotion_state.json`\n- `persona_state.json`\n- `memory_rank.json`\n- `autonomy_state.json`\n- `settings.json`\n\n## Event layer\n\n- `candidate_buffer.json`\n- `incidents.json`\n- `hooks.json`\n- `session_memory_staging.json`\n\n## Trace layer\n\n- `followup_trace.jsonl`\n- `candidate_buffer_audit.jsonl`\n- `session_memory_staging_audit.jsonl`\n- `hook_completion_audit.jsonl`\n- `frontstage_guard_log.jsonl`\n\n## Public V2 tracked event types\n\n- `parked_topic`\n- `watchful_state`\n- `delegated_task`\n- `sensitive_event`\n\n## Optional and host-boundary items\n\n- host delivery concerns\n- provider/network transport concerns\n- optional rhythm or nudge layers"},{"path":"references/templates.md","content":"# Frontstage notes\n\nThis file stays intentionally small. V2 does not own persona design; it protects continuity-facing frontstage behavior and keeps internal reasoning out of user-visible text.\n\n## V2 frontstage rules\n\n- keep frontstage text in natural Traditional Chinese\n- avoid exposing hook, schedule, checker, runtime, or internal-source language to the user\n- avoid unresolved fragments that require the user to guess what `這個` or `that` refers to\n- avoid false closure when no concrete continuity anchor exists\n- apply sleep/rest suppress only to follow-up behavior, not to ordinary user-facing replies\n\n## V2 follow-up tone boundaries\n\n- `emotional_followup`: accompany first, ask lightly\n- `health_followup`: check condition gently, do not sound like generic health advice\n- `progress_followup`: continue a parked task or topic without sounding like a manager reminder\n- `tomorrow_check`: light next-step reminder with human warmth\n\n## Optional note\n\nRhythm or nudge variants belong to optional layers. They are not part of the public V2 default unless a host explicitly enables and supports them."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Structured continuity and follow-up skill for OpenClaw agents. Use when an agent needs to decide whether natural user dialogue should stay as casual chat, be... Skill: OpenClaw Continuity Owner: redwakame Summary: Structured continuity and follow-up skill for OpenClaw agents. Use when an agent needs to decide whether natural user dialogue should stay as casual chat, be... Tags: carryover:2.0.21, continuity:2.0.21, follow-up:2.0.21, latest:2.0.21, memory:2.0.21 Version history: v2.0.21 | 2026-04-27T23:58:39.524Z | user OpenClaw Continuity 2.0.21 - Fixed ClawHub registry metad","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1652,"uniquenessScore":45,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T23:53:54.056Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T23:53:54.056Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:55:07.758Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}