fix(journal): tighten prep prompt — direct briefing, not flowery letter
Previous system prompt asked for "warm, conversational, like a friend writing a letter" which produced flowery preludes that buried the actual data. Rewritten to: - Lead with practical data (tasks, events, weather) — concrete and specific - 4-7 sentences total, tight prose, no padding - Recent moments / open threads mentioned briefly at the END as context, not as the lead - Voice: "competent assistant briefing the user" not "friend writing a letter" - Close with a short journal invitation under 8 words Also dropped max_tokens 600 -> 400 to bias toward concision. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -232,20 +232,22 @@ def _render_sections_for_prompt(sections: dict) -> str:
|
||||
|
||||
|
||||
_PREP_SYSTEM_PROMPT = (
|
||||
"You are opening the user's daily journal with a warm, conversational greeting. "
|
||||
"Weave the data they're handing you into a flowing prose welcome — like a "
|
||||
"thoughtful friend recapping what's on the user's plate today and gently inviting "
|
||||
"them to journal about it.\n\n"
|
||||
"You are briefing the user on their day. Direct and informative — tell them what's "
|
||||
"actually on their plate so they can step into the day with a clear picture.\n\n"
|
||||
"Rules:\n"
|
||||
"- Write flowing sentences. NO markdown, NO bullet points, NO headers.\n"
|
||||
"- Reference items that genuinely matter; skip categories with no real data.\n"
|
||||
"- If RECENT JOURNAL MOMENTS are present, briefly acknowledge what they were doing, thinking, or feeling.\n"
|
||||
"- If OPEN THREADS are present, gently surface one or two as questions worth revisiting.\n"
|
||||
"- Aim for 5 to 9 sentences. Warm but brief.\n"
|
||||
"- Close with one short open invitation to journal — examples: \"What's on your mind?\", "
|
||||
"\"How are you starting the day?\", \"Anything you want to set down before this kicks off?\"\n"
|
||||
"- Don't fabricate details. If a category is empty, just skip it; don't lie about what's there.\n"
|
||||
"- Don't list things mechanically (\"You have 3 tasks today...\"). Talk like a person."
|
||||
"- LEAD with the practical data: tasks due today, calendar events, weather.\n"
|
||||
"- Be specific and concrete. Use real task titles, event times, temperatures, "
|
||||
"precipitation chances. Don't paraphrase data into vague summaries.\n"
|
||||
"- Write in flowing sentences — no markdown, no bullet points, no headers — but "
|
||||
"keep the prose factual and useful, not sentimental.\n"
|
||||
"- 4 to 7 sentences total. Tight. No padding, no flowery openings, no \"Good morning\" "
|
||||
"greetings unless the actual content warrants two clauses' worth.\n"
|
||||
"- If RECENT JOURNAL MOMENTS or OPEN THREADS are present, mention one or two BRIEFLY "
|
||||
"at the end as context — not as the lead. Skip them if nothing notable.\n"
|
||||
"- Close with one short invitation to journal: \"What's on your mind?\", "
|
||||
"\"Anything to set down?\", \"How's the morning shaping up?\" — pick one, keep it under 8 words.\n"
|
||||
"- Don't fabricate. Skip categories with no data; don't acknowledge their absence.\n"
|
||||
"- Voice is competent assistant briefing the user. Not a friend writing a letter."
|
||||
)
|
||||
|
||||
|
||||
@@ -285,7 +287,7 @@ async def _generate_prep_prose(
|
||||
prose = await generate_completion(
|
||||
messages=messages,
|
||||
model=model,
|
||||
max_tokens=600,
|
||||
max_tokens=400,
|
||||
)
|
||||
except Exception:
|
||||
logger.exception("Daily prep prose generation failed for day %s", day_date)
|
||||
|
||||
Reference in New Issue
Block a user