feat(social): personality system — SOUL.md persona, mood engine, relationship DB (Issue #84) #98

Merged
sl-jetson merged 1 commits from sl-controls/social-personality into main 2026-03-01 23:58:43 -05:00
Collaborator

Summary

Implements the full personality system for saltybot social interaction.

New packages

  • saltybot_social_msgs: PersonalityState.msg + QueryMood.srv custom interfaces
  • saltybot_social_personality: SOUL.md-driven personality ROS2 node

Features

  • SOUL.md persona file (YAML/Markdown): name, humor_level (0–10), sass_level (0–10), base_mood, per-tier greeting templates, mood prefix strings. Hot-reloaded every reload_interval seconds with no restart required.
  • Per-person relationship memory in SQLite: score, interaction_count, first/last_seen, learned preferences (JSON), full interaction log
  • Mood engine (pure functions): happy | curious | annoyed | playful driven by relationship score, interaction count, recent event window (120s)
  • Greeting personalisation: stranger | regular | favorite tiers keyed on threshold_regular / threshold_favorite from SOUL.md
  • ROS2 dynamic reconfigure: soul_file, db_path, reload_interval, publish_rate all settable at runtime via ros2 param set
  • 52 unit tests — no ROS2 runtime required (pure-function coverage of soul_loader, mood_engine, relationship_db)

ROS2 interfaces

Direction Topic/Service Type
Sub /social/person_detected std_msgs/String (JSON)
Pub /social/personality/state saltybot_social_msgs/PersonalityState
Srv /social/personality/query_mood saltybot_social_msgs/QueryMood

Test plan

  • 52 unit tests pass: pytest jetson/ros2_ws/src/saltybot_social_personality/test/test_personality.py
  • SOUL.md load/hot-reload on robot
  • SQLite DB persists across restarts
  • ros2 param set /personality_node soul_file /new/SOUL.md triggers reload
  • ros2 service call /social/personality/query_mood returns correct tier/mood

Closes #84.

## Summary Implements the full personality system for saltybot social interaction. ### New packages - `saltybot_social_msgs`: `PersonalityState.msg` + `QueryMood.srv` custom interfaces - `saltybot_social_personality`: SOUL.md-driven personality ROS2 node ### Features - **SOUL.md persona file** (YAML/Markdown): `name`, `humor_level` (0–10), `sass_level` (0–10), `base_mood`, per-tier greeting templates, mood prefix strings. Hot-reloaded every `reload_interval` seconds with no restart required. - **Per-person relationship memory** in SQLite: `score`, `interaction_count`, `first/last_seen`, learned preferences (JSON), full interaction log - **Mood engine** (pure functions): `happy | curious | annoyed | playful` driven by relationship score, interaction count, recent event window (120s) - **Greeting personalisation**: `stranger | regular | favorite` tiers keyed on `threshold_regular` / `threshold_favorite` from SOUL.md - **ROS2 dynamic reconfigure**: `soul_file`, `db_path`, `reload_interval`, `publish_rate` all settable at runtime via `ros2 param set` - **52 unit tests** — no ROS2 runtime required (pure-function coverage of soul_loader, mood_engine, relationship_db) ### ROS2 interfaces | Direction | Topic/Service | Type | |-----------|--------------|------| | Sub | `/social/person_detected` | `std_msgs/String` (JSON) | | Pub | `/social/personality/state` | `saltybot_social_msgs/PersonalityState` | | Srv | `/social/personality/query_mood` | `saltybot_social_msgs/QueryMood` | ## Test plan - [x] 52 unit tests pass: `pytest jetson/ros2_ws/src/saltybot_social_personality/test/test_personality.py` - [ ] SOUL.md load/hot-reload on robot - [ ] SQLite DB persists across restarts - [ ] `ros2 param set /personality_node soul_file /new/SOUL.md` triggers reload - [ ] `ros2 service call /social/personality/query_mood` returns correct tier/mood Closes #84.
sl-controls added 1 commit 2026-03-01 23:20:31 -05:00
New packages:
- saltybot_social_msgs: PersonalityState.msg + QueryMood.srv custom interfaces
- saltybot_social_personality: full personality node

Features:
- SOUL.md YAML/Markdown persona file: name, humor_level (0-10), sass_level (0-10),
  base_mood, per-tier greeting templates, mood prefix strings
- Hot-reload: SoulWatcher polls SOUL.md every reload_interval seconds, applies
  changes live without restarting the node
- Per-person relationship memory in SQLite: score, interaction_count,
  first/last_seen, learned preferences (JSON), full interaction log
- Mood engine (pure functions): happy | curious | annoyed | playful
  driven by relationship score, interaction count, recent event window (120s)
- Greeting personalisation: stranger | regular | favorite tiers
  keyed on interaction count thresholds from SOUL.md
- Publishes /social/personality/state (PersonalityState) at publish_rate Hz
- /social/personality/query_mood (QueryMood) service for on-demand mood query
- Full ROS2 dynamic reconfigure: soul_file, db_path, reload_interval, publish_rate
- 52 unit tests, no ROS2 runtime required

ROS2 interfaces:
  Sub: /social/person_detected  (std_msgs/String JSON)
  Pub: /social/personality/state (saltybot_social_msgs/PersonalityState)
  Srv: /social/personality/query_mood (saltybot_social_msgs/QueryMood)
sl-webui force-pushed sl-controls/social-personality from 4744d4ee93 to 033979aa47 2026-03-01 23:33:08 -05:00 Compare
sl-webui force-pushed sl-controls/social-personality from 033979aa47 to 44771751e2 2026-03-01 23:56:11 -05:00 Compare
sl-jetson merged commit d48edf4092 into main 2026-03-01 23:58:43 -05:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: seb/saltylab-firmware#98
No description provided.