Skip to content

Persona-driven suggested prompts for Addie (Slack + Home) #2299

Description

@bokelley

Context

@pkras asked whether we could make Addie's suggested prompts more predictive — persona + engagement aware rather than static. Her direction:

Prompts change based on what we know about the member: their archetype (we already have the persona assessment), engagement stage (exploring → active → leading), working group memberships, certification progress, and last interaction with Addie.

Today there are two prompt systems, and they diverge:

System File Where it shows Style
Slack Assistant thread pane ("Try these prompts:") server/src/addie/prompts.tsbuildDynamicSuggestedPrompts Top of a new thread with Addie in Slack Static. 3 hardcoded tiers (unlinked / admin / member).
App Home + Web Home server/src/addie/home/builders/suggested-prompts.tsbuildSuggestedPrompts Slack App Home tab + web home Partially context-aware. Bug: persona check uses wrong persona IDs (ad_tech_vendor, agency_tech, publisher_tech) — none match the real IDs in server/src/config/personas.ts, so that branch never fires.

Proposal: consolidate on one rule-based builder, feed it everything we already know about the member, and ship Piia's 5 examples in two stages.

Signals already on MemberContext

  • persona.persona, persona.aspiration_persona, persona.journey_stage
  • engagement.login_count_30d, last_login, interest_level, email_click_count_30d
  • working_groups[] with is_leader per group
  • community_profile.completeness
  • addie_history.total_interactions, last_interaction_at
  • is_member, is_mapped, slack_linked

Persona IDs in use: molecule_builder, data_decoder, pureblood_protector, resops_integrator, ladder_climber, simple_starter, pragmatic_builder.

Signals NOT yet hydrated

  • Certification progress (data exists in certification_attempts — just not joined onto the context)
  • Agent registration (adagents.json / brand.json lookup by org domain)
  • Upcoming WG meetings — unclear if a data source exists; needs audit

Stage 1 — Unify + ship rules on existing data

One builder. Rule-based ({ id, when, label, prompt, priority }). Evaluated in priority order, top 4 wins (even count enforced for 2-col grid). Admin short-circuit preserved — admins still get the 4 ops prompts they use day-to-day.

Rule table (stage 1)

# Trigger Label Priority
1 unlinked What is AdCP? 100
2 unlinked What brings you here? 95
3 unlinked How do I join? 90
4 linked, not member Membership options 85
5 member, profile <80% complete Complete my profile 80
6 member, no working groups Find working groups that match your interests 75
7 member, leads a WG Working group to-dos 72
8 member, in WGs (not leader) What's happening in my working groups? 70
9 persona=molecule_builder/pragmatic_builder Build with AdCP 65
10 persona=data_decoder What data can AdCP move? 65
11 persona=resops_integrator Connect AdCP to my stack 65
12 persona=ladder_climber/simple_starter Start with the Academy 65
13 persona=pureblood_protector Governance and brand safety 65
14 member, last_login > 30d ago What's new since you were last here? 60
15 addie interactions < 3 What can you help me with? 40
16 fallback What's new? 10

Deliverables

  • home/builders/rules/prompt-rules.ts — rule registry
  • Rewrite suggested-prompts.ts to evaluate rules
  • Retire buildDynamicSuggestedPrompts in prompts.ts; point handler.ts + bolt-app.ts at the unified builder
  • Fix the broken persona IDs bug
  • Replace tests/unit/dynamic-prompts.test.ts with rule-coverage tests
  • Verify parity: same user sees same prompts in Slack Assistant, Slack App Home, and Web Home

Stage 2 — Hydrate missing signals, add remaining rules

Turns on the last 3 of Piia's examples:

  • Cert continuation (priority 78): query latest certification_attempts for the user, add certification block to MemberContext
  • Builder, no agent → Test your agent with Addie (priority 68): domain lookup for adagents.json / brand.json
  • WG leader with meeting in <7d → Prep for the meeting (priority 82): blocked on finding an events data source. Stage 2 kicks off with a 30-min audit; if nothing exists, we ship cert + agent and punt meeting prep to a follow-up.

Out of scope (for now)

  • A/B testing prompt variants (needs analytics)
  • LLM-generated prompts (rules are cheaper and more predictable; revisit if rules feel limiting)
  • i18n

@pkras — keeping this in your voice: does the priority ordering feel right? Two places I want your read:

  1. Profile completeness (rule 5) at priority 80 — higher than the persona prompts (65). Means members with incomplete profiles see a "finish your profile" nudge before a persona-specific prompt. Correct, or should the persona prompt always win?
  2. Disengaged (rule 14) at priority 60 — below personas. If someone hasn't logged in for 30+ days, do you want "what's new" to jump to the top instead?

Happy to reorder before we start building.

Metadata

Metadata

Assignees

No one assigned

    Labels

    addieIssues related to Addie (via any channel)claude-triagedIssue has been triaged by the Claude Code triage routine. Remove to re-triage.

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions