---
title: "External IRT engines and exact-method gating"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{External IRT engines and exact-method gating}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")
library(eyeprocess)
```

The engine registry makes estimation boundaries inspectable.

```{r}
eyeprocess_irt_engine_registry()
```

The current registry covers `mirt`, `TAM`, `GDINA`, `LNIRT`, `eRm`, `equateIRT`, `catR`, and `mirtCAT`. Wrappers return an `eye_external_irt_fit` when the requested package is available; otherwise they return an `eye_gated_irt_engine` with `fit = NULL`. They never switch to another estimator.

```{r, eval=FALSE}
fit <- fit_eyeprocess_mirt(response_matrix, model = 1, itemtype = "2PL")
validate_eyeprocess_external_irt_fit(fit, engine = "mirt")
```

This is the same governance principle used for eyeprocess's existing frontier estimators: estimator identity is part of the scientific specification.
