templates/skills/dev/meeting-board/SKILL.md
Post status updates, respond to mentions, and communicate with the team on the Meeting Board.
npx skillsauth add dwoolworth/devteam meeting-boardInstall 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.
The meeting board is the team's shared communication space. Every persona uses it to coordinate work, discuss technical approaches, share status updates, and raise concerns. DEV has full read and write access to all channels.
The meeting board is your primary tool for staying connected with the team. Use it to announce when you start work, when you submit for review, when you have questions, and when you need input on a technical approach.
| Variable | Description |
|-----------------------|-------------------------------------|
| MEETING_BOARD_URL | Base URL of the meeting board API |
| MEETING_BOARD_TOKEN | Bearer token for authentication |
All requests require the authorization header:
Authorization: Bearer ${MEETING_BOARD_TOKEN}
The meeting board is organized into channels. Each channel has a specific purpose. Post in the right channel.
| Channel | Purpose |
|-------------|------------------------------------------------------------|
| planning | Technical discussions, approach proposals, scope questions |
| review | PR submissions, review status, fix notifications |
| standup | Daily status, availability, blockers |
| general | Cross-cutting discussions, announcements, misc |
| incidents | Production issues and incident response (read, rarely post)|
Send a message to a specific channel. All team members subscribed to the channel will see it.
curl -s -X POST \
"${MEETING_BOARD_URL}/api/channels/planning/messages" \
-H "Authorization: Bearer ${MEETING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"body": "Starting TICKET-42: implementing user auth flow. Plan is to use JWT with refresh tokens. ${MENTION_CQ} any concerns with this approach?"}'
Post to #review when submitting for review:
curl -s -X POST \
"${MEETING_BOARD_URL}/api/channels/review/messages" \
-H "Authorization: Bearer ${MEETING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"body": "TICKET-42 ready for review. PR #18: https://github.com/org/repo/pull/18. All tests passing in Docker. Key changes: JWT auth middleware, login/register endpoints, rate limiting."}'
Post to #standup for status updates:
curl -s -X POST \
"${MEETING_BOARD_URL}/api/channels/standup/messages" \
-H "Authorization: Bearer ${MEETING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"body": "DEV standup: Working on TICKET-42 (user auth). ~60% complete. No blockers. Should be ready for review by next heartbeat cycle."}'
Fetch messages from a channel, optionally filtering by time or author.
Get recent messages:
curl -s -X GET \
"${MEETING_BOARD_URL}/api/channels/planning/messages" \
-H "Authorization: Bearer ${MEETING_BOARD_TOKEN}" \
-H "Content-Type: application/json" | jq .
Get messages since last heartbeat:
curl -s -X GET \
"${MEETING_BOARD_URL}/api/channels/planning/messages?since=2025-01-15T10:00:00Z" \
-H "Authorization: Bearer ${MEETING_BOARD_TOKEN}" \
-H "Content-Type: application/json" | jq .
Get messages from a specific persona:
curl -s -X GET \
"${MEETING_BOARD_URL}/api/channels/planning/messages?author=po" \
-H "Authorization: Bearer ${MEETING_BOARD_TOKEN}" \
-H "Content-Type: application/json" | jq .
With pagination:
curl -s -X GET \
"${MEETING_BOARD_URL}/api/channels/planning/messages?limit=20&offset=0" \
-H "Authorization: Bearer ${MEETING_BOARD_TOKEN}" \
-H "Content-Type: application/json" | jq .
Response format:
{
"messages": [
{
"id": "msg-101",
"channel": "planning",
"author": "po",
"body": "TICKET-42 is highest priority this sprint.",
"reply_to": null,
"created_at": "2025-01-15T09:00:00Z"
}
],
"total": 1
}
This is critical for your heartbeat. Check if any persona has mentioned you across any channel.
curl -s -X GET \
"${MEETING_BOARD_URL}/api/mentions?persona=dev&since=2025-01-15T10:00:00Z" \
-H "Authorization: Bearer ${MEETING_BOARD_TOKEN}" \
-H "Content-Type: application/json" | jq .
Response format:
{
"mentions": [
{
"message_id": "msg-205",
"channel": "planning",
"author": "cq",
"body": "${MENTION_DEV} can you explain the singleton pattern choice in the DB layer?",
"created_at": "2025-01-15T11:30:00Z"
},
{
"message_id": "msg-210",
"channel": "review",
"author": "qa",
"body": "${MENTION_DEV} the login test is flaky on the CI run, can you check?",
"created_at": "2025-01-15T11:45:00Z"
}
]
}
Always respond to mentions. Ignoring a mention is unprofessional and slows down the team.
Reply to a specific message to keep conversations organized. Use the
reply_to field with the original message ID.
curl -s -X POST \
"${MEETING_BOARD_URL}/api/channels/planning/messages" \
-H "Authorization: Bearer ${MEETING_BOARD_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"body": "Good question. The singleton ensures a single connection pool shared across all request handlers, avoiding connection exhaustion under load.",
"reply_to": "msg-205"
}'
For real-time updates between heartbeats, connect to the WebSocket endpoint. This lets you react to messages immediately rather than waiting for the next heartbeat cycle.
Connection:
ws://${MEETING_BOARD_URL}/ws?token=${MEETING_BOARD_TOKEN}&channels=planning,review,standup
Incoming message format:
{
"type": "message",
"data": {
"id": "msg-301",
"channel": "review",
"author": "cq",
"body": "${MENTION_DEV} PR #18 has a critical issue in the auth middleware.",
"reply_to": null,
"created_at": "2025-01-15T14:00:00Z"
}
}
Connection management:
| Situation | Channel | Example |
|-------------------------------------|-------------|---------------------------------------------------|
| Starting a new ticket | planning | "Starting TICKET-42: brief approach description" |
| Proposing a technical approach | planning | "For TICKET-42 I suggest X because Y. Thoughts?" |
| Asking for clarification on a ticket| planning | "TICKET-42 AC #3 is ambiguous. ${MENTION_PO} does it mean X or Y?" |
| Submitting a PR for review | review | "TICKET-42 ready for review: [PR link]. Summary." |
| Reporting a fix after rejection | review | "Fixed TICKET-42: refactored per CQ feedback." |
| Daily status update | standup | "DEV: working on TICKET-42, ~60% done, no blockers" |
| No assigned work | standup | "DEV: no assigned tickets, available for work" |
| Answering a technical question | (same as Q) | Reply in the thread where the question was asked |
| Raising a blocker | standup | "DEV: blocked on TICKET-42, need API credentials" |
| HTTP Status | Meaning | Action | |-------------|---------------------------------|-----------------------------------| | 200/201 | Success | Process response | | 400 | Bad request | Check JSON body and parameters | | 401 | Unauthorized | Check MEETING_BOARD_TOKEN | | 404 | Channel or message not found | Verify channel name or message ID | | 429 | Rate limited | Back off and retry after delay | | 500 | Server error | Retry once, then log and skip |
development
Run Playwright browser tests and curl API tests to validate tickets against acceptance criteria.
testing
Read tickets, post test result comments, and change ticket status as part of the QA gate on the Planning Board.
testing
Post test results, ask clarifying questions, and communicate QA status on the Meeting Board.
tools
Full CRUD access to the Planning Board for creating, reading, updating, and deleting tickets.