show-today

v2026.09.24

Priority tasks for today — checks live sources (email, calendar) before showing stale CSV data

GitHub
Install command
npx skhub add aaaaqwq/show-today
Markdown
SKILL.md

Show Today

What to do today — reality-checked against live sources

When to use

  • "what's for today?"
  • "which tasks?"
  • "where to start?"
  • At the beginning of the work day

Dependencies

  • Other skills: email-read, timezone
  • External: Python 3, pandas, Google Calendar API, Gmail API

Paths

WhatPath
Tasks$DATA_PATH/projects/pm/pm_tasks_master.csv
Projects$DATA_PATH/projects/pm/pm_projects_master.csv
Leads$DATA_PATH/sales/crm/relationships/leads.csv
People$DATA_PATH/sales/crm/contacts/people.csv
Calendar script$GOOGLE_TOOLS_PATH/read_calendar.py
Email script$GOOGLE_TOOLS_PATH/read_emails.py
Python venv$GOOGLE_TOOLS_PATH/.venv/bin/python3

Execution order

CRITICAL: Always gather live state BEFORE reading CSVs.

Step 1: Live sources  →  calendar + inbox + sent (last 3 days)
Step 2: Static sources →  leads.csv + pm_tasks_master.csv
Step 3: Reconcile      →  cross-reference emails with lead contacts
Step 4: Display        →  show corrected picture, grouped by priority tier

Step 1: Read live sources (parallel)

Run all three in parallel:

# Calendar — today's events
$GOOGLE_TOOLS_PATH/.venv/bin/python3 $GOOGLE_TOOLS_PATH/read_calendar.py 1

# Inbox — last 3 days, all messages
$GOOGLE_TOOLS_PATH/.venv/bin/python3 $GOOGLE_TOOLS_PATH/read_emails.py 30 "after:$(date -v-3d '+%Y/%m/%d')"

# Sent — last 3 days
$GOOGLE_TOOLS_PATH/.venv/bin/python3 $GOOGLE_TOOLS_PATH/read_emails.py 20 "in:sent after:$(date -v-3d '+%Y/%m/%d')"

Step 2: Read static sources

import pandas as pd
from datetime import date

today = str(date.today())
CRM = '$DATA_PATH/sales/crm'
PM = '$DATA_PATH/projects/pm'

leads = pd.read_csv(f'{CRM}/relationships/leads.csv')
people = pd.read_csv(f'{CRM}/contacts/people.csv')
tasks = pd.read_csv(f'{PM}/pm_tasks_master.csv')

# Active leads only (not won/lost/dead)
active_leads = leads[leads['stage'].isin(['new', 'qualified', 'proposal', 'negotiation'])]

# Leads with actions due today or overdue
due = active_leads[active_leads['next_action_date'] <= today]

Step 3: Reconcile — the critical step

For each active lead that has next_action containing "waiting"/"check"/"follow-up":

  1. Find the lead's primary contact email from people.csv
  2. Check if any inbox emails match that email address (from: field)
  3. If match found → the lead state is STALE — they already replied

Implementation:

# Build email lookup: person_id -> email
contact_emails = dict(zip(people['person_id'], people['email']))

# For each due lead, check if we have a reply
for _, lead in due.iterrows():
    contact_id = lead['primary_contact_id']
    email = contact_emails.get(contact_id, '')

    if not email or pd.isna(email):
        continue

    # Check if this email appears in recent inbox
    # (Claude: search the inbox output from Step 1 for this email address)
    # If found: flag as STALE — reply exists, next_action is outdated
    # If not found: lead state is current

Claude does this manually — scan Step 1 inbox output for email addresses matching lead contacts.

Step 4: Display

IMPORTANT: Use priority tiers, not raw priority_score.

=== TODAY: {date} ===

CALENDAR:
  {list today's events with times in WITA}

---

STALE ALERTS (leads where reply already exists but CRM not updated):
  - [lead-id] {contact name} replied on {date} — CRM says "{stale next_action}"
    ACTION NEEDED: read email, update lead, respond

---

MONEY NOW (invoices, payments, delivery deadlines):
  - {items}

MONEY SOON (deals in negotiation/proposal with active momentum):
  - {items}

LEADS — ACTION TODAY:
  - {leads with next_action_date == today}

LEADS — OVERDUE (skip anything older than 14 days unless high priority):
  - {leads with next_action_date < today, max 14 days old}

PM TASKS (in_progress or hot):
  - {items, skip auto-generated email reply tasks}

Priority tiers (strict order)

  1. MONEY NOW — invoices, payment follow-ups, client delivery deadlines
  2. MONEY SOON — closing deals in pipeline (negotiation/proposal stage with recent activity)
  3. MONEY REPEATABLE — productizing consulting, scaling data labeling
  4. SALES — outreach/follow-ups for qualified leads only
  5. EVERYTHING ELSE — research, tooling, community (max 20% of day)

Filtering rules

  • Skip auto-generated email tasks — pm_tasks_master.csv entries with task_name starting with "Reply:" are auto-generated by email agent. Do NOT show them as today's tasks.
  • Skip leads older than 14 days overdue — if next_action_date is >14 days ago and no recent email activity, skip. Mention count: "N stale leads hidden (run query-leads to review)."
  • Skip proj-012 AGI tasks — hobby time only, never show in daily briefing.
  • Merge duplicates — if same lead appears in both PM tasks and leads.csv, show once with the most recent info.

Staleness detection patterns

CRM next_action containsCheck inbox forIf found →
"waiting for reply" / "check reply"emails FROM contactReply exists — read and respond
"follow-up" / "ping" / "nudge"emails FROM contactThey replied before we pinged — update action
"send proposal" / "send NDA"emails in SENT to contactAlready sent — update to "waiting for response"
"schedule call" / "book meeting"calendar events with contact nameAlready booked — update to call prep

Task completion rule

When showing tasks and user says "done" or it's clear a task was completed:

  1. Mark done immediately (pm-done skill)
  2. Suggest follow-up if applicable
  3. Re-show updated list

Example output

=== TODAY: 2026-03-03 ===

CALENDAR:
  16:00  Client H x WelabelData (AI testing)
  18:00  Alex/Ivan (discovery call)
  21:30  Discovery Call: Frank Castle (Medical AI)

---

STALE ALERTS:
  - [lead-clienti-001] Edward Norton replied 2x (01:22, 02:47) —
    CRM says "Чекаємо відповідь, дьорнути якщо тиша до 05.03"
    ACTION: Edward asking for formal proposal on letterhead. Respond today.

---

MONEY NOW:
  - Invoice #99 Enterprise Corp/Client C ($X,XXX) — 19 days overdue, Alice checking fee structure
  - Mercury account closure — withdraw funds by April 16

MONEY SOON:
  - Client I — Edward wants formal proposal (letterhead, payment terms, dispute resolution)
  - Client G NDA — print, sign, send scan to Grace today

LEADS — ACTION TODAY:
  - [lead-example-001] Discovery call 18:00 WITA
  - [lead-clientg-001] Sign and send NDA

(3 stale leads hidden — run query-leads to review)

Related skills

  • email-read — read inbox/sent for live state
  • pm-done — mark task done + create follow-up
  • query-leads — detailed lead queries, bulk review stale leads
  • weekly-review — weekly progress report
  • timezone — time conversion for calendar events
Discovery
Tags

No tags published for this skill.

Version
Latest version metadata

Version

v2026.09.24

Published

Sep 24, 2026

Category

Uncategorized

License

MIT

Source path

skills/show-today

Default branch

main

Latest commit

b996aac

Tree SHA

07e787b