一键导入
wind-down
Interactive daily wrap-up: 1. Input candidates (Slack/email); 2. Discovered contacts; 3. Work log draft/write; 4. Next day's calendar preview.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Interactive daily wrap-up: 1. Input candidates (Slack/email); 2. Discovered contacts; 3. Work log draft/write; 4. Next day's calendar preview.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use when Justin asks you to search, read, write, or manage notes in the vault, OR when performing structural/physical vault maintenance (hygiene, task archiving, capitalization healing, link repair, and nightly cron plumbing).
Run vault compile-inputs — Phase 0 apply Ready to Apply, then phased Readings/Sources/Meetings/Others.
Master Justin's automated note-taking, ingestion, and logging pipeline (Brain Feeds Ingest). Coordinates email forwarding, Linear reactions, Telegram bookmarks, and central vault logging/entity integration.
Manage and operate the Obsidian Semantic Pointer CLI for on-demand historical bridging, semantic search, and context pruning.
Master conventions for chronological logs: governs Daily Notes, Meetings, and incoming Inputs (Emails, Slack, Readings).
Performs high-level semantic health checks on the vault, identifying potential contradictions, stale summaries, and structural anomalies in the knowledge graph.
| name | wind-down |
| description | Interactive daily wrap-up: 1. Input candidates (Slack/email); 2. Discovered contacts; 3. Work log draft/write; 4. Next day's calendar preview. |
| version | 2.0.0 |
| author | Apollo |
| license | MIT |
| platforms | ["linux","macos"] |
| metadata | {"hermes":{"tags":["productivity","wind-down","daily-routine","work-log","inbox-triage","sources","calendar"],"related_skills":["work-log","morning-briefing","obsidian"]}} |
This skill governs the interactive daily wind-down and wrap-up session for Justin. It runs in the late afternoon/evening when Justin is ready to close his workday, clear his head, and organize his vault for tomorrow.
The wind-down session runs interactively in a strict, step-by-step sequence. Wait for Justin's confirmation or feedback at the end of each phase before proceeding.
Present potential input candidates (active Slack conversations and noteworthy primary-category emails from the last 36-48 hours) that Justin hasn't tagged with 🧠 or forwarded to Apollo, but that are highly worthy of being turned into inputs in his vault.
Run the unified script live to fetch candidates:
python3 /home/justin.guest/.hermes/scripts/fetch_source_candidates.py
If candidates (Slack or Email) are found:
📋 N potential input candidates:
**Slack Conversations**
1. [\#channel-name] Topic or Preview — participants: Alice, Bob, Justin
2. [\#channel-name] Topic or Preview — participants: Endre, Justin
**Emails**
3. [Email/<account>] Subject line — from: Sender Name (Date)
...
Would you like to turn any of these conversations into inputs in your vault? (e.g. "yes, 1", "save 1 and 3", or "skip")
If Justin selects any:
id and local datetime conversions) to preserve search resolution.$OBSIDIAN_VAULT_PATH/Inputs/Slack/YYYY-MM-DD - Spaced Title.md.---
id: <timestamp_id> # YYYYMMDDHHmmss based on first message
daily_note: "[[<YYYY-MM-DD Weekday>]]"
original_url: "<permalink>"
category: "[[Slack]]"
channel: "<channel_name>"
participants:
- "Participant Name"
---
python3 /home/justin.guest/.hermes/scripts/fetch_slack_brains.py --mark-processed <channel_id> <ts>$OBSIDIAN_VAULT_PATH/Inputs/Emails/YYYY-MM-DD - Spaced Subject.md.---
id: <timestamp_id> # YYYYMMDDHHmmss based on first email
daily_note: "[[<YYYY-MM-DD Weekday>]]"
original_url: "<permalink>"
category: "[[Emails]]"
account: "<work | personal-main>"
participants:
- "Sender Name"
---
python3 /home/justin.guest/.hermes/scripts/fetch_source_candidates.py --mark-email-processed <thread_id>If no candidates are found, skip this phase entirely and proceed to Phase 2.
Present any discovered contacts or organizations (unresolved wikilinks found by the check_vault_signals.py script) from the signals cache file at ~/.hermes/morning-briefing/vault_signals_last_run.json (under the discovered_entities.people and discovered_entities.organizations fields).
Crucial Filtering & Duplication Check: The raw cache contains many false-positive people/organization names (such as "Use Anya Volosskaya", "ASL Bloom", "Daily Wind", "Scraps", or action item phrases).
*Name*) using search_files under /home/justin.guest/Developer/obsidian-vault/ to check if a contact note already exists in Notebook/Contacts/ or Inbox/. Omit any entities that already have an existing contact card from the candidate list entirely.If no new, unresolved, and verified human or organization candidates are found in the signals cache after filtering, skip this phase entirely and proceed to Phase 3.
Format:
👤 N discovered contact / organization candidates:
**People**
1. [Name] — first mentioned in [[context_file]]
**Organizations**
2. [Name] — first mentioned in [[context_file]]
...
Would you like me to create contact notes for any of these? (e.g. "yes, 1 as organization", "create 2", or "skip")
If Justin selects any:
/home/justin.guest/Developer/obsidian-vault/Notebook/Contacts/ OR in /home/justin.guest/Developer/obsidian-vault/Inbox/ by performing a wildcard search on the name (e.g. searching for files matching *Name* using the search_files tool with target='files'). This is critical because contacts are saved with their unique timestamp appended (e.g., Notebook/Contacts/Tor Barstad 20260610075543.md)./home/justin.guest/Developer/obsidian-vault/Inbox/<Name>.md and format the contact note following these strict standards:
---
id: <timestamp_id> # YYYYMMDDHHmmss format based on current time
category: "[[People]]" # (or [[Organizations]])
---
> Executive summary: Briefing for <Name>.
## State
- **Role:**
- **Company:**
- **Relationship:**
If no discovered contacts are found, proceed to Phase 3.
Draft today's work log, align with Justin, and write it to today's daily note. This step runs towards the end of the wind-down so that any activities, contact creations, log files, or inbox triage completed during previous steps are fully incorporated, ensuring the work log captures the final state of play for the day.
Calculate Dates:
TARGET_DATE as today (e.g., 2026-06-07 in local time).Gather Today's Raw Activities (Fast-track):
python3 ~/.hermes/skills/productivity/google-workspace/scripts/gws_multi.py --account all calendar list --start <YYYY-MM-DD>T00:00:00<OFFSET> --end <YYYY-MM-DD>T23:59:59<OFFSET>).python3 ~/.hermes/skills/social-media/slack/scripts/slack.py search 'from:@justin after:<YESTERDAY_DATE> before:<TOMORROW_DATE>' --limit 50).urllib.request using LINEAR_API_KEY from ~/.hermes/.env (no "Bearer" prefix) to retrieve issues updated today where Justin is assignee, creator, or subscriber.TaskNotes/Tasks/ and TaskNotes/Archive/ to identify newly added, completed, or archived tasks.git -C ~/Developer/obsidian-vault log --since="<YYYY-MM-DD> 00:00:00" --until="<YYYY-MM-DD> 23:59:59" --name-status --pretty=format:"COMMIT:%h|%an|%s"). Filter out commits from Apollo (apollo-vm) or containing apollo to isolate Justin's manual edits, paying close attention to modified tasks or newly created budget check files.read_file to see manual scratchpad entries.vault/Meetings/ or files containing today's date in their name)./home/justin.guest/.hermes/morning-briefing/<YYYY-MM-DD>.json to check the vault_activity field, and run a quick terminal find command over the vault to gather any high-level vault restructuring, bulk updates, or manual categorization sweeps that took place during the day.Synthesize the Work Log Draft:
Present the Draft to Justin:
Write the Finalized Work Log:
/home/justin.guest/Developer/obsidian-vault/Daily Notes/YYYY-MM-DD Weekday.md (create from template /home/justin.guest/Developer/obsidian-vault/Utilities/Templates/daily_note.md if missing, stripping Templater tags).> [!summary], ## 🗓 Schedule & Events for Today's and Tomorrow's events, and ## ✅ Work Log with the subheading ### 🚀 Highlights & Decisions) with your new synthesized content.## 🌄 Morning Briefing section. Never modify or delete it.Preview tomorrow's schedule to establish mental readiness, coordinate upcoming tasks, and close out the day.
Fetch Tomorrow's Schedule:
gws_multi.py with correct dynamic timezone offset:
python3 ~/.hermes/skills/productivity/google-workspace/scripts/gws_multi.py --account all calendar list --start <TOMORROW>T00:00:00<OFFSET> --end <TOMORROW>T23:59:59<OFFSET> --max 50
Present Tomorrow's Preview:
- **HH:MM - HH:MM** Event Title [Account/Context]Close out:
integrate-entities)./Inbox/Scratchpad.md note (categorized under # ✅ Tasks or # 🗒 Notes headings) rather than the daily note, which has retired its Scratchpad heading.#channel-name as \#channel-name inside the daily note so Obsidian doesn't parse it as a tag.-04:00 or -05:00) to --start and --end to prevent boundary events from leaking from yesterday or tomorrow.TaskNotes/Tasks/ and TaskNotes/Archive/), prioritize capturing task status changes (completed, archived, or added) directly from vault git history of the TaskNotes/ directory..lstrip() body content immediately upon extraction.---) on a fresh line. Writing it without an intervening newline will append it directly to the end of the last property string (e.g., daily_note: '...'---), which corrupts properties.## Timeline sections or append timeline entries to contact cards during wind-down or ingestion; rely on Obsidian's native Backlinks panel instead. Project timelines are similarly disabled in favor of state/decision updates./Inbox/Scratchpad.md note instead of daily note headings.