---
title: SAIF.Services.ClaimInfoApi.Core operations and processes
summary: Business and technical operations supported by this library.
status: draft
owner: SAIF.Core Documentation Team
last_reviewed: 2026-09-24
library: SAIF.Services.ClaimInfoApi.Core
reference_type: package
---

# SAIF.Services.ClaimInfoApi.Core operations and processes

This page is the operation catalog and cross-operation hub for `SAIF.Services.ClaimInfoApi.Core`. Each operation's detailed, step-by-step logic lives in its own page under `operations/`. This library performs no database access, so no operation carries a Tables or SQL citation.

## Operation catalog
| Operation | Intent | Trigger | Inputs | Outputs | Rules |
| --- | --- | --- | --- | --- | --- |
| [Calculate notifications for a model](operations/op-cia-01-calculate-notifications.md) | Evaluate every rule in a matrix against a model and collect the non-null results | Caller invokes `NotificationRuleEngine.CalculateNotifications<T>` | `model` (`T`), `matrix` (`NotificationMatrix`) | `NotificationResult[]`, one per distinct rule position | [CIA-BR-001](business-rules.md#cia-br-001-notification-outputs-are-keyed-by-rule-position), [CIA-BR-007](business-rules.md#cia-br-007-only-non-null-results-become-notifications-and-the-last-one-at-a-position-wins) |
| [Evaluate one rule](operations/op-cia-02-evaluate-one-rule.md) | Resolve a single rule's type and produce its output value, or null | Step 3 of OP-CIA-01, or recursively for an out-property child rule | `rule` (`NotificationRule`), `model` (`T`) | A string value, or null | [CIA-BR-002](business-rules.md#cia-br-002-evaluation-type-is-resolved-from-rule-metadata), [CIA-BR-003](business-rules.md#cia-br-003-non-bool-rule-results-are-returned-as-strings), [CIA-BR-004](business-rules.md#cia-br-004-a-false-bool-rule-produces-no-notification), [CIA-BR-005](business-rules.md#cia-br-005-a-true-bool-rule-with-an-out-property-recurses-into-a-child-property-rule), [CIA-BR-006](business-rules.md#cia-br-006-a-true-bool-rule-without-an-out-property-falls-back-to-a-constant-out-value) |
| [Compile a rule into a delegate](operations/op-cia-03-compile-rule.md) | Build a LINQ expression tree from rule metadata and compile it into a runnable delegate | A caller request, or OP-CIA-02 | `r` (`NotificationRule`) | A compiled `Func<T,TResult>` | [CIA-BR-008](business-rules.md#cia-br-008-the-literal-target-value-null-means-a-null-comparison-value), [CIA-BR-009](business-rules.md#cia-br-009-a-matching-public-method-name-invokes-that-method), [CIA-BR-010](business-rules.md#cia-br-010-no-operator-means-a-plain-property-read), [CIA-BR-011](business-rules.md#cia-br-011-an-operator-that-parses-as-an-expressiontype-builds-a-binary-comparison), [CIA-BR-012](business-rules.md#cia-br-012-an-unrecognized-operator-is-treated-as-a-method-on-the-property's-type) |
| [Build rule definitions](operations/op-cia-04-build-rule-definitions.md) | Construct a `NotificationRule` through one of its four static factory methods | A caller request | Position, type name, member/method name, target value | A `NotificationRule` instance | [CIA-BR-001](business-rules.md#cia-br-001-notification-outputs-are-keyed-by-rule-position), [CIA-BR-009](business-rules.md#cia-br-009-a-matching-public-method-name-invokes-that-method), [CIA-BR-010](business-rules.md#cia-br-010-no-operator-means-a-plain-property-read), [CIA-BR-013](business-rules.md#cia-br-013-a-matrix-is-identified-by-its-composite-document-type-and-subtype-key) |

## Process flow diagram
The following diagram visualizes the primary calculate-and-compile flow across the four operations.

```mermaid
flowchart TD
	Start(["Caller invokes<br>CalculateNotifications"]) --> Loop["OP-CIA-01: iterate<br>matrix.Rules"]
	Loop --> Eval["OP-CIA-02: evaluate<br>one rule"]
	Eval --> TypeCheck{"Resolved type?"}
	TypeCheck -->|int / string| Compile["OP-CIA-03: compile<br>and invoke delegate"]
	TypeCheck -->|bool, true, OutProperty set| Child["Recurse into child<br>PropertyRule (OP-CIA-02)"]
	TypeCheck -->|bool, false| Skip([No notification])
	Compile --> Collect["Add non-null value<br>keyed by Position"]
	Child --> Collect
	Collect --> Loop
	Loop -->|all rules done| Done([Return NotificationResult array])
```

## Failure and edge-case behavior
- If `matrix.Rules` is null, [OP-CIA-01](operations/op-cia-01-calculate-notifications.md) throws a `NullReferenceException`; there is no null guard.
- An unresolvable `TypeName` in [OP-CIA-02](operations/op-cia-02-evaluate-one-rule.md) falls through to the string evaluation branch rather than failing.
- [OP-CIA-03](operations/op-cia-03-compile-rule.md) has no validation or `try`/`catch`: an unknown member name can produce a `NullReferenceException`, `ArgumentNullException`, or `ArgumentException`; a non-convertible `TargetValue` produces `InvalidCastException` or `FormatException` from `Convert.ChangeType`; a delegate type mismatch produces `ArgumentException`. All propagate to the caller.
- Every call to [OP-CIA-03](operations/op-cia-03-compile-rule.md) recompiles the expression tree from scratch; no compiled delegate is cached, which is a known performance characteristic rather than a mitigated design choice — see [Architecture](architecture.md#design-constraints).
- Result array order from [OP-CIA-01](operations/op-cia-01-calculate-notifications.md) follows `Dictionary<string, NotificationResult>` enumeration order, which is not formally guaranteed*.

> **Note:** Statements marked with `*` were inferred from code structure, naming conventions, or
> contextual evidence where direct confirmation was not available in source artifacts.

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Business rules](business-rules.md)
- [API reference](api/index.md)

## Sources
- `Services/SAIF.Services.ClaimInfoApi.Core/NotificationMatrix.cs`
- `Services/SAIF.Services.ClaimInfoApi.Core/NotificationRule.cs`
- `Services/SAIF.Services.ClaimInfoApi.Core/NotificationRuleEngine.cs`
- `Services/SAIF.Services.ClaimInfoApi.Core/NotificationRuleResult.cs`
