{"id":"d0612574-b193-4b0f-bf5b-2809d904997b","entityType":"agent","slug":"clawhub-hussein1362-post-update-awareness","name":"Post Update Awareness","canonicalUrl":"https://www.xpersona.co/agent/clawhub-hussein1362-post-update-awareness","canonicalPath":"/agent/clawhub-hussein1362-post-update-awareness","generatedAt":"2026-10-14T14:14:55.556Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:51:23.675Z","emptyReason":null},"description":"After an OpenClaw version change, read the CHANGELOG entry pinned to the installed version and surface user-relevant changes — new tools, breaking changes, o...","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 973 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s170591b6zq2t4fvge4yc0ajes863ccy:post-update-awareness","sourceUrl":"https://clawhub.ai/hussein1362/post-update-awareness","homepage":"https://clawhub.ai/hussein1362/skills/post-update-awareness","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/hussein1362/post-update-awareness","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/hussein1362/skills/post-update-awareness","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Post Update Awareness technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:51:23.675Z","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-11T23:51:23.675Z","emptyReason":null},"stars":null,"forks":null,"downloads":973,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"0.4.0","tractionLabel":"973 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T23:51:23.662Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T23:51:23.675Z","lastCrawledAt":"2026-10-11T23:51:23.662Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T23:51:23.662Z","lastVerifiedAt":null,"highlights":[{"version":"0.4.0","createdAt":"2026-05-26T19:37:56.033Z","changelog":"Strict read-only split. All mutation paths removed (offering to update drifted plugins, cleaning stale config entries). For mutations see the new companion skill post-update-maintenance. Fixes the HIGH severity scope-contradiction flag from the security scanner.","fileCount":8,"zipByteSize":16362},{"version":"0.3.1","createdAt":"2026-05-26T06:39:52.704Z","changelog":"Fix: resolve.sh requires -r (readable) instead of -x on the target script, since clawhub install does not preserve exec bits. Without this fix the resolver returned empty on every fresh install.","fileCount":8,"zipByteSize":15525},{"version":"0.3.0","createdAt":"2026-05-26T06:35:43.681Z","changelog":"Profile-aware state file (multi-profile setups no longer share state). Surface-then-persist ordering with retry cap (channel blips no longer eat the notification). Update-guard awareness — skip redundant header when an external guard already announced the bump. New scripts/resolve.sh for callers outside the skill (safe-update wrappers, cron). find-local-changelog.sh now resolves pnpm/volta/nvm/fnm installs.","fileCount":8,"zipByteSize":15305},{"version":"0.2.0","createdAt":"2026-05-05T13:05:14.375Z","changelog":"Detect plugin version drift between gateway and externalized npm plugins (catches the @openclaw/whatsapp-stayed-on-old-version failure mode). Verify channel health post-restart. Surface openclaw.json rewrites and stale plugin entries. Add attended vs unattended mode guidance. New helper: check-plugin-drift.sh.","fileCount":6,"zipByteSize":10344},{"version":"0.1.0","createdAt":"2026-05-04T19:40:28.192Z","changelog":"Initial release.","fileCount":5,"zipByteSize":7229}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s170591b6zq2t4fvge4yc0ajes863ccy:post-update-awareness","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s170591b6zq2t4fvge4yc0ajes863ccy:post-update-awareness` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/hussein1362/post-update-awareness before using production credentials."],"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-hussein1362-post-update-awareness/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-hussein1362-post-update-awareness/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-hussein1362-post-update-awareness/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-hussein1362-post-update-awareness/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-hussein1362-post-update-awareness/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-hussein1362-post-update-awareness/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-14T14:14:55.555Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-hussein1362-post-update-awareness/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-hussein1362-post-update-awareness/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-hussein1362-post-update-awareness/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-hussein1362-post-update-awareness/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":"medium","updatedAt":"2026-10-11T23:51:23.675Z","emptyReason":null},"readme":"Skill: Post Update Awareness\n\nOwner: hussein1362\n\nSummary: After an OpenClaw version change, read the CHANGELOG entry pinned to the installed version and surface user-relevant changes — new tools, breaking changes, o...\n\nTags: awareness:0.1.0, changelog:0.1.0, latest:0.4.0, openclaw:0.1.0, update:0.1.0\n\nVersion history:\n\nv0.4.0 | 2026-05-26T19:37:56.033Z | user\n\nStrict read-only split. All mutation paths removed (offering to update drifted plugins, cleaning stale config entries). For mutations see the new companion skill post-update-maintenance. Fixes the HIGH severity scope-contradiction flag from the security scanner.\n\nv0.3.1 | 2026-05-26T06:39:52.704Z | user\n\nFix: resolve.sh requires -r (readable) instead of -x on the target script, since clawhub install does not preserve exec bits. Without this fix the resolver returned empty on every fresh install.\n\nv0.3.0 | 2026-05-26T06:35:43.681Z | user\n\nProfile-aware state file (multi-profile setups no longer share state). Surface-then-persist ordering with retry cap (channel blips no longer eat the notification). Update-guard awareness — skip redundant header when an external guard already announced the bump. New scripts/resolve.sh for callers outside the skill (safe-update wrappers, cron). find-local-changelog.sh now resolves pnpm/volta/nvm/fnm installs.\n\nv0.2.0 | 2026-05-05T13:05:14.375Z | user\n\nDetect plugin version drift between gateway and externalized npm plugins (catches the @openclaw/whatsapp-stayed-on-old-version failure mode). Verify channel health post-restart. Surface openclaw.json rewrites and stale plugin entries. Add attended vs unattended mode guidance. New helper: check-plugin-drift.sh.\n\nv0.1.0 | 2026-05-04T19:40:28.192Z | user\n\nInitial release.\n\nArchive index:\n\nArchive v0.4.0: 8 files, 16362 bytes\n\nFiles: _meta.json (140b), README.md (6147b), scripts/check-plugin-drift.sh (2486b), scripts/find-local-changelog.sh (2697b), scripts/probe-optional-dep.sh (1565b), scripts/resolve.sh (2093b), skill-card.md (2785b), SKILL.md (17140b)\n\nFile v0.4.0:SKILL.md\n\n---\nname: post-update-awareness\ndescription: After an OpenClaw version change, read the CHANGELOG entry pinned to the installed version and surface user-relevant changes — new tools, breaking changes, optional native dependencies that may need verification (sharp, ffmpeg, node-pty). Runs once per detected version bump. Use when OpenClaw has just been updated, when openclaw -V differs from the value on file, or when the user asks \"what changed in this update?\"\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"openclaw\",\"curl\",\"node\"]}}}\n---\n\n# Post-Update Awareness\n\nWhen OpenClaw is updated, the agent should not be the last to know. This skill reads the project CHANGELOG **for the exact installed version**, distills what changed for the user, and surfaces it once.\n\n## When to use\n\nRun this skill when **any** of the following is true:\n\n1. The user asks \"what changed in this update?\" or \"what's new in OpenClaw?\"\n2. A first-class update flow finishes (`openclaw update`, `openclaw plugins update`, or a package-manager update).\n3. `openclaw -V` returns a value different from the version recorded in the skill's state file.\n\nDo **not** run on every heartbeat. Run **once per detected version change**, then persist the new version so subsequent heartbeats stay quiet.\n\n## Scope and non-goals\n\nThis skill **only**:\n\n- Reads existing CHANGELOG content pinned to the installed version\n- Reports it to the user\n- Optionally probes for known-flaky optional native deps mentioned in the entry\n\nThis skill **does not**:\n\n- Apply updates (`openclaw update` already handles that)\n- Modify configuration\n- Install missing dependencies without explicit user confirmation\n- Roll back versions\n\n## Workflow\n\n### 1) Read the current installed version\n\n```json\n{ \"tool\": \"exec\", \"command\": \"openclaw -V\" }\n```\n\nParse the version token (e.g. `OpenClaw 2026.5.3-1 (2eae30e)` → `2026.5.3-1`).\n\n### 2) Compare against the last-known version\n\nThe skill maintains a small JSON state file per profile.\n\n**Path resolution** (first match wins):\n\n1. `$OPENCLAW_PROFILE_DIR/state/post-update-awareness.json` — when the runtime exports `OPENCLAW_PROFILE_DIR`\n2. `$HOME/.openclaw-<profile>/state/post-update-awareness.json` — when a profile name is known (e.g. from `openclaw --profile <name>` or the `OPENCLAW_PROFILE` env var)\n3. `$HOME/.openclaw/state/post-update-awareness.json` — single-profile / default fallback\n\nThis matters because the same machine can run multiple profiles (`main`, `noura-moi`, `amber`, …) and each one can independently update on its own cadence. A single shared state file caused the skill to go silent on profile B after surfacing on profile A — the bug the v0.3 path resolver fixes.\n\nContents:\n\n```json\n{\n  \"lastKnownVersion\": \"2026.5.2\",\n  \"lastSurfacedAt\": \"2026-05-04T13:15:00Z\",\n  \"profile\": \"noura-moi\"\n}\n```\n\n- If the file does not exist → write the current version as the baseline and **exit silently**. (No CHANGELOG dump on first run; only on actual transitions.)\n- If `currentVersion === lastKnownVersion` → exit silently.\n- If `currentVersion !== lastKnownVersion` → continue.\n\n### 2a) Yield to the update-guard if it already handled this transition\n\nMany OpenClaw setups also run an **update-guard** loop (heartbeat-driven config-backup + crash-loop watchdog — see e.g. `scripts/openclaw-update-guard.sh`). When the guard detects a version change it logs a `GUARD_OK`/`GUARD_RECOVERED`/`GUARD_ROLLBACK` event to `${HOME}/.openclaw-<profile>/update-guard/update-guard.log`.\n\nBefore surfacing, check whether the guard has *already announced* this exact transition in the last 10 minutes:\n\n```bash\ngrep -E \"VERSION CHANGE detected:.*v<currentVersion>\" \\\n  \"$HOME/.openclaw-<profile>/update-guard/update-guard.log\" 2>/dev/null | tail -1\n```\n\nIf a guard line for the current version is found within the recent window, the user has already been told the version changed. The skill should still surface the **CHANGELOG distillation** (that's what the guard doesn't do), but prefix it with `(already noted by update-guard)` and skip the redundant \"OpenClaw updated to X (was Y)\" header — go straight into the buckets. This avoids the double-notification failure mode.\n\n### 3) Fetch the CHANGELOG entry pinned to the installed version\n\n**Always pin to the installed version**, never read `main`. The release tag for OpenClaw matches the version with a `v` prefix.\n\nTry in order:\n\n1. **Local install copy** (fastest, offline-friendly): typical paths are platform-dependent. Try the directory of the npm install root first:\n   ```bash\n   {baseDir}/scripts/find-local-changelog.sh\n   ```\n   This script searches common install locations and prints the path if found.\n\n2. **Remote, pinned to tag**:\n   ```bash\n   curl -fsSL \"https://raw.githubusercontent.com/openclaw/openclaw/v<currentVersion>/CHANGELOG.md\"\n   ```\n   The `v` prefix is required. If the remote 404s (e.g. a brand-new release tag hasn't propagated yet), retry once after 30 seconds before giving up.\n\n3. **Fallback** (only if both above fail): query the GitHub Releases API for that exact tag:\n   ```bash\n   curl -fsSL \"https://api.github.com/repos/openclaw/openclaw/releases/tags/v<currentVersion>\"\n   ```\n   Use the `body` field as the changelog content.\n\nIf all three fail, surface a single line: *\"OpenClaw was updated to vX, but I couldn't fetch the changelog to summarize what changed.\"* Do **not** invent content.\n\n### 4) Extract the section for the new version\n\nThe CHANGELOG uses `## <version>` as section headings. Extract only the section between `## <currentVersion>` and the next `## ` heading. Do not dump the whole file.\n\nIf the section heading isn't found in the pinned changelog (rare — usually means the release tag exists but the changelog hasn't been updated for it), use the `Unreleased` section as a fallback only when the pinned-tag fetch came from `main`. When pinned to an actual release tag, prefer \"no detailed notes available\" over guessing.\n\n### 5) Distill into 3 buckets\n\nGroup items into:\n\n- **🆕 New for you** — new tools, commands, channels, capabilities the agent could benefit from. Filter ruthlessly to what an end-user agent actually touches; skip internal refactor lines, build-system changes, and CI plumbing.\n- **⚠️ Breaking or removed** — anything that changes current behavior: removed config keys, renamed CLI commands, deprecated features, security tightenings.\n- **🔧 May need attention** — optional native dependencies (`sharp`, `ffmpeg`, `node-pty`, `libvips`, etc.), peer-dep notes, post-install scripts, config-format migrations.\n\nEach bucket: 1–4 bullets max. Omit empty buckets entirely.\n\n### 6) Probe known-flaky optional deps (best effort)\n\nIf the \"May need attention\" bucket mentions a known native module, probe non-blockingly:\n\n```bash\n{baseDir}/scripts/probe-optional-dep.sh sharp\n```\n\nThe script returns `OK`, `MISSING`, or `ERROR <msg>`. Annotate findings inline in the surfaced summary as `❌ sharp (image processing) — not installed`. Do **not** auto-install.\n\nDefault known list (extend as the project evolves):\n\n- `sharp` — image attachment optimization\n- `ffmpeg-static` / system `ffmpeg` — audio/video transcoding\n- `node-pty` — terminal/PTY tools\n\n### 6a) Detect plugin version drift\n\nWhen the gateway updates, **externalized npm-installed plugins do not update automatically**. The result is a gateway on `vNew` running a plugin still on `vOld`. This was the original motivating case for surfacing this skill — see the \"plugin drift\" failure mode in the OpenClaw 2026.5.3→2026.5.4 transition where `@openclaw/whatsapp` was left behind.\n\nRun:\n\n```bash\n{baseDir}/scripts/check-plugin-drift.sh <currentVersion>\n```\n\nThe script lists installed plugins, parses the version column, and prints any plugin whose version does not match the gateway. Output format (one per line):\n\n```\nDRIFT <plugin-id> <plugin-version> (gateway <currentVersion>)\n```\n\nIf the script reports any drift, add a bullet to **🔧 May need attention** in the form:\n\n> `🔁 <plugin-id> still on <plugin-version> — run \\`openclaw plugins update <plugin-id>\\` then restart the gateway, or run the \\`post-update-maintenance\\` skill which handles drift + restart + channel verification end-to-end.`\n\nDo **not** auto-update from inside this skill. This skill is read-only. The user should either run the command themselves or hand off to the maintenance skill, which is explicitly scoped for mutations.\n\n### 6b) Verify channel health post-update\n\nUpdates frequently touch channel transports (Discord, WhatsApp, Telegram, Slack). After the gateway restart that follows an update, run:\n\n```bash\nopenclaw --profile <profile> channels status\n```\n\nFlag any channel reporting `not configured`, `disconnected`, `unhealthy`, `degraded`, or `error` as a **⚠️ Breaking or removed** bullet. A connected channel that is `health:healthy` should not be surfaced.\n\nThis is especially important for any channel the user has flagged as actively in use (groups with active participants, customer-facing inboxes, etc.). When a profile name encodes a deployment scope (e.g. `noura-moi`), channels on that profile deserve a verbatim status mention even when healthy:\n\n> `WhatsApp <profile>: linked, connected, healthy.`\n\nThis confirmation line is the only case where a healthy channel is surfaced — and only on profiles where the user has explicit production stake.\n\n### 6c) Surface config rewrites and stale-entry warnings\n\nWhen `plugins update` or `gateway` migrations rewrite `openclaw.json`, the CLI prints lines like:\n\n```\nConfig overwrite: <path> (sha256 <old> -> <new>, backup=<path>.bak)\nConfig warnings:\n- plugins.entries.<id>: plugin disabled (...) but config is present\n```\n\nWhen the skill observes either signal in command output it just executed (e.g. when the user ran `openclaw plugins update` in the same window), surface:\n\n- The config rewrite as an info line: `Config rewritten — backup at <path>.bak.`\n- Each stale-entry warning as a 🔧 bullet: `Stale config entry: \\`plugins.entries.<id>\\` (disabled but configured) — safe to remove from openclaw.json.`\n\nDo **not** edit the config from inside this skill. If the user wants the stale entries cleaned automatically, hand off to `post-update-maintenance`.\n\n### 7) Surface to the user\n\nSend **one** brief message via the active channel.\n\n```\nOpenClaw updated to <newVersion> (was <oldVersion>).\n\n🆕 New for you:\n- <bullet>\n\n⚠️ Breaking or removed:\n- <bullet>\n\n🔧 May need attention:\n- 🔁 @openclaw/whatsapp still on 2026.5.3 — run: openclaw plugins update @openclaw/whatsapp\n- ❌ sharp (image processing) — not installed; run: <install command>\n- Stale config entry: `plugins.entries.device-pair` (disabled but configured)\n\nWhatsApp noura-moi: linked, connected, healthy.\n\nFull notes: https://github.com/openclaw/openclaw/blob/v<newVersion>/CHANGELOG.md\n```\n\n**Hard cap: ~18 lines.** Drop empty sections. The healthy-channel confirmation line is allowed only when (a) the profile name encodes a production deployment scope and (b) at least one channel on that profile is reporting healthy after the update.\n\nIf everything is quiet:\n\n```\nOpenClaw updated to <newVersion>. Nothing in the changelog requires action on my end.\n```\n\n### 8) Persist new state — **only after successful surfacing**\n\nOrdering matters. Write state **after** the surface message has been dispatched, not before.\n\nWhy: if the agent crashes mid-skill, or the channel send fails (network blip, rate limit, channel disconnected during a plugin-drift update), writing state first would silently swallow the notification — the next heartbeat sees `currentVersion === lastKnownVersion` and exits quiet. The user never learns what changed.\n\nCorrect order:\n\n1. Build the surface message.\n2. Dispatch it through the active channel.\n3. **Confirm dispatch succeeded** (no thrown error, channel acknowledged).\n4. *Then* write `{ lastKnownVersion, lastSurfacedAt, profile }` atomically (write to `<file>.tmp`, then rename).\n\nIf step 3 fails, leave state untouched. The next heartbeat will retry. Cap retries at 5 per version transition (track in the state file as `surfaceAttempts: N`) to avoid an infinite loop if the changelog distillation itself is what's failing — once the cap is hit, write state with a `surfaceError` field and stop retrying.\n\n## Script resolution (for callers outside the skill)\n\nThis skill's helper scripts (`check-plugin-drift.sh`, `find-local-changelog.sh`, `probe-optional-dep.sh`) are useful **outside** the skill too — most notably from a safe-update wrapper that runs the same drift check before deciding whether to sync plugins.\n\nThe problem: ClawHub installs the skill into different paths depending on profile + invocation. A wrapper script hardcoding one path will drift as soon as the user switches profile or moves the install.\n\n**Stable resolver** (use this from any external caller):\n\n```bash\n# Locate this skill's script directory across known install layouts.\n# Echoes the absolute path on stdout, exits 0 on success.\nresolve_pua_scripts() {\n  for candidate in \\\n    \"${OPENCLAW_PROFILE_DIR:-/dev/null}/skills/post-update-awareness/scripts\" \\\n    \"$HOME/.openclaw-${OPENCLAW_PROFILE:-noura}/skills/post-update-awareness/scripts\" \\\n    \"$HOME/.openclaw/skills/post-update-awareness/scripts\" \\\n    \"$HOME/openclaw-soul/skills/post-update-awareness/scripts\" \\\n    \"$HOME/clawhub-skills/post-update-awareness/scripts\" ; do\n    if [ -d \"$candidate\" ] && [ -x \"$candidate/check-plugin-drift.sh\" ]; then\n      echo \"$candidate\"\n      return 0\n    fi\n  done\n  return 1\n}\n```\n\nThe resolver lives at `scripts/resolve.sh` in this skill — callers can `source` it directly:\n\n```bash\nsource \"$HOME/.openclaw-${PROFILE}/skills/post-update-awareness/scripts/resolve.sh\"\nPUA_SCRIPTS=$(resolve_pua_scripts) || PUA_SCRIPTS=\"\"\n```\n\nIf the wrapper can't find the skill at all, it should fall back to an inline copy of the drift check (the safe-update reference implementation already does this). Always prefer the skill copy when present — it gets updates via `clawhub update` while the wrapper's inline fallback stays frozen.\n\n## Mode: attended vs unattended\n\nThe skill runs in two distinct contexts:\n\n- **Unattended** (heartbeat-fired, no human watching): produce the strict 3-bucket summary, persist state, exit. Hard cap on length still applies.\n- **Attended** (the user just ran `openclaw update` and is watching): the same content is fine, and the skill may also answer follow-up questions about what changed. State is still persisted so the next heartbeat stays quiet about the same version transition.\n\nDetect attended mode by whether the skill is being invoked inside an active user-driven session (the agent is replying to a fresh user message about updating). When in doubt, default to unattended.\n\n### Hard line: read-only\n\nThis skill **does not mutate state**, in any mode. It does not update plugins, edit `openclaw.json`, install dependencies, or restart anything. When drifted plugins or stale config entries are detected, the skill *describes* what needs doing — the user (or a separate maintenance skill) runs the actual commands.\n\nIf the user asks the agent to fix the issues the skill surfaced, hand off to **[`post-update-maintenance`](https://clawhub.ai/skills/post-update-maintenance)** — a separate skill explicitly scoped for the mutation path. Do not perform mutations inline from inside this skill, even with user confirmation. The split exists so trust posture is clear: this skill is safe to install and run unattended on any heartbeat; the maintenance skill is invoked deliberately and is allowed to change things.\n\n## Voice\n\nThis is an operational notice, not a marketing email. Terse, factual, no celebratory language.\n\n- ✅ \"OpenClaw updated to 2026.5.3-1. New: agent can now use the `talk` realtime voice tool. Watch: optional `sharp` is not installed; some image replies will fall back to original-size send.\"\n- ❌ \"🎉 Exciting news! OpenClaw has been upgraded with brand-new features...\"\n\n## Failure modes\n\n| Situation | Behavior |\n|---|---|\n| CHANGELOG section missing for the version | One-line \"OpenClaw updated to vX. No detailed notes for this tag yet — see GitHub Releases for raw notes.\" |\n| No internet, no local copy | Same as above. |\n| State file write fails | Log error; surface still happens; next run will re-surface. |\n| Probe script not executable / shell unavailable | Skip the probe section; report changes without dep status. |\n\n## Why this exists\n\nOpenClaw releases are well-documented in `CHANGELOG.md` and per-version GitHub Releases, but the running agent has no built-in mechanism to *consume* that information after an update. Real-world consequence: when an update introduces a new optional native-dep requirement (e.g. `sharp` for image attachment optimization), the user discovers it only when an unrelated workflow fails.\n\nThis skill closes that loop using the existing CHANGELOG as source of truth, pinned to the installed version so the agent reads the changelog that matches what's actually running — not whatever has been merged since.\n\nFile v0.4.0:README.md\n\n# post-update-awareness\n\nA ClawHub skill that makes your OpenClaw agent **read its own release notes** after an update.\n\n## What it does\n\nWhen OpenClaw is updated, the agent has no built-in mechanism to consume the release notes — so optional-dependency surprises (e.g. a new release expects `sharp` to be installed) are discovered the hard way: when an unrelated workflow fails, in front of someone you care about.\n\nThis skill closes that loop:\n\n1. Detects a version change between current `openclaw -V` and a small per-profile JSON state file the skill maintains.\n2. Fetches the CHANGELOG entry **pinned to the installed version's tag** (`v<version>`), not `main`. So the agent reads the changelog that matches what's actually running.\n3. Distills the entry into three buckets the user actually cares about — new tools, breaking changes, optional native deps to verify.\n4. Probes known-flaky native modules (`sharp`, `ffmpeg-static`, `node-pty`) to flag missing ones.\n5. **Detects plugin version drift** — catches the case where the gateway is on `vNew` but an externalized npm-installed plugin (`@openclaw/whatsapp`, `@openclaw/discord`, etc.) is still on `vOld`.\n6. **Verifies channel health** post-restart (`channels status`) and surfaces any `disconnected` / `unhealthy` / `degraded` channel.\n7. **Surfaces config rewrites** when `plugins update` overwrites `openclaw.json`, including the path to the auto-saved `.bak`.\n8. **Yields to the update-guard** when one is already watching the same transition, so the user isn't notified twice for the same bump.\n9. Sends one brief surfaced message via the active channel, then — **only on confirmed delivery** — persists the new version so subsequent heartbeats stay quiet.\n\n## What's new in 0.4.0\n\n- **Strict read-only posture.** All mutation paths (offering to update drifted plugins, cleaning stale config entries) have been removed. This skill now only reads and notifies. For the mutation flow, see the companion skill **[post-update-maintenance](https://clawhub.ai/skills/post-update-maintenance)**, which is explicitly scoped for changes.\n- This split was made in response to security scanner feedback flagging the previous combined behavior as scope-contradictory. Trust posture is now clear: this skill is safe to install and run on any heartbeat.\n\n## What's new in 0.3.x\n\n- **Profile-aware state file.** Multi-profile setups (`main` + `noura-moi` + …) no longer share a single state file, which was silencing the skill on profile B after surfacing on profile A.\n- **Surface-then-persist ordering.** State is now written only after the channel acknowledges the message, with a retry cap. Channel blips no longer eat the notification.\n- **Update-guard awareness.** When an external update-guard already announced the version change, the skill skips the redundant header and goes straight into the CHANGELOG distillation.\n- **`scripts/resolve.sh`.** Stable resolver for callers outside the skill (safe-update wrappers, cron jobs) so they stop hardcoding install paths.\n- **Broader changelog discovery.** `find-local-changelog.sh` now resolves pnpm, volta, nvm, and fnm global installs in addition to npm.\n\n## Install\n\n```bash\nopenclaw skills install post-update-awareness\n```\n\nOr via the ClawHub CLI:\n\n```bash\nclawhub install post-update-awareness\n```\n\n## When the skill triggers\n\n- The user asks \"what changed in this update?\" or similar\n- An update flow finishes (`openclaw update`, `openclaw plugins update`)\n- `openclaw -V` returns a value different from the version on file\n\nIt does **not** run on every heartbeat — only on actual version transitions.\n\n## What it does not do\n\n- Apply updates (that's `openclaw update`)\n- Update drifted plugins (that's `post-update-maintenance`)\n- Modify configuration (that's `post-update-maintenance`)\n- Install missing dependencies — only flags them\n- Roll back versions (that's your update-guard)\n- Restart the gateway\n\nThis skill is **strictly read-only**. If you want the issues it surfaces to be acted on automatically, install **[post-update-maintenance](https://clawhub.ai/skills/post-update-maintenance)** — a separate skill that takes the diagnostics from this one and runs the corresponding mutations with explicit user confirmation.\n\n## Files\n\n- `SKILL.md` — the skill instructions the agent reads\n- `scripts/find-local-changelog.sh` — locates the bundled CHANGELOG.md if available (npm / pnpm / volta / nvm / fnm)\n- `scripts/probe-optional-dep.sh` — non-blocking native-dep loadability check\n- `scripts/check-plugin-drift.sh` — lists externalized plugins whose installed version doesn't match the gateway\n- `scripts/resolve.sh` — stable resolver for callers outside the skill (safe-update wrappers, cron, CI)\n\n## Feedback / issues\n\nFound a bug? An install layout the resolver misses? A CHANGELOG section the\ndistillation flattened poorly? Open an issue on the source repo and tag it\n`post-update-awareness`. There's no in-band telemetry — the only signal the\nauthor gets is what users say out loud.\n\nIf you're building on top of this skill (custom wrapper, alternative\nnotification surface, profile-specific filters), the resolver in\n`scripts/resolve.sh` is the supported integration point. Patterns and edge\ncases welcome.\n\n## Why a skill rather than core\n\nOpenClaw's project direction (per `VISION.md`) is that new skills publish through ClawHub first; bundled promotion happens later if a clear product, security, or maintainer-ownership reason emerges. This is that ClawHub-first version of the idea.\n\n## Privacy\n\nThe skill reads:\n- `openclaw -V` (local CLI output)\n- The pinned CHANGELOG via `raw.githubusercontent.com` (one HTTPS request per detected version change, no auth, no telemetry)\n\nNothing is sent anywhere else. The local state file lives under one of:\n\n- `$OPENCLAW_PROFILE_DIR/state/` when the runtime exports it\n- `~/.openclaw-<profile>/state/` for multi-profile installs\n- `~/.openclaw/state/` for the default single-profile case\n\nand contains only the version string, a timestamp, and the profile name.\n\n## License\n\nMIT-0 — free to use, modify, redistribute. No attribution required.\n\nFile v0.4.0:_meta.json\n\n{\n  \"ownerId\": \"kn7bz8fq6vk4bqtfd8q20gjtgn83cc3w\",\n  \"slug\": \"post-update-awareness\",\n  \"version\": \"0.4.0\",\n  \"publishedAt\": 1779824276033\n}\n\nFile v0.4.0:skill-card.md\n\n## Description:\n\nAfter an OpenClaw version change, this skill reads the CHANGELOG entry pinned to the installed version and surfaces user-relevant changes, breaking changes, and optional native dependencies that may need verification.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[hussein1362](https://clawhub.ai/user/hussein1362)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nOpenClaw users and operators use this skill after an update to detect version changes, summarize pinned release notes, and flag plugin drift, channel health, optional dependency, or config warnings without performing maintenance actions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill reads local OpenClaw version, plugin, channel, update-guard, and per-profile state information.\n\nMitigation: Install it only where those local operational signals are appropriate to inspect, and keep surfaced output limited to update-relevant diagnostics.\n\nRisk: The skill may make unauthenticated GitHub requests for pinned release notes when no local changelog is available.\n\nMitigation: Prefer the local changelog when present and request only the exact installed version tag; offline environments should expect the no-notes fallback.\n\nRisk: The skill may identify plugin drift, stale config entries, missing optional dependencies, or unhealthy channels but is not scoped to fix them.\n\nMitigation: Leave updates, config edits, dependency installs, and restarts to the user or the separate post-update-maintenance skill.\n\nRisk: Writing notification state too early could suppress future update notices.\n\nMitigation: Persist the per-profile state file only after the update notice has been successfully surfaced and acknowledged.\n\n## Reference(s):\n\n- [Post Update Awareness on ClawHub](https://clawhub.ai/hussein1362/skills/post-update-awareness)\n- [OpenClaw versioned CHANGELOG](https://github.com/openclaw/openclaw/blob/v<newVersion>/CHANGELOG.md)\n- [Post Update Maintenance companion skill](https://clawhub.ai/skills/post-update-maintenance)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration guidance]\n\n**Output Format:** [Concise Markdown notice with short bullet buckets and inline shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Caps the surfaced notice at about 18 lines and writes per-profile state only after successful surfacing.]\n\n## Skill Version(s):\n\n0.4.0 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v0.3.1: 8 files, 15525 bytes\n\nFiles: _meta.json (140b), README.md (5099b), scripts/check-plugin-drift.sh (2486b), scripts/find-local-changelog.sh (2697b), scripts/probe-optional-dep.sh (1565b), scripts/resolve.sh (2093b), skill-card.md (2544b), SKILL.md (16159b)\n\nFile v0.3.1:SKILL.md\n\n---\nname: post-update-awareness\ndescription: After an OpenClaw version change, read the CHANGELOG entry pinned to the installed version and surface user-relevant changes — new tools, breaking changes, optional native dependencies that may need verification (sharp, ffmpeg, node-pty). Runs once per detected version bump. Use when OpenClaw has just been updated, when openclaw -V differs from the value on file, or when the user asks \"what changed in this update?\"\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"openclaw\",\"curl\",\"node\"]}}}\n---\n\n# Post-Update Awareness\n\nWhen OpenClaw is updated, the agent should not be the last to know. This skill reads the project CHANGELOG **for the exact installed version**, distills what changed for the user, and surfaces it once.\n\n## When to use\n\nRun this skill when **any** of the following is true:\n\n1. The user asks \"what changed in this update?\" or \"what's new in OpenClaw?\"\n2. A first-class update flow finishes (`openclaw update`, `openclaw plugins update`, or a package-manager update).\n3. `openclaw -V` returns a value different from the version recorded in the skill's state file.\n\nDo **not** run on every heartbeat. Run **once per detected version change**, then persist the new version so subsequent heartbeats stay quiet.\n\n## Scope and non-goals\n\nThis skill **only**:\n\n- Reads existing CHANGELOG content pinned to the installed version\n- Reports it to the user\n- Optionally probes for known-flaky optional native deps mentioned in the entry\n\nThis skill **does not**:\n\n- Apply updates (`openclaw update` already handles that)\n- Modify configuration\n- Install missing dependencies without explicit user confirmation\n- Roll back versions\n\n## Workflow\n\n### 1) Read the current installed version\n\n```json\n{ \"tool\": \"exec\", \"command\": \"openclaw -V\" }\n```\n\nParse the version token (e.g. `OpenClaw 2026.5.3-1 (2eae30e)` → `2026.5.3-1`).\n\n### 2) Compare against the last-known version\n\nThe skill maintains a small JSON state file per profile.\n\n**Path resolution** (first match wins):\n\n1. `$OPENCLAW_PROFILE_DIR/state/post-update-awareness.json` — when the runtime exports `OPENCLAW_PROFILE_DIR`\n2. `$HOME/.openclaw-<profile>/state/post-update-awareness.json` — when a profile name is known (e.g. from `openclaw --profile <name>` or the `OPENCLAW_PROFILE` env var)\n3. `$HOME/.openclaw/state/post-update-awareness.json` — single-profile / default fallback\n\nThis matters because the same machine can run multiple profiles (`main`, `noura-moi`, `amber`, …) and each one can independently update on its own cadence. A single shared state file caused the skill to go silent on profile B after surfacing on profile A — the bug the v0.3 path resolver fixes.\n\nContents:\n\n```json\n{\n  \"lastKnownVersion\": \"2026.5.2\",\n  \"lastSurfacedAt\": \"2026-05-04T13:15:00Z\",\n  \"profile\": \"noura-moi\"\n}\n```\n\n- If the file does not exist → write the current version as the baseline and **exit silently**. (No CHANGELOG dump on first run; only on actual transitions.)\n- If `currentVersion === lastKnownVersion` → exit silently.\n- If `currentVersion !== lastKnownVersion` → continue.\n\n### 2a) Yield to the update-guard if it already handled this transition\n\nMany OpenClaw setups also run an **update-guard** loop (heartbeat-driven config-backup + crash-loop watchdog — see e.g. `scripts/openclaw-update-guard.sh`). When the guard detects a version change it logs a `GUARD_OK`/`GUARD_RECOVERED`/`GUARD_ROLLBACK` event to `${HOME}/.openclaw-<profile>/update-guard/update-guard.log`.\n\nBefore surfacing, check whether the guard has *already announced* this exact transition in the last 10 minutes:\n\n```bash\ngrep -E \"VERSION CHANGE detected:.*v<currentVersion>\" \\\n  \"$HOME/.openclaw-<profile>/update-guard/update-guard.log\" 2>/dev/null | tail -1\n```\n\nIf a guard line for the current version is found within the recent window, the user has already been told the version changed. The skill should still surface the **CHANGELOG distillation** (that's what the guard doesn't do), but prefix it with `(already noted by update-guard)` and skip the redundant \"OpenClaw updated to X (was Y)\" header — go straight into the buckets. This avoids the double-notification failure mode.\n\n### 3) Fetch the CHANGELOG entry pinned to the installed version\n\n**Always pin to the installed version**, never read `main`. The release tag for OpenClaw matches the version with a `v` prefix.\n\nTry in order:\n\n1. **Local install copy** (fastest, offline-friendly): typical paths are platform-dependent. Try the directory of the npm install root first:\n   ```bash\n   {baseDir}/scripts/find-local-changelog.sh\n   ```\n   This script searches common install locations and prints the path if found.\n\n2. **Remote, pinned to tag**:\n   ```bash\n   curl -fsSL \"https://raw.githubusercontent.com/openclaw/openclaw/v<currentVersion>/CHANGELOG.md\"\n   ```\n   The `v` prefix is required. If the remote 404s (e.g. a brand-new release tag hasn't propagated yet), retry once after 30 seconds before giving up.\n\n3. **Fallback** (only if both above fail): query the GitHub Releases API for that exact tag:\n   ```bash\n   curl -fsSL \"https://api.github.com/repos/openclaw/openclaw/releases/tags/v<currentVersion>\"\n   ```\n   Use the `body` field as the changelog content.\n\nIf all three fail, surface a single line: *\"OpenClaw was updated to vX, but I couldn't fetch the changelog to summarize what changed.\"* Do **not** invent content.\n\n### 4) Extract the section for the new version\n\nThe CHANGELOG uses `## <version>` as section headings. Extract only the section between `## <currentVersion>` and the next `## ` heading. Do not dump the whole file.\n\nIf the section heading isn't found in the pinned changelog (rare — usually means the release tag exists but the changelog hasn't been updated for it), use the `Unreleased` section as a fallback only when the pinned-tag fetch came from `main`. When pinned to an actual release tag, prefer \"no detailed notes available\" over guessing.\n\n### 5) Distill into 3 buckets\n\nGroup items into:\n\n- **🆕 New for you** — new tools, commands, channels, capabilities the agent could benefit from. Filter ruthlessly to what an end-user agent actually touches; skip internal refactor lines, build-system changes, and CI plumbing.\n- **⚠️ Breaking or removed** — anything that changes current behavior: removed config keys, renamed CLI commands, deprecated features, security tightenings.\n- **🔧 May need attention** — optional native dependencies (`sharp`, `ffmpeg`, `node-pty`, `libvips`, etc.), peer-dep notes, post-install scripts, config-format migrations.\n\nEach bucket: 1–4 bullets max. Omit empty buckets entirely.\n\n### 6) Probe known-flaky optional deps (best effort)\n\nIf the \"May need attention\" bucket mentions a known native module, probe non-blockingly:\n\n```bash\n{baseDir}/scripts/probe-optional-dep.sh sharp\n```\n\nThe script returns `OK`, `MISSING`, or `ERROR <msg>`. Annotate findings inline in the surfaced summary as `❌ sharp (image processing) — not installed`. Do **not** auto-install.\n\nDefault known list (extend as the project evolves):\n\n- `sharp` — image attachment optimization\n- `ffmpeg-static` / system `ffmpeg` — audio/video transcoding\n- `node-pty` — terminal/PTY tools\n\n### 6a) Detect plugin version drift\n\nWhen the gateway updates, **externalized npm-installed plugins do not update automatically**. The result is a gateway on `vNew` running a plugin still on `vOld`. This was the original motivating case for surfacing this skill — see the \"plugin drift\" failure mode in the OpenClaw 2026.5.3→2026.5.4 transition where `@openclaw/whatsapp` was left behind.\n\nRun:\n\n```bash\n{baseDir}/scripts/check-plugin-drift.sh <currentVersion>\n```\n\nThe script lists installed plugins, parses the version column, and prints any plugin whose version does not match the gateway. Output format (one per line):\n\n```\nDRIFT <plugin-id> <plugin-version> (gateway <currentVersion>)\n```\n\nIf the script reports any drift, add a bullet to **🔧 May need attention** in the form:\n\n> `🔁 <plugin-id> still on <plugin-version> — run \\`openclaw plugins update <plugin-id>\\` then restart the gateway.`\n\nDo **not** auto-update. The user should be the one to trigger it because plugin updates can rewrite `openclaw.json` (see step 6c).\n\n### 6b) Verify channel health post-update\n\nUpdates frequently touch channel transports (Discord, WhatsApp, Telegram, Slack). After the gateway restart that follows an update, run:\n\n```bash\nopenclaw --profile <profile> channels status\n```\n\nFlag any channel reporting `not configured`, `disconnected`, `unhealthy`, `degraded`, or `error` as a **⚠️ Breaking or removed** bullet. A connected channel that is `health:healthy` should not be surfaced.\n\nThis is especially important for any channel the user has flagged as actively in use (groups with active participants, customer-facing inboxes, etc.). When a profile name encodes a deployment scope (e.g. `noura-moi`), channels on that profile deserve a verbatim status mention even when healthy:\n\n> `WhatsApp <profile>: linked, connected, healthy.`\n\nThis confirmation line is the only case where a healthy channel is surfaced — and only on profiles where the user has explicit production stake.\n\n### 6c) Surface config rewrites and stale-entry warnings\n\nWhen `plugins update` or `gateway` migrations rewrite `openclaw.json`, the CLI prints lines like:\n\n```\nConfig overwrite: <path> (sha256 <old> -> <new>, backup=<path>.bak)\nConfig warnings:\n- plugins.entries.<id>: plugin disabled (...) but config is present\n```\n\nWhen the skill observes either signal in command output it just executed (e.g. when the user ran `openclaw plugins update` in the same window), surface:\n\n- The config rewrite as an info line: `Config rewritten — backup at <path>.bak.`\n- Each stale-entry warning as a 🔧 bullet: `Stale config entry: \\`plugins.entries.<id>\\` (disabled but configured) — safe to remove from openclaw.json.`\n\nDo **not** edit the config. Just point at it.\n\n### 7) Surface to the user\n\nSend **one** brief message via the active channel.\n\n```\nOpenClaw updated to <newVersion> (was <oldVersion>).\n\n🆕 New for you:\n- <bullet>\n\n⚠️ Breaking or removed:\n- <bullet>\n\n🔧 May need attention:\n- 🔁 @openclaw/whatsapp still on 2026.5.3 — run: openclaw plugins update @openclaw/whatsapp\n- ❌ sharp (image processing) — not installed; run: <install command>\n- Stale config entry: `plugins.entries.device-pair` (disabled but configured)\n\nWhatsApp noura-moi: linked, connected, healthy.\n\nFull notes: https://github.com/openclaw/openclaw/blob/v<newVersion>/CHANGELOG.md\n```\n\n**Hard cap: ~18 lines.** Drop empty sections. The healthy-channel confirmation line is allowed only when (a) the profile name encodes a production deployment scope and (b) at least one channel on that profile is reporting healthy after the update.\n\nIf everything is quiet:\n\n```\nOpenClaw updated to <newVersion>. Nothing in the changelog requires action on my end.\n```\n\n### 8) Persist new state — **only after successful surfacing**\n\nOrdering matters. Write state **after** the surface message has been dispatched, not before.\n\nWhy: if the agent crashes mid-skill, or the channel send fails (network blip, rate limit, channel disconnected during a plugin-drift update), writing state first would silently swallow the notification — the next heartbeat sees `currentVersion === lastKnownVersion` and exits quiet. The user never learns what changed.\n\nCorrect order:\n\n1. Build the surface message.\n2. Dispatch it through the active channel.\n3. **Confirm dispatch succeeded** (no thrown error, channel acknowledged).\n4. *Then* write `{ lastKnownVersion, lastSurfacedAt, profile }` atomically (write to `<file>.tmp`, then rename).\n\nIf step 3 fails, leave state untouched. The next heartbeat will retry. Cap retries at 5 per version transition (track in the state file as `surfaceAttempts: N`) to avoid an infinite loop if the changelog distillation itself is what's failing — once the cap is hit, write state with a `surfaceError` field and stop retrying.\n\n## Script resolution (for callers outside the skill)\n\nThis skill's helper scripts (`check-plugin-drift.sh`, `find-local-changelog.sh`, `probe-optional-dep.sh`) are useful **outside** the skill too — most notably from a safe-update wrapper that runs the same drift check before deciding whether to sync plugins.\n\nThe problem: ClawHub installs the skill into different paths depending on profile + invocation. A wrapper script hardcoding one path will drift as soon as the user switches profile or moves the install.\n\n**Stable resolver** (use this from any external caller):\n\n```bash\n# Locate this skill's script directory across known install layouts.\n# Echoes the absolute path on stdout, exits 0 on success.\nresolve_pua_scripts() {\n  for candidate in \\\n    \"${OPENCLAW_PROFILE_DIR:-/dev/null}/skills/post-update-awareness/scripts\" \\\n    \"$HOME/.openclaw-${OPENCLAW_PROFILE:-noura}/skills/post-update-awareness/scripts\" \\\n    \"$HOME/.openclaw/skills/post-update-awareness/scripts\" \\\n    \"$HOME/openclaw-soul/skills/post-update-awareness/scripts\" \\\n    \"$HOME/clawhub-skills/post-update-awareness/scripts\" ; do\n    if [ -d \"$candidate\" ] && [ -x \"$candidate/check-plugin-drift.sh\" ]; then\n      echo \"$candidate\"\n      return 0\n    fi\n  done\n  return 1\n}\n```\n\nThe resolver lives at `scripts/resolve.sh` in this skill — callers can `source` it directly:\n\n```bash\nsource \"$HOME/.openclaw-${PROFILE}/skills/post-update-awareness/scripts/resolve.sh\"\nPUA_SCRIPTS=$(resolve_pua_scripts) || PUA_SCRIPTS=\"\"\n```\n\nIf the wrapper can't find the skill at all, it should fall back to an inline copy of the drift check (the safe-update reference implementation already does this). Always prefer the skill copy when present — it gets updates via `clawhub update` while the wrapper's inline fallback stays frozen.\n\n## Mode: attended vs unattended\n\nThe skill runs in two distinct contexts:\n\n- **Unattended** (heartbeat-fired, no human watching): produce the strict 3-bucket summary, persist state, exit. Hard cap on length still applies.\n- **Attended** (the user just ran `openclaw update` and is watching): the same content is fine, but the skill may also answer follow-up questions and offer one interactive prompt — *\"Want me to update the drifted plugins now?\"* or *\"Want me to clean the stale config entries?\"* — and act on confirmation. State is still persisted so the next heartbeat stays quiet about the same version transition.\n\nDetect attended mode by whether the skill is being invoked inside an active user-driven session (the agent is replying to a fresh user message about updating). When in doubt, default to unattended.\n\n## Voice\n\nThis is an operational notice, not a marketing email. Terse, factual, no celebratory language.\n\n- ✅ \"OpenClaw updated to 2026.5.3-1. New: agent can now use the `talk` realtime voice tool. Watch: optional `sharp` is not installed; some image replies will fall back to original-size send.\"\n- ❌ \"🎉 Exciting news! OpenClaw has been upgraded with brand-new features...\"\n\n## Failure modes\n\n| Situation | Behavior |\n|---|---|\n| CHANGELOG section missing for the version | One-line \"OpenClaw updated to vX. No detailed notes for this tag yet — see GitHub Releases for raw notes.\" |\n| No internet, no local copy | Same as above. |\n| State file write fails | Log error; surface still happens; next run will re-surface. |\n| Probe script not executable / shell unavailable | Skip the probe section; report changes without dep status. |\n\n## Why this exists\n\nOpenClaw releases are well-documented in `CHANGELOG.md` and per-version GitHub Releases, but the running agent has no built-in mechanism to *consume* that information after an update. Real-world consequence: when an update introduces a new optional native-dep requirement (e.g. `sharp` for image attachment optimization), the user discovers it only when an unrelated workflow fails.\n\nThis skill closes that loop using the existing CHANGELOG as source of truth, pinned to the installed version so the agent reads the changelog that matches what's actually running — not whatever has been merged since.\n\nFile v0.3.1:README.md\n\n# post-update-awareness\n\nA ClawHub skill that makes your OpenClaw agent **read its own release notes** after an update.\n\n## What it does\n\nWhen OpenClaw is updated, the agent has no built-in mechanism to consume the release notes — so optional-dependency surprises (e.g. a new release expects `sharp` to be installed) are discovered the hard way: when an unrelated workflow fails, in front of someone you care about.\n\nThis skill closes that loop:\n\n1. Detects a version change between current `openclaw -V` and a small per-profile JSON state file the skill maintains.\n2. Fetches the CHANGELOG entry **pinned to the installed version's tag** (`v<version>`), not `main`. So the agent reads the changelog that matches what's actually running.\n3. Distills the entry into three buckets the user actually cares about — new tools, breaking changes, optional native deps to verify.\n4. Probes known-flaky native modules (`sharp`, `ffmpeg-static`, `node-pty`) to flag missing ones.\n5. **Detects plugin version drift** — catches the case where the gateway is on `vNew` but an externalized npm-installed plugin (`@openclaw/whatsapp`, `@openclaw/discord`, etc.) is still on `vOld`.\n6. **Verifies channel health** post-restart (`channels status`) and surfaces any `disconnected` / `unhealthy` / `degraded` channel.\n7. **Surfaces config rewrites** when `plugins update` overwrites `openclaw.json`, including the path to the auto-saved `.bak`.\n8. **Yields to the update-guard** when one is already watching the same transition, so the user isn't notified twice for the same bump.\n9. Sends one brief surfaced message via the active channel, then — **only on confirmed delivery** — persists the new version so subsequent heartbeats stay quiet.\n\n## What's new in 0.3.0\n\n- **Profile-aware state file.** Multi-profile setups (`main` + `noura-moi` + …) no longer share a single state file, which was silencing the skill on profile B after surfacing on profile A.\n- **Surface-then-persist ordering.** State is now written only after the channel acknowledges the message, with a retry cap. Channel blips no longer eat the notification.\n- **Update-guard awareness.** When an external update-guard already announced the version change, the skill skips the redundant header and goes straight into the CHANGELOG distillation.\n- **New `scripts/resolve.sh`.** Stable resolver for callers outside the skill (safe-update wrappers, cron jobs) so they stop hardcoding install paths.\n- **Broader changelog discovery.** `find-local-changelog.sh` now resolves pnpm, volta, nvm, and fnm global installs in addition to npm.\n\n## Install\n\n```bash\nopenclaw skills install post-update-awareness\n```\n\nOr via the ClawHub CLI:\n\n```bash\nclawhub install post-update-awareness\n```\n\n## When the skill triggers\n\n- The user asks \"what changed in this update?\" or similar\n- An update flow finishes (`openclaw update`, `openclaw plugins update`)\n- `openclaw -V` returns a value different from the version on file\n\nIt does **not** run on every heartbeat — only on actual version transitions.\n\n## What it does not do\n\n- Apply updates (that's `openclaw update`)\n- Modify configuration\n- Install missing dependencies — only flags them\n- Roll back versions\n\n## Files\n\n- `SKILL.md` — the skill instructions the agent reads\n- `scripts/find-local-changelog.sh` — locates the bundled CHANGELOG.md if available (npm / pnpm / volta / nvm / fnm)\n- `scripts/probe-optional-dep.sh` — non-blocking native-dep loadability check\n- `scripts/check-plugin-drift.sh` — lists externalized plugins whose installed version doesn't match the gateway\n- `scripts/resolve.sh` — stable resolver for callers outside the skill (safe-update wrappers, cron, CI)\n\n## Feedback / issues\n\nFound a bug? An install layout the resolver misses? A CHANGELOG section the\ndistillation flattened poorly? Open an issue on the source repo and tag it\n`post-update-awareness`. There's no in-band telemetry — the only signal the\nauthor gets is what users say out loud.\n\nIf you're building on top of this skill (custom wrapper, alternative\nnotification surface, profile-specific filters), the resolver in\n`scripts/resolve.sh` is the supported integration point. Patterns and edge\ncases welcome.\n\n## Why a skill rather than core\n\nOpenClaw's project direction (per `VISION.md`) is that new skills publish through ClawHub first; bundled promotion happens later if a clear product, security, or maintainer-ownership reason emerges. This is that ClawHub-first version of the idea.\n\n## Privacy\n\nThe skill reads:\n- `openclaw -V` (local CLI output)\n- The pinned CHANGELOG via `raw.githubusercontent.com` (one HTTPS request per detected version change, no auth, no telemetry)\n\nNothing is sent anywhere else. The local state file lives under one of:\n\n- `$OPENCLAW_PROFILE_DIR/state/` when the runtime exports it\n- `~/.openclaw-<profile>/state/` for multi-profile installs\n- `~/.openclaw/state/` for the default single-profile case\n\nand contains only the version string, a timestamp, and the profile name.\n\n## License\n\nMIT-0 — free to use, modify, redistribute. No attribution required.\n\nFile v0.3.1:_meta.json\n\n{\n  \"ownerId\": \"kn7bz8fq6vk4bqtfd8q20gjtgn83cc3w\",\n  \"slug\": \"post-update-awareness\",\n  \"version\": \"0.3.1\",\n  \"publishedAt\": 1779777592704\n}\n\nFile v0.3.1:skill-card.md\n\n## Description: <br>\nAfter an OpenClaw version change, read the CHANGELOG entry pinned to the installed version and surface user-relevant changes, including new tools, breaking changes, and optional native dependencies that may need verification. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[hussein1362](https://clawhub.ai/user/hussein1362) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nOpenClaw users and operators use this skill after an OpenClaw update to learn what changed, identify plugin drift or channel health issues, and decide whether optional dependencies or configuration entries need attention. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill is positioned as update awareness, but in attended mode it may offer to update drifted plugins or clean stale configuration entries after confirmation. <br>\nMitigation: Use the skill for read-only update summaries unless you intentionally approve a plugin version change or OpenClaw configuration edit. <br>\nRisk: The skill runs local OpenClaw, curl, and Node-based checks and writes a small per-profile state file after surfacing an update notice. <br>\nMitigation: Run it only in trusted OpenClaw profiles and review the required binaries and profile-specific state location before deployment. <br>\nRisk: Changelog retrieval and optional dependency probes can fail, producing partial update awareness. <br>\nMitigation: Treat missing changelog or dependency status as an explicit follow-up item rather than as evidence that no action is needed. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/hussein1362/post-update-awareness) <br>\n- [README](artifact/README.md) <br>\n- [Skill instructions](artifact/SKILL.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration guidance] <br>\n**Output Format:** [Brief Markdown operational notice with inline shell commands when action is needed] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Runs once per detected OpenClaw version transition and keeps output concise.] <br>\n\n## Skill Version(s): <br>\n0.3.1 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.3.0: 8 files, 15305 bytes\n\nFiles: _meta.json (140b), README.md (5099b), scripts/check-plugin-drift.sh (2486b), scripts/find-local-changelog.sh (2697b), scripts/probe-optional-dep.sh (1565b), scripts/resolve.sh (1923b), skill-card.md (2226b), SKILL.md (16159b)\n\nFile v0.3.0:SKILL.md\n\n---\nname: post-update-awareness\ndescription: After an OpenClaw version change, read the CHANGELOG entry pinned to the installed version and surface user-relevant changes — new tools, breaking changes, optional native dependencies that may need verification (sharp, ffmpeg, node-pty). Runs once per detected version bump. Use when OpenClaw has just been updated, when openclaw -V differs from the value on file, or when the user asks \"what changed in this update?\"\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"openclaw\",\"curl\",\"node\"]}}}\n---\n\n# Post-Update Awareness\n\nWhen OpenClaw is updated, the agent should not be the last to know. This skill reads the project CHANGELOG **for the exact installed version**, distills what changed for the user, and surfaces it once.\n\n## When to use\n\nRun this skill when **any** of the following is true:\n\n1. The user asks \"what changed in this update?\" or \"what's new in OpenClaw?\"\n2. A first-class update flow finishes (`openclaw update`, `openclaw plugins update`, or a package-manager update).\n3. `openclaw -V` returns a value different from the version recorded in the skill's state file.\n\nDo **not** run on every heartbeat. Run **once per detected version change**, then persist the new version so subsequent heartbeats stay quiet.\n\n## Scope and non-goals\n\nThis skill **only**:\n\n- Reads existing CHANGELOG content pinned to the installed version\n- Reports it to the user\n- Optionally probes for known-flaky optional native deps mentioned in the entry\n\nThis skill **does not**:\n\n- Apply updates (`openclaw update` already handles that)\n- Modify configuration\n- Install missing dependencies without explicit user confirmation\n- Roll back versions\n\n## Workflow\n\n### 1) Read the current installed version\n\n```json\n{ \"tool\": \"exec\", \"command\": \"openclaw -V\" }\n```\n\nParse the version token (e.g. `OpenClaw 2026.5.3-1 (2eae30e)` → `2026.5.3-1`).\n\n### 2) Compare against the last-known version\n\nThe skill maintains a small JSON state file per profile.\n\n**Path resolution** (first match wins):\n\n1. `$OPENCLAW_PROFILE_DIR/state/post-update-awareness.json` — when the runtime exports `OPENCLAW_PROFILE_DIR`\n2. `$HOME/.openclaw-<profile>/state/post-update-awareness.json` — when a profile name is known (e.g. from `openclaw --profile <name>` or the `OPENCLAW_PROFILE` env var)\n3. `$HOME/.openclaw/state/post-update-awareness.json` — single-profile / default fallback\n\nThis matters because the same machine can run multiple profiles (`main`, `noura-moi`, `amber`, …) and each one can independently update on its own cadence. A single shared state file caused the skill to go silent on profile B after surfacing on profile A — the bug the v0.3 path resolver fixes.\n\nContents:\n\n```json\n{\n  \"lastKnownVersion\": \"2026.5.2\",\n  \"lastSurfacedAt\": \"2026-05-04T13:15:00Z\",\n  \"profile\": \"noura-moi\"\n}\n```\n\n- If the file does not exist → write the current version as the baseline and **exit silently**. (No CHANGELOG dump on first run; only on actual transitions.)\n- If `currentVersion === lastKnownVersion` → exit silently.\n- If `currentVersion !== lastKnownVersion` → continue.\n\n### 2a) Yield to the update-guard if it already handled this transition\n\nMany OpenClaw setups also run an **update-guard** loop (heartbeat-driven config-backup + crash-loop watchdog — see e.g. `scripts/openclaw-update-guard.sh`). When the guard detects a version change it logs a `GUARD_OK`/`GUARD_RECOVERED`/`GUARD_ROLLBACK` event to `${HOME}/.openclaw-<profile>/update-guard/update-guard.log`.\n\nBefore surfacing, check whether the guard has *already announced* this exact transition in the last 10 minutes:\n\n```bash\ngrep -E \"VERSION CHANGE detected:.*v<currentVersion>\" \\\n  \"$HOME/.openclaw-<profile>/update-guard/update-guard.log\" 2>/dev/null | tail -1\n```\n\nIf a guard line for the current version is found within the recent window, the user has already been told the version changed. The skill should still surface the **CHANGELOG distillation** (that's what the guard doesn't do), but prefix it with `(already noted by update-guard)` and skip the redundant \"OpenClaw updated to X (was Y)\" header — go straight into the buckets. This avoids the double-notification failure mode.\n\n### 3) Fetch the CHANGELOG entry pinned to the installed version\n\n**Always pin to the installed version**, never read `main`. The release tag for OpenClaw matches the version with a `v` prefix.\n\nTry in order:\n\n1. **Local install copy** (fastest, offline-friendly): typical paths are platform-dependent. Try the directory of the npm install root first:\n   ```bash\n   {baseDir}/scripts/find-local-changelog.sh\n   ```\n   This script searches common install locations and prints the path if found.\n\n2. **Remote, pinned to tag**:\n   ```bash\n   curl -fsSL \"https://raw.githubusercontent.com/openclaw/openclaw/v<currentVersion>/CHANGELOG.md\"\n   ```\n   The `v` prefix is required. If the remote 404s (e.g. a brand-new release tag hasn't propagated yet), retry once after 30 seconds before giving up.\n\n3. **Fallback** (only if both above fail): query the GitHub Releases API for that exact tag:\n   ```bash\n   curl -fsSL \"https://api.github.com/repos/openclaw/openclaw/releases/tags/v<currentVersion>\"\n   ```\n   Use the `body` field as the changelog content.\n\nIf all three fail, surface a single line: *\"OpenClaw was updated to vX, but I couldn't fetch the changelog to summarize what changed.\"* Do **not** invent content.\n\n### 4) Extract the section for the new version\n\nThe CHANGELOG uses `## <version>` as section headings. Extract only the section between `## <currentVersion>` and the next `## ` heading. Do not dump the whole file.\n\nIf the section heading isn't found in the pinned changelog (rare — usually means the release tag exists but the changelog hasn't been updated for it), use the `Unreleased` section as a fallback only when the pinned-tag fetch came from `main`. When pinned to an actual release tag, prefer \"no detailed notes available\" over guessing.\n\n### 5) Distill into 3 buckets\n\nGroup items into:\n\n- **🆕 New for you** — new tools, commands, channels, capabilities the agent could benefit from. Filter ruthlessly to what an end-user agent actually touches; skip internal refactor lines, build-system changes, and CI plumbing.\n- **⚠️ Breaking or removed** — anything that changes current behavior: removed config keys, renamed CLI commands, deprecated features, security tightenings.\n- **🔧 May need attention** — optional native dependencies (`sharp`, `ffmpeg`, `node-pty`, `libvips`, etc.), peer-dep notes, post-install scripts, config-format migrations.\n\nEach bucket: 1–4 bullets max. Omit empty buckets entirely.\n\n### 6) Probe known-flaky optional deps (best effort)\n\nIf the \"May need attention\" bucket mentions a known native module, probe non-blockingly:\n\n```bash\n{baseDir}/scripts/probe-optional-dep.sh sharp\n```\n\nThe script returns `OK`, `MISSING`, or `ERROR <msg>`. Annotate findings inline in the surfaced summary as `❌ sharp (image processing) — not installed`. Do **not** auto-install.\n\nDefault known list (extend as the project evolves):\n\n- `sharp` — image attachment optimization\n- `ffmpeg-static` / system `ffmpeg` — audio/video transcoding\n- `node-pty` — terminal/PTY tools\n\n### 6a) Detect plugin version drift\n\nWhen the gateway updates, **externalized npm-installed plugins do not update automatically**. The result is a gateway on `vNew` running a plugin still on `vOld`. This was the original motivating case for surfacing this skill — see the \"plugin drift\" failure mode in the OpenClaw 2026.5.3→2026.5.4 transition where `@openclaw/whatsapp` was left behind.\n\nRun:\n\n```bash\n{baseDir}/scripts/check-plugin-drift.sh <currentVersion>\n```\n\nThe script lists installed plugins, parses the version column, and prints any plugin whose version does not match the gateway. Output format (one per line):\n\n```\nDRIFT <plugin-id> <plugin-version> (gateway <currentVersion>)\n```\n\nIf the script reports any drift, add a bullet to **🔧 May need attention** in the form:\n\n> `🔁 <plugin-id> still on <plugin-version> — run \\`openclaw plugins update <plugin-id>\\` then restart the gateway.`\n\nDo **not** auto-update. The user should be the one to trigger it because plugin updates can rewrite `openclaw.json` (see step 6c).\n\n### 6b) Verify channel health post-update\n\nUpdates frequently touch channel transports (Discord, WhatsApp, Telegram, Slack). After the gateway restart that follows an update, run:\n\n```bash\nopenclaw --profile <profile> channels status\n```\n\nFlag any channel reporting `not configured`, `disconnected`, `unhealthy`, `degraded`, or `error` as a **⚠️ Breaking or removed** bullet. A connected channel that is `health:healthy` should not be surfaced.\n\nThis is especially important for any channel the user has flagged as actively in use (groups with active participants, customer-facing inboxes, etc.). When a profile name encodes a deployment scope (e.g. `noura-moi`), channels on that profile deserve a verbatim status mention even when healthy:\n\n> `WhatsApp <profile>: linked, connected, healthy.`\n\nThis confirmation line is the only case where a healthy channel is surfaced — and only on profiles where the user has explicit production stake.\n\n### 6c) Surface config rewrites and stale-entry warnings\n\nWhen `plugins update` or `gateway` migrations rewrite `openclaw.json`, the CLI prints lines like:\n\n```\nConfig overwrite: <path> (sha256 <old> -> <new>, backup=<path>.bak)\nConfig warnings:\n- plugins.entries.<id>: plugin disabled (...) but config is present\n```\n\nWhen the skill observes either signal in command output it just executed (e.g. when the user ran `openclaw plugins update` in the same window), surface:\n\n- The config rewrite as an info line: `Config rewritten — backup at <path>.bak.`\n- Each stale-entry warning as a 🔧 bullet: `Stale config entry: \\`plugins.entries.<id>\\` (disabled but configured) — safe to remove from openclaw.json.`\n\nDo **not** edit the config. Just point at it.\n\n### 7) Surface to the user\n\nSend **one** brief message via the active channel.\n\n```\nOpenClaw updated to <newVersion> (was <oldVersion>).\n\n🆕 New for you:\n- <bullet>\n\n⚠️ Breaking or removed:\n- <bullet>\n\n🔧 May need attention:\n- 🔁 @openclaw/whatsapp still on 2026.5.3 — run: openclaw plugins update @openclaw/whatsapp\n- ❌ sharp (image processing) — not installed; run: <install command>\n- Stale config entry: `plugins.entries.device-pair` (disabled but configured)\n\nWhatsApp noura-moi: linked, connected, healthy.\n\nFull notes: https://github.com/openclaw/openclaw/blob/v<newVersion>/CHANGELOG.md\n```\n\n**Hard cap: ~18 lines.** Drop empty sections. The healthy-channel confirmation line is allowed only when (a) the profile name encodes a production deployment scope and (b) at least one channel on that profile is reporting healthy after the update.\n\nIf everything is quiet:\n\n```\nOpenClaw updated to <newVersion>. Nothing in the changelog requires action on my end.\n```\n\n### 8) Persist new state — **only after successful surfacing**\n\nOrdering matters. Write state **after** the surface message has been dispatched, not before.\n\nWhy: if the agent crashes mid-skill, or the channel send fails (network blip, rate limit, channel disconnected during a plugin-drift update), writing state first would silently swallow the notification — the next heartbeat sees `currentVersion === lastKnownVersion` and exits quiet. The user never learns what changed.\n\nCorrect order:\n\n1. Build the surface message.\n2. Dispatch it through the active channel.\n3. **Confirm dispatch succeeded** (no thrown error, channel acknowledged).\n4. *Then* write `{ lastKnownVersion, lastSurfacedAt, profile }` atomically (write to `<file>.tmp`, then rename).\n\nIf step 3 fails, leave state untouched. The next heartbeat will retry. Cap retries at 5 per version transition (track in the state file as `surfaceAttempts: N`) to avoid an infinite loop if the changelog distillation itself is what's failing — once the cap is hit, write state with a `surfaceError` field and stop retrying.\n\n## Script resolution (for callers outside the skill)\n\nThis skill's helper scripts (`check-plugin-drift.sh`, `find-local-changelog.sh`, `probe-optional-dep.sh`) are useful **outside** the skill too — most notably from a safe-update wrapper that runs the same drift check before deciding whether to sync plugins.\n\nThe problem: ClawHub installs the skill into different paths depending on profile + invocation. A wrapper script hardcoding one path will drift as soon as the user switches profile or moves the install.\n\n**Stable resolver** (use this from any external caller):\n\n```bash\n# Locate this skill's script directory across known install layouts.\n# Echoes the absolute path on stdout, exits 0 on success.\nresolve_pua_scripts() {\n  for candidate in \\\n    \"${OPENCLAW_PROFILE_DIR:-/dev/null}/skills/post-update-awareness/scripts\" \\\n    \"$HOME/.openclaw-${OPENCLAW_PROFILE:-noura}/skills/post-update-awareness/scripts\" \\\n    \"$HOME/.openclaw/skills/post-update-awareness/scripts\" \\\n    \"$HOME/openclaw-soul/skills/post-update-awareness/scripts\" \\\n    \"$HOME/clawhub-skills/post-update-awareness/scripts\" ; do\n    if [ -d \"$candidate\" ] && [ -x \"$candidate/check-plugin-drift.sh\" ]; then\n      echo \"$candidate\"\n      return 0\n    fi\n  done\n  return 1\n}\n```\n\nThe resolver lives at `scripts/resolve.sh` in this skill — callers can `source` it directly:\n\n```bash\nsource \"$HOME/.openclaw-${PROFILE}/skills/post-update-awareness/scripts/resolve.sh\"\nPUA_SCRIPTS=$(resolve_pua_scripts) || PUA_SCRIPTS=\"\"\n```\n\nIf the wrapper can't find the skill at all, it should fall back to an inline copy of the drift check (the safe-update reference implementation already does this). Always prefer the skill copy when present — it gets updates via `clawhub update` while the wrapper's inline fallback stays frozen.\n\n## Mode: attended vs unattended\n\nThe skill runs in two distinct contexts:\n\n- **Unattended** (heartbeat-fired, no human watching): produce the strict 3-bucket summary, persist state, exit. Hard cap on length still applies.\n- **Attended** (the user just ran `openclaw update` and is watching): the same content is fine, but the skill may also answer follow-up questions and offer one interactive prompt — *\"Want me to update the drifted plugins now?\"* or *\"Want me to clean the stale config entries?\"* — and act on confirmation. State is still persisted so the next heartbeat stays quiet about the same version transition.\n\nDetect attended mode by whether the skill is being invoked inside an active user-driven session (the agent is replying to a fresh user message about updating). When in doubt, default to unattended.\n\n## Voice\n\nThis is an operational notice, not a marketing email. Terse, factual, no celebratory language.\n\n- ✅ \"OpenClaw updated to 2026.5.3-1. New: agent can now use the `talk` realtime voice tool. Watch: optional `sharp` is not installed; some image replies will fall back to original-size send.\"\n- ❌ \"🎉 Exciting news! OpenClaw has been upgraded with brand-new features...\"\n\n## Failure modes\n\n| Situation | Behavior |\n|---|---|\n| CHANGELOG section missing for the version | One-line \"OpenClaw updated to vX. No detailed notes for this tag yet — see GitHub Releases for raw notes.\" |\n| No internet, no local copy | Same as above. |\n| State file write fails | Log error; surface still happens; next run will re-surface. |\n| Probe script not executable / shell unavailable | Skip the probe section; report changes without dep status. |\n\n## Why this exists\n\nOpenClaw releases are well-documented in `CHANGELOG.md` and per-version GitHub Releases, but the running agent has no built-in mechanism to *consume* that information after an update. Real-world consequence: when an update introduces a new optional native-dep requirement (e.g. `sharp` for image attachment optimization), the user discovers it only when an unrelated workflow fails.\n\nThis skill closes that loop using the existing CHANGELOG as source of truth, pinned to the installed version so the agent reads the changelog that matches what's actually running — not whatever has been merged since.\n\nFile v0.3.0:README.md\n\n# post-update-awareness\n\nA ClawHub skill that makes your OpenClaw agent **read its own release notes** after an update.\n\n## What it does\n\nWhen OpenClaw is updated, the agent has no built-in mechanism to consume the release notes — so optional-dependency surprises (e.g. a new release expects `sharp` to be installed) are discovered the hard way: when an unrelated workflow fails, in front of someone you care about.\n\nThis skill closes that loop:\n\n1. Detects a version change between current `openclaw -V` and a small per-profile JSON state file the skill maintains.\n2. Fetches the CHANGELOG entry **pinned to the installed version's tag** (`v<version>`), not `main`. So the agent reads the changelog that matches what's actually running.\n3. Distills the entry into three buckets the user actually cares about — new tools, breaking changes, optional native deps to verify.\n4. Probes known-flaky native modules (`sharp`, `ffmpeg-static`, `node-pty`) to flag missing ones.\n5. **Detects plugin version drift** — catches the case where the gateway is on `vNew` but an externalized npm-installed plugin (`@openclaw/whatsapp`, `@openclaw/discord`, etc.) is still on `vOld`.\n6. **Verifies channel health** post-restart (`channels status`) and surfaces any `disconnected` / `unhealthy` / `degraded` channel.\n7. **Surfaces config rewrites** when `plugins update` overwrites `openclaw.json`, including the path to the auto-saved `.bak`.\n8. **Yields to the update-guard** when one is already watching the same transition, so the user isn't notified twice for the same bump.\n9. Sends one brief surfaced message via the active channel, then — **only on confirmed delivery** — persists the new version so subsequent heartbeats stay quiet.\n\n## What's new in 0.3.0\n\n- **Profile-aware state file.** Multi-profile setups (`main` + `noura-moi` + …) no longer share a single state file, which was silencing the skill on profile B after surfacing on profile A.\n- **Surface-then-persist ordering.** State is now written only after the channel acknowledges the message, with a retry cap. Channel blips no longer eat the notification.\n- **Update-guard awareness.** When an external update-guard already announced the version change, the skill skips the redundant header and goes straight into the CHANGELOG distillation.\n- **New `scripts/resolve.sh`.** Stable resolver for callers outside the skill (safe-update wrappers, cron jobs) so they stop hardcoding install paths.\n- **Broader changelog discovery.** `find-local-changelog.sh` now resolves pnpm, volta, nvm, and fnm global installs in addition to npm.\n\n## Install\n\n```bash\nopenclaw skills install post-update-awareness\n```\n\nOr via the ClawHub CLI:\n\n```bash\nclawhub install post-update-awareness\n```\n\n## When the skill triggers\n\n- The user asks \"what changed in this update?\" or similar\n- An update flow finishes (`openclaw update`, `openclaw plugins update`)\n- `openclaw -V` returns a value different from the version on file\n\nIt does **not** run on every heartbeat — only on actual version transitions.\n\n## What it does not do\n\n- Apply updates (that's `openclaw update`)\n- Modify configuration\n- Install missing dependencies — only flags them\n- Roll back versions\n\n## Files\n\n- `SKILL.md` — the skill instructions the agent reads\n- `scripts/find-local-changelog.sh` — locates the bundled CHANGELOG.md if available (npm / pnpm / volta / nvm / fnm)\n- `scripts/probe-optional-dep.sh` — non-blocking native-dep loadability check\n- `scripts/check-plugin-drift.sh` — lists externalized plugins whose installed version doesn't match the gateway\n- `scripts/resolve.sh` — stable resolver for callers outside the skill (safe-update wrappers, cron, CI)\n\n## Feedback / issues\n\nFound a bug? An install layout the resolver misses? A CHANGELOG section the\ndistillation flattened poorly? Open an issue on the source repo and tag it\n`post-update-awareness`. There's no in-band telemetry — the only signal the\nauthor gets is what users say out loud.\n\nIf you're building on top of this skill (custom wrapper, alternative\nnotification surface, profile-specific filters), the resolver in\n`scripts/resolve.sh` is the supported integration point. Patterns and edge\ncases welcome.\n\n## Why a skill rather than core\n\nOpenClaw's project direction (per `VISION.md`) is that new skills publish through ClawHub first; bundled promotion happens later if a clear product, security, or maintainer-ownership reason emerges. This is that ClawHub-first version of the idea.\n\n## Privacy\n\nThe skill reads:\n- `openclaw -V` (local CLI output)\n- The pinned CHANGELOG via `raw.githubusercontent.com` (one HTTPS request per detected version change, no auth, no telemetry)\n\nNothing is sent anywhere else. The local state file lives under one of:\n\n- `$OPENCLAW_PROFILE_DIR/state/` when the runtime exports it\n- `~/.openclaw-<profile>/state/` for multi-profile installs\n- `~/.openclaw/state/` for the default single-profile case\n\nand contains only the version string, a timestamp, and the profile name.\n\n## License\n\nMIT-0 — free to use, modify, redistribute. No attribution required.\n\nFile v0.3.0:_meta.json\n\n{\n  \"ownerId\": \"kn7bz8fq6vk4bqtfd8q20gjtgn83cc3w\",\n  \"slug\": \"post-update-awareness\",\n  \"version\": \"0.3.0\",\n  \"publishedAt\": 1779777343681\n}\n\nFile v0.3.0:skill-card.md\n\n## Description: <br>\nAfter an OpenClaw version change, reads the installed version's CHANGELOG entry and surfaces user-relevant changes, including new tools, breaking changes, and optional native dependencies that may need verification. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[hussein1362](https://clawhub.ai/user/hussein1362) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and operators use this skill after OpenClaw updates to summarize version-pinned release notes, flag plugin drift or channel health issues, and identify optional dependencies that may need attention. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill may inspect operational state, including installed plugins, channel health, update-guard logs, and config rewrite warnings. <br>\nMitigation: Review the skill before installing and use it only where that operational visibility is acceptable. <br>\nRisk: In attended mode, the skill may offer to update plugins or clean configuration entries. <br>\nMitigation: Require a fresh, explicit confirmation before any plugin update or config cleanup action. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/hussein1362/post-update-awareness) <br>\n- [README](README.md) <br>\n- [Skill instructions](SKILL.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown text with concise operational bullets and inline shell commands] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Requires openclaw, curl, and node; helper scripts may read local profile state, plugin lists, channel status, update-guard logs, config warnings, and the pinned OpenClaw changelog.] <br>\n\n## Skill Version(s): <br>\n0.3.0 (source: server release metadata and README release notes) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.2.0: 6 files, 10344 bytes\n\nFiles: README.md (3207b), scripts/check-plugin-drift.sh (2486b), scripts/find-local-changelog.sh (1667b), scripts/probe-optional-dep.sh (1565b), SKILL.md (11644b), _meta.json (140b)\n\nFile v0.2.0:SKILL.md\n\n---\nname: post-update-awareness\ndescription: After an OpenClaw version change, read the CHANGELOG entry pinned to the installed version and surface user-relevant changes — new tools, breaking changes, optional native dependencies that may need verification (sharp, ffmpeg, node-pty). Runs once per detected version bump. Use when OpenClaw has just been updated, when openclaw -V differs from the value on file, or when the user asks \"what changed in this update?\"\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"openclaw\",\"curl\",\"node\"]}}}\n---\n\n# Post-Update Awareness\n\nWhen OpenClaw is updated, the agent should not be the last to know. This skill reads the project CHANGELOG **for the exact installed version**, distills what changed for the user, and surfaces it once.\n\n## When to use\n\nRun this skill when **any** of the following is true:\n\n1. The user asks \"what changed in this update?\" or \"what's new in OpenClaw?\"\n2. A first-class update flow finishes (`openclaw update`, `openclaw plugins update`, or a package-manager update).\n3. `openclaw -V` returns a value different from the version recorded in the skill's state file.\n\nDo **not** run on every heartbeat. Run **once per detected version change**, then persist the new version so subsequent heartbeats stay quiet.\n\n## Scope and non-goals\n\nThis skill **only**:\n\n- Reads existing CHANGELOG content pinned to the installed version\n- Reports it to the user\n- Optionally probes for known-flaky optional native deps mentioned in the entry\n\nThis skill **does not**:\n\n- Apply updates (`openclaw update` already handles that)\n- Modify configuration\n- Install missing dependencies without explicit user confirmation\n- Roll back versions\n\n## Workflow\n\n### 1) Read the current installed version\n\n```json\n{ \"tool\": \"exec\", \"command\": \"openclaw -V\" }\n```\n\nParse the version token (e.g. `OpenClaw 2026.5.3-1 (2eae30e)` → `2026.5.3-1`).\n\n### 2) Compare against the last-known version\n\nThe skill maintains a small JSON state file at `${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/state/post-update-awareness.json`:\n\n```json\n{ \"lastKnownVersion\": \"2026.5.2\", \"lastSurfacedAt\": \"2026-05-04T13:15:00Z\" }\n```\n\n- If the file does not exist → write the current version as the baseline and **exit silently**. (No CHANGELOG dump on first run; only on actual transitions.)\n- If `currentVersion === lastKnownVersion` → exit silently.\n- If `currentVersion !== lastKnownVersion` → continue.\n\n### 3) Fetch the CHANGELOG entry pinned to the installed version\n\n**Always pin to the installed version**, never read `main`. The release tag for OpenClaw matches the version with a `v` prefix.\n\nTry in order:\n\n1. **Local install copy** (fastest, offline-friendly): typical paths are platform-dependent. Try the directory of the npm install root first:\n   ```bash\n   {baseDir}/scripts/find-local-changelog.sh\n   ```\n   This script searches common install locations and prints the path if found.\n\n2. **Remote, pinned to tag**:\n   ```bash\n   curl -fsSL \"https://raw.githubusercontent.com/openclaw/openclaw/v<currentVersion>/CHANGELOG.md\"\n   ```\n   The `v` prefix is required. If the remote 404s (e.g. a brand-new release tag hasn't propagated yet), retry once after 30 seconds before giving up.\n\n3. **Fallback** (only if both above fail): query the GitHub Releases API for that exact tag:\n   ```bash\n   curl -fsSL \"https://api.github.com/repos/openclaw/openclaw/releases/tags/v<currentVersion>\"\n   ```\n   Use the `body` field as the changelog content.\n\nIf all three fail, surface a single line: *\"OpenClaw was updated to vX, but I couldn't fetch the changelog to summarize what changed.\"* Do **not** invent content.\n\n### 4) Extract the section for the new version\n\nThe CHANGELOG uses `## <version>` as section headings. Extract only the section between `## <currentVersion>` and the next `## ` heading. Do not dump the whole file.\n\nIf the section heading isn't found in the pinned changelog (rare — usually means the release tag exists but the changelog hasn't been updated for it), use the `Unreleased` section as a fallback only when the pinned-tag fetch came from `main`. When pinned to an actual release tag, prefer \"no detailed notes available\" over guessing.\n\n### 5) Distill into 3 buckets\n\nGroup items into:\n\n- **🆕 New for you** — new tools, commands, channels, capabilities the agent could benefit from. Filter ruthlessly to what an end-user agent actually touches; skip internal refactor lines, build-system changes, and CI plumbing.\n- **⚠️ Breaking or removed** — anything that changes current behavior: removed config keys, renamed CLI commands, deprecated features, security tightenings.\n- **🔧 May need attention** — optional native dependencies (`sharp`, `ffmpeg`, `node-pty`, `libvips`, etc.), peer-dep notes, post-install scripts, config-format migrations.\n\nEach bucket: 1–4 bullets max. Omit empty buckets entirely.\n\n### 6) Probe known-flaky optional deps (best effort)\n\nIf the \"May need attention\" bucket mentions a known native module, probe non-blockingly:\n\n```bash\n{baseDir}/scripts/probe-optional-dep.sh sharp\n```\n\nThe script returns `OK`, `MISSING`, or `ERROR <msg>`. Annotate findings inline in the surfaced summary as `❌ sharp (image processing) — not installed`. Do **not** auto-install.\n\nDefault known list (extend as the project evolves):\n\n- `sharp` — image attachment optimization\n- `ffmpeg-static` / system `ffmpeg` — audio/video transcoding\n- `node-pty` — terminal/PTY tools\n\n### 6a) Detect plugin version drift\n\nWhen the gateway updates, **externalized npm-installed plugins do not update automatically**. The result is a gateway on `vNew` running a plugin still on `vOld`. This was the original motivating case for surfacing this skill — see the \"plugin drift\" failure mode in the OpenClaw 2026.5.3→2026.5.4 transition where `@openclaw/whatsapp` was left behind.\n\nRun:\n\n```bash\n{baseDir}/scripts/check-plugin-drift.sh <currentVersion>\n```\n\nThe script lists installed plugins, parses the version column, and prints any plugin whose version does not match the gateway. Output format (one per line):\n\n```\nDRIFT <plugin-id> <plugin-version> (gateway <currentVersion>)\n```\n\nIf the script reports any drift, add a bullet to **🔧 May need attention** in the form:\n\n> `🔁 <plugin-id> still on <plugin-version> — run \\`openclaw plugins update <plugin-id>\\` then restart the gateway.`\n\nDo **not** auto-update. The user should be the one to trigger it because plugin updates can rewrite `openclaw.json` (see step 6c).\n\n### 6b) Verify channel health post-update\n\nUpdates frequently touch channel transports (Discord, WhatsApp, Telegram, Slack). After the gateway restart that follows an update, run:\n\n```bash\nopenclaw --profile <profile> channels status\n```\n\nFlag any channel reporting `not configured`, `disconnected`, `unhealthy`, `degraded`, or `error` as a **⚠️ Breaking or removed** bullet. A connected channel that is `health:healthy` should not be surfaced.\n\nThis is especially important for any channel the user has flagged as actively in use (groups with active participants, customer-facing inboxes, etc.). When a profile name encodes a deployment scope (e.g. `noura-moi`), channels on that profile deserve a verbatim status mention even when healthy:\n\n> `WhatsApp <profile>: linked, connected, healthy.`\n\nThis confirmation line is the only case where a healthy channel is surfaced — and only on profiles where the user has explicit production stake.\n\n### 6c) Surface config rewrites and stale-entry warnings\n\nWhen `plugins update` or `gateway` migrations rewrite `openclaw.json`, the CLI prints lines like:\n\n```\nConfig overwrite: <path> (sha256 <old> -> <new>, backup=<path>.bak)\nConfig warnings:\n- plugins.entries.<id>: plugin disabled (...) but config is present\n```\n\nWhen the skill observes either signal in command output it just executed (e.g. when the user ran `openclaw plugins update` in the same window), surface:\n\n- The config rewrite as an info line: `Config rewritten — backup at <path>.bak.`\n- Each stale-entry warning as a 🔧 bullet: `Stale config entry: \\`plugins.entries.<id>\\` (disabled but configured) — safe to remove from openclaw.json.`\n\nDo **not** edit the config. Just point at it.\n\n### 7) Surface to the user\n\nSend **one** brief message via the active channel.\n\n```\nOpenClaw updated to <newVersion> (was <oldVersion>).\n\n🆕 New for you:\n- <bullet>\n\n⚠️ Breaking or removed:\n- <bullet>\n\n🔧 May need attention:\n- 🔁 @openclaw/whatsapp still on 2026.5.3 — run: openclaw plugins update @openclaw/whatsapp\n- ❌ sharp (image processing) — not installed; run: <install command>\n- Stale config entry: `plugins.entries.device-pair` (disabled but configured)\n\nWhatsApp noura-moi: linked, connected, healthy.\n\nFull notes: https://github.com/openclaw/openclaw/blob/v<newVersion>/CHANGELOG.md\n```\n\n**Hard cap: ~18 lines.** Drop empty sections. The healthy-channel confirmation line is allowed only when (a) the profile name encodes a production deployment scope and (b) at least one channel on that profile is reporting healthy after the update.\n\nIf everything is quiet:\n\n```\nOpenClaw updated to <newVersion>. Nothing in the changelog requires action on my end.\n```\n\n### 8) Persist new state\n\nWrite the new version + surfaced timestamp to the state file. Subsequent heartbeats stay silent unless the version changes again.\n\n## Mode: attended vs unattended\n\nThe skill runs in two distinct contexts:\n\n- **Unattended** (heartbeat-fired, no human watching): produce the strict 3-bucket summary, persist state, exit. Hard cap on length still applies.\n- **Attended** (the user just ran `openclaw update` and is watching): the same content is fine, but the skill may also answer follow-up questions and offer one interactive prompt — *\"Want me to update the drifted plugins now?\"* or *\"Want me to clean the stale config entries?\"* — and act on confirmation. State is still persisted so the next heartbeat stays quiet about the same version transition.\n\nDetect attended mode by whether the skill is being invoked inside an active user-driven session (the agent is replying to a fresh user message about updating). When in doubt, default to unattended.\n\n## Voice\n\nThis is an operational notice, not a marketing email. Terse, factual, no celebratory language.\n\n- ✅ \"OpenClaw updated to 2026.5.3-1. New: agent can now use the `talk` realtime voice tool. Watch: optional `sharp` is not installed; some image replies will fall back to original-size send.\"\n- ❌ \"🎉 Exciting news! OpenClaw has been upgraded with brand-new features...\"\n\n## Failure modes\n\n| Situation | Behavior |\n|---|---|\n| CHANGELOG section missing for the version | One-line \"OpenClaw updated to vX. No detailed notes for this tag yet — see GitHub Releases for raw notes.\" |\n| No internet, no local copy | Same as above. |\n| State file write fails | Log error; surface still happens; next run will re-surface. |\n| Probe script not executable / shell unavailable | Skip the probe section; report changes without dep status. |\n\n## Why this exists\n\nOpenClaw releases are well-documented in `CHANGELOG.md` and per-version GitHub Releases, but the running agent has no built-in mechanism to *consume* that information after an update. Real-world consequence: when an update introduces a new optional native-dep requirement (e.g. `sharp` for image attachment optimization), the user discovers it only when an unrelated workflow fails.\n\nThis skill closes that loop using the existing CHANGELOG as source of truth, pinned to the installed version so the agent reads the changelog that matches what's actually running — not whatever has been merged since.\n\nFile v0.2.0:README.md\n\n# post-update-awareness\n\nA ClawHub skill that makes your OpenClaw agent **read its own release notes** after an update.\n\n## What it does\n\nWhen OpenClaw is updated, the agent has no built-in mechanism to consume the release notes — so optional-dependency surprises (e.g. a new release expects `sharp` to be installed) are discovered the hard way: when an unrelated workflow fails, in front of someone you care about.\n\nThis skill closes that loop:\n\n1. Detects a version change between current `openclaw -V` and a small JSON state file the skill maintains.\n2. Fetches the CHANGELOG entry **pinned to the installed version's tag** (`v<version>`), not `main`. So the agent reads the changelog that matches what's actually running.\n3. Distills the entry into three buckets the user actually cares about — new tools, breaking changes, optional native deps to verify.\n4. Probes known-flaky native modules (`sharp`, `ffmpeg-static`, `node-pty`) to flag missing ones.\n5. **Detects plugin version drift** — catches the case where the gateway is on `vNew` but an externalized npm-installed plugin (`@openclaw/whatsapp`, `@openclaw/discord`, etc.) is still on `vOld`.\n6. **Verifies channel health** post-restart (`channels status`) and surfaces any `disconnected` / `unhealthy` / `degraded` channel.\n7. **Surfaces config rewrites** when `plugins update` overwrites `openclaw.json`, including the path to the auto-saved `.bak`.\n8. Sends one brief surfaced message via the active channel, then persists the new version so subsequent heartbeats stay quiet.\n\n## Install\n\n```bash\nopenclaw skills install post-update-awareness\n```\n\nOr via the ClawHub CLI:\n\n```bash\nclawhub install post-update-awareness\n```\n\n## When the skill triggers\n\n- The user asks \"what changed in this update?\" or similar\n- An update flow finishes (`openclaw update`, `openclaw plugins update`)\n- `openclaw -V` returns a value different from the version on file\n\nIt does **not** run on every heartbeat — only on actual version transitions.\n\n## What it does not do\n\n- Apply updates (that's `openclaw update`)\n- Modify configuration\n- Install missing dependencies — only flags them\n- Roll back versions\n\n## Files\n\n- `SKILL.md` — the skill instructions the agent reads\n- `scripts/find-local-changelog.sh` — locates the bundled CHANGELOG.md if available\n- `scripts/probe-optional-dep.sh` — non-blocking native-dep loadability check\n- `scripts/check-plugin-drift.sh` — lists externalized plugins whose installed version doesn't match the gateway\n\n## Why a skill rather than core\n\nOpenClaw's project direction (per `VISION.md`) is that new skills publish through ClawHub first; bundled promotion happens later if a clear product, security, or maintainer-ownership reason emerges. This is that ClawHub-first version of the idea.\n\n## Privacy\n\nThe skill reads:\n- `openclaw -V` (local CLI output)\n- The pinned CHANGELOG via `raw.githubusercontent.com` (one HTTPS request per detected version change, no auth, no telemetry)\n\nNothing is sent anywhere else. The local state file lives under `~/.openclaw/state/` and contains only the version string and a timestamp.\n\n## License\n\nMIT-0 — free to use, modify, redistribute. No attribution required.\n\nFile v0.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn7bz8fq6vk4bqtfd8q20gjtgn83cc3w\",\n  \"slug\": \"post-update-awareness\",\n  \"version\": \"0.2.0\",\n  \"publishedAt\": 1777986314375\n}\n\nArchive v0.1.0: 5 files, 7229 bytes\n\nFiles: README.md (2634b), scripts/find-local-changelog.sh (1667b), scripts/probe-optional-dep.sh (1565b), SKILL.md (7640b), _meta.json (140b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: post-update-awareness\ndescription: After an OpenClaw version change, read the CHANGELOG entry pinned to the installed version and surface user-relevant changes — new tools, breaking changes, optional native dependencies that may need verification (sharp, ffmpeg, node-pty). Runs once per detected version bump. Use when OpenClaw has just been updated, when openclaw -V differs from the value on file, or when the user asks \"what changed in this update?\"\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"openclaw\",\"curl\",\"node\"]}}}\n---\n\n# Post-Update Awareness\n\nWhen OpenClaw is updated, the agent should not be the last to know. This skill reads the project CHANGELOG **for the exact installed version**, distills what changed for the user, and surfaces it once.\n\n## When to use\n\nRun this skill when **any** of the following is true:\n\n1. The user asks \"what changed in this update?\" or \"what's new in OpenClaw?\"\n2. A first-class update flow finishes (`openclaw update`, `openclaw plugins update`, or a package-manager update).\n3. `openclaw -V` returns a value different from the version recorded in the skill's state file.\n\nDo **not** run on every heartbeat. Run **once per detected version change**, then persist the new version so subsequent heartbeats stay quiet.\n\n## Scope and non-goals\n\nThis skill **only**:\n\n- Reads existing CHANGELOG content pinned to the installed version\n- Reports it to the user\n- Optionally probes for known-flaky optional native deps mentioned in the entry\n\nThis skill **does not**:\n\n- Apply updates (`openclaw update` already handles that)\n- Modify configuration\n- Install missing dependencies without explicit user confirmation\n- Roll back versions\n\n## Workflow\n\n### 1) Read the current installed version\n\n```json\n{ \"tool\": \"exec\", \"command\": \"openclaw -V\" }\n```\n\nParse the version token (e.g. `OpenClaw 2026.5.3-1 (2eae30e)` → `2026.5.3-1`).\n\n### 2) Compare against the last-known version\n\nThe skill maintains a small JSON state file at `${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/state/post-update-awareness.json`:\n\n```json\n{ \"lastKnownVersion\": \"2026.5.2\", \"lastSurfacedAt\": \"2026-05-04T13:15:00Z\" }\n```\n\n- If the file does not exist → write the current version as the baseline and **exit silently**. (No CHANGELOG dump on first run; only on actual transitions.)\n- If `currentVersion === lastKnownVersion` → exit silently.\n- If `currentVersion !== lastKnownVersion` → continue.\n\n### 3) Fetch the CHANGELOG entry pinned to the installed version\n\n**Always pin to the installed version**, never read `main`. The release tag for OpenClaw matches the version with a `v` prefix.\n\nTry in order:\n\n1. **Local install copy** (fastest, offline-friendly): typical paths are platform-dependent. Try the directory of the npm install root first:\n   ```bash\n   {baseDir}/scripts/find-local-changelog.sh\n   ```\n   This script searches common install locations and prints the path if found.\n\n2. **Remote, pinned to tag**:\n   ```bash\n   curl -fsSL \"https://raw.githubusercontent.com/openclaw/openclaw/v<currentVersion>/CHANGELOG.md\"\n   ```\n   The `v` prefix is required. If the remote 404s (e.g. a brand-new release tag hasn't propagated yet), retry once after 30 seconds before giving up.\n\n3. **Fallback** (only if both above fail): query the GitHub Releases API for that exact tag:\n   ```bash\n   curl -fsSL \"https://api.github.com/repos/openclaw/openclaw/releases/tags/v<currentVersion>\"\n   ```\n   Use the `body` field as the changelog content.\n\nIf all three fail, surface a single line: *\"OpenClaw was updated to vX, but I couldn't fetch the changelog to summarize what changed.\"* Do **not** invent content.\n\n### 4) Extract the section for the new version\n\nThe CHANGELOG uses `## <version>` as section headings. Extract only the section between `## <currentVersion>` and the next `## ` heading. Do not dump the whole file.\n\nIf the section heading isn't found in the pinned changelog (rare — usually means the release tag exists but the changelog hasn't been updated for it), use the `Unreleased` section as a fallback only when the pinned-tag fetch came from `main`. When pinned to an actual release tag, prefer \"no detailed notes available\" over guessing.\n\n### 5) Distill into 3 buckets\n\nGroup items into:\n\n- **🆕 New for you** — new tools, commands, channels, capabilities the agent could benefit from. Filter ruthlessly to what an end-user agent actually touches; skip internal refactor lines, build-system changes, and CI plumbing.\n- **⚠️ Breaking or removed** — anything that changes current behavior: removed config keys, renamed CLI commands, deprecated features, security tightenings.\n- **🔧 May need attention** — optional native dependencies (`sharp`, `ffmpeg`, `node-pty`, `libvips`, etc.), peer-dep notes, post-install scripts, config-format migrations.\n\nEach bucket: 1–4 bullets max. Omit empty buckets entirely.\n\n### 6) Probe known-flaky optional deps (best effort)\n\nIf the \"May need attention\" bucket mentions a known native module, probe non-blockingly:\n\n```bash\n{baseDir}/scripts/probe-optional-dep.sh sharp\n```\n\nThe script returns `OK`, `MISSING`, or `ERROR <msg>`. Annotate findings inline in the surfaced summary as `❌ sharp (image processing) — not installed`. Do **not** auto-install.\n\nDefault known list (extend as the project evolves):\n\n- `sharp` — image attachment optimization\n- `ffmpeg-static` / system `ffmpeg` — audio/video transcoding\n- `node-pty` — terminal/PTY tools\n\n### 7) Surface to the user\n\nSend **one** brief message via the active channel.\n\n```\nOpenClaw updated to <newVersion> (was <oldVersion>).\n\n🆕 New for you:\n- <bullet>\n\n⚠️ Breaking or removed:\n- <bullet>\n\n🔧 May need attention:\n- ❌ sharp (image processing) — not installed; run: <install command>\n\nFull notes: https://github.com/openclaw/openclaw/blob/v<newVersion>/CHANGELOG.md\n```\n\n**Hard cap: ~15 lines.** Drop empty sections. If everything is quiet:\n\n```\nOpenClaw updated to <newVersion>. Nothing in the changelog requires action on my end.\n```\n\n### 8) Persist new state\n\nWrite the new version + surfaced timestamp to the state file. Subsequent heartbeats stay silent unless the version changes again.\n\n## Voice\n\nThis is an operational notice, not a marketing email. Terse, factual, no celebratory language.\n\n- ✅ \"OpenClaw updated to 2026.5.3-1. New: agent can now use the `talk` realtime voice tool. Watch: optional `sharp` is not installed; some image replies will fall back to original-size send.\"\n- ❌ \"🎉 Exciting news! OpenClaw has been upgraded with brand-new features...\"\n\n## Failure modes\n\n| Situation | Behavior |\n|---|---|\n| CHANGELOG section missing for the version | One-line \"OpenClaw updated to vX. No detailed notes for this tag yet — see GitHub Releases for raw notes.\" |\n| No internet, no local copy | Same as above. |\n| State file write fails | Log error; surface still happens; next run will re-surface. |\n| Probe script not executable / shell unavailable | Skip the probe section; report changes without dep status. |\n\n## Why this exists\n\nOpenClaw releases are well-documented in `CHANGELOG.md` and per-version GitHub Releases, but the running agent has no built-in mechanism to *consume* that information after an update. Real-world consequence: when an update introduces a new optional native-dep requirement (e.g. `sharp` for image attachment optimization), the user discovers it only when an unrelated workflow fails.\n\nThis skill closes that loop using the existing CHANGELOG as source of truth, pinned to the installed version so the agent reads the changelog that matches what's actually running — not whatever has been merged since.\n\nFile v0.1.0:README.md\n\n# post-update-awareness\n\nA ClawHub skill that makes your OpenClaw agent **read its own release notes** after an update.\n\n## What it does\n\nWhen OpenClaw is updated, the agent has no built-in mechanism to consume the release notes — so optional-dependency surprises (e.g. a new release expects `sharp` to be installed) are discovered the hard way: when an unrelated workflow fails, in front of someone you care about.\n\nThis skill closes that loop:\n\n1. Detects a version change between current `openclaw -V` and a small JSON state file the skill maintains.\n2. Fetches the CHANGELOG entry **pinned to the installed version's tag** (`v<version>`), not `main`. So the agent reads the changelog that matches what's actually running.\n3. Distills the entry into three buckets the user actually cares about — new tools, breaking changes, optional native deps to verify.\n4. Probes known-flaky native modules (`sharp`, `ffmpeg-static`, `node-pty`) to flag missing ones.\n5. Sends one brief surfaced message via the active channel, then persists the new version so subsequent heartbeats stay quiet.\n\n## Install\n\n```bash\nopenclaw skills install post-update-awareness\n```\n\nOr via the ClawHub CLI:\n\n```bash\nclawhub install post-update-awareness\n```\n\n## When the skill triggers\n\n- The user asks \"what changed in this update?\" or similar\n- An update flow finishes (`openclaw update`, `openclaw plugins update`)\n- `openclaw -V` returns a value different from the version on file\n\nIt does **not** run on every heartbeat — only on actual version transitions.\n\n## What it does not do\n\n- Apply updates (that's `openclaw update`)\n- Modify configuration\n- Install missing dependencies — only flags them\n- Roll back versions\n\n## Files\n\n- `SKILL.md` — the skill instructions the agent reads\n- `scripts/find-local-changelog.sh` — locates the bundled CHANGELOG.md if available\n- `scripts/probe-optional-dep.sh` — non-blocking native-dep loadability check\n\n## Why a skill rather than core\n\nOpenClaw's project direction (per `VISION.md`) is that new skills publish through ClawHub first; bundled promotion happens later if a clear product, security, or maintainer-ownership reason emerges. This is that ClawHub-first version of the idea.\n\n## Privacy\n\nThe skill reads:\n- `openclaw -V` (local CLI output)\n- The pinned CHANGELOG via `raw.githubusercontent.com` (one HTTPS request per detected version change, no auth, no telemetry)\n\nNothing is sent anywhere else. The local state file lives under `~/.openclaw/state/` and contains only the version string and a timestamp.\n\n## License\n\nMIT-0 — free to use, modify, redistribute. No attribution required.\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7bz8fq6vk4bqtfd8q20gjtgn83cc3w\",\n  \"slug\": \"post-update-awareness\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1777923628192\n}","readmeExcerpt":"Skill: Post Update Awareness Owner: hussein1362 Summary: After an OpenClaw version change, read the CHANGELOG entry pinned to the installed version and surface user-relevant changes — new tools, breaking changes, o... Tags: awareness:0.1.0, changelog:0.1.0, latest:0.4.0, openclaw:0.1.0, update:0.1.0 Version history: v0.4.0 | 2026-05-26T19:37:56.033Z | user Strict read-only split. All mutation paths removed (offering ","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{ \"tool\": \"exec\", \"command\": \"openclaw -V\" }"},{"language":"json","snippet":"{\n  \"lastKnownVersion\": \"2026.5.2\",\n  \"lastSurfacedAt\": \"2026-05-04T13:15:00Z\",\n  \"profile\": \"noura-moi\"\n}"},{"language":"bash","snippet":"grep -E \"VERSION CHANGE detected:.*v<currentVersion>\" \\\n  \"$HOME/.openclaw-<profile>/update-guard/update-guard.log\" 2>/dev/null | tail -1"},{"language":"bash","snippet":"{baseDir}/scripts/find-local-changelog.sh"},{"language":"bash","snippet":"curl -fsSL \"https://raw.githubusercontent.com/openclaw/openclaw/v<currentVersion>/CHANGELOG.md\""},{"language":"bash","snippet":"curl -fsSL \"https://raw.githubusercontent.com/openclaw/openclaw/v<currentVersion>/CHANGELOG.md\""}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: post-update-awareness\ndescription: After an OpenClaw version change, read the CHANGELOG entry pinned to the installed version and surface user-relevant changes — new tools, breaking changes, optional native dependencies that may need verification (sharp, ffmpeg, node-pty). Runs once per detected version bump. Use when OpenClaw has just been updated, when openclaw -V differs from the value on file, or when the user asks \"what changed in this update?\"\nmetadata: {\"openclaw\":{\"requires\":{\"bins\":[\"openclaw\",\"curl\",\"node\"]}}}\n---\n\n# Post-Update Awareness\n\nWhen OpenClaw is updated, the agent should not be the last to know. This skill reads the project CHANGELOG **for the exact installed version**, distills what changed for the user, and surfaces it once.\n\n## When to use\n\nRun this skill when **any** of the following is true:\n\n1. The user asks \"what changed in this update?\" or \"what's new in OpenClaw?\"\n2. A first-class update flow finishes (`openclaw update`, `openclaw plugins update`, or a package-manager update).\n3. `openclaw -V` returns a value different from the version recorded in the skill's state file.\n\nDo **not** run on every heartbeat. Run **once per detected version change**, then persist the new version so subsequent heartbeats stay quiet.\n\n## Scope and non-goals\n\nThis skill **only**:\n\n- Reads existing CHANGELOG content pinned to the installed version\n- Reports it to the user\n- Optionally probes for known-flaky optional native deps mentioned in the entry\n\nThis skill **does not**:\n\n- Apply updates (`openclaw update` already handles that)\n- Modify configuration\n- Install missing dependencies without explicit user confirmation\n- Roll back versions\n\n## Workflow\n\n### 1) Read the current installed version\n\n```json\n{ \"tool\": \"exec\", \"command\": \"openclaw -V\" }\n```\n\nParse the version token (e.g. `OpenClaw 2026.5.3-1 (2eae30e)` → `2026.5.3-1`).\n\n### 2) Compare against the last-known version\n\nThe skill maintains a small JSON state file per profile.\n\n**Path resolution** (first match wins):\n\n1. `$OPENCLAW_PROFILE_DIR/state/post-update-awareness.json` — when the runtime exports `OPENCLAW_PROFILE_DIR`\n2. `$HOME/.openclaw-<profile>/state/post-update-awareness.json` — when a profile name is known (e.g. from `openclaw --profile <name>` or the `OPENCLAW_PROFILE` env var)\n3. `$HOME/.openclaw/state/post-update-awareness.json` — single-profile / default fallback\n\nThis matters because the same machine can run multiple profiles (`main`, `noura-moi`, `amber`, …) and each one can independently update on its own cadence. A single shared state file caused the skill to go silent on profile B after surfacing on profile A — the bug the v0.3 path resolver fixes.\n\nContents:\n\n```json\n{\n  \"lastKnownVersion\": \"2026.5.2\",\n  \"lastSurfacedAt\": \"2026-05-04T13:15:00Z\",\n  \"profile\": \"noura-moi\"\n}\n```\n\n- If the file does not exist → write the current version as the baseline and **exit silently**. (No CHANGELOG dump on first run; only on actual transitions.)\n- If `currentVersio"},{"path":"README.md","content":"# post-update-awareness\n\nA ClawHub skill that makes your OpenClaw agent **read its own release notes** after an update.\n\n## What it does\n\nWhen OpenClaw is updated, the agent has no built-in mechanism to consume the release notes — so optional-dependency surprises (e.g. a new release expects `sharp` to be installed) are discovered the hard way: when an unrelated workflow fails, in front of someone you care about.\n\nThis skill closes that loop:\n\n1. Detects a version change between current `openclaw -V` and a small per-profile JSON state file the skill maintains.\n2. Fetches the CHANGELOG entry **pinned to the installed version's tag** (`v<version>`), not `main`. So the agent reads the changelog that matches what's actually running.\n3. Distills the entry into three buckets the user actually cares about — new tools, breaking changes, optional native deps to verify.\n4. Probes known-flaky native modules (`sharp`, `ffmpeg-static`, `node-pty`) to flag missing ones.\n5. **Detects plugin version drift** — catches the case where the gateway is on `vNew` but an externalized npm-installed plugin (`@openclaw/whatsapp`, `@openclaw/discord`, etc.) is still on `vOld`.\n6. **Verifies channel health** post-restart (`channels status`) and surfaces any `disconnected` / `unhealthy` / `degraded` channel.\n7. **Surfaces config rewrites** when `plugins update` overwrites `openclaw.json`, including the path to the auto-saved `.bak`.\n8. **Yields to the update-guard** when one is already watching the same transition, so the user isn't notified twice for the same bump.\n9. Sends one brief surfaced message via the active channel, then — **only on confirmed delivery** — persists the new version so subsequent heartbeats stay quiet.\n\n## What's new in 0.4.0\n\n- **Strict read-only posture.** All mutation paths (offering to update drifted plugins, cleaning stale config entries) have been removed. This skill now only reads and notifies. For the mutation flow, see the companion skill **[post-update-maintenance](https://clawhub.ai/skills/post-update-maintenance)**, which is explicitly scoped for changes.\n- This split was made in response to security scanner feedback flagging the previous combined behavior as scope-contradictory. Trust posture is now clear: this skill is safe to install and run on any heartbeat.\n\n## What's new in 0.3.x\n\n- **Profile-aware state file.** Multi-profile setups (`main` + `noura-moi` + …) no longer share a single state file, which was silencing the skill on profile B after surfacing on profile A.\n- **Surface-then-persist ordering.** State is now written only after the channel acknowledges the message, with a retry cap. Channel blips no longer eat the notification.\n- **Update-guard awareness.** When an external update-guard already announced the version change, the skill skips the redundant header and goes straight into the CHANGELOG distillation.\n- **`scripts/resolve.sh`.** Stable resolver for callers outside the skill (safe-update wrappers, cron jobs) so they stop "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7bz8fq6vk4bqtfd8q20gjtgn83cc3w\",\n  \"slug\": \"post-update-awareness\",\n  \"version\": \"0.4.0\",\n  \"publishedAt\": 1779824276033\n}"},{"path":"skill-card.md","content":"## Description:\n\nAfter an OpenClaw version change, this skill reads the CHANGELOG entry pinned to the installed version and surfaces user-relevant changes, breaking changes, and optional native dependencies that may need verification.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[hussein1362](https://clawhub.ai/user/hussein1362)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nOpenClaw users and operators use this skill after an update to detect version changes, summarize pinned release notes, and flag plugin drift, channel health, optional dependency, or config warnings without performing maintenance actions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill reads local OpenClaw version, plugin, channel, update-guard, and per-profile state information.\n\nMitigation: Install it only where those local operational signals are appropriate to inspect, and keep surfaced output limited to update-relevant diagnostics.\n\nRisk: The skill may make unauthenticated GitHub requests for pinned release notes when no local changelog is available.\n\nMitigation: Prefer the local changelog when present and request only the exact installed version tag; offline environments should expect the no-notes fallback.\n\nRisk: The skill may identify plugin drift, stale config entries, missing optional dependencies, or unhealthy channels but is not scoped to fix them.\n\nMitigation: Leave updates, config edits, dependency installs, and restarts to the user or the separate post-update-maintenance skill.\n\nRisk: Writing notification state too early could suppress future update notices.\n\nMitigation: Persist the per-profile state file only after the update notice has been successfully surfaced and acknowledged.\n\n## Reference(s):\n\n- [Post Update Awareness on ClawHub](https://clawhub.ai/hussein1362/skills/post-update-awareness)\n- [OpenClaw versioned CHANGELOG](https://github.com/openclaw/openclaw/blob/v<newVersion>/CHANGELOG.md)\n- [Post Update Maintenance companion skill](https://clawhub.ai/skills/post-update-maintenance)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration guidance]\n\n**Output Format:** [Concise Markdown notice with short bullet buckets and inline shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Caps the surfaced notice at about 18 lines and writes per-profile state only after successful surfacing.]\n\n## Skill Version(s):\n\n0.4.0 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1756,"uniquenessScore":42,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T23:51:23.675Z","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-11T23:51:23.675Z","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-14T14:14:55.556Z","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"}]}}}