Skip to Content

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:

LayerNameWhat it does
1. ADRAssessment Decision RulesAssigns each piece of evidence an interpretive Final Status Code (12 codes, e.g. confirmed_gateway_weakness, adequate_initial_signal).
2. PAC / CISPattern-Aware Confirmation / Confirmatory Item SelectionDecides 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. SSRSkill Status RulesCombines code, pattern, and behavior into the per-skill SkillStatus (9 states) plus a confidence value.
4. DDRDomain Decision RulesAggregates skills into the per-domain DomainStatus (9 states), with explicit precedence.
5. DSMDomain-Status-to-Macro MapMaps 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)

TileArea
READ_FOUNDReading foundations
ACC_FLUAccuracy & fluency
READ_COMPReading comprehension
LISTEN_COMPListening comprehension
LANG_COMPLanguage for comprehension
WR_SPWriting & 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 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.

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 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. 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.

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

Last updated on