personal memory agent
0
fork

Configure Feed

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

chore(pipeline-health): align owner-facing phrasings with CPO spec

Adjust user-facing strings in pipeline_status_message and
morning_briefing.md to match the CPO request verbatim — swap
developer-ish labels ("dream agents didn't run") for owner-facing
framing ("Activity processing gap — meeting notes may be delayed",
"Daily processing hasn't run yet", "N agent error(s) today",
"**Pipeline gap:**"/"**Pipeline issue:**" briefing preambles).

Also ignore tests/fixtures/journal/*/health/*_dream.jsonl — test
runs now produce these via DreamJSONLWriter and they're artifacts,
not sources.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

+13 -12
+1
.gitignore
··· 10 10 .coverage 11 11 tests/fixtures/journal/agents/*/*.jsonl 12 12 tests/fixtures/journal/tokens/*.json 13 + tests/fixtures/journal/*/health/*_dream.jsonl 13 14 *.sqlite 14 15 *.sqlite-shm 15 16 *.sqlite-wal
+5 -5
talent/morning_briefing.md
··· 90 90 2. Pending follow-ups (items flagged by the followups agent) 91 91 3. Relationship maintenance (entities not contacted recently who are relevant) 92 92 4. Unscheduled todos (action items with no calendar time blocked) 93 - Pipeline gaps owner-facing phrasings (from `pipeline_anomalies`): 94 - - `activity_agents_missing` → "Activity agents didn't fire yesterday — detected activities weren't processed." 95 - - `daily_agents_missing` → "Daily dream agents didn't run yesterday." 96 - - `agent_failure` → "N dream agent(s) failed yesterday: <names>." 93 + Pipeline gaps owner-facing phrasings (from `pipeline_anomalies`). Use these verbatim, substituting real counts and agent names from the summary: 94 + - `activity_agents_missing` → "**Pipeline gap:** N activities ended yesterday but activity agents didn't fire — meeting notes, decisions, and follow-ups may be missing." 95 + - `agent_failure` → "**Pipeline issue:** N agents timed out during yesterday's processing (name1, name2). Some insights may be incomplete." (Use "timed out" when every failed agent has `state == "timeout"`; otherwise use "failed".) 96 + - `daily_agents_missing` → "**Pipeline gap:** Daily agents didn't run yesterday despite journal data. Facet newsletters and digest may be missing." 97 97 98 - Do NOT include this section when pipeline status is `healthy` (status == "healthy" or anomalies list is empty). 98 + Do NOT include this section when pipeline status is `healthy` (status == "healthy" or anomalies list is empty). Zero noise on normal days. 99 99 Attribute commitments and follow-ups to the originating segment: `(committed [date](sol://...))`, `(flagged [date](sol://...))`. For relationship items: `(last interaction [date])`. For inferred items: `(inferred from [source](sol://...))`. 100 100 Grade action items by evidence strength. **High** (explicit commitment with date, or overdue todo): state assertively — "Follow up on Series A term sheet — committed March 20, now overdue." **Medium** (flagged by followups agent with moderate confidence, or clear single-source item): present with attribution — "Review CI pipeline logs (flagged yesterday)." **Low** (inferred obligation from ambiguous mention, or low-confidence followup): hedge — "Possible commitment to send deck to investors" or "May need to follow up on the API discussion." When upstream followup output includes a `Confidence:` score, use it: 0.85+ high, 0.50–0.84 medium, below 0.50 low. Never hedge explicit commitments with clear dates; never present inferred obligations as definite action items. 101 101
+4 -4
tests/test_pipeline_health.py
··· 282 282 }, 283 283 { 284 284 "status": "stale", 285 - "message": "Activity agents didn't run — persisted activities untouched.", 285 + "message": "Activity processing gap — meeting notes may be delayed", 286 286 }, 287 287 ), 288 288 ( ··· 297 297 }, 298 298 { 299 299 "status": "stale", 300 - "message": "Daily dream didn't run for 20260102.", 300 + "message": "Daily processing hasn't run yet", 301 301 }, 302 302 ), 303 303 ( ··· 307 307 "agents": {"failed": 1}, 308 308 "day": "20260101", 309 309 }, 310 - {"status": "warning", "message": "1 dream agent failed."}, 310 + {"status": "warning", "message": "1 agent error today"}, 311 311 ), 312 312 ( 313 313 { ··· 316 316 "agents": {"failed": 3}, 317 317 "day": "20260101", 318 318 }, 319 - {"status": "warning", "message": "3 dream agents failed."}, 319 + {"status": "warning", "message": "3 agent errors today"}, 320 320 ), 321 321 ( 322 322 {
+3 -3
think/pipeline_health.py
··· 168 168 if any(anomaly.get("kind") == "activity_agents_missing" for anomaly in anomalies): 169 169 return { 170 170 "status": "stale", 171 - "message": "Activity agents didn't run — persisted activities untouched.", 171 + "message": "Activity processing gap — meeting notes may be delayed", 172 172 } 173 173 if any(anomaly.get("kind") == "daily_agents_missing" for anomaly in anomalies): 174 174 return { 175 175 "status": "stale", 176 - "message": f"Daily dream didn't run for {summary['day']}.", 176 + "message": "Daily processing hasn't run yet", 177 177 } 178 178 if any(anomaly.get("kind") == "agent_failure" for anomaly in anomalies): 179 179 count = summary.get("agents", {}).get("failed", 0) 180 180 plural = "s" if count != 1 else "" 181 181 return { 182 182 "status": "warning", 183 - "message": f"{count} dream agent{plural} failed.", 183 + "message": f"{count} agent error{plural} today", 184 184 } 185 185 return None