personal memory agent
0
fork

Configure Feed

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

cleanup(sprint4): scrub stale occurrence/has_extraction/schedule refs

Post-Sprint-4 trivials bundled:
- remove dead occurrence/has_extraction detection in settings routes
plus the now-unreachable Extract toggle UI branch in workspace.html,
and drop the corresponding extract/has_extraction keys from the
generators.json baseline; refresh adjacent docstring/copy that
referenced the removed field
- normalize the schedule generator description to the post-Sprint-3
"anticipated activity records" phrasing in talent/schedule.md and
the three API baselines that mirror it
- fix stale "calendar" in the talent/journal/references/config.md
apps.order example (now "activities")
- replace retired "occurrence" hook value with live "schedule" in
the _format_tags test data
- document the sense.json/sense.md dual-write coupling to
think/cluster.py's per-segment talents/**/*.md glob

+15 -60
+1 -16
apps/settings/routes.py
··· 379 379 - cogitate: Current cogitate provider, tier, and backup 380 380 - contexts: Configured context overrides from journal.json 381 381 - context_defaults: Context registry with labels/groups for UI 382 - (includes talent configs with type, schedule, disabled, extract) 382 + (includes talent configs with type, schedule, and disabled state) 383 383 - api_keys: Boolean status for each provider's API key 384 384 - auth: Per-provider auth mode for cogitate ("platform" or "api_key") 385 385 """ ··· 432 432 if "schedule" in info: 433 433 context_defaults[context_key]["schedule"] = info["schedule"] 434 434 context_defaults[context_key]["disabled"] = info.get("disabled", False) 435 - # Include extract for generators with occurrence hooks 436 - hook = info.get("hook") 437 - has_extraction = ( 438 - isinstance(hook, dict) and hook.get("post") in ("occurrence",) 439 - ) or hook in ("occurrence",) 440 - if has_extraction: 441 - context_defaults[context_key]["extract"] = info.get("extract", True) 442 435 443 436 # Get providers list from registry 444 437 providers_list = get_provider_list() ··· 928 921 Transforms talent config metadata into the format expected by the 929 922 Settings UI Insights section. 930 923 """ 931 - # Determine if extraction is supported (occurrence hooks) 932 - hook = info.get("hook") 933 - has_extraction = ( 934 - isinstance(hook, dict) and hook.get("post") in ("occurrence",) 935 - ) or hook in ("occurrence",) 936 - 937 924 return { 938 925 "key": key, 939 926 "title": info.get("title", info.get("label", key)), ··· 941 928 "source": info.get("source", "system"), 942 929 "app": info.get("app"), 943 930 "disabled": info.get("disabled", False), 944 - "extract": info.get("extract", True) if has_extraction else None, 945 - "has_extraction": has_extraction, 946 931 } 947 932 948 933
+1 -20
apps/settings/workspace.html
··· 2500 2500 <!-- Insights Section --> 2501 2501 <section class="settings-section" id="section-insights" role="tabpanel" aria-labelledby="tab-insights"> 2502 2502 <h2>insights</h2> 2503 - <p class="settings-section-desc">Configure which AI insights run and whether they extract events to your timeline.</p> 2503 + <p class="settings-section-desc">Configure which AI insights run.</p> 2504 2504 2505 2505 <form class="settings-form" onsubmit="return false;"> 2506 2506 ··· 5332 5332 5333 5333 for (const insight of sourceInsights) { 5334 5334 const isDisabled = insight.disabled; 5335 - const hasExtraction = insight.has_extraction; 5336 - const extractEnabled = insight.extract !== false; 5337 5335 5338 5336 html += `<div class="insight-row${isDisabled ? ' insight-disabled' : ''}" data-insight="${insight.key}">`; 5339 5337 html += `<div class="insight-info">`; ··· 5344 5342 html += `</div>`; 5345 5343 5346 5344 html += `<div class="insight-controls">`; 5347 - 5348 - // Extract toggle (only if insight supports extraction) 5349 - if (hasExtraction) { 5350 - html += `<div class="insight-toggle-group">`; 5351 - html += `<span class="insight-toggle-label">Extract</span>`; 5352 - html += `<label class="insight-toggle">`; 5353 - html += `<input type="checkbox" data-insight="${insight.key}" data-field="extract" ${extractEnabled ? 'checked' : ''} ${isDisabled ? 'disabled' : ''}>`; 5354 - html += `<span class="slider"></span>`; 5355 - html += `</label>`; 5356 - html += `</div>`; 5357 - } 5358 5345 5359 5346 // Enabled toggle 5360 5347 html += `<div class="insight-toggle-group">`; ··· 5389 5376 5390 5377 // Update row styling and disable/enable other toggles 5391 5378 row.classList.toggle('insight-disabled', disabled); 5392 - const extractToggle = row.querySelector('input[data-field="extract"]'); 5393 - if (extractToggle) { 5394 - extractToggle.disabled = disabled; 5395 - } 5396 - } else if (field === 'extract') { 5397 - await saveInsightSetting(insightKey, 'extract', e.target.checked); 5398 5379 } 5399 5380 }); 5400 5381 });
+1 -1
talent/journal/references/config.md
··· 58 58 ```json 59 59 { 60 60 "facets": {"order": ["work", "personal"], "selected": "work"}, 61 - "apps": {"order": ["home", "calendar", "todos"], "starred": ["home", "todos"]} 61 + "apps": {"order": ["home", "activities", "todos"], "starred": ["home", "todos"]} 62 62 } 63 63 ``` 64 64
+2 -2
talent/schedule.md
··· 2 2 "type": "generate", 3 3 4 4 "title": "Upcoming Schedule", 5 - "description": "Extracts future scheduled events and calendar activities into structured anticipation records. Captures dates, times, participants, and cancellation state.", 5 + "description": "Extracts future scheduled items from screen and transcript content into anticipated activity records. Captures dates, times, participants, and cancellation state.", 6 6 "hook": {"post": "schedule"}, 7 7 "color": "#5e35b1", 8 8 "schedule": "daily", ··· 17 17 18 18 **Input:** A markdown file containing chronologically ordered transcripts of a workday plus the screen agent's output for the same day. Calendar views, meeting invitations, scheduling UIs, and project-management interfaces are captured in the screen content; verbal mentions of future plans appear in transcripts. 19 19 20 - **Your task:** Identify every future scheduled item (dated after today) visible in the day's screen or transcript content and emit a JSON array of anticipation objects. 20 + **Your task:** Identify every future scheduled item (dated after today) visible in the day's screen or transcript content and emit a JSON array of anticipated activity objects. 21 21 22 22 ## What to capture 23 23
+1 -17
tests/baselines/api/settings/generators.json
··· 4 4 "app": "entities", 5 5 "description": "Extracts durable factoids about attached entities from journal content", 6 6 "disabled": false, 7 - "extract": null, 8 - "has_extraction": false, 9 7 "key": "entities:entity_observer", 10 8 "source": "app", 11 9 "title": "Entity Observer" ··· 14 12 "app": null, 15 13 "description": "Analyzes activity patterns to identify optimal times for scheduled maintenance tasks.", 16 14 "disabled": false, 17 - "extract": null, 18 - "has_extraction": false, 19 15 "key": "daily_schedule", 20 16 "source": "system", 21 17 "title": "Maintenance Window" 22 18 }, 23 19 { 24 20 "app": null, 25 - "description": "Extracts future scheduled events and calendar activities into structured anticipation records. Captures dates, times, participants, and cancellation state.", 21 + "description": "Extracts future scheduled items from screen and transcript content into anticipated activity records. Captures dates, times, participants, and cancellation state.", 26 22 "disabled": false, 27 - "extract": null, 28 - "has_extraction": false, 29 23 "key": "schedule", 30 24 "source": "system", 31 25 "title": "Upcoming Schedule" ··· 36 30 "app": null, 37 31 "description": "Creates a detailed documentary record of screen activity. Focuses on the 'what' - chronological account with preserved details, excerpts, and entities.", 38 32 "disabled": false, 39 - "extract": null, 40 - "has_extraction": false, 41 33 "key": "screen", 42 34 "source": "system", 43 35 "title": "Screen Record" ··· 46 38 "app": null, 47 39 "description": "Extracts people, companies, projects, and tools from segment content", 48 40 "disabled": false, 49 - "extract": null, 50 - "has_extraction": false, 51 41 "key": "entities", 52 42 "source": "system", 53 43 "title": "Entity Extraction" ··· 56 46 "app": null, 57 47 "description": "Extracts structured intelligence from imported documents", 58 48 "disabled": false, 59 - "extract": null, 60 - "has_extraction": false, 61 49 "key": "documents", 62 50 "source": "system", 63 51 "title": "Document Analysis" ··· 66 54 "app": null, 67 55 "description": "Identifies who said what in each transcript segment. Layers 1-3 (owner, structural, acoustic) run computationally via hook; Layer 4 uses contextual LLM analysis for remaining unmatched sentences.", 68 56 "disabled": false, 69 - "extract": null, 70 - "has_extraction": false, 71 57 "key": "speaker_attribution", 72 58 "source": "system", 73 59 "title": "Speaker Attribution" ··· 76 62 "app": null, 77 63 "description": "Unified segment understanding — density, content type, entities, facets, speakers, and routing recommendations in a single pass", 78 64 "disabled": false, 79 - "extract": null, 80 - "has_extraction": false, 81 65 "key": "sense", 82 66 "source": "system", 83 67 "title": "Segment Sense"
+1 -1
tests/baselines/api/sol/talents-day.json
··· 371 371 "schedule": { 372 372 "app": null, 373 373 "color": "#5e35b1", 374 - "description": "Extracts future scheduled events and calendar activities into structured anticipation records. Captures dates, times, participants, and cancellation state.", 374 + "description": "Extracts future scheduled items from screen and transcript content into anticipated activity records. Captures dates, times, participants, and cancellation state.", 375 375 "multi_facet": false, 376 376 "output_format": "json", 377 377 "schedule": "daily",
+1 -1
tests/baselines/api/stats/stats.json
··· 216 216 }, 217 217 "schedule": { 218 218 "color": "#5e35b1", 219 - "description": "Extracts future scheduled events and calendar activities into structured anticipation records. Captures dates, times, participants, and cancellation state.", 219 + "description": "Extracts future scheduled items from screen and transcript content into anticipated activity records. Captures dates, times, participants, and cancellation state.", 220 220 "hook": { 221 221 "post": "schedule" 222 222 },
+2 -2
tests/test_talent_cli.py
··· 80 80 assert _format_tags({}) == "" 81 81 82 82 # Hook tags (compact, no =name suffix) 83 - assert _format_tags({"hook": {"post": "occurrence"}}) == "post" 83 + assert _format_tags({"hook": {"post": "schedule"}}) == "post" 84 84 assert _format_tags({"hook": {"pre": "prep"}}) == "pre" 85 85 assert _format_tags({"hook": {"pre": "prep", "post": "process"}}) == "pre post" 86 86 ··· 93 93 94 94 # Combined: output + hooks + disabled + FAIL 95 95 tags = _format_tags( 96 - {"output": "md", "hook": {"post": "occurrence"}, "disabled": True}, 96 + {"output": "md", "hook": {"post": "schedule"}, "disabled": True}, 97 97 failed=True, 98 98 ) 99 99 assert tags == "md post disabled FAIL"
+5
think/sense_splitter.py
··· 48 48 "timestamp": datetime.now(tz=timezone.utc).isoformat(), 49 49 }, 50 50 ) 51 + # Write both structured and human-readable Sense outputs here. 52 + # think/cluster.py discovers talent outputs by globbing 53 + # {segment}/talents/**/*.md for load.talents.{name} consumers. 54 + # Dropping sense.md would silently break downstream talents such as 55 + # participation that rely on the sense markdown file being present. 51 56 _write_json_atomic(agents_dir / "sense.json", sense_json) 52 57 53 58 if entities: