personal memory agent
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

refactor(docs): scrub stragglers from retired events/occurrences/anticipations framework

Sprint 4 Lode D. Surgical scrub of stale references left over from Lodes A-C3c.
Runtime was already migrated; this lode removes dead-pointer debris so readers
and prompts do not follow commands, files, or features that no longer exist.

Docs:
- APPS.md: drop occurrence-hook as a live option; mark the V6 audit retired; reference implementations now cite only `talent/schedule.py`.
- THINK.md, CORTEX.md: align the hook example and Active Facet Detection description with live behavior (`think/facets.py::get_active_facets`).
- talent/journal/references/{captures,cli,config,facets,storage}.md: frame events as historical; delete the `events` subcommand section and dead `extract` config knob; add activities alongside events; swap `flow` examples for live talent names.

Talent prompts / skill (surgical swap-or-drop, no style rewrites):
- skills/solstone/SKILL.md, triage.md, joke_bot.md, decisionalizer.md, think/planner.md, apps/entities/talent/{entity_assist,entities}.md, apps/todos/talent/{daily,weekly}.md: replace `sol call journal events` with either `sol call activities list --source anticipated` (future-facing) or `sol call journal search -a meetings` (historical); drop it where no literal equivalent applies.
- think/planner.md: drop `get_events` from the tool list and replace examples with `search_journal` agent filters.

Code:
- think/tools/search.py: drop `flow` from live-agent examples in the docstring; swap `agent="flow"` to `agent="meetings"`; keep `agent="event"` as the historical example.
- convey/templates/app.html: simplify the command-hint branch to check only `sol call activities list`.

Tests + fixtures:
- tests/baselines/api/activities/day-events.json: delete the orphan baseline (endpoint removed in Lode C1).
- make update-api-baselines is zero-delta; live baselines were regenerated in `9a5d800b`. Historical `flow` / `knowledge_graph` entries in `tokens/usage.json` come from fixture talent logs and remain out of scope.
- tests/fixtures/journal/sol/briefing.md: align with the morning briefing template (`calendar_events` to `anticipated_activities`).

Keep-list invariants intact:
- `think/formatters.py:142` `facets/*/events/*.jsonl` registry entry.
- `think/event_formatter.py::format_events`.
- `think/indexer/journal.py:~250` glob.
- `tests/test_formatters.py` and `tests/test_journal_index.py` event/flow fixture coverage.

Follow-ups (flagged, not fixed):
- `apps/settings/routes.py:435-441, 931-935`: dead `hook == "occurrence"` branches and orphan `extract` field handling.
- `talent/schedule.md:5`: schedule output still says "structured anticipation records"; this leaks into three baselines but was outside Lode D scope.

3238 passed, 1 skipped, 1 warning.

