Rule
Ephemeral stores materialized rule snapshots under Ephemeral.rules. Register rules in two ways:
Rule.AddRuleById— template key underPersistent.configuration.rules, optionalparameterOverrides.Rule.AddRule— full rule object inparameters.definition(e.g. embedded in a boon JSON file); no template lookup.
Both deep-copy, attach a GnosisRule on IGnosisEventBus, and append { instanceId, definition } to Ephemeral.rules.
Code path: Runtime/GnosisEngine/Source/Services/Persistent/Services/Rules/GnosisRuleService.cs.
State
| Key | Branch | Purpose |
|---|---|---|
rules | Ephemeral | List of objects { instanceId, definition } — full materialized rule JSON (save/load and reapply) |
On init: ensures rules is a list, clears bus rules, reapplies each entry’s definition. On run end: clears bus rules.
How it looks in ephemeral.json
{
"Ephemeral": {
"rules": []
}
}Each persisted entry has instanceId and definition (merged rule object, including resolved executionOrder when assigned).
Events
The engine emits FACT_RULE_APPLIED when a rule’s conditions pass and outcomes run (not during dry run). Payload: ruleId, triggerEventId, category. See GnosisRuleEvents in Runtime/GnosisEngine/Source/Services/Persistent/Services/Rules/GnosisRuleEvents.cs.
Functions
| Function | Parameters | Behavior |
|---|---|---|
AddRule | definition (object), optional parameterOverrides, optional instanceId (else definition.id required), optional executionOrder | Inline rule; same persist path as AddRuleById |
AddRuleById | ruleId, optional parameterOverrides, optional instanceId, optional executionOrder | Materialize from configuration.rules |
RemoveRuleById | ruleId | Detach by materialized definition.id |
ReapplyActiveRulesFromEphemeral | — | Clears bus, reapplies each stored definition |
Statistics
None in this service (rules may call Statistic via outcomes).
Usage examples
Template (shared / boss / core):
{
"service": "Rule",
"function": "AddRuleById",
"parameters": {
"ruleId": "your_template_key",
"parameterOverrides": {}
}
}Inline (boon-local):
{
"service": "Rule",
"function": "AddRule",
"parameters": {
"definition": {
"id": "my_boon_rule_instance",
"category": "INTERCEPTOR",
"trigger": "REQUEST_OBJECTIVE_CONTRIBUTION_FROM_LINE_CLEAR",
"conditions": [],
"outcomes": [],
"parameters": {}
}
}
}Use a unique id (or top-level instanceId) per equipped boon so RemoveRuleById and boon deactivate stay deterministic. Omit executionOrder in parameters and definition to use auto ordering (max(existing)+10 per trigger); the stored definition then includes the resolved value.