Select the types of activity you want to include in your feed.
Add speakers and calendar Agent Skills
Extract speaker identification and calendar event commands from unified.md into standalone SKILL.md files at their app-level muse directories, following the established skill pattern.
···11+---
22+name: calendar
33+description: >
44+ Manage calendar events with sol call calendar commands. List, create, update,
55+ cancel, and move events organized by facet and day.
66+ TRIGGER: calendar events, scheduling, appointments, meetings, event
77+ management, moving events between facets.
88+---
99+1010+# Calendar CLI Skill
1111+1212+Use these commands to manage calendar events from the terminal.
1313+1414+**Environment defaults**: When `SOL_DAY` is set, commands that take a DAY argument will use it automatically. Same for `SOL_FACET` where FACET is required.
1515+1616+Common pattern:
1717+1818+```bash
1919+sol call calendar <command> [args...]
2020+```
2121+2222+## list
2323+2424+```bash
2525+sol call calendar list [DAY] --facet FACET
2626+```
2727+2828+List events for a day.
2929+3030+- `DAY`: day in `YYYYMMDD` (default: `SOL_DAY` env).
3131+- `--facet`: facet name (default: `SOL_FACET` env).
3232+3333+Example:
3434+3535+```bash
3636+sol call calendar list 20260115 --facet work
3737+```
3838+3939+## create
4040+4141+```bash
4242+sol call calendar create TITLE --start HH:MM --day DAY --facet FACET [--end HH:MM] [--summary TEXT] [--participants NAMES]
4343+```
4444+4545+Create a calendar event.
4646+4747+- `TITLE`: event title (positional argument).
4848+- `--start`: start time in `HH:MM` (required).
4949+- `--day`: day in `YYYYMMDD` (default: `SOL_DAY` env).
5050+- `--facet`: facet name (default: `SOL_FACET` env).
5151+- `--end`: optional end time in `HH:MM`.
5252+- `--summary`: optional event description.
5353+- `--participants`: optional comma-separated participant names.
5454+5555+Example:
5656+5757+```bash
5858+sol call calendar create "Team standup" --start 09:00 --end 09:30 --day 20260115 --facet work --participants "Alicia, Ben"
5959+```
6060+6161+## update
6262+6363+```bash
6464+sol call calendar update LINE --day DAY --facet FACET [--title TEXT] [--start HH:MM] [--end HH:MM] [--summary TEXT] [--participants NAMES]
6565+```
6666+6767+Update an existing calendar event.
6868+6969+- `LINE`: 1-based line number from `list` output (positional argument).
7070+- `--day`: day in `YYYYMMDD` (default: `SOL_DAY` env).
7171+- `--facet`: facet name (default: `SOL_FACET` env).
7272+- `--title`: new event title.
7373+- `--start`: new start time in `HH:MM`.
7474+- `--end`: new end time in `HH:MM`.
7575+- `--summary`: new event description.
7676+- `--participants`: new comma-separated participant names.
7777+7878+Example:
7979+8080+```bash
8181+sol call calendar update 2 --day 20260115 --facet work --start 10:00 --end 10:30
8282+```
8383+8484+## cancel
8585+8686+```bash
8787+sol call calendar cancel LINE --day DAY --facet FACET
8888+```
8989+9090+Cancel a calendar event.
9191+9292+- `LINE`: 1-based line number from `list` output (positional argument).
9393+- `--day`: day in `YYYYMMDD` (default: `SOL_DAY` env).
9494+- `--facet`: facet name (default: `SOL_FACET` env).
9595+9696+Behavior notes:
9797+9898+- Cancelled events remain visible in listings to preserve line numbering.
9999+100100+Example:
101101+102102+```bash
103103+sol call calendar cancel 3 --day 20260115 --facet work
104104+```
105105+106106+## move
107107+108108+```bash
109109+sol call calendar move LINE --day YYYYMMDD --from SOURCE --to DEST [--consent]
110110+```
111111+112112+Move a non-cancelled calendar event to another facet.
113113+114114+- `LINE`: 1-based line number from `list` output (positional argument).
115115+- `--day`: day in `YYYYMMDD` (required).
116116+- `--from`: source facet name.
117117+- `--to`: destination facet name.
118118+- `--consent`: required when called by a proactive agent. Must have explicit user approval before calling with this flag.
119119+120120+Behavior notes:
121121+122122+- Only non-cancelled events can be moved.
123123+- The `--consent` flag signals that the user has explicitly approved this action. Proactive agents must obtain user approval before including it.
124124+125125+Example:
126126+127127+```bash
128128+sol call calendar move 1 --day 20260115 --from personal --to work --consent
129129+```
+183
apps/speakers/muse/speakers/SKILL.md
···11+---
22+name: speakers
33+description: >
44+ Manage the speaker identification subsystem with sol call speakers commands.
55+ Check speaker status, detect the owner voice, identify unknown speakers, and
66+ merge name variants. Curate the speaker library over time.
77+ TRIGGER: speaker identification, voice recognition, owner detection, speaker
88+ names, voice matching, unknown voices, speaker merge.
99+---
1010+1111+# Speakers CLI Skill
1212+1313+Use these commands to manage the speaker identification subsystem from the terminal.
1414+1515+**Environment defaults**: When `SOL_DAY` is set, commands that take a DAY argument will use it automatically. Same for `SOL_FACET` where FACET is required.
1616+1717+Common pattern:
1818+1919+```bash
2020+sol call speakers <command> [args...]
2121+```
2222+2323+**Typical workflow**: status → status owner → suggest → identify/merge-names
2424+2525+## status
2626+2727+```bash
2828+sol call speakers status [SECTION]
2929+```
3030+3131+Speaker ID subsystem dashboard (embeddings, owner, speakers, clusters, imports, attribution). Returns JSON.
3232+3333+- `SECTION`: optional section name to filter (e.g., `owner`).
3434+3535+Behavior notes:
3636+3737+- Without a section, returns the full dashboard.
3838+- Use `sol call speakers status owner` to check just the owner centroid state.
3939+4040+Examples:
4141+4242+```bash
4343+sol call speakers status
4444+sol call speakers status owner
4545+```
4646+4747+## suggest
4848+4949+```bash
5050+sol call speakers suggest [--limit N]
5151+```
5252+5353+Actionable curation opportunities: unknown recurring voices, name variants, low-confidence segments. Returns JSON.
5454+5555+- `--limit`: max suggestions to return.
5656+5757+Behavior notes:
5858+5959+- Run after dream processing completes, or when the user is engaging with transcripts or recordings.
6060+- Surface suggestions one at a time conversationally — don't stack them.
6161+6262+Example:
6363+6464+```bash
6565+sol call speakers suggest --limit 5
6666+```
6767+6868+## owner detect
6969+7070+```bash
7171+sol call speakers owner detect [--force]
7272+```
7373+7474+Run owner voice detection. Returns candidate with samples.
7575+7676+- `--force`: re-run even if a candidate already exists.
7777+7878+Behavior notes:
7979+8080+- Only attempt when there are 50+ segments with embeddings across 3+ streams.
8181+- If fewer segments exist, wait — don't mention speaker ID proactively until there's enough data.
8282+8383+Example:
8484+8585+```bash
8686+sol call speakers owner detect
8787+sol call speakers owner detect --force
8888+```
8989+9090+## owner confirm
9191+9292+```bash
9393+sol call speakers owner confirm
9494+```
9595+9696+Save detected owner centroid after user confirms.
9797+9898+Behavior notes:
9999+100100+- Only run after presenting the candidate to the user and receiving explicit confirmation.
101101+- After confirmation, the system can start identifying other voices.
102102+103103+## owner reject
104104+105105+```bash
106106+sol call speakers owner reject
107107+```
108108+109109+Discard candidate if user says "that's not me."
110110+111111+Behavior notes:
112112+113113+- Wait for more data before trying detection again.
114114+- Don't re-ask about a rejected owner candidate within the same week.
115115+116116+## identify
117117+118118+```bash
119119+sol call speakers identify <cluster_id> <name> [--entity-id ID]
120120+```
121121+122122+Name an unknown speaker cluster after the user provides the name.
123123+124124+- `cluster_id`: cluster identifier from `suggest` output (positional argument).
125125+- `name`: speaker name to assign (positional argument).
126126+- `--entity-id`: optional entity ID to link the speaker to an existing entity.
127127+128128+Example:
129129+130130+```bash
131131+sol call speakers identify abc123 "Alicia Chen"
132132+sol call speakers identify abc123 "Alicia Chen" --entity-id alicia_chen
133133+```
134134+135135+## merge-names
136136+137137+```bash
138138+sol call speakers merge-names <alias> <canonical>
139139+```
140140+141141+Merge a name variant into the canonical entity.
142142+143143+- `alias`: the variant name to merge away (positional argument).
144144+- `canonical`: the canonical name to keep (positional argument).
145145+146146+Behavior notes:
147147+148148+- Use when `suggest` surfaces a name variant (e.g., "Mitch" and "Mitch Baumgartner" sound identical).
149149+- Ask the user for confirmation before merging.
150150+151151+Example:
152152+153153+```bash
154154+sol call speakers merge-names "Mitch" "Mitch Baumgartner"
155155+```
156156+157157+## Owner Detection
158158+159159+Check `speakers status owner`. If the owner centroid doesn't exist:
160160+161161+- If there are 50+ segments with embeddings across 3+ streams: good time to try. Run `speakers owner detect`.
162162+- If fewer: wait. Don't mention speaker ID proactively until there's enough data.
163163+164164+When you have a candidate, present it naturally: "I've been listening to your journal across your different devices and I think I can recognize your voice. Here are a few moments — does this sound right?" Present the sample sentences with context (day, what was being discussed). Don't play audio — show text and context.
165165+166166+- If the user confirms: run `speakers owner confirm`.
167167+- If the user rejects: run `speakers owner reject`. Wait for more data before trying again.
168168+169169+## Speaker Curation
170170+171171+Run `speakers suggest` after dream processing completes, or when the user is engaging with transcripts or recordings. Surface suggestions conversationally based on type:
172172+173173+- **Unknown recurring voice:** "I keep hearing a voice in your [day/context] recordings. They said things like '[sample text]'. Do you know who that is?" If the user names them, run `speakers identify <cluster_id> <name>`.
174174+- **Name variant:** "I noticed 'Mitch' and 'Mitch Baumgartner' sound identical in your recordings. Should I merge them?" If yes, run `speakers merge-names <alias> <canonical>`.
175175+- **Low confidence review:** "There are a few speakers in this conversation I'm not sure about. Want to take a quick look?"
176176+177177+**Don't stack suggestions.** Surface one at a time. Wait for the user to respond before presenting another. Speaker curation should feel like a natural aside, not a checklist.
178178+179179+## When NOT to Act
180180+181181+- Don't proactively surface speaker ID during unrelated conversations. If the user is asking about their calendar or a todo, don't pivot to "by the way, I found a new voice."
182182+- Don't surface low-confidence suggestions. If a cluster has only a few embeddings, wait for it to grow.
183183+- Don't re-ask about a rejected owner candidate within the same week.