Staging engine — Stage 1 / 2 / 3 classification
The staging engine is the part of IFRS 9 auditors examine first, because it determines whether ECL is computed over 12 months (Stage 1) or over the full life of the loan (Stage 2 and 3). Get the staging wrong and every downstream number is wrong.

What staging actually is
Staging is a quarterly classification exercise. For every loan in the book on the quarter-end date, the engine evaluates a set of ordered rules and assigns one of three stages. The stage drives two downstream calculations: the ECL horizon (12-month vs lifetime PD) and the interest recognition (gross vs net carrying amount for Stage 3).
The rules live in ifrs9.staging.rule. Each rule has a sequence (evaluated low-to-high), a Python condition evaluated against the loan record, and a target stage. The first matching rule wins. There is always a default Stage-1 fallback rule with the highest sequence number.
The shipped default rules

The system ships with eight default rules calibrated to CBK PG/04 and IFRS 9 paragraph 5.5. You can disable any rule but you cannot delete the shipped Stage-3 DPD-≥90 rule.
| Seq | Rule name | Condition (plain English) | Target |
|---|---|---|---|
| 10 | DPD ≥ 90 | Days past due is 90 or more on any instalment | Stage 3 |
| 20 | Credit-impaired flag | Officer ticked 'credit impaired' on the loan | Stage 3 |
| 30 | Distressed restructure | Restructure happened in last 24 months AND borrower was in arrears at restructure | Stage 3 |
| 40 | Cross-default | Same member has another loan in Stage 3 | Stage 3 |
| 50 | DPD ≥ 30 | Days past due is 30 or more | Stage 2 |
| 60 | Watchlist | Loan is on the credit committee watchlist | Stage 2 |
| 70 | PD doubled since origination | Current 12-month PD is ≥ 2× origination 12-month PD | Stage 2 |
| 80 | Sector stress | Member's sector has a Risk Committee 'stress' flag this quarter | Stage 2 |
| 999 | Default fallback | Always matches | Stage 1 |
Significant Increase in Credit Risk (SICR)
IFRS 9 requires loans to move from Stage 1 to Stage 2 when there has been a 'significant increase in credit risk' since initial recognition. This is the most judgement-heavy area of the standard and a frequent audit topic.
We use three SICR triggers and a loan triggers Stage 2 if any of them fires. They are designed to be defensible without being trigger-happy: a loan that drifts to 31 DPD then cures back the same quarter should not bounce between stages.
- Quantitative — DPD ≥ 30. The IFRS 9 rebuttable presumption. We do not rebut it.
- Quantitative — PD doubling. Current 12-month PD ≥ 2× origination 12-month PD. Calibrated on local default data.
- Qualitative — Watchlist / sector stress. Risk Committee can flag individual loans or whole sectors.
Cure periods — moving back down
Stage transitions are not symmetric. A loan moves up the stages as soon as a trigger fires. A loan moves down only after a defined cure period of demonstrated good behaviour. This prevents the cliff-edge of a loan paying one instalment, going to Stage 1, then re-defaulting.
| From | To | Cure condition | Cure period |
|---|---|---|---|
| Stage 3 | Stage 2 | Continuous payments per schedule, no arrears | 12 months (forborne) / 6 months (non-forborne) |
| Stage 3 | Stage 1 | Not permitted — must go via Stage 2 first | — |
| Stage 2 | Stage 1 | All Stage-2 triggers cleared | 3 months |
is_forborne on the loan record and enforces this automatically. Do not override without Risk Manager sign-off.Manual stage override
In exceptional cases a Risk Manager can override the engine's stage decision. Override is logged with reason and reviewer, surfaced in the audit pack, and required to be re-justified at the next run.
- Open the run line for the loan in question.
- Click Override stage (visible only to MFI / IFRS 9 / Risk Manager group).
- Select target stage and pick from the reason list (Forced cure, Sectoral noise, Data error, Other).
- Add a free-text justification ≥ 50 characters.
- Override is now logged in
ifrs9.stage.overridewith the user, timestamp, and run.
What auditors check
From the four most recent external audits, these are the questions that consistently come up around staging:
All five questions can be answered from the audit pack without leaving the system. See audit pack.
- Sample of 25 Stage 1 loans — any that should have been Stage 2 based on DPD or PD doubling?
- Sample of 10 Stage 2 loans — was the SICR trigger captured correctly?
- Stage 3 → Stage 2 transitions during the period — did each have a documented cure period?
- Any manual overrides — what was the justification and who signed off?
- Year-on-year migration matrix — are Stage 2 and Stage 3 populations stable, growing, or shrinking?
Worked scenarios
Scenario — Drought triggers sector stress — 84 agriculture loans move to Stage 2
| Character | Role |
|---|---|
| Kimani Mwangi | Risk Manager |
| Mary Mutua | Head of Credit |
| Florence Achieng | CFO |
| Jane Wambui | Maize farmer, KES 80,000 loan, current |
Timeline
- Sep 18: Risk Committee reviews Met Office forecast. Decides to flag 'Agriculture — rain-fed maize' as a stressed sector. (Minute item 4.2)
- Sep 19: Kimani opens IFRS 9 → Sector Stress Flags. Adds sector 'AGR-MAIZE-RAINFED' with effective date 30-Sep. (ifrs9.sector.stress row created)
- Sep 30, 23:59: Quarter-end snapshot. 4,189 loans frozen. (ifrs9.run state=snapshotted)
- Oct 1, 08:30: Kimani runs staging. Rule 80 (Sector stress) fires on 84 agriculture loans — including Jane's KES 80,000 loan which is current and would otherwise be Stage 1. (84 loans moved to Stage 2)
- Oct 1, 09:15: Mary spot-checks the list. Two loans are already Stage 3 by Rule 10 (90+ DPD) — those stay Stage 3 (lower-numbered rule wins). (Rule-precedence check passes)
- Oct 1, 11:00: ECL recomputes. The 84 newly-staged loans add KES 1.2M to weighted ECL vs Q2. (state=computed)
- Oct 3, 10:00: Florence reviews. Asks Kimani to document the sector-stress decision in the audit pack. (Audit pack section 3.4)
- Oct 3, 14:00: Run posted to GL. (state=posted)
- Jun 30 (next year): Rains have recovered; arrears on the agriculture book back to baseline. Risk Committee removes the sector flag. Staging engine moves 71 of the 84 back to Stage 1 (after the 3-month cure since flag removal). (13 loans remain in Stage 2 by other rules)
Outcome — Forward-looking SICR captured without waiting for actual arrears; ECL ahead of the curve; full audit trail of the qualitative judgement.
Reference
ifrs9.staging.rule fields
| Field | Type | Notes |
|---|---|---|
| sequence | Integer | Evaluation order; lower wins |
| name | Char | Human-readable rule name |
| target_stage | Selection (1/2/3) | Stage to assign on match |
| condition_python | Text | Python expression evaluated against loan record. Example: loan.days_past_due >= 90 |
| active | Boolean | Disable without deleting; preserves audit history |
| valid_from / valid_to | Date | Rule applies to runs whose period_end falls in this window |
| is_shipped_locked | Boolean | True for the Stage-3 DPD-≥90 rule; cannot be disabled |
Permitted stage transitions
| From | To | Allowed | Requires |
|---|---|---|---|
| Stage 1 | Stage 2 | Yes | Any Stage-2 SICR rule fires |
| Stage 1 | Stage 3 | Yes | Any Stage-3 rule fires |
| Stage 2 | Stage 1 | Yes | 3-month cure, all Stage-2 triggers cleared |
| Stage 2 | Stage 3 | Yes | Any Stage-3 rule fires |
| Stage 3 | Stage 2 | Yes | 6-month cure (non-forborne) or 12-month (forborne) |
| Stage 3 | Stage 1 | No | Must pass via Stage 2 |
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| A loan I expected in Stage 2 is showing Stage 1. | Rule 50 (DPD ≥ 30) checks days_past_due at the snapshot date. If the borrower paid on 29-Sep and DPD reset to zero, the rule does not fire. | Check the loan's payment history. If you believe SICR was triggered earlier and not cured properly, raise a manual override with reason 'Forced SICR retention'. |
| Whole portfolio jumps to Stage 2 unexpectedly. | Sector stress flag was added at the parent sector level (e.g. 'Agriculture' rather than 'AGR-MAIZE-RAINFED') and cascades to all child sectors. | Edit the sector stress record and narrow the sector. Re-run staging — the cascade will revert. |
| Stage 3 → Stage 2 transition not happening despite 12 clean months. | is_forborne flag on the loan was never cleared after the original restructure; engine is still applying the 12-month forborne cure on top. | If 12 months have elapsed, the engine should clear. If last_arrear_date on the loan is more recent than expected, the cure clock restarts from that date. |
| Override count is high (>5% of book). | Either the staging rules are mis-calibrated or there is a data quality issue (e.g. DPD field not refreshed). | Run the daily DPD refresh first (MFI → Tools → Refresh DPD). If overrides remain high, take the rule calibration to Risk Committee. |
| Staging rule changes affect prior quarters' runs. | The valid_from date on the rule was set in the past. | Rules should always have valid_from set forward of the most recent posted run. Adjust valid_from; previously-posted runs are immutable so the change cannot retroactively contaminate them. |

