Generate daily team intelligence brief by cross-referencing GitHub, Linear, Slack, PostHog, meetings, and braindumps with two-way Linear sync-back
44
47%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Risky
Do not use without reviewing
Optimize this skill with Tessl
npx tessl skill review --optimize ./.claude/skills/team-brief/SKILL.mdCheck agent_mode in 00-inbox/MY-PROFILE.md frontmatter:
agent_mode: team — use the full parallel agent execution strategy below (6 agents)agent_mode: solo — run data collection sequentially in the main conversation. Skip Phase 3.5 (Linear sync-back) and Phase 3.7 (HackMD publish) to keep it fast.Generate a concise daily team intelligence brief focused on what we're doing, what needs attention, and what's falling through the cracks. Cross-references Linear work tracking, Slack discussions, GitHub activity, PostHog product analytics, braindumps, and recent meetings to surface insights, flag mismatches, and keep the team aligned.
Monday = Week Start Brief: If today is Monday, the brief covers Friday through Sunday (the full weekend window). All date ranges, queries, and language should reflect "since Friday" / "over the weekend" instead of "yesterday." This captures anything that happened Friday afternoon, weekend deploys, or async discussions.
This is NOT an industry news report. News/market intelligence belongs in the weekly brief.
/team-briefYou're not a reporting tool — you're a teammate who happens to have read every Slack thread, every PR, and every meeting note. Write like someone who genuinely cares about the team succeeding.
Do:
Don't:
Example tone:
Good day yesterday — we cut v1.2.0 with the new workflow, caching fix, and a bunch of UX polish. 11 PRs merged by 4 people. The team is shipping.
But we have a problem: two discovery calls in a row ended with the prospect unable to log in. The onboarding flow just doesn't work. We're building features for users who can't get through the front door.
The daily brief MUST use parallel agents to maximize speed and efficiency.
When /daily-brief is invoked, the orchestrator (main agent) should:
LOOKBACK_DATE to Friday's date. This is a Week Start Brief.LOOKBACK_DATE to yesterday's date. This is a standard Daily Brief.[CUSTOMIZE: path/to/meetings/] matching dates from LOOKBACK_DATE through today[CUSTOMIZE: path/to/braindumps/] matching dates from LOOKBACK_DATE through todayLaunch ALL of these agents in a single message using the Task tool with run_in_background: true:
Query GitHub for dev team activity on [CUSTOMIZE: your-org/your-repo].
Lookback start date: [INSERT LOOKBACK_DATE].
Today's date: [INSERT TODAY_DATE].
Brief type: [Daily Brief / Week Start Brief (Monday)]
Run these gh CLI commands (all date filters use LOOKBACK_DATE as the start):
1. PRs merged since lookback:
gh pr list --repo [CUSTOMIZE: your-org/your-repo] --state merged --search "merged:>=[LOOKBACK_DATE]" --json number,title,author,mergedAt,labels --limit 50
2. PRs opened since lookback:
gh pr list --repo [CUSTOMIZE: your-org/your-repo] --state open --search "created:>=[LOOKBACK_DATE]" --json number,title,author,createdAt,labels --limit 20
3. ALL open PRs (for stale PR detection):
gh pr list --repo [CUSTOMIZE: your-org/your-repo] --state open --json number,title,author,createdAt,reviewDecision,labels,updatedAt --limit 50
4. PR review comments since lookback (to cross-reference with Slack discussions):
gh api repos/[CUSTOMIZE: your-org/your-repo]/pulls/comments --jq '[.[] | select(.created_at >= "[LOOKBACK_DATE]")] | .[] | {pr_url: .pull_request_url, body: .body[0:200], user: .user.login, created_at: .created_at}'
5. Issues closed since lookback:
gh issue list --repo [CUSTOMIZE: your-org/your-repo] --state closed --search "closed:>=[LOOKBACK_DATE]" --json number,title,labels --limit 20
6. Issues opened since lookback:
gh issue list --repo [CUSTOMIZE: your-org/your-repo] --state open --search "created:>=[LOOKBACK_DATE]" --json number,title,labels --limit 20
7. Commits since lookback:
gh api repos/[CUSTOMIZE: your-org/your-repo]/commits --jq '[.[] | select(.commit.author.date >= "[LOOKBACK_DATE]")] | .[] | {sha: .sha[0:7], message: .commit.message | split("\n")[0], author: .commit.author.name, date: .commit.author.date}'
ANALYSIS REQUIRED — Don't just list data, provide insights:
A) **Stale PR Detection**: Flag any open PR created more than 3 days ago with no review decision or with CHANGES_REQUESTED for more than 2 days. Calculate days since creation/last update.
B) **Velocity Snapshot**: How many PRs merged, commits pushed, contributors active. If Monday (weekend window), note the multi-day period and don't compare to a single-day baseline — instead comment on weekend activity level (busy weekend vs. quiet weekend).
C) **Review Bottleneck**: Count PRs waiting for review (REVIEW_REQUIRED). If >5, flag as bottleneck.
D) **PR Comment Themes**: Summarize the key topics being discussed in PR reviews (architecture concerns, bugs, design patterns, etc.)
Return structured data AND insights.Only spawn if Slack MCP is available
Check Slack [CUSTOMIZE: your-team-channel] channel for key discussions since [LOOKBACK_DATE].
Brief type: [Daily Brief / Week Start Brief (Monday)]
If Monday: cover Friday through Sunday — there may be more threads than usual.
Instructions:
1. Use ToolSearch to load Slack tools
2. Read recent messages from [CUSTOMIZE: your-team-channel] channel (get enough to cover since [LOOKBACK_DATE])
3. For each significant discussion thread, extract:
- Topic / what was discussed
- Decisions made or agreements reached
- Action items mentioned (who agreed to do what)
- Blockers raised
- Customer feedback or external links shared
- Any specific features, PRs, or technical topics referenced
CRITICAL: For each action item or decision, note:
- WHO is responsible
- WHAT they agreed to do
- Whether it references a specific PR, feature, or technical area
Also extract:
- Links shared (competitive intel, articles, tools)
- Questions that were asked but NOT answered
- Discussions that seemed unresolved
Return structured output with clear separation between:
1. Decisions & Agreements (with responsible person)
2. Action Items (with owner)
3. Blockers & Escalations
4. Unresolved Discussions
5. External Links & Intel Shared
6. Feature/Technical Topics Discussed (for cross-referencing with GitHub)Check for meeting notes and standup notes since [LOOKBACK_DATE].
Brief type: [Daily Brief / Week Start Brief (Monday)]
If Monday: check Friday, Saturday, and Sunday for any meeting notes.
Instructions:
1. Look for meeting files in [CUSTOMIZE: path/to/meetings/] with dates from [LOOKBACK_DATE] through today
2. Use Glob to find files: [CUSTOMIZE: path/to/meetings/][LOOKBACK_DATE]*.md (and if Monday, also check Saturday and Sunday dates)
3. Also check [CUSTOMIZE: path/to/checkins/] for recent daily checkins
4. Read any found files
For each meeting/standup found, extract:
- Decisions made
- Action items assigned (WHO + WHAT)
- Features or changes discussed
- Priorities set
- Deadlines mentioned
- Any commitments like "I'll make a quick change to X" or "Let's update Y today"
Return structured list of:
1. Meeting summaries with date
2. All action items with owners
3. All discussed features/changes (for cross-referencing with GitHub PRs/commits and Linear issues)
4. Priorities and deadlines mentionedOnly spawn if Linear MCP is available
Query Linear for work tracking data since [LOOKBACK_DATE].
Brief type: [Daily Brief / Week Start Brief (Monday)]
If Monday: cover Friday through Sunday.
=== CONTEXT OPTIMIZATION RULES (CRITICAL — reduces token usage by ~70%) ===
**DEFAULT FILTERS — apply to ALL list_issues calls:**
- ALWAYS exclude issues with state "Done", "Completed", "Canceled", or "Archived" UNLESS they were updated since [LOOKBACK_DATE] (i.e., only show recently-completed wins, not old closed work).
- ALWAYS set limit: 50 on any list call to prevent overflow.
- NEVER make redundant queries — if you already fetched issues updated since lookback, do NOT re-fetch the same issues in a separate "completed" query. Filter from the data you already have.
**DATA EXTRACTION — from every API response, extract ONLY these fields per issue:**
- identifier (e.g., [CUSTOMIZE: PROJ]-123)
- title
- state (name only)
- priority (number + label)
- assignee (name only)
- updatedAt
- project (name only)
- labels (names only)
Discard everything else (full descriptions, URLs, metadata blobs, nested objects). This is critical — raw Linear responses are 50-100KB each and most of that data is unused.
**QUERY CONSOLIDATION — use minimal API calls:**
Do NOT make 5+ separate list_issues calls. Instead:
Instructions:
1. Use ToolSearch to load Linear tools (search "+linear list issues", "+linear list initiatives", "+linear list milestones", "+linear list projects")
2. Query the following data using Linear MCP tools:
=== ISSUE-LEVEL DATA (2-3 calls max) ===
a) Issues updated since lookback (THE main query — covers most needs):
Use mcp__claude_ai_Linear__list_issues with updatedAt: "[LOOKBACK_DATE]", limit: 50.
From this ONE response, extract: recently completed issues (wins), issues that moved to In Progress, issues still in Todo, new issues created.
b) High-priority/urgent + blocked issues (only if not already captured above):
Use mcp__claude_ai_Linear__list_issues with priority: 1 (Urgent), limit: 30.
Only query this separately if the main query didn't surface urgent items.
c) Blocked/stuck issues:
Look for issues with state "blocked" or "In Progress" with no updates in >2 days. Use the data from query (a) first — only make a separate query if needed.
=== CYCLE & SPRINT DATA (1 call) ===
d) Current cycle progress:
Use mcp__claude_ai_Linear__list_teams to get team IDs, then mcp__claude_ai_Linear__list_cycles with type: "current" for each team. This shows sprint/cycle health.
=== INITIATIVE DATA (1-2 calls) ===
e) All active initiatives:
Use mcp__claude_ai_Linear__list_initiatives with includeProjects: true to get initiative names, target dates, health status, progress, and linked projects.
Do NOT call get_initiative for each individual initiative — the list call with includeProjects gives enough data.
=== PROJECT DATA (SKIP separate call) ===
f) Project data comes from the initiatives query above (includeProjects: true). Do NOT make a separate list_projects call — it returns ~37KB of mostly unused data.
=== MILESTONE DATA (1 call only if needed) ===
g) Only query milestones if an initiative is At Risk or has an approaching target date (≤14 days). Otherwise skip — milestone data is verbose and rarely actionable day-to-day.
3. For each significant issue, note ONLY:
- Issue identifier, title, assignee name, status, priority, project name
- Whether it has linked PRs (just note yes/no + PR number, don't include full URLs)
4. Build an INITIATIVE HEALTH MAP from the data you already have (do NOT make additional queries):
For each initiative, compile:
- Total issues across linked projects (completed / in-progress / todo / blocked)
- Projects status breakdown
- Key blockers
- Days until target date
ANALYSIS REQUIRED:
A) **Cycle Health**: What % of the current cycle is complete? Are we on pace? How many issues remain vs. days left?
B) **Work Distribution**: Who has the most issues assigned? Anyone overloaded or idle?
C) **Blocked Items**: List anything stuck with reasons if available.
D) **Priority Mismatches**: Any urgent/high-priority issues with no recent activity? Flag them.
E) **New Work vs Planned**: How many issues were created since lookback vs. what was already planned in the cycle? Is scope creeping?
F) **Completed Work**: Celebrate — list what got done and by whom.
G) **Initiative Progress**: For each initiative, report health (on track / at risk / off track) based on:
- % of issues completed vs. days remaining to target date
- Number of blocked items
- Whether projects under the initiative are progressing
H) **Milestone Status**: Only flag milestones that are overdue or at risk. Skip healthy milestones.
I) **Project Rollup**: For each project, summarize progress % and whether it's contributing to initiative goals.
Return structured data AND insights, including the initiative health map.
IMPORTANT: Your total output should be under 5KB of text. Summarize, don't dump raw data.Check for recent braindumps since [LOOKBACK_DATE].
Brief type: [Daily Brief / Week Start Brief (Monday)]
If Monday: check Friday through Sunday.
Instructions:
1. Use Glob to find braindump files matching recent dates:
- [CUSTOMIZE: path/to/braindumps/]braindump-[LOOKBACK_DATE through TODAY]*.md
2. Read any found files
For each braindump found, extract:
- Core themes and strategic thinking
- Decisions being considered or made
- Product direction signals
- Concerns or risks flagged
- Ideas that should be connected to current work
- Any references to specific features, PRs, or team members
Return structured list of:
1. Braindump summaries with date and source
2. Strategic insights and product direction signals
3. Concerns/risks that should appear in the brief
4. Connections to current engineering work (for cross-referencing with GitHub/Linear)Only spawn if PostHog MCP is available
Query PostHog for HIGH-LEVEL product metrics only.
Project ID: [CUSTOMIZE: your-posthog-project-id], Dashboard ID: [CUSTOMIZE: your-posthog-dashboard-id].
Lookback start date: [INSERT LOOKBACK_DATE].
Today's date: [INSERT TODAY_DATE].
Brief type: [Daily Brief / Week Start Brief (Monday)]
=== CONTEXT OPTIMIZATION RULES (CRITICAL) ===
- DO NOT query for errors or error details. Skip list-errors entirely.
- DO NOT fetch insights-get-all (returns huge payload of all saved insights). Only use the dashboard.
- DO NOT include raw query results in your output. Summarize into 1-2 lines per metric.
- Your total output should be under 3KB of text.
Instructions:
1. Use ToolSearch to load PostHog tools (search "+posthog")
2. Run ONLY these queries:
=== DASHBOARD OVERVIEW (1 call) ===
a) Get the main dashboard:
Use mcp__posthog__dashboard-get with dashboard_id: [CUSTOMIZE: your-posthog-dashboard-id].
Extract only: visitor count, signup count, core event count, and any trend data shown.
=== KEY METRICS (3 HogQL queries — combine into period comparison) ===
b) Current period metrics (single combined query):
Use mcp__posthog__query-run with a HogQL query:
SELECT
countIf(DISTINCT person_id, event = '$pageview') as visitors,
countIf(event = '$pageview') as pageviews,
countIf(DISTINCT person_id, event = 'user_signed_up') as signups,
countIf(event = '[CUSTOMIZE: your_core_event]') as core_events,
countIf(DISTINCT person_id, event = '[CUSTOMIZE: your_core_event]') as core_event_users
FROM events
WHERE timestamp >= '[LOOKBACK_DATE]'
c) Previous period metrics (for % change calculation):
Run the same query for the PREVIOUS equivalent period.
If daily: day before lookback. If Monday (Fri-Sun): previous Fri-Sun.
d) Top features (lightweight):
Use mcp__posthog__query-run:
SELECT event, count() as count, count(DISTINCT person_id) as unique_users
FROM events
WHERE timestamp >= '[LOOKBACK_DATE]' AND event NOT LIKE '$%'
GROUP BY event ORDER BY count DESC LIMIT 10
ANALYSIS — Return ONLY high-level insights (no raw data dumps):
A) **Metric Summary**: 1 line each for visitors, sign-ups, core events with ↑↓→ trend and % change.
B) **Anomalies**: Only flag metrics with >20% change. If none, say "No anomalies."
C) **Top Features**: List top 5 features by usage, 1 line each.
D) **One-liner Assessment**: "Product health: [good/concerning/needs attention] — [why in 1 sentence]"
Return a concise summary, NOT raw query results. Target ~1KB output max.This is the most critical phase. The orchestrator must:
Collect results from all background agents using Read on their output files
Cross-reference Linear ↔ GitHub (the core alignment check):
Cross-reference Slack ↔ GitHub ↔ Linear:
Cross-reference Meetings ↔ GitHub ↔ Linear:
Cross-reference Braindumps ↔ Current Work:
Cross-reference Linear Cycle ↔ Overall Progress:
Cross-reference Initiatives ↔ Projects ↔ Issues:
Cross-reference PostHog ↔ GitHub ↔ Slack:
Generate the brief following the Content Structure below, with insights FIRST and details LAST. Use the Voice & Tone guidelines — write like a teammate, not a dashboard.
Save to [CUSTOMIZE: path/to/briefs/]daily-brief-YYYY-MM-DD.md with proper metadata
Present a concise summary to the user
This phase writes data BACK to Linear to keep it up-to-date with reality from GitHub, Slack, and meetings.
Use ToolSearch to load the necessary Linear update tools: "+linear update issue", "+linear update initiative", "+linear update project", "+linear create comment", "+linear create attachment", "+linear save status update", "+linear update milestone".
For each merged or open PR found in the GitHub data:
[CUSTOMIZE: PROJ]-123)mcp__claude_ai_Linear__create_attachment to attach the PR URL to the issue (if not already linked). Use format:
https://github.com/[CUSTOMIZE: your-org/your-repo]/pull/XXXget_issue attachments) — skip if already linked to avoid duplicatesBased on the cross-reference data from Phase 3:
mcp__claude_ai_Linear__update_issue to transition the issue to "Done" state. Add a comment: "Automatically marked done — PR #XXX merged on [date]."mcp__claude_ai_Linear__update_issue to transition to "In Progress". Add a comment: "Marked in progress — PR #XXX opened."Safety rules:
For each active initiative, compose and post a status update using mcp__claude_ai_Linear__save_status_update:
**[DATE] Daily Update**
• Shipped: [list key PRs/features merged]
• In Progress: [key items being worked on]
• Blocked: [any blockers, or "None"]
• Health: [On Track / At Risk / Off Track] — [1-line reasoning]
• Next: [what's expected to ship next]mcp__claude_ai_Linear__save_status_update to post the update to the initiativemcp__claude_ai_Linear__update_initiative to update the health fieldFor each milestone in active projects:
mcp__claude_ai_Linear__update_milestone to update its status/description with a noteFor each active project:
After all sync-back operations, compile a summary of what was updated:
Include this summary in the brief under a "Linear Sync Report" section.
This phase publishes the full daily brief to HackMD so it can be shared with the team via a link.
The HackMD API token is stored in .claude/settings/hackmd-token (one line, no whitespace). Read it with: cat .claude/settings/hackmd-token | tr -d '\n'. Alternatively check env var HACKMD_API_TOKEN.
API Details:
https://api.hackmd.io/v1Authorization: Bearer <HACKMD_API_TOKEN>Steps:
Create the note via POST https://api.hackmd.io/v1/notes with:
{
"title": "Daily Brief — [DAY_NAME], [FULL_DATE]",
"readPermission": "signed_in",
"writePermission": "owner",
"commentPermission": "disabled",
"content": "placeholder"
}readPermission: "signed_in" means any HackMD user with the link can viewid and publishLink from the responseUpdate the note content via PATCH https://api.hackmd.io/v1/notes/<id> with the full brief markdown content:
[CUSTOMIZE: path/to/briefs/]daily-brief-YYYY-MM-DD.mdcurl -X PATCH ... -d @/tmp/hackmd-payload.jsonStore the HackMD link for use in the Slack message AND the local brief file:
publishLink from step 1 (format: https://hackmd.io/@[CUSTOMIZE: your-hackmd-username]/<shortId>).md file's frontmatter by adding/updating hackmd_url: <publishLink> in the YAML frontmatter. Insert it after the created: field. Use the Edit tool to do this — do NOT rewrite the entire file.If HackMD API fails, log the error and continue — the brief should still be posted to Slack without the link. Note in the Slack message: "(HackMD link unavailable)"
Implementation pattern (Bash):
# Step 1: Create note
curl -s -X POST 'https://api.hackmd.io/v1/notes' \
-H "Authorization: Bearer $HACKMD_API_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"title":"...","readPermission":"owner","writePermission":"owner","commentPermission":"disabled","content":"placeholder"}'
# Step 2: Prepare payload and update
python3 -c "
import json
with open('[CUSTOMIZE: path/to/briefs/]daily-brief-YYYY-MM-DD.md') as f:
content = f.read()
with open('/tmp/hackmd-payload.json', 'w') as f:
json.dump({'content': content}, f)
"
curl -s -X PATCH "https://api.hackmd.io/v1/notes/<id>" \
-H "Authorization: Bearer $HACKMD_API_TOKEN" \
-H 'Content-Type: application/json' \
-d @/tmp/hackmd-payload.jsonAfter presenting the brief summary to the user, always compose and show the Slack highlight message for preview. Display the exact message the user will see in Slack, then ask: "Ready to post this to #[CUSTOMIZE: your-team-channel]? (or edit anything first)"
Do NOT post until the user explicitly confirms. If they suggest edits, adjust and show the updated preview. Only post after they say yes/confirm/looks good/send it/etc.
Compose a Slack-native highlight message — NOT the full brief, just the most important bits the team should see. Keep it short enough that people actually read it.
Once user confirms, use ToolSearch to load Slack send tool, then post via mcp__claude_ai_Slack__slack_send_message to the [CUSTOMIZE: your-team-channel] channel.
Slack message format (adapt based on actual content — this is a template, not a rigid format):
For Monday (Week Start Brief):
:calendar: *Week Start Brief — [DATE] (covering Fri–Sun)*
*Weekend recap:* [X] PRs merged since Friday. [Brief summary of what got done.] :rocket:
*What shipped:*
• [Feature/PR 1 with <https://github.com/[CUSTOMIZE: your-org/your-repo]/pull/XXX|#XXX> link] — [1-line description]
• [Feature/PR 2 with link] — [1-line description]
• [Feature/PR 3 with link] — [1-line description]
---
:rotating_light: *Heads up:*
• [Most important alert with PR links and context]
• [Second alert — include who's involved and what's needed]
• [Third alert if relevant]
---
:mag: *Key discussions from Slack:*
• *[Topic 1]:* [2-3 sentence summary of the discussion, decisions made, and any open questions.]
• *[Topic 2]:* [Summary with context]
:clipboard: *Open action items:*
• [Person] — [What they need to do] ([source: meeting/Slack thread])
• [Person] — [What they need to do]
---
:bar_chart: *Product pulse:*
• [X] visitors ([↑/↓X%]), [X] sign-ups, [X] core events ([↑/↓X%]) | [Any notable anomaly]
:chart_with_upwards_trend: *This week's focus:*
• [Key priority or theme for the week]
:zap: *Quick wins:*
• <https://github.com/[CUSTOMIZE: your-org/your-repo]/pull/XXX|#XXX> and <...|#YYY> are approved — just need someone to merge.
:link: *Full brief:* [HACKMD_PUBLISH_LINK]For regular days:
:newspaper: *Daily Brief — [DATE]*
*What shipped:* [X] PRs merged. :rocket:
• [Feature/PR 1 with <https://github.com/[CUSTOMIZE: your-org/your-repo]/pull/XXX|#XXX> link] — [1-line description]
• [Feature/PR 2 with link] — [1-line description]
---
:rotating_light: *Heads up:*
• [Alert 1 with PR links, context, and who needs to act]
• [Alert 2 with details]
---
:mag: *Key discussions:*
• *[Topic]:* [2-3 sentence summary — what was discussed, any decisions, open questions.]
:clipboard: *Action items:*
• [Person] — [Task] ([from meeting/Slack])
---
:bar_chart: *Product pulse:* [X] visitors ([↑/↓X%]) | [X] core events ([↑/↓X%]) | [Any notable anomaly]
:zap: *Quick wins:*
• <https://github.com/[CUSTOMIZE: your-org/your-repo]/pull/XXX|#XXX> and <...|#YYY> are approved — just need someone to merge.
:link: *Full brief:* [HACKMD_PUBLISH_LINK]<https://github.com/[CUSTOMIZE: your-org/your-repo]/pull/XXX|#XXX>. Never use bare #930 — make it clickable.:link: *Full brief:* [HACKMD_URL]. This is how the team accesses the full detailed brief.Quick vibe check. Was it a good shipping day? Quiet? Lots of discussion but no merges? Set the context in plain language.
If Monday (Week Start Brief): Frame the opening around the weekend + set the tone for the week ahead. Example: "Happy Monday — the team stayed busy over the weekend with 6 PRs merged. Here's what happened since Friday and what's on deck for the week."
Regular day example:
Solid day — v1.2.0 shipped with 11 PRs merged. The team is moving fast on features. But we've got a growing problem on the onboarding side that needs attention before we lose more prospects.
Things that need attention today. Keep to 3-5 max. Write them as things a teammate would flag in standup, not as system alerts.
Types (in priority order):
Example:
Onboarding is broken — Two prospects in a row got stuck at sign-up during discovery calls. No fix PR exists for either issue.
Review backlog is getting out of hand — 22 open PRs, 16 of them stale. Some are 100+ days old. We should do a quick triage to close the dead ones.
API docs (#930) need reviewer feedback resolved before we merge the implementation (#933). Let's not build on an uncertain foundation.
Combined intelligence from Slack + GitHub + Meetings. Group RELATED items together. This is where the cross-referencing shines — connect the dots between what was discussed and what actually happened in code.
Celebrate the wins. Brief summary of merged PRs. Group by theme if possible rather than just listing.
Open PRs with review status AND corresponding Linear issue status. Flag age and anything that looks stuck. Show alignment between Linear status and actual PR state.
For each active initiative, show a quick-glance status:
Format:
Initiative Name — Health: On Track | 23% complete | 76 days remaining
- Projects: Project A (In Progress, 40%), Project B (In Progress, 15%)
- Milestones: Milestone 1 (due Mar 15 — on track), Milestone 2 (due Mar 30 — at risk)
- Shipped today: PR #945 (feature X), PR #948 (feature Y)
- Blockers: None
Current Linear cycle progress — % complete, days remaining, scope changes. Flag if the team is on pace or falling behind.
Quick velocity numbers — not exhaustive, just enough to get a pulse. Include both GitHub metrics (PRs, commits) and Linear metrics (issues completed, cycle progress).
Quick snapshot of how the product is actually performing with real user data. This grounds the engineering activity in business reality.
Format:
Visitors: 342 (↑12% vs previous day) | Sign-ups: 8 (↓25%) | Core Events: 156 (↑34%) | Errors: 3 new
What the numbers say: Core events jumped after we shipped the loop detection fix (PR #942) — users are getting further into workflows without hitting errors. Sign-ups dipped but that might just be a quiet day.
Feature adoption:
new-featureused by 23 unique users (good early traction).onboarding-flowstill showing 40% drop-off at email verification step.Error watch: 3 new
TypeErrorerrors in/api/executesince yesterday's deploy. Correlates with PR #935 merge.
Rules:
Summary of what the daily brief sync-back updated in Linear:
Key insights from recent braindumps that connect to current work. This gives the brief depth beyond just "what happened" — it adds "why it matters" from the product lead's own thinking.
Detailed Slack discussion summaries. This is the appendix — people who want depth can read here.
Action items from recent meetings tracked against actual GitHub/Slack/Linear activity. Use status indicators to show progress at a glance.
---
type: daily-brief
brief_type: daily / week-start # "week-start" if Monday, "daily" otherwise
domain: shared
date: YYYY-MM-DD
lookback_from: YYYY-MM-DD # Friday's date if Monday, yesterday otherwise
created: YYYY-MM-DD HH:MM
tags:
- daily-brief
- team-intelligence
data_sources:
github: true
slack: true/false
linear: true/false
posthog: true/false
meetings: true/false
braindumps: true/false
linear_sync:
issues_synced: X
prs_linked: X
initiative_updates_posted: X
milestones_flagged: X
errors: []
initiatives:
- name: "[CUSTOMIZE: Your Initiative 1]"
health: on_track / at_risk / off_track
progress_pct: X
days_remaining: X
projects_count: X
blocked_issues: X
- name: "[CUSTOMIZE: Your Initiative 2]"
health: on_track / at_risk / off_track
progress_pct: X
days_remaining: X
projects_count: X
blocked_issues: X
linear_cycle:
name: "Cycle X"
progress_pct: X
days_remaining: X
scope_changes: X # issues added mid-cycle
posthog_metrics:
visitors: X
visitors_change_pct: X # vs previous period
signups: X
signups_change_pct: X
core_events: X
core_events_change_pct: X
new_errors: X
top_feature: "feature_name"
anomalies: [] # list of metrics with >20% change
hackmd_url: "" # HackMD publish link, populated in Phase 3.7
stale_prs: X
review_bottleneck: true/false
missing_followups: X
linear_blocked_issues: X
---When multiple alerts exist, order by:
slack: unavailablelinear: unavailable. Flag this — Linear is now the primary work trackerposthog: unavailable. The brief will still be useful without it.034af4c
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.