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.
compositeComposite rule
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
- The operand rules, each approved in its own right
- The operator: AND, OR or NOT
- Each operand’s own data, evaluated in the same monitoring run
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
| Rule | Status |
|---|---|
| Cash band | Compliant |
| Issuer cap | Compliant |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| 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
| Rule | Status |
|---|---|
| Cash band | Compliant |
| Issuer cap | Breach |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| 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
| Rule | Status |
|---|---|
| Cash band | Compliant |
| Issuer cap | Not evaluated: data quality |
| Group | Status | Value | Bounds | Headroom to the hard bound | Code |
|---|---|---|---|---|---|
| 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
| Code | State | Meaning | What to do |
|---|---|---|---|
| COMPOSITE_SATISFIED ✓ | Compliant | Returned by the engine; the registry’s reason-code dictionary has no entry for it. | – |
| COMPOSITE_FAILED ✓ | Breach | Returned by the engine; the registry’s reason-code dictionary has no entry for it. | – |
| NO_APPLICABLE_OPERANDS | Not applicable | None of this composite rule's operands applied to the portfolio. | – |
| NOT_IN_SCOPE | Not applicable | This 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_ACCEPTED | Not evaluated: data quality | A 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 quality | A 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_ACCEPTED | Not evaluated: data quality | The 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_REJECTED | Not evaluated: data quality | The portfolio's newest snapshot was rejected, so there is no authoritative data to measure. | Load a corrected file. |
| STALE_POSITIONS | Not evaluated: data quality | The newest snapshot is older than the organisation's staleness threshold. | Load current positions, or revisit the threshold on Data & Quality ▸ Policy. |
| STALE_PRICES | Not evaluated: data quality | A 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_DATA | Pending external data | An 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_SUPPORTED | Not evaluated: unsupported | The 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_ERROR | Not evaluated: system error | The 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.
Acclimetry evaluates AND, OR and NOT over the outcomes of other approved rules in the same run. A composite with an unevaluated operand is never read as compliant. It does not combine measured values or express aggregate tests, such as the UCITS 40% bucket or the 1940 Act 75-5-10 test, as one rule.
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
- Directive 2009/65/EC (UCITS), consolidated text of 16 April 2026, Arts 52 and 55 (EUR-Lex, source of record) · CC BY 4.0 · Read on12 October 2026