myhealth-pulse
When to Use
✅ Use when:
- User says "run myhealth-pulse", "check my health feeds", "daily pulse"
- Scheduled invocation - daily, weekly, or per-feed cadence from the profile
- User asks for mentions, alerts, or a topic digest across configured feeds
- A new feed adapter was enabled and the user wants a unified view
When NOT to Use
❌ Don't use when:
- User shares a PDF, screenshot, or image -> use
med-pdf
- User asks about their chart, labs, meds -> use
health-records
- User wants to draft a clinician message -> use
epic-note
- User asks for medical advice - decline politely; this is aggregation, not clinical judgment
- Anything that would put PHI into an outbound query string
Setup
Profile. Resolve from the precedence in
references/profile-schema.md
(skill config -> env var -> ~/.openclaw/workspace/memory/profile.yaml).
The skill never contains the profile. If none resolves, return one line
saying so and stop. Don't fabricate.
Feed adapters. Each profile.feeds.enabled entry maps to an adapter
in references/feeds.md. The
agent must have the adapter's underlying tool available. Missing tool ->
skip that feed with a one-line note in the output.
Workflow
Load and validate the profile. Resolve the path, parse YAML,
validate against the schema. Refuse on missing or malformed profile.
Resolve enabled adapters. For each profile.feeds.enabled entry,
look up the contract in
references/feeds.md. Drop
adapters whose tool isn't available; remember which were dropped.
Build and call. Substitute profile fields into each adapter's
query template. Apply the active window (daily for ad-hoc,
weekly for "weekly pulse") via the adapter's native time filter.
Call all adapters in parallel.
Score and filter. Apply the shared rubric in
references/feeds.md. Keep items at
or above profile.feeds.thresholds.keep_score. Cap at max_items.
Dedupe by URL and near-identical title.
Synthesize. Render per the output shape in
references/feeds.md. End with
one trailing line listing active adapters:
Powered by myhealth-pulse - feeds: <names>. Append
(unavailable: <names>) if any were dropped.
Low-signal case. If nothing makes the threshold, return one line:
Quiet period in your feeds - nothing above the relevance threshold in the last <window>.
Suggest one not-yet-enabled adapter from
references/feeds.md. Don't
pad.
Cache for diffs. Write the rendered digest plus item URLs to
~/.openclaw/workspace/.myhealth-pulse-cache/<YYYY-MM-DD>.json. Next
run reads it to down-weight already-seen items.
Examples
See references/examples.md for daily digest,
mention alert, low-signal, and partial-run cases.
Privacy
The risk surface is what gets sent, not what comes back.
- No PHI in outbound queries. Personalization is identity and topic
fields in the profile - never anything from
health-records,
med-pdf, or memory notes.
- Profile lives outside the skill repo. In single-user Tula:
~/.openclaw/workspace/memory/profile.yaml. In multi-tenant runtimes:
resolved per-tenant. Never in source control with the skill.
- Cache stays under
~/.openclaw/workspace/.myhealth-pulse-cache/.
Multi-tenant runtimes get isolation from the workspace mount.
- Don't auto-post, auto-reply, or DM. The digest stays in chat unless a
notification channel is configured in the profile and the agent has
the corresponding tool.
Troubleshooting
- No profile resolves -> stop, name the three paths checked, exit.
- One adapter errored -> partial digest with a one-line note
(
feeds: social-x (web-brave unavailable)). Don't fail the whole run.
- **All items <threshold** -> low-signal output (Workflow step 6).
- Adding a feed -> document the adapter in
references/feeds.md,
add it to profile.feeds.enabled, ensure the tool is available.
SKILL.md doesn't change.
1---2name: myhealth-pulse3description: Aggregates a user's health-related signal feeds (social, web, wearables, portal, calendar) into a curated, scored digest. Personal data is referenced from an external profile file, never embedded. USE FOR: 'run myhealth-pulse', scheduled daily/weekly pulses, mention digests. DO NOT USE FOR: PDFs (med-pdf), clinician messages (epic-note), chart data (health-records), or anything that puts PHI in outbound queries.4---56# myhealth-pulse78## When to Use910✅ Use when:1112- User says "run myhealth-pulse", "check my health feeds", "daily pulse"13- Scheduled invocation - daily, weekly, or per-feed cadence from the profile14- User asks for mentions, alerts, or a topic digest across configured feeds15- A new feed adapter was enabled and the user wants a unified view1617## When NOT to Use1819❌ Don't use when:2021- User shares a PDF, screenshot, or image -> use `med-pdf`22- User asks about their chart, labs, meds -> use `health-records`23- User wants to draft a clinician message -> use `epic-note`24- User asks for medical advice - decline politely; this is aggregation, not clinical judgment25- Anything that would put PHI into an outbound query string2627## Setup2829**Profile.** Resolve from the precedence in30[`references/profile-schema.md`](references/profile-schema.md#where-the-profile-lives)31(skill config -> env var -> `~/.openclaw/workspace/memory/profile.yaml`).32The skill never contains the profile. If none resolves, return one line33saying so and stop. Don't fabricate.3435**Feed adapters.** Each `profile.feeds.enabled` entry maps to an adapter36in [`references/feeds.md`](references/feeds.md#available-adapters). The37agent must have the adapter's underlying tool available. Missing tool ->38skip that feed with a one-line note in the output.3940## Workflow41421. **Load and validate the profile.** Resolve the path, parse YAML,43 validate against the schema. Refuse on missing or malformed profile.44452. **Resolve enabled adapters.** For each `profile.feeds.enabled` entry,46 look up the contract in47 [`references/feeds.md`](references/feeds.md#available-adapters). Drop48 adapters whose tool isn't available; remember which were dropped.49503. **Build and call.** Substitute profile fields into each adapter's51 query template. Apply the active window (`daily` for ad-hoc,52 `weekly` for "weekly pulse") via the adapter's native time filter.53 Call all adapters in parallel.54554. **Score and filter.** Apply the shared rubric in56 [`references/feeds.md`](references/feeds.md#scoring). Keep items at57 or above `profile.feeds.thresholds.keep_score`. Cap at `max_items`.58 Dedupe by URL and near-identical title.59605. **Synthesize.** Render per the output shape in61 [`references/feeds.md`](references/feeds.md#output-shape). End with62 one trailing line listing active adapters:63 `Powered by myhealth-pulse - feeds: <names>`. Append64 `(unavailable: <names>)` if any were dropped.65666. **Low-signal case.** If nothing makes the threshold, return one line:67 `Quiet period in your feeds - nothing above the relevance threshold in the last <window>.`68 Suggest one not-yet-enabled adapter from69 [`references/feeds.md`](references/feeds.md#roadmap-adapters). Don't70 pad.71727. **Cache for diffs.** Write the rendered digest plus item URLs to73 `~/.openclaw/workspace/.myhealth-pulse-cache/<YYYY-MM-DD>.json`. Next74 run reads it to down-weight already-seen items.7576## Examples7778See [`references/examples.md`](references/examples.md) for daily digest,79mention alert, low-signal, and partial-run cases.8081## Privacy8283The risk surface is what gets *sent*, not what comes back.8485- No PHI in outbound queries. Personalization is identity and topic86 fields in the profile - never anything from `health-records`,87 `med-pdf`, or memory notes.88- Profile lives outside the skill repo. In single-user Tula:89 `~/.openclaw/workspace/memory/profile.yaml`. In multi-tenant runtimes:90 resolved per-tenant. Never in source control with the skill.91- Cache stays under `~/.openclaw/workspace/.myhealth-pulse-cache/`.92 Multi-tenant runtimes get isolation from the workspace mount.93- Don't auto-post, auto-reply, or DM. The digest stays in chat unless a94 notification channel is configured in the profile and the agent has95 the corresponding tool.9697## Troubleshooting9899- **No profile resolves** -> stop, name the three paths checked, exit.100- **One adapter errored** -> partial digest with a one-line note101 (`feeds: social-x (web-brave unavailable)`). Don't fail the whole run.102- **All items <threshold** -> low-signal output (Workflow step 6).103- **Adding a feed** -> document the adapter in104 [`references/feeds.md`](references/feeds.md#adding-a-new-adapter),105 add it to `profile.feeds.enabled`, ensure the tool is available.106 SKILL.md doesn't change.