---
title: "The Decision Engine"
url: https://docs.growamal.com/en/how-it-works/decision-engine/
language: en
---

# The Decision Engine

The skill-status engine sits at the center of the loop. It takes raw evidence
(answered items, probe scores, observations) and turns it into an honest status per
skill, per domain, and rolled up to six macro-domain tiles. It is fully
deterministic: same input plus same rule version always yields the same output.

## The five transformation layers

Evidence flows through five layers, each one refining the last:

| Layer | Name | What it does |
|---|---|---|
| 1. **ADR** | Assessment Decision Rules | Assigns each piece of evidence an interpretive **Final Status Code** (12 codes, e.g. `confirmed_gateway_weakness`, `adequate_initial_signal`). |
| 2. **PAC / CIS** | Pattern-Aware Confirmation / Confirmatory Item Selection | Decides whether a weak signal is worth confirming with a short 2-item mini-test, and how those items are picked. Broad patterns skip confirmation to avoid over-testing. |
| 3. **SSR** | Skill Status Rules | Combines code, pattern, and behavior into the per-skill **SkillStatus** (9 states) plus a confidence value. |
| 4. **DDR** | Domain Decision Rules | Aggregates skills into the per-domain **DomainStatus** (9 states), with explicit precedence. |
| 5. **DSM** | Domain-Status-to-Macro Map | Maps DomainStatus onto the macro tiles, including two honesty values (`Partial`, `Contextual`). |

A parallel **Response Behavior Metadata** stream annotates the scores with behavior
flags (too-fast answers, long hesitations, repeated same option). It annotates and
never overwrites.

## The three outputs

### SkillStatus (9 values, per skill)

`adequate` · `monitor` · `weak_isolated` · `monitor_gateway` · `weak_gateway` ·
`weak_domain_related` · `broad_weakness_related` ·
`cautionary_weakness_with_metadata` · `contextual_review`

### DomainStatus (9 values, per domain)

`adequate_domain` · `monitor_domain` · `isolated_skill_need` ·
`gateway_driven_domain_concern` · `coherent_domain_weakness` ·
`broad_related_domain_concern` · `partial_domain_profile` ·
`domain_weakness_with_behavior_metadata` · `contextual_domain_review`

`gateway_driven_domain_concern` is the load-bearing state, since it carries the
Arabic-accuracy carve-out described below.

### MacroDomainStatus (6 tiles + GLOBAL)

| Tile | Area |
|---|---|
| `READ_FOUND` | Reading foundations |
| `ACC_FLU` | Accuracy & fluency |
| `READ_COMP` | Reading comprehension |
| `LISTEN_COMP` | Listening comprehension |
| `LANG_COMP` | Language for comprehension |
| `WR_SP` | Writing & spelling |

`GLOBAL` is a meta-rollup for cross-cutting decisions only, never a dashboard tile.
Macro tiles roll up by status (worst-case-wins on `Severe`), never by averaging
numbers, so there is no single global percentage (V-3).

The macro tiles are projected once per diagnostic finish by the
[Measurement Bridge](https://docs.growamal.com/en/guides/measurement-bridge/), which rolls up the latest domain
statuses worst-case-wins and writes the GLOBAL row as the meta row. Before a diagnostic
finishes, the tiles are simply unwritten and the report reads `Not_Assessed`.

## The `do_not_decide_yet` sentinel

This is the engine's central safety value. When evidence is split or insufficient,
the engine refuses to commit and emits `do_not_decide_yet`.

> **Warning:** `do_not_decide_yet` is a **hard stop for every downstream consumer**. Profiles,
> bundles, alerts, and gamification must all halt and wait rather than act on a
> not-yet-decided skill. Treating the sentinel as just another status is a bug,
> because it means "do not act."

The RTI decision layer is one of these consumers: a `do_not_decide_yet` skill is
one of the sentinel conditions its alert pipeline checks first, so a not-yet-decided
skill opens no alert and blocks any tier movement. See
[RTI Decisions & Tiers](https://docs.growamal.com/en/guides/rti-decisions/) for the full sentinel set.

## The Arabic-accuracy carve-out

A small set of Arabic-orthography detail skills (**shadda, tanween, hamza, madd**,
and similar) must **never escalate a domain on their own**. Hamza is out of scope in
the current wave; in practice, only the active Arabic-accuracy indicator skills in the
taxonomy are subject to this carve-out. The carve-out applies automatically to any skill
whose taxonomy `skill_role` is `Arabic_Accuracy_Indicator`. A child can be developing
on these fine features while reading perfectly well. The engine routes them to a
gentle monitor-only modifier instead of a domain concern.

> **Note:** This carve-out is enforced inside the engine, not bolted on afterward: these
> indicators are excluded from `gateway_driven_domain_concern` and routed to
> monitor / micro-practice only. They can inform a modifier profile, but they can
> never, by themselves, raise a domain to a weakness.

## Where to go next

- [Skill-Status Engine guide](https://docs.growamal.com/en/guides/skill-status-engine/): layer-by-layer detail and the rule tables.
- [Student Profiles](https://docs.growamal.com/en/guides/student-profiles/): how statuses compose into one named profile.
- [Intervention Design](https://docs.growamal.com/en/how-it-works/intervention/): what happens once a profile is resolved.
- [Glossary](https://docs.growamal.com/en/glossary/): every status value and ID family defined.
