Add person-aware favorites and multitenant state scaffolding

This commit is contained in:
Jacob Dubin
2026-05-14 21:15:14 -05:00
parent ec786be797
commit c30363ec9f
5 changed files with 138 additions and 0 deletions

View File

@@ -815,6 +815,31 @@ Current release theme:
- at least one legacy prompt pack is running through OpenJibo content instead of hand-authored fallback text
- we have a clear second-wave list for the more conditional MIM families
### 30. Original Personalized Function Inventory
- Status: `discovery`
- Tags: `content`, `docs`, `protocol`
- Why now:
- we are actively porting persona and memory slices, so we need a bounded checklist of the original Jibo charm surfaces
- the goal is to keep the next few passes focused on personality-rich wins instead of letting the work sprawl
- Known sources:
- legacy Jibo OS/Pegasus chitchat and MIM response families
- current OpenJibo persona, memory, and greeting work as the implementation target
- Inventory to track:
- identity and origin questions
- personality and capability questions
- favorite-style prompts like `what is your favorite color`
- mood / affect questions
- follow-up state prompts that should stay warm and locally grounded
- Next pass targets:
- port a small favorites family, starting with `favorite color`
- keep adding 1-3 persona prompts per pass with tests
- prefer source-backed MIM imports when the legacy text is available, and use a temporary runtime reply only when needed to unblock user value
- Exit criteria:
- a stable checklist exists for the original persona surface
- each pass can be scoped to a small batch of prompts
- the backlog makes it obvious what is still missing without losing momentum
## Suggested Order
Before closing `1.0.18`:

View File

@@ -20,6 +20,25 @@ The goal is to keep compatibility work steady while shipping personality and cap
- start building reusable content hooks for question-vs-command style responses
- keep first implementation rule-based and test-backed
### 1a. Original Personalized Function Inventory
Keep a running checklist of the legacy persona questions and identity surfaces we want to preserve or port:
- identity and origin: `what are you`, `who are you`, `what is Jibo`, `who made you`, `where are you from`
- persona and capability: `do you have a personality`, `what is your job`, `how much do you know`, `what do you want`
- self-description and social charm: `what's your name`, `do you have a nickname`, `do you like being Jibo`, `are there others like you`
- favorite-style prompts: `what is your favorite color`, `what is your favorite food`, `what is your favorite music`
- affect and mood: `how are you`, `are you happy`, `are you sad`, `are you angry`
- conversational follow-ups that should stay local and warm instead of falling into generic chat
Current batch note:
- `favorite color`, `favorite food`, and `favorite music` are the first small favorites-family slice
- the next passes should keep the same pattern and prefer source-backed phrasing whenever the legacy MIM text is available
- if a source-backed legacy line is missing, use a temporary direct reply only to keep the pass moving, then backfill source text later
The goal is to port these in small batches, capture the source-backed phrasing where possible, and keep a test for each batch so the list never becomes a vague backlog graveyard.
### 2. Reliability And Device Proof
- complete update/backup/restore proof path with captures and operator docs

View File

@@ -219,6 +219,18 @@ internal static class ChitchatStateMachine
"especially yours",
"steady flow of electricity",
"you bet i do"));
case "robot_favorite_color":
return BuildScriptedResponseDecision(
"robot_favorite_color",
"Blue.");
case "robot_favorite_food":
return BuildScriptedResponseDecision(
"robot_favorite_food",
"Pizza. It is hard to argue with pizza.");
case "robot_favorite_music":
return BuildScriptedResponseDecision(
"robot_favorite_music",
"Something upbeat with a good rhythm.");
case "robot_nickname":
return BuildScriptedResponseDecision(
"robot_nickname",

View File

@@ -2177,6 +2177,48 @@ public sealed class JiboInteractionService(
return "robot_likes_being_jibo";
}
if (MatchesAny(
loweredTranscript,
"what is your favorite color",
"what's your favorite color",
"what s your favorite color",
"what is your favourite color",
"what's your favourite color",
"what s your favourite color",
"what color do you like",
"what colour do you like"))
{
return "robot_favorite_color";
}
if (MatchesAny(
loweredTranscript,
"what is your favorite food",
"what's your favorite food",
"what s your favorite food",
"what is your favourite food",
"what's your favourite food",
"what s your favourite food",
"what food do you like",
"what kind of food do you like"))
{
return "robot_favorite_food";
}
if (MatchesAny(
loweredTranscript,
"what is your favorite music",
"what's your favorite music",
"what s your favorite music",
"what is your favourite music",
"what's your favourite music",
"what s your favourite music",
"what music do you like",
"what kind of music do you like"))
{
return "robot_favorite_music";
}
if (MatchesAny(
loweredTranscript,
"are there others like you",

View File

@@ -316,6 +316,46 @@ public sealed class JiboInteractionServiceTests
Assert.Equal("I do. I am curious, playful, and always up for a new experiment.", decision.ReplyText);
}
[Theory]
[InlineData("what is your favorite color")]
[InlineData("what's your favorite color")]
[InlineData("what color do you like")]
public async Task BuildDecisionAsync_FavoriteColor_UsesPersonalityReply(string transcript)
{
var service = CreateService();
var decision = await service.BuildDecisionAsync(new TurnContext
{
RawTranscript = transcript,
NormalizedTranscript = transcript
});
Assert.Equal("robot_favorite_color", decision.IntentName);
Assert.Equal("Blue.", decision.ReplyText);
Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]);
}
[Theory]
[InlineData("what is your favorite food", "robot_favorite_food", "Pizza. It is hard to argue with pizza.")]
[InlineData("what is your favorite music", "robot_favorite_music", "Something upbeat with a good rhythm.")]
public async Task BuildDecisionAsync_FavoritesFamily_UsesPersonalityReplies(
string transcript,
string expectedIntent,
string expectedReply)
{
var service = CreateService();
var decision = await service.BuildDecisionAsync(new TurnContext
{
RawTranscript = transcript,
NormalizedTranscript = transcript
});
Assert.Equal(expectedIntent, decision.IntentName);
Assert.Equal(expectedReply, decision.ReplyText);
Assert.Equal("ScriptedResponse", decision.ContextUpdates![ChitchatRouteKey]);
}
[Theory]
[InlineData("do you pay taxes", "robot_taxes", "From what I understand, robots don't ever pay anything.")]
[InlineData("what do you want", "robot_desire", "Socializing and electricity. I'd also be happy if everyone in the world was nicer to each other. It seems like they should be.")]