Engine
Protective layer that monitors scenes and triggers adjustment
The Engine wraps every scene. It monitors signal readings, enforces audience bounds, and triggers adjustment when conditions change.
Responsibilities
- Enforce bounds — block touches exceeding contact limits
- Monitor signals — track delivery, engagement, response, sentiment, behavior, conversion
- Trigger adjustment — apply rules when signal patterns match
- Record — write all observations and actions to the ledger
Signals
Six types of post-touch observations:
| Type | Measures | Metrics |
|---|---|---|
delivery | Message arrival | delivered, bounced, blocked |
engagement | Audience interaction | opened, clicked, viewed |
response | Audience reply | replied, called_back, forwarded |
behavior | Observable actions | visited_site, downloaded, shared |
sentiment | Emotional signal | positive, negative, neutral, hostile |
conversion | Goal completion | signed, purchased, enrolled |
Each reading includes confidence (0.0-1.0).
Reporting
await rodeo.signals.report({
signalId: "email-tracker",
touchId: touch.id,
sceneId: scene.id,
type: "engagement",
metric: "opened",
value: true,
confidence: 0.95,
});Batch reporting supported via rodeo.signals.reportBatch([...]).
Adjustment
Rules that fire when signal patterns match:
adjustment_rules: [
{
condition: { type: "response", metric: "replied", sentiment: "positive" },
action: "accelerate",
params: { factor: 2 },
},
{
condition: { type: "sentiment", metric: "hostile" },
action: "terminate",
},
]Signals
| Handler | Trigger | Default |
|---|---|---|
onExplicitDecline | Audience says no | terminate |
onPositiveSignal | Positive engagement | continue |
onNeutralSignal | No response | continue |
onNegativeSignal | Negative engagement | decelerate |
onBoundsExceeded | Contact limits hit | terminate |
Events
Every Engine action generates a scene event, streamed via SSE and stored permanently:
{
sceneId: "uuid",
eventType: "adjustment_triggered",
touchId: "uuid",
data: { rule: { ... }, readings: [...] },
}