+55 -154
+2 -2
apps/entities/talent/entities.md
··· 57 57 Discovery tools (note facet scoping): 58 58 - `sol call journal read AGENT` - read full agent output (e.g., knowledge_graph, followups) - GLOBAL 59 59 - `sol call journal search QUERY -d DAY -a AGENT -f FACET -n LIMIT` - unified search across all journal content - facet-scopable 60 - - `sol call journal events [-f FACET]` - get structured events - **FACET-SCOPED when facet parameter provided** 60 + - `sol call journal search QUERY -d DAY -a meetings -f FACET -n LIMIT` - search historical meetings - **FACET-SCOPED when facet parameter provided** 61 61 62 62 **IMPORTANT**: When using GLOBAL search tools, you must actively filter results to find ONLY entities that participated in THIS facet's activities. Seeing an entity in a global search result does NOT automatically mean it belongs to this facet. 63 63 ··· 79 79 **Search Strategy - Facet-First Approach:** 80 80 81 81 **Priority 1: Facet-Scoped Events** (start here - most facet-specific) 82 - - `sol call journal events -f your_facet` - **FACET-SCOPED** when facet parameter provided 82 + - `sol call journal search "" -d $day_YYYYMMDD -a meetings -f your_facet` - **FACET-SCOPED** when facet parameter provided 83 83 - Events tagged to this facet are your most reliable source 84 84 - Extract ALL entities that participated in this facet's events 85 85
+1 -1
apps/entities/talent/entity_assist.md
··· 41 41 - `sol call journal search QUERY -n 3` - find entity mentions in all journal content 42 42 - `sol call journal search QUERY -a audio -n 3` - find entity in transcripts 43 43 - `sol call journal search QUERY -a news -n 3` - find entity in facet news 44 - - `sol call journal events -d DAY` - find entity in events for a specific day 44 + - `sol call journal search QUERY -d DAY -a meetings -n 3` - find entity in meetings for a specific day 45 45 - `sol call journal read AGENT` - read full agent output when snippet search is insufficient 46 46 47 47 ## Quick Addition Process
+1 -1
apps/todos/talent/daily.md
··· 55 55 - `sol call todos done LINE_NUMBER` – mark an entry complete 56 56 - `sol call todos upcoming -l LIMIT` – view upcoming todos 57 57 58 - You may combine these with discovery calls (`sol call journal search`, `sol call journal events`, `sol call journal read AGENT`) to gather supporting evidence. Line numbers are stable identifiers—todos are never deleted, only cancelled. 58 + You may combine these with discovery calls (`sol call journal search`, `sol call activities list --source anticipated`, `sol call journal read AGENT`) to gather supporting evidence. Line numbers are stable identifiers—todos are never deleted, only cancelled. 59 59 60 60 ## Process 61 61
+1 -1
apps/todos/talent/weekly.md
··· 20 20 You have access to: 21 21 1. **Checklist history** – `sol call todos list -d DAY` for today and each of the prior six days 22 22 2. **Follow-up insights** – `sol call journal search "followup" -d {date} -a followups` for each day in scope (follow-ups are produced per-activity, so results may span multiple activities) 23 - 3. **Journal search** – `sol call journal search QUERY -d DAY -a AGENT -f FACET -n LIMIT` and `sol call journal events -d DAY -f FACET` for discovery scoped to the date range 23 + 3. **Journal search** – `sol call journal search QUERY -d DAY -a AGENT -f FACET -n LIMIT` for discovery scoped to the date range 24 24 4. **Facet news** – `sol call journal search "[keywords]" -a news` or `sol call journal news -d DAY` for announced commitments 25 25 5. **Current date and facet context** – for ordering, scheduling, and due-date decisions 26 26
+1 -1
convey/templates/app.html
··· 533 533 if (query) return 'searching: ' + query.substring(0, 50) + '\u2026'; 534 534 return 'searching your journal\u2026'; 535 535 } 536 - if (cmd.includes('sol call journal events') || cmd.includes('sol call activities list')) return 'looking up events\u2026'; 536 + if (cmd.includes('sol call activities list')) return 'looking up activities\u2026'; 537 537 if (cmd.includes('sol call navigate')) return 'navigating\u2026'; 538 538 if (cmd.includes('sol call transcripts')) return 'reading transcripts\u2026'; 539 539 if (cmd.includes('sol call entity') || cmd.includes('sol call entities')) {
+7 -9
docs/APPS.md
··· 291 291 - 90+: Late-stage agents 292 292 - 99: Fun/optional prompts 293 293 294 - **Event extraction via hooks:** To extract structured events from generator output, use the `hook` field: 294 + **Schedule extraction via hooks:** The live built-in extraction hook is `schedule`: 295 295 296 - - `"hook": {"post": "occurrence"}` - Extracts past events to `facets/{facet}/events/{day}.jsonl` 297 - - `"hook": {"post": "schedule"}` - Writes future scheduled items as anticipated activity records 296 + - `"hook": {"post": "schedule"}` - Writes future scheduled items to `facets/{facet}/activities/{target_day}.jsonl` as anticipated activity records 298 297 299 - The `occurrences` field (optional string) provides agent-specific extraction guidance when using the occurrence hook. Example: 298 + Example: 300 299 301 300 ```json 302 301 { 303 - "title": "Meeting Summary", 302 + "title": "Schedule Extractor", 304 303 "schedule": "daily", 305 - "hook": {"post": "occurrence"}, 306 - "occurrences": "Each meeting should generate an occurrence with start and end times, participants, and summary." 304 + "hook": {"post": "schedule"} 307 305 } 308 306 ``` 309 307 ··· 350 348 - **Natural-key dedup.** Read the existing output, compute a natural key per row (e.g., `(facet, event_day, title, start, end)` for facet events), skip rows already present, and append only the new ones. Use this when the output is append-only history and you want to preserve prior writes from other agents. 351 349 - **Atomic replace.** Recompute the full output, write it to a temp file, and rename into place. `atomic_write()` in `think/entities/core.py` is the established helper for text outputs; for JSONL, write the full set of lines to a tempfile and `os.replace()`. Use this when the hook owns the file end-to-end. 352 350 353 - An earlier `write_events_jsonl` hook in `think/hooks.py` opened facet-event logs in `"a"` mode with no dedup and doubled row counts on every `sol think --refresh` — see the 2026-04-17 layer-violations audit (V6) in the sol pbc internal extro repo (`vpe/workspace/solstone-layer-violations-audit.md`) for the full write-up. 351 + (Retired 2026-04-18 Sprint 4.) An earlier `write_events_jsonl` hook in `think/hooks.py` opened facet-event logs in `"a"` mode with no dedup and doubled row counts on every `sol think --refresh` — see the 2026-04-17 layer-violations audit (V6) in the sol pbc internal extro repo (`vpe/workspace/solstone-layer-violations-audit.md`) for the full write-up. 354 352 355 353 See `docs/coding-standards.md` L8/L9 for the broader principles. 356 354 357 355 **Reference implementations:** 358 356 - System generator templates: `talent/*.md` (files with `schedule` field but no `tools` field) 359 - - Event/schedule hooks: `talent/occurrence.py`, `talent/schedule.py` 357 + - Schedule hook: `talent/schedule.py` 360 358 - Discovery logic: `think/talent.py` - `get_talent_configs(has_tools=False)`, `get_output_name()` 361 359 - Hook loading: `think/talent.py` - `load_pre_hook()`, `load_post_hook()` 362 360
+1 -1
docs/CORTEX.md
··· 336 336 337 337 #### Daily Multi-Facet Agents 338 338 339 - **Active Facet Detection**: By default, daily multi-facet agents only run for facets that had activity the previous day. Activity is determined by the presence of occurrence events in `facets/{facet}/events/{day}.jsonl`. This prevents unnecessary agent runs for inactive facets. 339 + **Active Facet Detection**: By default, daily multi-facet agents only run for facets that had activity the previous day. `think/facets.py:get_active_facets()` determines activity by scanning segment-level `facets.json` files from the previous day, not facet event files. This prevents unnecessary agent runs for inactive facets. 340 340 341 341 To force an agent to run for all facets regardless of activity, set `"always": true`: 342 342
+1 -1
docs/THINK.md
··· 183 183 - `mtime` – modification time of the `.md` file 184 184 - Additional keys from JSON frontmatter such as `title`, `description`, `hook`, or `load` 185 185 186 - The `hook` field enables output processing by invoking named hooks like `"occurrence"` or `"schedule"`. 186 + The `hook` field enables output processing by invoking named hooks like `"schedule"`. 187 187 The `load` key controls transcript/percept/agent source filtering for generators. 188 188 See [APPS.md](APPS.md#prompt-context-configuration) for the full schema. 189 189
+1 -5
skills/solstone/SKILL.md
··· 62 62 Combine these commands to get a full picture of the current day: 63 63 64 64 ```bash 65 - # Today's events (imports, captures, activity) 66 - sol call journal events 67 - 68 65 # Upcoming todos 69 66 sol call todos upcoming 70 67 ··· 142 139 143 140 **"Brief me on today"** — events + todos + calendar + recent entity strength: 144 141 ```bash 145 - sol call journal events 146 142 sol call todos upcoming 147 143 sol call activities list --source anticipated 148 144 sol call entities strength --since $(date +%Y%m%d) ··· 157 153 158 154 **"What did I miss yesterday?"** — yesterday's events + transcripts + news: 159 155 ```bash 160 - sol call journal events --day 20260326 156 + sol call journal search "" -d 20260326 -a meetings 161 157 sol call transcripts scan 20260326 162 158 sol call journal news "<facet>" --day 20260326 163 159 ```
+3 -4
talent/decisionalizer.md
··· 22 22 23 23 ## Available Commands 24 24 25 - SOL_DAY is set in your environment. Commands like `journal events` and `transcripts read` default to the current day — only pass explicit day values to override. Note: `journal search` requires explicit `-d DAY`. 25 + SOL_DAY is set in your environment. Commands like `transcripts read` default to the current day — only pass explicit day values to override. Note: `journal search` requires explicit `-d DAY`. 26 26 27 27 - `sol call journal search` for discovery across journal content 28 - - `sol call journal events [-f FACET]` for structured event data 29 28 - `sol call transcripts read --start HHMMSS --length MINUTES --full|--audio|--screen` for transcript windows 30 29 31 30 **Query syntax**: Searches match ALL words by default; use `OR` between words to match ANY (e.g., `apple OR orange`), quote phrases for exact matches (e.g., `"project meeting"`), and append `*` for prefix matching (e.g., `debug*`). ··· 73 72 - Goal: Find all people, teams, projects mentioned 74 73 75 74 2. **Map meeting participants:** 76 - - `sol call journal events` or `sol call journal search "[keywords]" -d $day_YYYYMMDD -a event` 75 + - `sol call journal search "[keywords]" -d $day_YYYYMMDD -a meetings` 77 76 - `sol call journal search "[keywords]" -a news -f work -d $day_YYYYMMDD` for public announcements 78 77 - Goal: Identify who needs to know about this decision 79 78 ··· 95 94 - Goal: Find follow-up notifications or discussions 96 95 97 96 2. **Review meetings:** 98 - - `sol call journal search "[keywords]" -d $day_YYYYMMDD -a event` 97 + - `sol call journal search "[keywords]" -d $day_YYYYMMDD -a meetings` 99 98 - Goal: See if decision was discussed 100 99 101 100 3. **Check messaging:**
+2 -2
talent/joke_bot.md
··· 25 25 3. **Contextual Analysis**: Use transcript/insight retrieval to pull full context for the most promising findings from the previous phases. This raw material will be analyzed for comedic elements like irony, juxtaposition, or absurdity. 26 26 4. **Creative Synthesis & Delivery**: The final phase involves brainstorming joke concepts from the analyzed material, selecting the best one, and delivering it as the final response. 27 27 28 - SOL_DAY is set in your environment. Commands like `journal events`, `journal read`, and `transcripts read` default to the current day — only pass explicit day values to override. Note: `journal search` requires explicit `-d DAY`. 28 + SOL_DAY is set in your environment. Commands like `journal read` and `transcripts read` default to the current day — only pass explicit day values to override. Note: `journal search` requires explicit `-d DAY`. 29 29 30 30 ### Detailed Research Steps 31 31 ··· 39 39 - **Expected Outcomes**: A list of all agent insights from the day, which will help identify recurring themes or unusual combinations of activities. 40 40 41 41 2. **List All Structured Events**: 42 - - **Command**: `sol call journal events` 42 + - **Command**: `sol call journal search "" -d $day_YYYYMMDD -a meetings` 43 43 - **Purpose**: To identify all formal meetings, calls, or tasks. Corporate jargon, meeting mishaps, or task-related struggles are excellent sources of humor. 44 44 - **Expected Outcomes**: A timeline of the day's key events, such as "Project Phoenix Sync," "API Debugging Session," or "Team Standup." 45 45
+13 -14
talent/journal/references/captures.md
··· 17 17 │ (JSON/JSONL files) │ "What happened" 18 18 │ - audio.jsonl, *_audio.jsonl │ 19 19 │ - screen.jsonl, *_screen.jsonl │ 20 - │ - events/*.jsonl (per-facet) │ 20 + │ - events/*.jsonl (historical) │ 21 21 └─────────────────────────────────────┘ 22 22 ↑ derived from 23 23 ┌─────────────────────────────────────┐ ··· 52 52 | Term | Definition | Examples | 53 53 |------|------------|----------| 54 54 | **Entity** | Tracked person/project/concept | People, companies, tools | 55 - | **Occurrence** | Time-based event | Meetings, messages, files | 55 + | **Occurrence** | Historical term; occurrence hook retired 2026-04-18 Sprint 4. Produced `facets/{facet}/events/{day}.jsonl`, still searchable via `search_journal(agent="event")`. | Meetings, messages, files | 56 56 57 57 ## Imported Audio 58 58 ··· 227 227 2. Category-specific follow-up prompts are discovered from `observe/categories/*.md` files 228 228 3. Follow-ups are triggered for categories that have extraction content in their `.md` file (currently: messaging, browsing, reading, productivity output markdown; meeting outputs JSON) 229 229 230 - ### Event extracts 230 + ### Historical event extracts 231 231 232 - Generator output processing extracts time-based events from the day's transcripts—meetings, messages, follow-ups, file activity and more. Occurrence events are stored per-facet in JSONL files at `facets/{facet}/events/{day}.jsonl`. Future scheduled items from the schedule talent are stored as anticipated activity records under `facets/{facet}/activities/{target_day}.jsonl` with `source: "anticipated"`. 232 + The retired occurrence hook previously extracted time-based events from the day's transcripts—meetings, messages, follow-ups, file activity, and more. Those historical event rows were stored per-facet in JSONL files at `facets/{facet}/events/{day}.jsonl`. These files persist for historical search via `search_journal(agent="event")`. Live future scheduled items are stored separately as anticipated activity records under `facets/{facet}/activities/{target_day}.jsonl` with `source: "anticipated"`. 233 233 234 234 ```jsonl 235 235 {"type": "meeting", "start": "09:00:00", "end": "09:30:00", "title": "Team stand-up", "summary": "Status update with the engineering team", "work": true, "participants": ["Jeremie Miller", "Alice", "Bob"], "facet": "work", "agent": "meetings", "occurred": true, "source": "20250101/talents/meetings.md", "details": "Sprint planning discussion"} 236 - {"id": "anticipated_deadline_000000_0115", "activity": "deadline", "target_date": "2025-01-15", "start": null, "end": null, "title": "Project milestone", "description": "Q1 deliverable due.", "details": "Final review before release", "facet": "work", "source": "anticipated", "active_entities": [], "participation": [], "participation_confidence": 0.5, "cancelled": false} 237 236 ``` 238 237 239 - **Common fields:** 240 - - **type** – event kind: `meeting`, `message`, `file`, `followup`, `documentation`, `research`, `media`, `deadline`, `appointment`, etc. 241 - - **start** and **end** – HH:MM:SS timestamps (or `null` when a time is not known) 238 + **Common historical fields:** 239 + - **type** – event kind such as `meeting`, `message`, `file`, `followup`, `documentation`, `research`, `media`, `deadline`, or `appointment` 240 + - **start** and **end** – HH:MM:SS timestamps (or `null` when a time was not known) 242 241 - **title** and **summary** – short text for display and search 243 - - **facet** – facet name the event belongs to (required) 244 - - **agent** – source generator type for occurrence events (e.g., "meetings", "flow") 245 - - **occurred** – `true` for occurrence event rows in `facets/*/events/*.jsonl` 246 - - **source** – path to the output file that generated this event 242 + - **facet** – facet name the event belonged to 243 + - **agent** – source generator type for the historical event row (for example `"meetings"`) 244 + - **occurred** – `true` for historical event rows in `facets/*/events/*.jsonl` 245 + - **source** – path to the output file that generated the event row 247 246 - **work** – boolean, work vs. personal classification 248 247 - **participants** – optional list of people or entities involved 249 248 - **details** – free-form string with additional context 250 249 251 - This structure allows the indexer to collect and search events across all facets and days. 250 + These persisted historical files still allow the indexer to collect and search event rows across all facets and days. 252 251 253 252 ## Layer 3: Agent Outputs 254 253 ··· 269 268 Each template is a `.md` file with JSON frontmatter containing metadata (title, description, schedule, output format). The `schedule` field is required and must be `"segment"` or `"daily"` - generators with missing or invalid schedule are skipped. Use `get_talent_configs(has_tools=False)` from `think/talent.py` to retrieve all available generators, or `get_talent_configs(has_tools=False, schedule="daily")` to get generators filtered by schedule. 270 269 271 270 **Output naming:** 272 - - System outputs: `talents/{agent}.md` (e.g., `talents/flow.md`, `talents/meetings.md`) 271 + - System outputs: `talents/{agent}.md` (e.g., `talents/meetings.md`, `talents/briefing.md`) 273 272 - App outputs: `talents/_{app}_{agent}.md` (e.g., `talents/_entities_observer.md`) 274 273 - JSON output: `talents/{agent}.json` when metadata specifies `"output": "json"` 275 274
+5 -25
talent/journal/references/cli.md
··· 10 10 sol call journal <command> [args...] 11 11 ``` 12 12 13 - **Typical workflow**: `search` to find content across all types → `events` or `facet` for structured detail on a specific day or project. 13 + **Typical workflow**: `search` to find content across all types → `facet` for project detail. For future scheduled items, use `sol call activities list`. 14 14 15 15 ## search 16 16 ··· 18 18 sol call journal search [QUERY] [-n LIMIT] [--offset N] [-d DAY] [--day-from DAY] [--day-to DAY] [-f FACET] [-a AGENT] 19 19 ``` 20 20 21 - Search the journal index across insights, transcripts, events, entities, and todos. 21 + Search the journal index across insights, transcripts, historical event extracts, activity records, entities, and todos. 22 22 23 23 - `QUERY`: optional text query. Defaults to empty string (`""`), which works as browse mode when filters are provided. 24 24 - `-n, --limit`: max results (default `10`). ··· 26 26 - `-d, --day`: exact day filter (`YYYYMMDD`). 27 27 - `--day-from`, `--day-to`: inclusive date-range filters (`YYYYMMDD`). 28 28 - `-f, --facet`: facet filter (for example `work`, `personal`). 29 - - `-a, --agent`: agent/content filter (for example `flow`, `event`, `news`, `entity:detected`). 29 + - `-a, --agent`: agent/content filter (for example `meetings`, historical `event`, `news`, `entity:detected`). 30 30 31 31 Behavior notes: 32 32 ··· 43 43 sol call journal search "incident review" -n 20 -f work 44 44 sol call journal search "standup OR sync" --day-from 20260101 --day-to 20260107 45 45 sol call journal search "" -d 20260115 -a audio 46 - ``` 47 - 48 - ## events 49 - 50 - ```bash 51 - sol call journal events [DAY] [-f FACET] 52 - ``` 53 - 54 - List structured events for a day. 55 - 56 - - `DAY`: day in `YYYYMMDD` (default: `SOL_DAY` env). 57 - - `-f, --facet`: optional facet filter. 58 - 59 - Use this when you need full event records (titles, summaries, times, participants), not just search snippets. 60 - 61 - Examples: 62 - 63 - ```bash 64 - sol call journal events 20260115 65 - sol call journal events 20260115 -f work 66 46 ``` 67 47 68 48 ## facet show ··· 247 227 248 228 Read full content of an agent output. 249 229 250 - - `AGENT`: agent name, e.g. `flow`, `meetings`, `activity` (positional argument). 230 + - `AGENT`: agent name, e.g. `meetings`, `briefing`, `activity` (positional argument). 251 231 - `-d, --day`: day in `YYYYMMDD` (default: `SOL_DAY` env). 252 232 - `-s, --segment`: optional segment key (default: `SOL_SEGMENT` env). 253 233 - `--max`: max output bytes (default `16384`, `0` for unlimited). ··· 257 237 Examples: 258 238 259 239 ```bash 260 - sol call journal read flow -d 20260115 240 + sol call journal read briefing -d 20260115 261 241 sol call journal read meetings 262 242 sol call journal read activity -s 091500_300 263 243 ```
+2 -3
talent/journal/references/config.md
··· 99 99 100 100 "Raw media" means layer 1 capture files only: audio files (`.flac`, `.opus`, `.ogg`, `.m4a`, `.wav`), video files (`.webm`, `.mov`, `.mp4`), and screen diffs (`monitor_*_diff.png`). 101 101 102 - All layer 2 and layer 3 content is always preserved regardless of retention policy: transcripts (`audio.jsonl`, `screen.jsonl`), talent outputs (`talents/*.md`), speaker labels (`talents/speaker_labels.json`), facet events (`events/*.jsonl`), entity data, segment metadata (`stream.json`), and search index entries. 102 + All layer 2 and layer 3 content is always preserved regardless of retention policy: transcripts (`audio.jsonl`, `screen.jsonl`), talent outputs (`talents/*.md`), speaker labels (`talents/speaker_labels.json`), historical facet events (`events/*.jsonl`), entity data, segment metadata (`stream.json`), and search index entries. 103 103 104 104 Raw media is never deleted from segments that haven't finished processing. A segment is considered complete only when all four checks pass: 105 105 ··· 243 243 "observe.*": {"provider": "google", "tier": 3}, 244 244 "talent.system.*": {"tier": 1}, 245 245 "talent.system.meetings": {"provider": "anthropic", "disabled": true}, 246 - "talent.entities.observer": {"tier": 2, "extract": false} 246 + "talent.entities.observer": {"tier": 2} 247 247 }, 248 248 "models": { 249 249 "google": { ··· 298 298 - `tier` (integer) – Tier number (optional). 299 299 - `model` (string) – Explicit model name (optional, overrides tier). 300 300 - `disabled` (boolean) – Disable this talent config (optional, talent contexts only). 301 - - `extract` (boolean) – Enable/disable event extraction for generators with occurrence hooks (optional). 302 301 303 302 **models** – Per-provider tier overrides. Maps provider name to tier-model mappings: 304 303 ```json
+1 -1
talent/journal/references/facets.md
··· 10 10 - `activities/` – configured activities and completed activity records (see [activity records](#activity-records)). 11 11 - `entities/` – entity relationships and detected entities (see [facet entities](#facet-entities)). 12 12 - `todos/` – daily todo lists (see [facet-scoped todos](#facet-scoped-todos)). 13 - - `events/` – extracted events per day (see [event extracts](captures.md#event-extracts)). 13 + - `events/` – historical extracted events per day (see [historical event extracts](captures.md#historical-event-extracts)). 14 14 - `news/` – daily news and updates relevant to the facet (optional). 15 15 - `logs/` – action audit logs for tool calls (optional, see [action logs](logs.md#action-logs)). 16 16
+2 -2
talent/journal/references/storage.md
··· 8 8 |----------------|---------| 9 9 | `chronicle/` | Container for daily capture folders (`YYYYMMDD/`) containing segments, extracts, and agent outputs | 10 10 | `entities/` | Journal-level entity identity records (`<id>/entity.json`) | 11 - | `facets/` | Facet-specific data: entity relationships, todos, events, news, action logs | 11 + | `facets/` | Facet-specific data: activities, entity relationships, todos, historical events, news, action logs | 12 12 | `talents/` | Talent run logs in per-talent subdirectories (`<name>/<id>.jsonl`), day indexes (`<day>.jsonl`), and latest-run symlinks (`<name>.log`) | 13 13 | `apps/` | App-specific storage (distinct from codebase `apps/`) | 14 14 | `streams/` | Per-stream state files (`<name>.json`) tracking segment chains and sequence numbers | ··· 38 38 The `indexer/` directory contains the full-text search index built from journal content. 39 39 40 40 **Files:** 41 - - `indexer/journal.sqlite` – FTS5 SQLite database containing indexed chunks from agent outputs, events, entities, todos, and action logs 41 + - `indexer/journal.sqlite` – FTS5 SQLite database containing indexed chunks from agent outputs, activities, historical events, entities, todos, and action logs 42 42 43 43 The indexer converts content to markdown chunks via the formatters framework, then indexes with metadata fields (day, facet, agent) for filtering. Raw audio/screen transcripts are formattable but not indexed — agent outputs provide more useful search results. Use `get_journal_index()` from `think/indexer/journal.py` to access the database programmatically. 44 44
+2 -2
talent/triage.md
··· 31 31 - `sol call entities intelligence ENTITY [--facet FACET] [--brief]` — Intelligence briefing for an entity (returns JSON — synthesize into natural language). Use --brief for concise lookups. 32 32 33 33 ### Journal 34 - - `sol call journal events [DAY] [-f FACET]` — List events with participants, times, and summaries. 34 + - `sol call activities list --source anticipated [--day DAY] [-f FACET]` — List anticipated activities with participants, times, and summaries. 35 35 36 36 ### Awareness 37 37 - `sol call awareness status [SECTION]` — Read awareness state (e.g., processing state, journal health). ··· 48 48 - For lookups (list todos, list events, list entities), present the results concisely. 49 49 - For entity intelligence briefings, synthesize the JSON output into a concise natural-language summary — do not dump raw JSON. 50 50 - **Pre-meeting briefings**: When the owner asks "brief me on my next meeting", "who am I meeting?", or similar: 51 - 1. Run `sol call journal events` to find upcoming events with participants. 51 + 1. Run `sol call activities list --source anticipated` to find upcoming events with participants. 52 52 2. For each participant, run `sol call entities intelligence PARTICIPANT --brief` to gather background. 53 53 3. Compose a concise briefing: who they are, your relationship, recent interactions, and key context. 54 54 Proactively offer briefings when context shows an upcoming meeting: "You have a meeting with [person] in [time]. Want me to brief you?"
-69
tests/baselines/api/activities/day-events.json
··· 1 - [ 2 - { 3 - "agent": "flow", 4 - "color": "#6c757d", 5 - "details": "Attended keynote on unified API gateways", 6 - "endTime": "2026-03-04T12:00:00", 7 - "facet": "montague", 8 - "occurred": true, 9 - "participants": [ 10 - "Romeo Montague", 11 - "Mercutio Escalus" 12 - ], 13 - "source": "20260304/talents/flow.md", 14 - "startTime": "2026-03-04T09:00:00", 15 - "subject": "", 16 - "summary": "Conference keynote featuring Juliet Capulet", 17 - "title": "Denver Tech Summit - Morning Keynote" 18 - }, 19 - { 20 - "agent": "flow", 21 - "color": "#6c757d", 22 - "details": "Juliet and Romeo exchanged Signal contacts", 23 - "endTime": "2026-03-04T20:00:00", 24 - "facet": "capulet", 25 - "occurred": true, 26 - "participants": [ 27 - "Juliet Capulet", 28 - "Romeo Montague" 29 - ], 30 - "source": "20260304/talents/flow.md", 31 - "startTime": "2026-03-04T18:00:00", 32 - "subject": "", 33 - "summary": "Networking event", 34 - "title": "Conference Mixer" 35 - }, 36 - { 37 - "agent": "flow", 38 - "color": "#6c757d", 39 - "details": "Standing ovation for architecture presentation", 40 - "endTime": "2026-03-04T10:00:00", 41 - "facet": "capulet", 42 - "occurred": true, 43 - "participants": [ 44 - "Juliet Capulet" 45 - ], 46 - "source": "20260304/talents/flow.md", 47 - "startTime": "2026-03-04T09:00:00", 48 - "subject": "", 49 - "summary": "Juliet presented on unified API gateways", 50 - "title": "Denver Tech Summit - Juliet's Keynote" 51 - }, 52 - { 53 - "agent": "flow", 54 - "color": "#6c757d", 55 - "details": "Tybalt confronted Romeo", 56 - "endTime": "2026-03-04T18:00:00", 57 - "facet": "montague", 58 - "occurred": true, 59 - "participants": [ 60 - "Romeo Montague", 61 - "Mercutio Escalus" 62 - ], 63 - "source": "20260304/talents/flow.md", 64 - "startTime": "2026-03-04T14:00:00", 65 - "subject": "", 66 - "summary": "Built API bridge prototype", 67 - "title": "Hackathon - API Bridge Challenge" 68 - } 69 - ]
+2 -2
tests/fixtures/journal/sol/briefing.md
··· 5 5 model: "claude-sonnet-4-20250514" 6 6 sources: 7 7 segments: 14 8 - calendar_events: 3 8 + anticipated_activities: 3 9 9 entities_consulted: 3 10 10 facet_newsletters: 2 11 11 followups: 5 ··· 13 13 gaps: [] 14 14 --- 15 15 16 - > Built from 14 transcript segments, 3 calendar events, 3 entity profiles, 2 facet newsletters, 5 follow-ups, 8 todos. No gaps. 16 + > Built from 14 transcript segments, 3 anticipated activities, 3 entity profiles, 2 facet newsletters, 5 follow-ups, 8 todos. No gaps. 17 17 18 18 ## Your Day 19 19
+5 -6
think/planner.md
··· 15 15 You have knowledge of these tools for planning purposes: 16 16 17 17 ### Search Tools 18 - - **search_journal**: Unified full-text search across all journal content (agent outputs, events, entities, todos). Supports filtering by `day`, `facet`, and `agent` (e.g., "event", "flow", "news"). Best for discovering themes, concepts, patterns, and specific content across the journal. Note: raw audio/screen transcripts are not indexed — use `sol call transcripts read` for transcript content. 19 - - **get_events**: Retrieves structured events for a specific day from facet event logs. Returns events with timestamps, titles, and descriptions. Best for finding scheduled activities, meetings, or notable occurrences on particular days. 18 + - **search_journal**: Unified full-text search across all journal content (agent outputs, events, entities, todos). Supports filtering by `day`, `facet`, and `agent` (e.g., "event", "meetings", "news"). Best for discovering themes, concepts, patterns, and specific content across the journal. Note: raw audio/screen transcripts are not indexed — use `sol call transcripts read` for transcript content. 20 19 21 20 ### Content Access 22 - - **sol call journal read DAY AGENT**: Read full agent output markdown for a specific day and agent (e.g., `sol call journal read 20240115 flow`) 21 + - **sol call journal read DAY AGENT**: Read full agent output markdown for a specific day and agent (e.g., `sol call journal read 20240115 meetings`) 23 22 - Use `--segment HHMMSS_LEN` for per-segment outputs (e.g., `sol call journal read 20240115 activity --segment 093000_300`) 24 23 - **sol call journal agents DAY**: List all available agent outputs for a day 25 24 - Use `--segment HHMMSS_LEN` to list outputs for a specific segment ··· 41 40 42 41 **Discovery Phase** (Use search tools to identify relevant content): 43 42 - Start broad with `search_journal` to identify relevant topics and time segments 44 - - Use `search_journal` with `agent="event"` to find structured activities related to the request 43 + - Use `search_journal(..., agent="meetings")` to find structured activities related to the request 45 44 - Use `sol call transcripts read` for raw transcript content when exact details are needed 46 - - Use `get_events(day)` when you need all events for a specific day 45 + - Use `search_journal("", day=..., agent="meetings")` when you need structured meeting records for a specific day 47 46 48 47 **Deep Analysis Phase** (Use resources for complete information): 49 48 - Access full agent outputs via `sol call journal read {day} {agent}` for identified agents ··· 79 78 - Expected outcomes: [what information this should reveal] 80 79 81 80 2. **Targeted Searches**: 82 - - Tool: `search_journal` with agent filter or `get_events` 81 + - Tool: `search_journal` with agent filter 83 82 - Parameters: [specific filters or days] 84 83 - Purpose: [what specific information to find] 85 84
+2 -2
think/tools/search.py
··· 102 102 day_from: Filter by date range start (``YYYYMMDD``, inclusive) 103 103 day_to: Filter by date range end (``YYYYMMDD``, inclusive) 104 104 facet: Filter by facet name (e.g., "work", "personal") 105 - agent: Filter by agent (e.g., "flow", "event", "entity:detected", "news") 105 + agent: Filter by agent (e.g., "meetings", "event", "entity:detected", "news") 106 106 stream: Filter by stream name (e.g., "archon", "import.apple") 107 107 time_bucket: Filter by time of day — "morning" (06:00–11:59), 108 108 "afternoon" (12:00–16:59), "evening" (17:00–20:59), or "night" (21:00–05:59) ··· 122 122 - search_journal("project planning", facet="work") 123 123 - search_journal("standup", agent="event") 124 124 - search_journal("weekly sync", day_from="20241201", day_to="20241207") 125 - - search_journal(agent="flow", day="20240101") # Browse all flow for a day 125 + - search_journal(agent="meetings", day="20240101") # Browse all meetings for a day 126 126 - search_journal("meeting", stream="archon") # Filter by stream 127 127 - search_journal("standup", time_bucket="morning") # Morning meetings 128 128 """