Components

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 }]
}