skills/project-heartbeat/SKILL.md
Generate a client-facing project heartbeat / status update message for a Kanopi project, ready to be posted as a Teamwork message. Use this skill whenever the user asks to write, draft, generate, or send a project update, heartbeat, status update, or progress report to a client. Also triggers when the user says things like "time for a project update", "draft the heartbeat", "write up the update for [project]", or "it's been two weeks, let's send an update". Always use this skill — even if the user doesn't say "heartbeat" — whenever the intent is to summarise recent project activity for a client audience.
npx skillsauth add kanopi/cms-cultivator project-heartbeatInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate a polished, client-facing Teamwork project update message by pulling recent activity from Teamwork and Fathom, then drafting it in Andrew's established voice and format.
If the conversation is happening inside a named Claude Project, infer the project from that context and confirm with the user before proceeding:
"I'll draft a heartbeat for [Project Name] — is that right?"
If the project is ambiguous or not obvious, ask directly:
"Which Teamwork project should I pull the heartbeat for?"
Once confirmed, look up the project in Teamwork to get its project_id.
⚠️ Critical: Heartbeat updates are posted as replies to a single long-running message thread, not as separate messages. The parent message may have been created months ago — its date is irrelevant. You must look at the replies, not the parent.
Using the Teamwork MCP:
list_messages to find the project's heartbeat/update message thread (typically titled "Project Update" or similar).list_message_replies with that message ID to fetch all replies.createdAt descending and taking the first result.createdAt of that most recent reply.Do not use the parent message's createdAt under any circumstances. The parent is just the thread container — the actual updates live in the replies.
Before moving to Step 3, confirm the window with the user:
"The last heartbeat reply was posted on [createdAt of most recent reply]. I'll pull activity from then through today ([TODAY]). Does that look right?"
Wait for confirmation before proceeding.
createdAt of the most recent reply in the heartbeat threadIf the message thread has no replies at all, fall back to the parent message's createdAt and note this is effectively the first update since the thread was opened.
Use Teamwork MCP tools for all Teamwork data (projects, tasks, messages). Use Fathom MCP tools for all meeting data.
Use the Teamwork MCP to pull all tasks completed within the reporting window for the project. Group them loosely by theme or tasklist (e.g. Discovery, Technical, UX, Content). Focus on tasks that would be meaningful to a client — skip purely internal admin tasks.
Use the Teamwork MCP to pull project messages from the reporting window. Scan for:
Use the Fathom MCP to search for meetings associated with this project during the reporting window. From each meeting, extract:
Use the Slack MCP to find and read the project's Slack channel. The channel name is typically
just the client name (e.g. #smalley for the Smalley project, #acme for an Acme project).
slack_search_channels to find the channel by the client/project name if the channel ID isn't already known.slack_read_channel to read messages within the reporting window. Filter to messages
that fall between the reporting window start date and today.If no matching channel is found, skip this step silently and proceed with the other sources.
If a Statement of Work or project brief has been added to this Claude Project as context, use it to:
Budget data is not pulled automatically — leave a clear placeholder in the draft:
[BUDGET TABLE — Please fill in manually:
Reporting Period: Thru [DATE]
Total Hours Used: [X]
Table: Item | Hours Allocated | Hours Used | Hours Remaining | Notes]
Use the structure and tone from the reference examples below. Write in Andrew's voice: warm, professional, client-focused, concise. Avoid internal jargon. Do not mention specific team member names unless they were already shared with the client.
@[Client contacts]
[Opening paragraph — 2–4 sentences]
Warm opener referencing where the project is at. High-level summary of the period's
momentum. Keep it energetic but grounded.
[1–2 body paragraphs]
Narrative summary of what happened. Weave together completed work, meeting outcomes,
and key decisions. Don't just list — tell the story of progress.
---
### Budget
Reporting Period: Thru [DATE]
Total Hours Used: [X]
[BUDGET TABLE PLACEHOLDER]
---
### Timeline
- Projected Completion Date: [from SOW or previous update]
---
### Recent Highlights
- [Bullet per meaningful completed item, decision, or milestone]
- Keep to 6–10 bullets max
- Client-facing language only
---
### Looking Ahead
- [Bullet per upcoming task, next step, or open item needing client input]
- Flag any items requiring client action clearly
---
Please let me know if there are any items we may have missed or if there is anything
you would like to discuss in additional detail.
Cheers,
Andrew
Show the full draft in the chat as a clean, readable message (not HTML). Below the draft, add a short "Sources Used" summary — e.g.:
Sources used: 12 completed tasks (Apr 22–May 7), 3 Fathom meeting summaries (Apr 23, Apr 28, May 1), 4 Teamwork messages, 18 Slack messages (#smalley). Budget table left blank for manual entry.
Then ask:
"Want me to adjust the tone, add/remove anything, or post this to Teamwork once you're happy?"
Based on Andrew's existing updates, the tone should be:
Avoid:
tools
Strategist-focused site audit for discovery and pre-discovery. Given a site URL and optional qualitative research data, navigates the site via CoWork, audits against all 21 UX Laws from lawsofux.com, reviews content hierarchy, synthesises qualitative data, runs Lighthouse, and produces two deliverables — a Project Knowledge Summary (Markdown for Claude Desktop Projects) and a polished, iterable HTML Artifact for client sharing. Use when a strategist, UX lead, or PM asks for a discovery audit, UX laws audit, content hierarchy review, pre-discovery site review, "audit this site for strategy", "strategist audit", "UX audit", or pastes a site URL with discovery context. Not for developer audits — use accessibility-audit, performance-audit, or live-site-audit for those.
development
Provide story point estimation guidance with hour calculations for software development tasks. Uses Fibonacci sequence (1, 2, 3, 5, 8, 13, 21, 34+) and converts story points to hours. Includes platform-specific adjustments and velocity calculations.
tools
Perform a full QA review of a Teamwork task by reading the task and all its comments for context, extracting the multi-dev URL, generating dynamic validation steps tailored to the task type, and using CoWork browser automation to execute those steps on the multi-dev environment. Produces a structured validation report with pass/fail per step, screenshots, internal notes, and a client-facing summary — all shown in chat. Use this skill whenever the user asks to QA, test, validate, or review a Teamwork task or multi-dev environment — even if they just say "can you QA this?" or paste a Teamwork link. Also triggers for phrases like "run QA on", "check the multi-dev", "validate this task", "test the dev link", or "review the ticket". Works across Drupal/CMS updates, WordPress/plugin updates, bug fixes, new feature development, and general web development tasks.
tools
Quickly prepare a PM for an upcoming client check-in by pulling together context from Teamwork (tasks + messages), Gmail, Slack, and Fathom meeting recordings. Produces a structured briefing with talking points, ticket progress, new feature requests, and suggested next steps — then optionally generates a formatted agenda. Use this skill whenever the user says things like: - "prep me for my meeting with [client]" - "I have a check-in with [project] tomorrow, help me prep" - "what do I need to know before my call with [client]?" - "get me ready for [project name] meeting" - "meeting prep for [project]" Always trigger this skill when meeting preparation is the goal, even if the user doesn't say "skill" or "prep" explicitly. If the user mentions a client name or project name alongside a meeting, check-in, or call — use this skill.