RODEO

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

  1. Enforce bounds — block touches exceeding contact limits
  2. Monitor signals — track delivery, engagement, response, sentiment, behavior, conversion
  3. Trigger adjustment — apply rules when signal patterns match
  4. Record — write all observations and actions to the ledger

Signals

Six types of post-touch observations:

TypeMeasuresMetrics
deliveryMessage arrivaldelivered, bounced, blocked
engagementAudience interactionopened, clicked, viewed
responseAudience replyreplied, called_back, forwarded
behaviorObservable actionsvisited_site, downloaded, shared
sentimentEmotional signalpositive, negative, neutral, hostile
conversionGoal completionsigned, 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

HandlerTriggerDefault
onExplicitDeclineAudience says noterminate
onPositiveSignalPositive engagementcontinue
onNeutralSignalNo responsecontinue
onNegativeSignalNegative engagementdecelerate
onBoundsExceededContact limits hitterminate

Events

Every Engine action generates a scene event, streamed via SSE and stored permanently:

{
  sceneId: "uuid",
  eventType: "adjustment_triggered",
  touchId: "uuid",
  data: { rule: { ... }, readings: [...] },
}