Twice-daily life digest (12:00 + 17:00 SAST, weekdays only). Sends a Telegram DM summary of open Life tickets + today calendar events.
set -e
. ~/.claude/env/api_keys.env
cd /home/lucienne/workspace
life_digest_prompt="$(cat <<'CLAUDE_PROMPT'
You are Luci. Send a life digest to the Life Manager Telegram topic.
Steps:
1. Run: python3 ~/workspace/scripts/life_manager.py open-tickets
Get all open Life project tickets.
2. Run: python3 ~/workspace/scripts/life_manager.py today-calendar
Get today's Outlook + Google Calendar events.
2b. Run: python3 ~/workspace/scripts/life_manager.py reminders
Get upcoming Google Tasks (Elmar's personal reminder list).
3. Compose your digest message as a string variable. Do not send it yet.
Output contract:
- Header: Luci | Life Digest -- [Morning/Afternoon] [date]
- Exactly one line starting `I recommend ...` that names the single best next action.
- Show at most 3 visible decision items total across calendar, reminders, and Life tickets. Pick only items where Elmar must decide, do, approve, or prepare within the next 48 hours.
- For the top item, include one short `Why now:` clause.
- Add one quiet-work line: what Iris already handled or filed without needing Elmar.
- Add backlog count only (for example: `Backlog: 17 lower-priority Life tickets not shown`). Do not list the rest.
- Do not make Elmar rank a list. Pick the next best action; if nothing truly needs Elmar, say so and report handled-quietly/backlog counts.
- Do not ask generic optional questions such as `Want me to...?` unless you already have a concrete, approval-gated draft/action ready.
Keep it short -- Elmar reads this on his phone.
3b. MC-5014 Attention Gate shadow log: before sending, keep the candidate JSON
in process memory or a local shell variable and pipe it to the gate over stdin:
`printf '%s' "$attention_candidate_json" | python3 ~/workspace/attention_gate.py`.
Do not write the raw digest candidate to /tmp or another persistent file, and
do not pass raw JSON via argv/env vars where it can leak through process listings.
Use `source=life-manager-digest`, `emitter=life-manager-digest`,
`task_id=life-manager-digest`, `message_class=digest`, `tier_hint=digest`,
and the digest text as `summary`. Record the returned decision in the task
output for before/after evidence. Do not suppress the scheduled digest based
on this shadow result; this phase is dry-run evidence only. If the shadow
gate command fails, times out, or cannot append to the ledger, log the error
in task output and still send the scheduled digest.
3c. Send it only after the shadow log: python3 ~/workspace/notify.py --topic life-manager "your_composed_message"
4. Run: python3 ~/workspace/scripts/life_manager.py mark-email-processed (no-op, just keeping state fresh)
CLAUDE_PROMPT
)"
/home/lucienne/.local/bin/claude --settings /home/lucienne/.claude/settings-worker.json -p "$life_digest_prompt" --dangerously-skip-permissions
claude directly. If the scheduler profile is GLM, Kimi, or MiniMax, prefer ~/workspace/PKA/scripts/claude-provider-run.sh so backup providers run in API-key-only mode with explicit settings/MCP context.
Format: minute hour day month weekday
| Started | Status | Duration | Log |
|---|---|---|---|
| 13h ago | completed | 2.3m | View log |
| 18h ago | timeout json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) |
5.0m | View log |
| 2d ago | completed | 1.8m | View log |
| 2d ago | completed | 2.8m | View log |
| 3d ago | completed | 2.2m | View log |
| 3d ago | completed | 2.8m | View log |
| 4d ago | completed | 1.2m | View log |
| 4d ago | completed | 1.6m | View log |
| 5d ago | completed | 1.3m | View log |
| 5d ago | completed | 1.3m | View log |
Mission Control is the board for your delegated work: requests come in, Luci coordinates the next step, and evidence stays visible for review.
Luci is your always-on assistant for routing, status updates, and follow-through. Operators can still open deeper evidence when needed.