Component spec
The fields every behavior has, the ρ scale, and the confusable pairs.
Fields
FieldContentNote
id · namecmp.curious · {ko, en}
typeS1 Symbolic · S2 Illustrator · S3 Expressive · S4 Regulator · S5 Adaptor (Ekman & Friesen)
meaningThe meaning in one line
trigger · forbid_whenTrigger and forbid conditionsSP-1, MUST
valence · arousalValence and arousalUsed for SP-4
channels_minMinimum number of channels2 for negative emotion
rhoStyle acceptance
recipe3 tracks (motion · face · sound), roles + token names onlyNo joint names
structuremove > pause > return …SP-5
guardrailsMUST IDs that apply
confusable_withConfusable pairs + how they differSP-3
recognizeFeatures that identify the behavior in a source video (reuses P1–P6 measures)For AI input analysis
fallbackSubstitute or skip when a role or channel is missing
variants · statesVariants and per-state overrides
evidence{type, metric, value, scale, n}
used_inPattern IDs that use itCross-reference
ρ scale
ρMeaning
High (0.8–0.95)Style makes the personality
Medium (0.5–0.6)Relationship signal — the shape is kept
Low (0.2–0.3)Agreed signal — too much reads as broken
Confusable pairs
PairTold apart by
Nod ↔ BowAxis (head pitch vs whole body) · start pose · timing (after a question vs arriving and leaving)
Curious ↔ NodAxis (roll vs pitch) · count (1 vs 2)
Approach ↔ Keep distanceDirection
Fear ↔ Keep distanceHeight change · face · target
Close ↔ DozeTiming (end of a conversation vs no input) · gaze (at the person vs none)
Schema example
{
"id": "cmp.curious",
"name": { "en": "Curious" },
"type": "S3_expressive",
"meaning": "Signals that the input is unclear",
"trigger": ["input.ambiguous", "object.novel"],
"forbid_when": ["user.speaking", "same_component_within_s < 5"],
"valence": "neutral",
"channels_min": 1,
"rho": 0.85,
"recipe": [
{ "track": "motion", "role": "ATTEND", "token": "tok.body.tilt", "size": "l", "t_ms": 0 },
{ "track": "motion", "token": "tok.time.pause", "size": "m", "after": "prev" },
{ "track": "face", "block": "eyes", "token": "tok.face.eye.angle", "value_deg": 12, "t_ms": 100 },
{ "track": "sound", "token": "tok.sound.pitch", "value_st": 2, "shape": "rising", "lead_ms": 100 }
],
"structure": "move > pause > return",
"guardrails": ["gr.repeat_max_2", "gr.no_irregular_tremor"],
"confusable_with": [{ "id": "cmp.nod", "separate_by": ["axis: roll vs pitch", "count: 1 vs 2"] }],
"recognize": { "attend_roll_peak_deg": [12, 30], "hold_after_peak_ms": [250, 600], "repeats": 1 },
"fallback": { "ATTEND.roll missing": "POSTURE.tilt", "FACE none": "skip face track" },
"evidence": [{ "type": "study", "metric": "malfunction", "value": 24.1, "scale": "0-100", "n": 47 }]
}