Investment restriction

Composite investment rules (if-then conditions)

A composite investment rule combines the outcomes of other approved rules with AND, OR or NOT, so that a policy condition becomes one testable result. Acclimetry evaluates the operand rules first and then the logic. If any operand is not evaluated, the composite is not evaluated either.

Rule template
composite
Composite rule
Measured in
ratio
Worked examples, run by the engine
3

How policies word it

Conditional limits appear when one limit depends on another. ‘Emerging-market equities may exceed 10% only if total equities stay within their range’ is one form. ‘Either at least 75% of dollar exposure is hedged, or dollar exposure stays below 10%’ joins a currency hedge ratio to a currency band.

Most such clauses reduce to rule outcomes joined by ‘and’, ‘or’ or ‘not’. Writing each part as its own approved rule first keeps the composite readable: every operand has its own source passage, parameters and results.

Some conditions add up weights rather than outcomes. The UCITS 5/10/40 rule caps the total of holdings above 5% at 40%, which is a sum, not a combination of rule results. Composites cannot build it.

  • Emerging-market equities may exceed 10% of the portfolio only if total equities remain within their policy range.
  • Either at least 75% of US dollar exposure is hedged, or US dollar exposure does not exceed 10% of the portfolio.
  • Unfunded commitments above 20% are permitted only while at least 30% of the portfolio is liquid within 30 days.
  • The portfolio must comply with both the single-issuer limit and the issuer-group limit at all times.

How it is evaluated

A composite has no parameters of its own. It names its operand rules and one operator. AND is satisfied when every operand is compliant and breaches when any operand breaches; the result names the failing operands.

OR is satisfied when at least one operand holds. NOT reverses an operand’s outcome. If none of the operands applies to the portfolio, the composite reads not applicable.

Unknowns never launder into a pass. If any operand is not evaluated, the composite is not evaluated, even under OR where another operand holds. The data gap must be fixed, not outvoted.

Governance and breaches

A composite is a rule version like any other. It has effective dates, a materiality level that sets how many distinct approvers it needs, and maker-checker approval. Its operands keep their own versions, so a change to an operand is approved on that operand.

A composite breach opens a case like any other, and the result names the failing operands. A waiver on the composite is time-bound and changes neither its result nor its operands’ results.

Data the check reads

Rule parameters

Combines the outcomes of other approved rules with AND / OR / NOT.

Parameter names, methodology text and result-code meanings are shown exactly as the platform states them.

Worked examples, run by the engine

AND over two operands that both hold is satisfied

Rule template: composite

operator: and

Outcomes of the combined rules
RuleStatus
Cash bandCompliant
Issuer capCompliant
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Composite Compliant – – – COMPOSITE_SATISFIED
  • COMPOSITE_SATISFIED: Returned by the engine; the registry’s reason-code dictionary has no entry for it.

These are the product's own test cases for this template, evaluated by the Acclimetry rule engine (backend commit 8197063). The build fails if any result changes.

AND fails when one operand breaches

Rule template: composite

operator: and

Outcomes of the combined rules
RuleStatus
Cash bandCompliant
Issuer capBreach
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Composite Breach – – – COMPOSITE_FAILED
  • COMPOSITE_FAILED: Returned by the engine; the registry’s reason-code dictionary has no entry for it.

These are the product's own test cases for this template, evaluated by the Acclimetry rule engine (backend commit 8197063). The build fails if any result changes.

An operand that was not evaluated makes the composite not evaluated — an unknown never launders into an OR that holds

Rule template: composite

operator: or

Outcomes of the combined rules
RuleStatus
Cash bandCompliant
Issuer capNot evaluated: data quality
Result
GroupStatusValueBoundsHeadroom to the hard boundCode
Composite Not evaluated: data quality – – – OPERAND_NOT_EVALUATED
  • OPERAND_NOT_EVALUATED: A composite rule could not be decided because one of its operand rules was not evaluated.

These are the product's own test cases for this template, evaluated by the Acclimetry rule engine (backend commit 8197063). The build fails if any result changes.

Interpretation traps

OR with an unknown

Three-valued logic would let ‘true OR unknown’ pass. Acclimetry does not: an operand that was not evaluated makes the composite not evaluated. See composite rule logic.

Outcomes, not sums

A composite combines results, not exposures. Conditions that add weights, such as the UCITS 40% test, cannot be built by joining rules. Record them as unsupported by the engine or as a manual obligation.

Align the scopes

If none of the operands applies to a portfolio, the composite reads not applicable. Keep each operand’s scope in line with the composite’s, or the condition may never be tested.

Write ‘only if’ carefully

‘A may exceed 10% only if B holds’ means the A cap OR rule B. With the wrong operator, the composite breaches when the policy allows or passes when it does not.

Result codes this check can return

CodeStateMeaningWhat to do
COMPOSITE_SATISFIED ✓CompliantReturned by the engine; the registry’s reason-code dictionary has no entry for it.–
COMPOSITE_FAILED ✓BreachReturned by the engine; the registry’s reason-code dictionary has no entry for it.–
NO_APPLICABLE_OPERANDSNot applicableNone of this composite rule's operands applied to the portfolio.–
NOT_IN_SCOPENot applicableThis rule version does not apply to this portfolio — the portfolio is outside the version's stated scope. Recorded so that "considered and out of scope" can be told from "never run".–
AGGREGATE_MEMBER_NOT_ACCEPTEDNot evaluated: data qualityA portfolio in the measured set has no authoritative snapshot, so the set-level number cannot be stated.Accept the named portfolios' snapshots. A partial set produces no aggregate.
OPERAND_NOT_EVALUATED ✓Not evaluated: data qualityA composite rule could not be decided because one of its operand rules was not evaluated.Resolve the operand rule's own reason first.
SNAPSHOT_NOT_ACCEPTEDNot evaluated: data qualityThe portfolio's newest snapshot awaits data-quality review; only accepted data may produce an authoritative result.Accept, override or reject the snapshot on Data & Quality.
SNAPSHOT_REJECTEDNot evaluated: data qualityThe portfolio's newest snapshot was rejected, so there is no authoritative data to measure.Load a corrected file.
STALE_POSITIONSNot evaluated: data qualityThe newest snapshot is older than the organisation's staleness threshold.Load current positions, or revisit the threshold on Data & Quality ▸ Policy.
STALE_PRICESNot evaluated: data qualityA holding had no price on the position file and its approved price was older than the organisation's price-staleness threshold, so it was left unvalued.Load a current price for the holding, price it on the position file, or revisit the threshold on Data & Quality ▸ Policy.
AWAITING_EXTERNAL_DATAPending external dataAn approved input is late but still inside the organisation's grace window. This is not a pass and not an exception.None yet. If the delivery does not arrive, this becomes a data-quality exception.
METHOD_NOT_SUPPORTEDNot evaluated: unsupportedThe rule version asks for a measurement method this engine does not implement. Declared rather than approximated.Choose a supported methodology, or treat this limit as a manual obligation until the method ships.
EVALUATOR_ERRORNot evaluated: system errorThe evaluator raised an error. Surfaced as a visible result rather than as silence.Report it. A system error is never a pass and never a compliant reading.

✓ seen in the worked examples. The rest come from the platform registry’s own scan of the template source.

Questions

Why is my OR rule not evaluated when one side holds?

Because the other side was not evaluated. An unknown never turns into a pass; supply the missing data and the next run decides.

Is a composite the same as two separate rules?

For AND, nearly: two rules give two results, a composite gives one. OR and NOT express conditions that separate rules cannot.

Sources

Updated: 12 October 2026Acclimetry · Foreranger Ltd