mfrm_report() is a report-synthesis layer for an existing
mfrm_results() object. It does not refit the model, recompute diagnostics,
or add new validity rules. Instead, it turns the comprehensive first-screen
result into a first-screen table, section plan, claim-readiness table,
report-gap table, report-index table, template-index table,
fit-criteria table, result-specific fit evidence summaries,
fit-reporting wording templates, precision/separation reporting templates,
bias/DFF reporting templates, misfit/pathway reporting templates,
linking/anchor reporting templates, ZSTD-convention table,
evidence-boundary table, next-action table, and optional Markdown or HTML
report.
Arguments
- x
An
mfrm_results()object.- style
Report emphasis.
"qc"is the default first-screen report."apa"emphasizes manuscript wording,"validation"emphasizes the validity-argument boundary,"reviewer"emphasizes reviewer response preparation, and"technical"emphasizes appendix/reproducibility routes.- output
Return format:
"object"for anmfrm_reportobject,"markdown"for a character scalar,"html"for a temporary HTML file, or"tables"for the report's named data-frame list.
Value
Depending on output, an mfrm_report object, a Markdown character
scalar, an mfrm_report_html object, or a named list of data frames.
Details
The intended workflow is:
Create
res <- mfrm_results(fit, include = ...).Inspect
summary(res)$triageandsummary(res)$next_actions.Create
report <- mfrm_report(res, style = "qc").Read
summary(report)andreport$first_screenbefore opening detailed report tables.Use
report$report_indexto choose the nextPrimaryTable,TemplateTable, plot route, or export route.Use
report$template_indexbefore copying APA/QC/validation wording.Use
style = "apa","validation","reviewer", or"technical"only when that reporting question is needed.
Report rows deliberately distinguish evidence from claims. The
first_screen table is the compact entry point: it gives an overall row and
one row per major evidence area with status, readiness, main issue, next
action, and primary route. The
summary.mfrm_report method summarizes that first screen into immediate
actions, optional not-requested sections, claim-readiness counts, report
gaps, and template-boundary rows without introducing a new pass/fail
decision. The default print method follows the same short reading order and
does not print every detailed evidence table. HTML output places the same
reader guidance and report-summary tables before the full Markdown text so
the browser view starts from the first-screen route. The
report_index table is the detailed evidence-route index: it lists the
major report areas, evidence status, readiness label, review-signal count,
and the primary/template tables, evidence routes, template routes, plot
routes, export route, and mfrm_results(include = ...) preset to inspect
next. In ordinary use, open detailed tables through the PrimaryTable and
TemplateTable columns rather than scanning every element of report$tables.
The
template_index table then stacks all fit, precision, bias, misfit, and
linking wording templates into a single boundary/claim-strength index before
users drill into the area-specific template tables. The
claim_readiness table marks which report claims are ready, caveated,
unavailable, or require additional requested sections. The report_gaps
table turns those statuses into follow-up actions. The fit-specific tables
keep multiple MnSq threshold profiles, observed fit-status counts, and
engine-vs-FACETS-style ZSTD conventions visible, including the
small-df/capping boundary used for FACETS-style ZSTD review. They summarize
the stored fit_measures component from mfrm_results(); mfrm_report()
itself does not recompute diagnostics. The fit_reporting_templates table
turns those counts into cautious reporting language while keeping MnSq,
ZSTD standardization, df sensitivity, and
separation/reliability in separate sentences. All reporting-template tables
share EvidenceTable, EvidenceRoute, BoundaryType, ClaimStrength, and
RecommendedUse columns so each template can be traced back to its evidence
and claim boundary. The default RecommendedUse is
"report_with_context"; more restrictive rows request evidence, identify a
methods or appendix caveat, or require targeted follow-up. template_index
stacks those columns across all
template areas so report authors can review unsupported or caveated wording
before opening the full template text. The precision_reporting_templates
table does the same for separation, reliability, and strata using the
stored precision review and diagnostics$reliability. The
bias_reporting_templates table is
available when the source result was built with include = "bias" and keeps
facet-level screens, interaction-bias contrasts, DFF follow-up, and fairness
conclusions in separate lanes. The misfit_reporting_templates table is
available when the source result was built with include = "misfit_review"
and keeps unexpected responses, displacement, pathway-map evidence, and
case-review actions separate. The linking_reporting_templates table is
available when the source result was built with include = "linking" and
keeps anchor readiness, drift review, equating-chain review, and GPCM
support boundaries separate. For example, fit and separation are not
collapsed into a single pass/fail statement; bias screens are not treated
as final fairness conclusions; pathway/misfit rows are case-review prompts;
and drift/equating claims require multiple fitted forms or waves.
Examples
# \donttest{
toy <- load_mfrmr_data("example_core")
toy_small <- toy[toy$Person %in% unique(toy$Person)[1:6], , drop = FALSE]
fit <- fit_mfrm(toy_small, "Person", c("Rater", "Criterion"), "Score",
method = "JML", maxit = 30)
res <- mfrm_results(fit, include = c("fit", "diagnostics", "tables"))
report <- mfrm_report(res, style = "qc")
summary(report)
#> mfrmr Report Summary
#>
#> Overview
#> Style OverallStatus FirstAction ReviewAreas NotComputedAreas CaveatAreas
#> qc review Start with Fit. 1 0 1
#> OptionalAreas UnavailableAreas OkAreas SourceInclude
#> 3 0 0 fit, diagnostics, tables
#>
#> First screen
#> Area Status Readiness
#> Overall review review
#> Fit review review
#> Precision caveat write_with_caveat
#> Bias / DFF request_if_needed request_if_needed
#> Linking / anchors request_if_needed request_if_needed
#> Misfit / pathway request_if_needed request_if_needed
#> MainIssue
#> ok=0; review=1; caveat=1; request_if_needed=3; not_computed=0; unavailable=0.
#> ReviewSignalCount = 8; underfit=0; overfit=0; df_sensitive=8
#> ReviewSignalCount = 4; tier=NA; review_warn=NA; reliability_rows=3
#> Evidence was not requested.
#> Evidence was not requested.
#> Evidence was not requested.
#> NextAction
#> Start with Fit.
#> Inspect the primary evidence table and template boundary before writing.
#> Use caveated wording and inspect the boundary before writing.
#> Request this evidence only if the claim is needed.
#> Request this evidence only if the claim is needed.
#> Request this evidence only if the claim is needed.
#> PrimaryRoute
#> report$report_index; report$template_index
#> report$fit_evidence_summary
#> report$precision_evidence_summary
#> mfrm_results(fit, include = "bias")
#> mfrm_results(fit, include = "linking")
#> mfrm_results(fit, include = "misfit_review")
#>
#> Immediate actions
#> Area Status
#> Fit review
#> Precision caveat
#> MainIssue
#> ReviewSignalCount = 8; underfit=0; overfit=0; df_sensitive=8
#> ReviewSignalCount = 4; tier=NA; review_warn=NA; reliability_rows=3
#> NextAction
#> Inspect the primary evidence table and template boundary before writing.
#> Use caveated wording and inspect the boundary before writing.
#> PrimaryRoute TemplateRoute
#> report$fit_evidence_summary report$fit_reporting_templates
#> report$precision_evidence_summary report$precision_reporting_templates
#>
#> Optional sections not requested
#> Area Status MainIssue
#> Bias / DFF request_if_needed Evidence was not requested.
#> Linking / anchors request_if_needed Evidence was not requested.
#> Misfit / pathway request_if_needed Evidence was not requested.
#> NextAction
#> Request this evidence only if the claim is needed.
#> Request this evidence only if the claim is needed.
#> Request this evidence only if the claim is needed.
#> PrimaryRoute
#> mfrm_results(fit, include = "bias")
#> mfrm_results(fit, include = "linking")
#> mfrm_results(fit, include = "misfit_review")
#>
#> Claim readiness
#> Readiness Claims ExampleClaim
#> needs_requested_section 6 APA-style manuscript text
#> ready 4 Appendix or reviewer supplement
#>
#> Report gaps
#> Priority GapType Section
#> 3 not_requested APA and manuscript wording
#> 3 not_requested Anchors and linking
#> 3 not_requested Bias screening
#> 3 not_requested Fit, separation, and precision
#> 3 not_requested Misfit and pathway review
#> 3 not_requested Network and connectivity
#> 3 not_requested Response-time QC
#> RecommendedAction
#> Rebuild the result with mfrm_results(fit, include = "publication") before using APA-style output.
#> Rebuild the result with mfrm_results(fit, include = "linking") before writing anchor-readiness text.
#> Rebuild the result with mfrm_results(fit, include = "bias") before writing bias or fairness-screen text.
#> Request the relevant mfrm_results() section or call the route-specific helper before reporting this claim.
#> Rebuild the result with mfrm_results(fit, include = "misfit_review") before writing observation-level misfit text.
#> Rebuild the result with mfrm_results(fit, include = "network") before writing connectivity text.
#> Request the relevant mfrm_results() section or call the route-specific helper before reporting this claim.
#> Route
#> mfrm_results(fit, include = "publication"); build_apa_outputs()
#> mfrm_results(fit, include = "linking"); plot(res, type = "anchors")
#> mfrm_results(fit, include = "bias"); estimate_bias(); bias_interaction_report()
#> summary(res$components$precision_review); precision_review_report(fit, diagnostics)
#> mfrm_results(fit, include = "misfit_review"); plot(res, type = "pathway")
#> mfrm_results(fit, include = "network"); build_mfrm_network_review()
#> mfrm_results(fit, include = "response_time", response_time = ..., response_time_data = ...); plot(res, type = "response_time")
#>
#> Boundary index
#> Area Topic BoundaryType
#> Bias / DFF Bias/DFF evidence not requested screen_not_fairness_decision
#> Linking / anchors Linking evidence not requested anchor_not_drift_absence
#> Fit Fit-status wording fit_not_validity
#> Fit Boundary wording fit_not_validity
#> Precision Precision-tier wording precision_not_agreement
#> Precision Separation wording precision_not_agreement
#> Precision Reliability wording precision_not_agreement
#> Precision Strata wording precision_not_agreement
#> ClaimStrength RecommendedUse
#> not_supported_without_followup targeted_followup_before_claim
#> not_supported_without_followup request_evidence_before_writing
#> descriptive_only report_with_context
#> descriptive_only reporting_guardrail
#> descriptive_only report_with_context
#> descriptive_only report_with_context
#> descriptive_only report_with_context
#> descriptive_only report_with_context
#> EvidenceRoute
#> report$bias_evidence_summary
#> report$linking_evidence_summary
#> report$fit_evidence_summary
#> report$fit_decision_policy
#> report$precision_evidence_summary
#> res$diagnostics$reliability
#> res$diagnostics$reliability
#> report$precision_basis
report$first_screen
#> Area Status Readiness
#> 1 Overall review review
#> 2 Fit review review
#> 3 Precision caveat write_with_caveat
#> 4 Bias / DFF request_if_needed request_if_needed
#> 5 Linking / anchors request_if_needed request_if_needed
#> 6 Misfit / pathway request_if_needed request_if_needed
#> MainIssue
#> 1 ok=0; review=1; caveat=1; request_if_needed=3; not_computed=0; unavailable=0.
#> 2 ReviewSignalCount = 8; underfit=0; overfit=0; df_sensitive=8
#> 3 ReviewSignalCount = 4; tier=NA; review_warn=NA; reliability_rows=3
#> 4 Evidence was not requested.
#> 5 Evidence was not requested.
#> 6 Evidence was not requested.
#> NextAction
#> 1 Start with Fit.
#> 2 Inspect the primary evidence table and template boundary before writing.
#> 3 Use caveated wording and inspect the boundary before writing.
#> 4 Request this evidence only if the claim is needed.
#> 5 Request this evidence only if the claim is needed.
#> 6 Request this evidence only if the claim is needed.
#> PrimaryRoute
#> 1 report$report_index; report$template_index
#> 2 report$fit_evidence_summary
#> 3 report$precision_evidence_summary
#> 4 mfrm_results(fit, include = "bias")
#> 5 mfrm_results(fit, include = "linking")
#> 6 mfrm_results(fit, include = "misfit_review")
#> TemplateRoute PlotRoute
#> 1 report$template_index
#> 2 report$fit_reporting_templates plot(res, type = 'qc')
#> 3 report$precision_reporting_templates plot(res, type = 'qc')
#> 4 report$bias_reporting_templates plot(res, type = 'tables')
#> 5 report$linking_reporting_templates plot(res, type = "anchors")
#> 6 report$misfit_reporting_templates plot(res, type = 'pathway')
#> BoundaryType
#> 1 first_screen_summary
#> 2 fit_not_validity
#> 3 precision_not_agreement
#> 4 screen_not_fairness_decision
#> 5 anchor_not_drift_absence
#> 6 misfit_not_exclusion_rule
report$report_index[, c("Area", "Readiness", "PrimaryTable",
"TemplateTable", "PlotRoute")]
#> Area Readiness PrimaryTable
#> 1 Fit review fit_evidence_summary
#> 2 Precision write_with_caveat precision_evidence_summary
#> 3 Bias / DFF request_if_needed bias_evidence_summary
#> 4 Misfit / pathway request_if_needed misfit_evidence_summary
#> 5 Linking / anchors request_if_needed linking_evidence_summary
#> TemplateTable PlotRoute
#> 1 fit_reporting_templates plot(res, type = 'qc')
#> 2 precision_reporting_templates plot(res, type = 'qc')
#> 3 bias_reporting_templates plot(res, type = 'tables')
#> 4 misfit_reporting_templates plot(res, type = 'pathway')
#> 5 linking_reporting_templates plot(res, type = "anchors")
report$template_index[, c("Area", "Topic", "BoundaryType",
"ClaimStrength", "EvidenceRoute")]
#> Area Topic
#> 1 Bias / DFF Bias/DFF evidence not requested
#> 2 Linking / anchors Linking evidence not requested
#> 3 Fit Threshold-profile wording
#> 4 Fit ZSTD-convention wording
#> 5 Fit DF/ZSTD sensitivity wording
#> 6 Misfit / pathway Misfit/pathway evidence not requested
#> 7 Fit Fit-status wording
#> 8 Fit Boundary wording
#> 9 Precision Precision-tier wording
#> 10 Precision Separation wording
#> 11 Precision Reliability wording
#> 12 Precision Strata wording
#> 13 Precision Boundary wording
#> BoundaryType ClaimStrength
#> 1 screen_not_fairness_decision not_supported_without_followup
#> 2 anchor_not_drift_absence not_supported_without_followup
#> 3 fit_not_validity write_with_caveat
#> 4 fit_not_validity write_with_caveat
#> 5 fit_not_validity write_with_caveat
#> 6 misfit_not_exclusion_rule write_with_caveat
#> 7 fit_not_validity descriptive_only
#> 8 fit_not_validity descriptive_only
#> 9 precision_not_agreement descriptive_only
#> 10 precision_not_agreement descriptive_only
#> 11 precision_not_agreement descriptive_only
#> 12 precision_not_agreement descriptive_only
#> 13 precision_not_agreement descriptive_only
#> EvidenceRoute
#> 1 report$bias_evidence_summary
#> 2 report$linking_evidence_summary
#> 3 report$fit_threshold_sensitivity
#> 4 report$zstd_conventions
#> 5 report$fit_df_sensitivity_summary
#> 6 report$misfit_evidence_summary
#> 7 report$fit_evidence_summary
#> 8 report$fit_decision_policy
#> 9 report$precision_evidence_summary
#> 10 res$diagnostics$reliability
#> 11 res$diagnostics$reliability
#> 12 report$precision_basis
#> 13 report$precision_basis
# Open detailed evidence only after the index points to it.
fit_primary <- report$report_index$PrimaryTable[
report$report_index$Area == "Fit"
][1]
report$tables[[fit_primary]]
#> Status Rows DisplayedRows UnderfitRows OverfitRows MixedRows
#> 1 available 8 8 0 0 0
#> WithinBandRows NotAvailableRows DfComparedRows DfSensitiveRows
#> 1 8 0 8 8
#> FlagChangedByDfRows LargeZSTDShiftRows DfConventionDifferenceRows FitDfMethod
#> 1 0 1 7 both
#> ThresholdProfiles FacetsCompanionAvailable Source
#> 1 all TRUE res$components$fit_measures
#> Route
#> 1 res$components$fit_measures$summary
#> Boundary
#> 1 Counts summarize the stored fit-measures component. Interpret MnSq status, df-sensitive ZSTD shifts, separation, and reliability as separate evidence streams.
mfrm_report(res, output = "markdown")
#> [1] "# mfrmr QC Report\n\n## Narrative\n- Quality-control triage before manuscript, appendix, or reviewer handoff. The report is generated from an existing mfrm_results object and does not refit the model.\n- The source result uses model RSM with method JML and 96 observations.\n- Highest-priority first-screen signals: Diagnostics=review (diagnostic_warnings_present); Data review=ok (data_readiness_pass); Design / connectivity=ok (design_linked).\n- Use the section plan and evidence-boundary table to decide what can be written now, what needs a targeted follow-up helper, and what should remain caveated.\n\n## First Screen\n| Area | Status | Readiness | MainIssue | NextAction | PrimaryRoute | TemplateRoute | PlotRoute | BoundaryType |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| Overall | review | review | ok=0; review=1; caveat=1; request_if_needed=3; not_computed=0; unavailable=0. | Start with Fit. | report$report_index; report$template_index | report$template_index | | first_screen_summary |\n| Fit | review | review | ReviewSignalCount = 8; underfit=0; overfit=0; df_sensitive=8 | Inspect the primary evidence table and template boundary before writing. | report$fit_evidence_summary | report$fit_reporting_templates | plot(res, type = 'qc') | fit_not_validity |\n| Precision | caveat | write_with_caveat | ReviewSignalCount = 4; tier=NA; review_warn=NA; reliability_rows=3 | Use caveated wording and inspect the boundary before writing. | report$precision_evidence_summary | report$precision_reporting_templates | plot(res, type = 'qc') | precision_not_agreement |\n| Bias / DFF | request_if_needed | request_if_needed | Evidence was not requested. | Request this evidence only if the claim is needed. | mfrm_results(fit, include = \"bias\") | report$bias_reporting_templates | plot(res, type = 'tables') | screen_not_fairness_decision |\n| Linking / anchors | request_if_needed | request_if_needed | Evidence was not requested. | Request this evidence only if the claim is needed. | mfrm_results(fit, include = \"linking\") | report$linking_reporting_templates | plot(res, type = \"anchors\") | anchor_not_drift_absence |\n| Misfit / pathway | request_if_needed | request_if_needed | Evidence was not requested. | Request this evidence only if the claim is needed. | mfrm_results(fit, include = \"misfit_review\") | report$misfit_reporting_templates | plot(res, type = 'pathway') | misfit_not_exclusion_rule |\n\n## Report Index\n| Area | Section | SectionStatus | EvidenceStatus | Readiness | ReviewSignalCount | EvidenceDetail | PrimaryTable | TemplateTable | Route | EvidenceRoute | TemplateRoute | PlotRoute | ExportRoute | IncludePreset | Boundary |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| Fit | Fit, separation, and precision | not_requested | available | review | 8 | underfit=0; overfit=0; df_sensitive=8 | fit_evidence_summary | fit_reporting_templates | report$fit_evidence_summary; report$fit_reporting_templates | report$fit_evidence_summary | report$fit_reporting_templates | plot(res, type = 'qc') | export_mfrm_results(res, include = \"report\") | mfrm_results(fit, include = c(\"fit\", \"diagnostics\", \"precision\", \"reporting\")) | Counts summarize the stored fit-measures component. Interpret MnSq status, df-sensitive ZSTD shifts, separation, and reliability as separate evidence streams. |\n| Precision | Fit, separation, and precision | not_requested | available_without_precision_review | write_with_caveat | 4 | tier=NA; review_warn=NA; reliability_rows=3 | precision_evidence_summary | precision_reporting_templates | report$precision_evidence_summary; report$precision_reporting_templates | report$precision_evidence_summary | report$precision_reporting_templates | plot(res, type = 'qc') | export_mfrm_results(res, include = \"report\") | mfrm_results(fit, include = c(\"fit\", \"diagnostics\", \"precision\", \"reporting\")) | Separation, reliability, and strata summarize spread relative to measurement error. They are not inter-rater agreement, model fit, or standalone validity evidence. |\n| Bias / DFF | Bias screening | not_requested | not_requested | request_if_needed | NA | screen_rows=NA; residual_screen=NA; chi_sq_screen=NA | bias_evidence_summary | bias_reporting_templates | report$bias_evidence_summary; report$bias_reporting_templates | report$bias_evidence_summary | report$bias_reporting_templates | plot(res, type = 'tables') | export_mfrm_results(res, include = \"report\") | mfrm_results(fit, include = \"bias\") | Bias/DFF wording requires the bias preset or an explicit bias/DFF helper call. Do not infer fairness conclusions from omitted sections. |\n| Misfit / pathway | Misfit and pathway review | not_requested | not_requested | request_if_needed | NA | unexpected=NA; displacement=NA; pathway=FALSE | misfit_evidence_summary | misfit_reporting_templates | report$misfit_evidence_summary; report$misfit_reporting_templates | report$misfit_evidence_summary | report$misfit_reporting_templates | plot(res, type = 'pathway') | export_mfrm_results(res, include = \"report\") | mfrm_results(fit, include = \"misfit_review\") | Misfit/pathway wording requires the misfit_review preset or explicit unexpected-response, displacement, and pathway helper calls. |\n| Linking / anchors | Anchors and linking | not_requested | not_requested | request_if_needed | NA | review_status=not_requested; drift=not_requested; chain=not_requested | linking_evidence_summary | linking_reporting_templates | report$linking_evidence_summary; report$linking_reporting_templates | report$linking_evidence_summary | report$linking_reporting_templates | plot(res, type = \"anchors\") | export_mfrm_results(res, include = \"report\") | mfrm_results(fit, include = \"linking\") | Linking/anchor wording requires the linking preset or explicit anchor, drift, or equating-chain helper calls. |\n\n## Template Index\n| Area | TemplateTable | TemplateRow | Topic | BoundaryType | ClaimStrength | RecommendedUse | EvidenceTable | EvidenceRoute | Route | Caveat |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| Bias / DFF | bias_reporting_templates | 1 | Bias/DFF evidence not requested | screen_not_fairness_decision | not_supported_without_followup | targeted_followup_before_claim | bias_evidence_summary | report$bias_evidence_summary | mfrm_results(fit, include = \"bias\"); estimate_bias(); analyze_dff() | Request the bias preset or run an explicit bias/DFF helper before writing fairness language. |\n| Linking / anchors | linking_reporting_templates | 1 | Linking evidence not requested | anchor_not_drift_absence | not_supported_without_followup | request_evidence_before_writing | linking_evidence_summary | report$linking_evidence_summary | mfrm_results(fit, include = \"linking\"); review_mfrm_anchors(); detect_anchor_drift(); build_equating_chain() | Request the linking preset or run explicit anchor, drift, or equating-chain helpers before writing linking claims. |\n| Fit | fit_reporting_templates | 2 | Threshold-profile wording | fit_not_validity | write_with_caveat | methods_or_appendix_caveat | fit_threshold_sensitivity | report$fit_threshold_sensitivity | report$fit_threshold_sensitivity | Use profile disagreement as sensitivity evidence; do not silently mix fit bands across reports. |\n| Fit | fit_reporting_templates | 3 | ZSTD-convention wording | fit_not_validity | write_with_caveat | methods_or_appendix_caveat | zstd_conventions | report$zstd_conventions | report$zstd_conventions | Read MnSq size first; use ZSTD to explain standardization, not as independent residual evidence. |\n| Fit | fit_reporting_templates | 4 | DF/ZSTD sensitivity wording | fit_not_validity | write_with_caveat | methods_or_appendix_caveat | fit_df_sensitivity_summary | report$fit_df_sensitivity_summary | report$fit_df_sensitivity_summary; report$fit_df_sensitive_rows | A df-sensitive ZSTD result is a convention-sensitive review prompt, not a different MnSq fit signal. |\n| Misfit / pathway | misfit_reporting_templates | 1 | Misfit/pathway evidence not requested | misfit_not_exclusion_rule | write_with_caveat | request_evidence_before_writing | misfit_evidence_summary | report$misfit_evidence_summary | mfrm_results(fit, include = \"misfit_review\"); build_misfit_casebook() | Request the misfit_review preset or run the local misfit helpers before writing case-review language. |\n| Fit | fit_reporting_templates | 1 | Fit-status wording | fit_not_validity | descriptive_only | report_with_context | fit_evidence_summary | report$fit_evidence_summary | report$fit_evidence_summary | This sentence reports a screening table, not a global model-validity decision. |\n| Fit | fit_reporting_templates | 5 | Boundary wording | fit_not_validity | descriptive_only | reporting_guardrail | fit_decision_policy | report$fit_decision_policy | report$fit_decision_policy | This boundary is intentionally conservative because published MnSq bands and ZSTD conventions differ. |\n| Precision | precision_reporting_templates | 1 | Precision-tier wording | precision_not_agreement | descriptive_only | report_with_context | precision_evidence_summary | report$precision_evidence_summary | report$precision_evidence_summary | A favorable precision tier does not override misfit, convergence, linking, or design problems. |\n| Precision | precision_reporting_templates | 2 | Separation wording | precision_not_agreement | descriptive_only | report_with_context | diagnostics | res$diagnostics$reliability | res$diagnostics$reliability | Do not describe separation as observed rater agreement or as proof of construct validity. |\n| Precision | precision_reporting_templates | 3 | Reliability wording | precision_not_agreement | descriptive_only | report_with_context | diagnostics | res$diagnostics$reliability | res$diagnostics$reliability | This is Rasch/FACETS-style separation reliability, not classical inter-rater agreement. |\n| Precision | precision_reporting_templates | 4 | Strata wording | precision_not_agreement | descriptive_only | report_with_context | diagnostics | report$precision_basis | report$precision_basis | Use strata as a precision-spread summary; do not turn it into an independent quality gate. |\n| Precision | precision_reporting_templates | 5 | Boundary wording | precision_not_agreement | descriptive_only | reporting_guardrail | precision_basis | report$precision_basis | report$precision_basis; report$fit_decision_policy | Do not use high reliability to excuse misfit, and do not use good fit to imply high precision. |\n\n## Section Plan\n| Section | Status | Evidence | Route | ReportUse | Boundary | Focus |\n| --- | --- | --- | --- | --- | --- | --- |\n| Model and data setup | available | Model = RSM; method = JML; N = 96; categories = 4. | summary(res)$overview; specifications_report(fit) | Use for method and analysis-setup wording. | Confirm scoring, column roles, missing-data handling, anchoring, and estimation settings in the analysis script. | Quality-control triage before manuscript, appendix, or reviewer handoff. |\n| First-screen diagnostics | available | Diagnostics object and triage rows are available. | summary(res)$triage; summary(res$diagnostics) | Use for QC ordering and report-readiness checks. | Diagnostics are evidence for follow-up and wording strength, not a standalone validity decision. | Quality-control triage before manuscript, appendix, or reviewer handoff. |\n| Fit, separation, and precision | not_requested | Precision review keeps fit size, standardized fit, separation, and reliability in separate lanes. | summary(res$components$precision_review); precision_review_report(fit, diagnostics) | Use for cautious wording about fit, precision, and separation. | Do not collapse fit, separation, reliability, and ZSTD into one pass/fail rule. | Quality-control triage before manuscript, appendix, or reviewer handoff. |\n| Category functioning | available | Rating-scale/category tables or curves are available when collected by mfrm_results(). | rating_scale_table(fit, diagnostics); category_structure_report(fit) | Use for score-scale interpretation and category-functioning prose. | Category evidence supports score-scale review; it does not by itself establish validity. | Quality-control triage before manuscript, appendix, or reviewer handoff. |\n| Bias screening | not_requested | Facet-level bias screening is available only when requested in mfrm_results(). | mfrm_results(fit, include = \"bias\"); estimate_bias(); bias_interaction_report() | Use for screening language and targeted follow-up contrasts. | Treat positive screens as prompts for substantive review, not final fairness conclusions. | Quality-control triage before manuscript, appendix, or reviewer handoff. |\n| Misfit and pathway review | not_requested | Unexpected-response, displacement, and pathway-map surfaces can localize observations for review. | mfrm_results(fit, include = \"misfit_review\"); plot(res, type = \"pathway\") | Use for case-review notes and reviewer-facing diagnostic follow-up. | Observation-level misfit is not an automatic exclusion or bias decision. | Quality-control triage before manuscript, appendix, or reviewer handoff. |\n| Anchors and linking | not_requested | Anchor-readiness is available from stored fit metadata when the linking preset is requested. | mfrm_results(fit, include = \"linking\"); plot(res, type = \"anchors\") | Use for operational scale-maintenance checks. | Drift and equating require multiple fitted forms or waves; they are not inferred from one fit. | Quality-control triage before manuscript, appendix, or reviewer handoff. |\n| Response-time QC | not_requested | Response-time summaries are available only when timing metadata are explicitly supplied to mfrm_results(). | mfrm_results(fit, include = \"response_time\", response_time = ..., response_time_data = ...); plot(res, type = \"response_time\") | Use for descriptive timing context, rapid/slow-response screening, and QC appendices. | Response-time review does not alter MFRM estimates, fit speed parameters, or define automatic exclusion rules. | Quality-control triage before manuscript, appendix, or reviewer handoff. |\n| Network and connectivity | not_requested | Network review describes design connectivity and overlap structure. | mfrm_results(fit, include = \"network\"); build_mfrm_network_review() | Use for design and sparseness documentation. | Connectivity evidence does not replace model fit, precision, or bias diagnostics. | Quality-control triage before manuscript, appendix, or reviewer handoff. |\n| APA and manuscript wording | not_requested | APA output assembly is available for supported RSM/PCM manuscript routes. | mfrm_results(fit, include = \"publication\"); build_apa_outputs() | Use as draft wording and table/caption templates. | APA text must be edited against the actual study design, model choice, and validation argument. | Quality-control triage before manuscript, appendix, or reviewer handoff. |\n| Tables, plots, and handoff | available | 87 table(s) and 7 plot route(s) were indexed. | build_summary_table_bundle(res); export_mfrm_results(res) | Use for appendix, reviewer supplement, or reproducible handoff. | Exported tables preserve evidence surfaces; they do not add new analyses. | Quality-control triage before manuscript, appendix, or reviewer handoff. |\n\n## Claim Readiness\n| Claim | Section | CurrentStatus | Readiness | EvidenceNeeded | SuggestedWording | FollowUp | Boundary | Style |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| APA-style manuscript text | APA and manuscript wording | not_requested | needs_requested_section | Supported APA output object or a manually edited report template. | Treat generated APA-style text as a draft and edit against the study design. | Use mfrm_results(fit, include = \"publication\") or build_apa_outputs(). | Generated prose is not a substitute for study-specific reporting judgment. | qc |\n| Anchor, linking, or drift claim | Anchors and linking | not_requested | needs_requested_section | Anchor-readiness output for one fit; multiple fitted waves/forms for drift or equating. | Report anchor readiness separately from drift or equating claims. | Use mfrm_results(fit, include = \"linking\"); for drift/equating use detect_anchor_drift() or build_equating_chain(). | Do not infer drift or equating from a single fitted object. | qc |\n| Bias or DFF screening | Bias screening | not_requested | needs_requested_section | Facet-level bias table and any explicitly selected interaction or DFF contrast. | Use screening language unless a targeted contrast and substantive review have been completed. | Use mfrm_results(fit, include = \"bias\") and then estimate_bias() for explicit facet pairs. | Do not present screen positives as final fairness conclusions. | qc |\n| Design connectivity | Network and connectivity | not_requested | needs_requested_section | Network/connectivity review and design overlap evidence. | Use connectivity language to describe design support and sparseness, not model fit. | Use mfrm_results(fit, include = \"network\") and build_mfrm_network_review(). | Connectivity evidence does not replace fit, precision, or bias diagnostics. | qc |\n| Fit and precision evidence | Fit, separation, and precision | not_requested | needs_requested_section | Selected MnSq threshold profile, observed fit-status counts, ZSTD convention, fit df, df-sensitivity rows, separation, reliability, strata, and uncertainty/context notes. | Report MnSq fit, ZSTD standardization, separation, and reliability as separate evidence streams with the selected threshold profile stated. | Use report$fit_evidence_summary, report$fit_threshold_sensitivity, report$fit_df_sensitivity_summary, precision_review_report(), and facets_fit_df_guide(). | Do not reduce these indices to one pass/fail claim, and do not interpret a df-sensitive ZSTD flag without MnSq and context. | qc |\n| Misfit case review | Misfit and pathway review | not_requested | needs_requested_section | Unexpected-response rows, displacement evidence, and pathway-map context. | Frame misfit rows as case-review prompts and report the follow-up basis. | Use mfrm_results(fit, include = \"misfit_review\") and build_misfit_casebook() when needed. | Do not use observation-level misfit as an automatic exclusion rule. | qc |\n| Appendix or reviewer supplement | Tables, plots, and handoff | available | ready | Collected result tables, plot routes, replay code, and a written-files manifest if exported. | Provide tables and replay routes so readers can inspect the evidence surface. | Use build_summary_table_bundle(res), export_mfrm_results(res), or mfrm_report(res, output = \"html\"). | Appendix files preserve evidence; they do not add new analyses. | qc |\n| Category functioning | Category functioning | available | ready | Rating-scale, category-structure, or category-curve evidence. | Describe whether score categories behaved as intended and identify any category-level caveats. | Use rating_scale_table(), category_structure_report(), and category_curves_report(). | Category evidence supports score-scale review but not a standalone validity claim. | qc |\n| Diagnostic review completed | First-screen diagnostics | available | ready | A diagnostics object, triage rows, and any key warning text. | State that diagnostics were inspected, then report only the specific supported findings. | Inspect summary(res)$triage and summary(res$diagnostics)$key_warnings. | Diagnostic availability is a starting point, not a global quality guarantee. | qc |\n| Model specification | Model and data setup | available | ready | Model, method, facets, score coding, categories, sample size, and missing-data handling. | Report the fitted MFRM specification, estimation method, scoring scale, and facet roles explicitly. | Use specifications_report(fit) and the analysis script for final methods wording. | This documents the analysis setup; it is not validity evidence by itself. | qc |\n\n## Report Gaps\n| Priority | GapType | Section | CurrentStatus | RecommendedAction | Route | Reason |\n| --- | --- | --- | --- | --- | --- | --- |\n| 3 | not_requested | APA and manuscript wording | not_requested | Rebuild the result with mfrm_results(fit, include = \"publication\") before using APA-style output. | mfrm_results(fit, include = \"publication\"); build_apa_outputs() | APA text must be edited against the actual study design, model choice, and validation argument. |\n| 3 | not_requested | Anchors and linking | not_requested | Rebuild the result with mfrm_results(fit, include = \"linking\") before writing anchor-readiness text. | mfrm_results(fit, include = \"linking\"); plot(res, type = \"anchors\") | Drift and equating require multiple fitted forms or waves; they are not inferred from one fit. |\n| 3 | not_requested | Bias screening | not_requested | Rebuild the result with mfrm_results(fit, include = \"bias\") before writing bias or fairness-screen text. | mfrm_results(fit, include = \"bias\"); estimate_bias(); bias_interaction_report() | Treat positive screens as prompts for substantive review, not final fairness conclusions. |\n| 3 | not_requested | Fit, separation, and precision | not_requested | Request the relevant mfrm_results() section or call the route-specific helper before reporting this claim. | summary(res$components$precision_review); precision_review_report(fit, diagnostics) | Do not collapse fit, separation, reliability, and ZSTD into one pass/fail rule. |\n| 3 | not_requested | Misfit and pathway review | not_requested | Rebuild the result with mfrm_results(fit, include = \"misfit_review\") before writing observation-level misfit text. | mfrm_results(fit, include = \"misfit_review\"); plot(res, type = \"pathway\") | Observation-level misfit is not an automatic exclusion or bias decision. |\n| 3 | not_requested | Network and connectivity | not_requested | Rebuild the result with mfrm_results(fit, include = \"network\") before writing connectivity text. | mfrm_results(fit, include = \"network\"); build_mfrm_network_review() | Connectivity evidence does not replace model fit, precision, or bias diagnostics. |\n| 3 | not_requested | Response-time QC | not_requested | Request the relevant mfrm_results() section or call the route-specific helper before reporting this claim. | mfrm_results(fit, include = \"response_time\", response_time = ..., response_time_data = ...); plot(res, type = \"response_time\") | Response-time review does not alter MFRM estimates, fit speed parameters, or define automatic exclusion rules. |\n\n## Fit Criteria\n| Profile | ProfileLabel | Metric | Lower | Upper | ZSTDCut | Source | SuggestedUse | DecisionRole | ReportBoundary | Route |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| active | Active review band | Infit/Outfit MnSq | 0.5 | 1.5 | 2 | Current call/options | The band used for the main fit-measures table | main_report_screen | Use as a screening band. Report the selected profile and do not treat a different published band as a contradiction unless it changes the substantive conclusion. | fit_measures_table(fit, threshold_profiles = \"all\", fit_df_method = \"both\") |\n| linacre_productive | Productive measurement | Infit/Outfit MnSq | 0.5 | 1.5 | 2 | Linacre (2002); Bond & Fox (2015) | Broad screening band for productive measurement | sensitivity_or_context | Use as a screening band. Report the selected profile and do not treat a different published band as a contradiction unless it changes the substantive conclusion. | fit_measures_table(fit, threshold_profiles = \"all\", fit_df_method = \"both\") |\n| wright_linacre_high_stakes_mcq | High-stakes multiple-choice | Infit/Outfit MnSq | 0.8 | 1.2 | 2 | Wright & Linacre (1994) | High-stakes selected-response tests | sensitivity_or_context | Use as a screening band. Report the selected profile and do not treat a different published band as a contradiction unless it changes the substantive conclusion. | fit_measures_table(fit, threshold_profiles = \"all\", fit_df_method = \"both\") |\n| wright_linacre_routine_mcq | Routine multiple-choice | Infit/Outfit MnSq | 0.7 | 1.3 | 2 | Wright & Linacre (1994) | Routine selected-response tests | sensitivity_or_context | Use as a screening band. Report the selected profile and do not treat a different published band as a contradiction unless it changes the substantive conclusion. | fit_measures_table(fit, threshold_profiles = \"all\", fit_df_method = \"both\") |\n| wright_linacre_rating_scale | Rating-scale surveys | Infit/Outfit MnSq | 0.6 | 1.4 | 2 | Wright & Linacre (1994) | Rating-scale surveys and questionnaires | sensitivity_or_context | Use as a screening band. Report the selected profile and do not treat a different published band as a contradiction unless it changes the substantive conclusion. | fit_measures_table(fit, threshold_profiles = \"all\", fit_df_method = \"both\") |\n| wright_linacre_clinical_observation | Clinical observation | Infit/Outfit MnSq | 0.5 | 1.7 | 2 | Wright & Linacre (1994) | Clinical observation ratings | sensitivity_or_context | Use as a screening band. Report the selected profile and do not treat a different published band as a contradiction unless it changes the substantive conclusion. | fit_measures_table(fit, threshold_profiles = \"all\", fit_df_method = \"both\") |\n| wright_linacre_judged_performance | Judged performance | Infit/Outfit MnSq | 0.4 | 1.2 | 2 | Wright & Linacre (1994) | Judged performance ratings | sensitivity_or_context | Use as a screening band. Report the selected profile and do not treat a different published band as a contradiction unless it changes the substantive conclusion. | fit_measures_table(fit, threshold_profiles = \"all\", fit_df_method = \"both\") |\n\n## Fit Evidence Summary\n| Status | Rows | DisplayedRows | UnderfitRows | OverfitRows | MixedRows | WithinBandRows | NotAvailableRows | DfComparedRows | DfSensitiveRows | FlagChangedByDfRows | LargeZSTDShiftRows | DfConventionDifferenceRows | FitDfMethod | ThresholdProfiles | FacetsCompanionAvailable | Source | Route | Boundary |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| available | 8 | 8 | 0 | 0 | 0 | 8 | 0 | 8 | 8 | 0 | 1 | 7 | both | all | TRUE | res$components$fit_measures | res$components$fit_measures$summary | Counts summarize the stored fit-measures component. Interpret MnSq status, df-sensitive ZSTD shifts, separation, and reliability as separate evidence streams. |\n\n## Fit Threshold Sensitivity\n| Status | Profile | ProfileLabel | Lower | Upper | Facet | Rows | AvailableRows | UnderfitRate | OverfitRate | MixedRate | AnyFlagRate | Source | Route | ReportBoundary |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| available | active | Active review band | 0.5 | 1.5 | All facets | 8 | 8 | 0 | 0 | 0 | 0 | res$components$fit_measures | res$components$fit_measures$profile_summary_overall | Use profile disagreement as sensitivity evidence. Do not present one published MnSq band as universal. |\n| available | linacre_productive | Productive measurement | 0.5 | 1.5 | All facets | 8 | 8 | 0 | 0 | 0 | 0 | res$components$fit_measures | res$components$fit_measures$profile_summary_overall | Use profile disagreement as sensitivity evidence. Do not present one published MnSq band as universal. |\n| available | wright_linacre_high_stakes_mcq | High-stakes multiple-choice | 0.8 | 1.2 | All facets | 8 | 8 | 0.125 | 0.125 | 0 | 0.25 | res$components$fit_measures | res$components$fit_measures$profile_summary_overall | Use profile disagreement as sensitivity evidence. Do not present one published MnSq band as universal. |\n| available | wright_linacre_routine_mcq | Routine multiple-choice | 0.7 | 1.3 | All facets | 8 | 8 | 0 | 0.125 | 0 | 0.125 | res$components$fit_measures | res$components$fit_measures$profile_summary_overall | Use profile disagreement as sensitivity evidence. Do not present one published MnSq band as universal. |\n| available | wright_linacre_rating_scale | Rating-scale surveys | 0.6 | 1.4 | All facets | 8 | 8 | 0 | 0 | 0 | 0 | res$components$fit_measures | res$components$fit_measures$profile_summary_overall | Use profile disagreement as sensitivity evidence. Do not present one published MnSq band as universal. |\n| available | wright_linacre_clinical_observation | Clinical observation | 0.5 | 1.7 | All facets | 8 | 8 | 0 | 0 | 0 | 0 | res$components$fit_measures | res$components$fit_measures$profile_summary_overall | Use profile disagreement as sensitivity evidence. Do not present one published MnSq band as universal. |\n| available | wright_linacre_judged_performance | Judged performance | 0.4 | 1.2 | All facets | 8 | 8 | 0.125 | 0 | 0 | 0.125 | res$components$fit_measures | res$components$fit_measures$profile_summary_overall | Use profile disagreement as sensitivity evidence. Do not present one published MnSq band as universal. |\n\n## Fit Reporting Templates\n| Audience | Topic | Template | EvidenceUsed | Caveat | Route | Style | EvidenceTable | EvidenceRoute | BoundaryType | ClaimStrength | RecommendedUse |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| QC report | Fit-status wording | Use as first-screen QC wording before manuscript or reviewer handoff. Element fit was screened for 8 facet-element row(s) using the stored mean-square profile set (all); 0 row(s) were flagged for underfit, 0 for overfit, 0 as mixed, and 8 remained within the selected band. | fit_evidence_summary | This sentence reports a screening table, not a global model-validity decision. | report$fit_evidence_summary | qc | fit_evidence_summary | report$fit_evidence_summary | fit_not_validity | descriptive_only | report_with_context |\n| QC report | Threshold-profile wording | Across the stored mean-square threshold profiles, any-flag rates ranged from 0.0% to 25.0%. The active profile rate was 0.0%. | fit_threshold_sensitivity | Use profile disagreement as sensitivity evidence; do not silently mix fit bands across reports. | report$fit_threshold_sensitivity | qc | fit_threshold_sensitivity | report$fit_threshold_sensitivity | fit_not_validity | write_with_caveat | methods_or_appendix_caveat |\n| QC report | ZSTD-convention wording | ZSTD values were treated as df-dependent standardizations of the same MnSq values. Engine and FACETS-style companion df/ZSTD columns were available under fit_df_method = \"both\". | zstd_conventions; fit_evidence_summary | Read MnSq size first; use ZSTD to explain standardization, not as independent residual evidence. | report$zstd_conventions | qc | zstd_conventions | report$zstd_conventions | fit_not_validity | write_with_caveat | methods_or_appendix_caveat |\n| QC report | DF/ZSTD sensitivity wording | Engine-vs-FACETS-style df comparison covered 8 row(s): 8 row(s) were df-sensitive, 0 changed the \\|ZSTD\\| flag status, 1 had a large ZSTD shift without necessarily changing flag status, and 7 showed a df-convention difference. | fit_df_sensitivity_summary | A df-sensitive ZSTD result is a convention-sensitive review prompt, not a different MnSq fit signal. | report$fit_df_sensitivity_summary; report$fit_df_sensitive_rows | qc | fit_df_sensitivity_summary | report$fit_df_sensitivity_summary | fit_not_validity | write_with_caveat | methods_or_appendix_caveat |\n| QC report | Boundary wording | Report fit, ZSTD standardization, separation/reliability, and local case review in separate sentences. Avoid wording such as 'the model passed fit' unless the stated threshold profile, df convention, and follow-up review all support that narrower claim. | fit_decision_policy | This boundary is intentionally conservative because published MnSq bands and ZSTD conventions differ. | report$fit_decision_policy | qc | fit_decision_policy | report$fit_decision_policy | fit_not_validity | descriptive_only | reporting_guardrail |\n\n## Precision Evidence Summary\n| Status | PrecisionTier | SupportsFormalInference | ReliabilityRows | ReviewOrWarnChecks | MinSeparation | MaxSeparation | MinReliability | MaxReliability | MinStrata | MaxStrata | ZeroSeparationRows | ZeroReliabilityRows | ReliabilityUse | Source | Route | Boundary |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| available_without_precision_review | NA | FALSE | 3 | NA | 0 | 3.07935640921313 | 0 | 0.904602326213069 | 0.333333333333333 | 4.43914187895084 | 2 | 2 | screening_only | res$diagnostics$reliability | report$precision_evidence_summary; res$components$precision_review; res$diagnostics$reliability | Separation, reliability, and strata summarize spread relative to measurement error. They are not inter-rater agreement, model fit, or standalone validity evidence. |\n\n## Precision Basis\n| Topic | SourceBasis | PackageSurface | Interpretation | ValidationUse | Availability | Source |\n| --- | --- | --- | --- | --- | --- | --- |\n| Separation reliability and strata | Wright & Masters G/R/H convention | diagnostics$reliability; precision_review_report() | Precision review was not stored in this mfrm_results object. | Rebuild with include = \"precision\" before using source-grounded precision wording. | not_requested | not_available |\n\n## Precision Reporting Templates\n| Audience | Topic | Template | EvidenceUsed | Caveat | Route | Style | EvidenceTable | EvidenceRoute | BoundaryType | ClaimStrength | RecommendedUse |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| QC report | Precision-tier wording | Use as first-screen precision wording before stronger report claims. The precision review classified the run as NA; formal inference support was not supported, and NA precision check(s) were marked review/warn. | precision_evidence_summary; precision_review_report()$profile | A favorable precision tier does not override misfit, convergence, linking, or design problems. | report$precision_evidence_summary | qc | precision_evidence_summary | report$precision_evidence_summary | precision_not_agreement | descriptive_only | report_with_context |\n| QC report | Separation wording | Facet separation was available for 3 facet row(s), ranging from 0.00 to 3.08. Interpret separation as spread relative to average measurement error. | diagnostics$reliability$Separation | Do not describe separation as observed rater agreement or as proof of construct validity. | res$diagnostics$reliability | qc | diagnostics | res$diagnostics$reliability | precision_not_agreement | descriptive_only | report_with_context |\n| QC report | Reliability wording | Facet separation reliability ranged from 0.00 to 0.90; reliability-use labels were: screening_only. | diagnostics$reliability$Reliability | This is Rasch/FACETS-style separation reliability, not classical inter-rater agreement. | res$diagnostics$reliability | qc | diagnostics | res$diagnostics$reliability | precision_not_agreement | descriptive_only | report_with_context |\n| QC report | Strata wording | Facet strata ranged from 0.33 to 4.44 under the Wright/Masters G/R/H convention. | diagnostics$reliability$Strata; precision_basis | Use strata as a precision-spread summary; do not turn it into an independent quality gate. | report$precision_basis | qc | diagnostics | report$precision_basis | precision_not_agreement | descriptive_only | report_with_context |\n| QC report | Boundary wording | State the precision tier and source convention before interpreting separation, reliability, or strata. Source basis: Wright & Masters G/R/H convention. | precision_basis | Do not use high reliability to excuse misfit, and do not use good fit to imply high precision. | report$precision_basis; report$fit_decision_policy | qc | precision_basis | report$precision_basis | precision_not_agreement | descriptive_only | reporting_guardrail |\n\n## Bias Evidence Summary\n| Status | Rows | Facets | NonPersonFacets | MaxAbsBias | MaxAbsStdResidual | ResidualTScreenPositiveRows | ChiSqScreenPositiveRows | ExplicitInteractionSelected | InteractionStatus | Source | Route | Boundary |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| not_requested | NA | NA | NA | NA | NA | NA | NA | FALSE | not_requested | not_requested | mfrm_results(fit, include = \"bias\") | Bias/DFF wording requires the bias preset or an explicit bias/DFF helper call. Do not infer fairness conclusions from omitted sections. |\n\n## Bias Reporting Templates\n| Audience | Topic | Template | EvidenceUsed | Caveat | Route | Style | EvidenceTable | EvidenceRoute | BoundaryType | ClaimStrength | RecommendedUse |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| QC report | Bias/DFF evidence not requested | Bias, DFF, or fairness-screen wording was not generated because the mfrm_results object was not built with include = \"bias\". | bias_evidence_summary | Request the bias preset or run an explicit bias/DFF helper before writing fairness language. | mfrm_results(fit, include = \"bias\"); estimate_bias(); analyze_dff() | qc | bias_evidence_summary | report$bias_evidence_summary | screen_not_fairness_decision | not_supported_without_followup | targeted_followup_before_claim |\n\n## Misfit Evidence Summary\n| Status | UnexpectedRows | DisplacementRows | PathwayFitRows | PathwayStatusRows | CurveFitStatusRows | UnexpectedScreenPositiveRows | DisplacementFlaggedRows | MaxAbsStdResidual | MaxAbsDisplacement | MaxAbsDisplacementT | PathwayAvailable | Source | Route | Boundary |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| not_requested | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | FALSE | not_requested | mfrm_results(fit, include = \"misfit_review\") | Misfit/pathway wording requires the misfit_review preset or explicit unexpected-response, displacement, and pathway helper calls. |\n\n## Misfit Reporting Templates\n| Audience | Topic | Template | EvidenceUsed | Caveat | Route | Style | EvidenceTable | EvidenceRoute | BoundaryType | ClaimStrength | RecommendedUse |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| QC report | Misfit/pathway evidence not requested | Misfit/pathway wording was not generated because the mfrm_results object was not built with include = \"misfit_review\". | misfit_evidence_summary | Request the misfit_review preset or run the local misfit helpers before writing case-review language. | mfrm_results(fit, include = \"misfit_review\"); build_misfit_casebook() | qc | misfit_evidence_summary | report$misfit_evidence_summary | misfit_not_exclusion_rule | write_with_caveat | request_evidence_before_writing |\n\n## Linking Evidence Summary\n| Status | AnchorReviewAvailable | DriftAvailable | ChainAvailable | ReviewStatus | TopRiskRows | AnchorRiskRows | DriftRiskRows | ChainRiskRows | GroupViews | AnchorFacetRows | AnchoredLevels | GroupAnchoredLevels | OverlapLevels | AnchorIssueTypes | AnchorIssueRows | LowObservationLevels | LowCategoryRows | DriftReviewStatus | EquatingChainStatus | GPCMSupport | SourceModels | Source | Route | Boundary |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| not_requested | FALSE | FALSE | FALSE | not_requested | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | not_requested | not_requested | NA | NA | not_requested | mfrm_results(fit, include = \"linking\") | Linking/anchor wording requires the linking preset or explicit anchor, drift, or equating-chain helper calls. |\n\n## Linking Reporting Templates\n| Audience | Topic | Template | EvidenceUsed | Caveat | Route | Style | EvidenceTable | EvidenceRoute | BoundaryType | ClaimStrength | RecommendedUse |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| QC report | Linking evidence not requested | Anchor/linking wording was not generated because the mfrm_results object was not built with include = \"linking\". | linking_evidence_summary | Request the linking preset or run explicit anchor, drift, or equating-chain helpers before writing linking claims. | mfrm_results(fit, include = \"linking\"); review_mfrm_anchors(); detect_anchor_drift(); build_equating_chain() | qc | linking_evidence_summary | report$linking_evidence_summary | anchor_not_drift_absence | not_supported_without_followup | request_evidence_before_writing |\n\n## ZSTD Conventions\n| Convention | FormulaOrRule | PackageConstraint | ReportingImplication | SourceBasis | Route |\n| --- | --- | --- | --- | --- | --- |\n| engine df | Infit df = sum(Var * Weight); Outfit df = sum(Weight). | zstd_from_mnsq() returns NA when df < 1 to avoid unstable Wilson-Hilferty signs. | Routine mfrmr diagnostics are conservative for very small df cells. | Package-native numerical guard for Wilson-Hilferty stability. | diagnose_mfrm(fit_df_method = \"engine\") |\n| FACETS-style df | Fourth-moment Wright-Masters-style df: 2 * numerator^2 / denominator; package columns DF_*_FACETS. | zstd_from_mnsq_facets() allows positive df below 1 and caps reported ZSTD at +/-9. | This option applies the documented fourth-moment df/ZSTD convention; agreement with external FACETS output must be checked separately. | FACETS/Winsteps fit-standardization documentation and Wright-Masters fourth-moment df convention. | diagnose_mfrm(fit_df_method = \"facets\") |\n| Wilson-Hilferty ZSTD | (MnSq^(1/3) - (1 - 2 / (9 * df))) / sqrt(2 / (9 * df)). | Requires finite positive MnSq and usable df; small df can dominate the transformation. | ZSTD is a standardization of MnSq, not a separate residual-fit statistic. | Wilson-Hilferty cube-root approximation used in Rasch fit standardization. | fit_measures_table(..., fit_df_method = \"engine\" or \"facets\") |\n| WHEXACT / linear approximation | (MnSq - 1) * sqrt(df / 2) when whexact = TRUE. | Still requires usable df; use only when the analysis intentionally follows that convention. | State the transformation setting before interpreting ZSTD. | Winsteps/FACETS WHEXACT documentation. | diagnose_mfrm(..., whexact = TRUE) |\n| Report comparison route | Keep engine and FACETS-style columns side by side with fit_df_method = \"both\". | Compare MnSq first, then df, then ZSTD; classify flag changes as convention-sensitive. | Do not explain fit decisions from ZSTD alone when MnSq, df, or threshold profile differs. | facets_fit_df_guide(); facets_fit_review(); fit_measures_table(). | fit_measures_table(..., fit_df_method = \"both\") |\n\n## Fit Decision Policy\n| Step | Rule | Rationale | RecommendedRoute | ReportBoundary |\n| --- | --- | --- | --- | --- |\n| 1 | Choose and state the MnSq band | Published bands differ by setting; the active band and sensitivity profiles should both be visible. | fit_measures_table(threshold_profiles = \"all\") | Do not silently mix bands across reports. |\n| 2 | Read MnSq before ZSTD | MnSq is the size of the fit signal; ZSTD is a df-dependent standardization of that signal. | fit_measures_table()$table[, c(\"Infit\", \"Outfit\", \"FitStatus\")] | Do not treat ZSTD as independent evidence from MnSq. |\n| 3 | Keep ZSTD convention visible | FACETS-style df can change \\|ZSTD\\| flags even when MnSq is unchanged. | fit_measures_table(fit_df_method = \"both\")$df_sensitivity | Do not call a df-sensitive ZSTD change a substantive fit change without MnSq/context evidence. |\n| 4 | Separate fit from precision | Fit, separation, reliability, and strata answer different questions. | precision_review_report()$fit_separation_basis | Do not use high reliability to excuse misfit or good fit to imply high precision. |\n| 5 | Treat profile disagreement as sensitivity evidence | A row can be flagged under one defensible band and not another; report this as a review sensitivity. | fit_measures_table()$profile_summary_by_facet | Do not present one threshold profile as universal. |\n| 6 | Use local review before action | Element fit flags are prompts for inspecting responses, raters, items, categories, or design links. | unexpected_response_table(); displacement_table(); plot(res, type = \"pathway\") | Do not remove levels or observations from fit flags alone. |\n\n## Fit DF Sensitivity\n| Status | ComparedRows | SameOrRoundingRows | FlagChangedByDfRows | LargeZSTDShiftRows | DfConventionDifferenceRows | DfSensitiveRows | FitDfMethod | Source | Route | ReportBoundary |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| review | 8 | 0 | 0 | 1 | 7 | 8 | both | res$components$fit_measures | res$components$fit_measures$df_sensitivity_summary | A df-sensitive row means the ZSTD interpretation changed or moved materially under engine-vs-FACETS-style standardization; it is not a different MnSq fit statistic. |\n\n## Fit DF Sensitive Rows\n| Status | Facet | Level | DfSensitivityStatus | FlagChangedByDf | MaxAbsZSTDDiff_FACETS_vs_ENGINE | MaxDFRelativeDifference_ENGINE_vs_FACETS | InfitZSTD_ENGINE | InfitZSTD_FACETS | OutfitZSTD_ENGINE | OutfitZSTD_FACETS | Interpretation | Source | Route | ReportBoundary |\n| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |\n| review | Criterion | Organization | large_zstd_shift | FALSE | 0.61636171683901 | 0.567215745928674 | -0.960552825831941 | -1.57691454267095 | -1.48973774937019 | -1.62145753703411 | The FACETS-style df changes ZSTD substantially; interpret ZSTD only with the df convention stated. | res$components$fit_measures | res$components$fit_measures$df_sensitive | Inspect the row context before using a ZSTD-only flag in report text; MnSq size and substantive role remain primary. |\n| review | Criterion | Accuracy | df_convention_difference | FALSE | 0.23891837089197 | 0.56241264380073 | 0.690341151331195 | 0.929259522223165 | 0.778498925319008 | 0.826268598283153 | The df convention differs enough to affect ZSTD interpretation even if the flag status is unchanged. | res$components$fit_measures | res$components$fit_measures$df_sensitive | Inspect the row context before using a ZSTD-only flag in report text; MnSq size and substantive role remain primary. |\n| review | Rater | R04 | df_convention_difference | FALSE | 0.154323977580657 | 0.557657027367327 | -0.0843712677061883 | -0.238695245286846 | -0.306869512177568 | -0.348131137135136 | The df convention differs enough to affect ZSTD interpretation even if the flag status is unchanged. | res$components$fit_measures | res$components$fit_measures$df_sensitive | Inspect the row context before using a ZSTD-only flag in report text; MnSq size and substantive role remain primary. |\n| review | Rater | R03 | df_convention_difference | FALSE | 0.112065122500992 | 0.586323661034455 | 0.0288601387772102 | -0.0832049837237821 | -0.0351160873336413 | -0.0483415827394094 | The df convention differs enough to affect ZSTD interpretation even if the flag status is unchanged. | res$components$fit_measures | res$components$fit_measures$df_sensitive | Inspect the row context before using a ZSTD-only flag in report text; MnSq size and substantive role remain primary. |\n| review | Rater | R01 | df_convention_difference | FALSE | 0.0896803733539769 | 0.577599521514167 | 0.393528355989861 | 0.483208729343838 | 0.507834788300319 | 0.531757208368787 | The df convention differs enough to affect ZSTD interpretation even if the flag status is unchanged. | res$components$fit_measures | res$components$fit_measures$df_sensitive | Inspect the row context before using a ZSTD-only flag in report text; MnSq size and substantive role remain primary. |\n| review | Rater | R02 | df_convention_difference | FALSE | 0.0612010421870001 | 0.557657006155333 | 0.100558313821056 | 0.0393572716340563 | -0.0793289698850662 | -0.101502932492101 | The df convention differs enough to affect ZSTD interpretation even if the flag status is unchanged. | res$components$fit_measures | res$components$fit_measures$df_sensitive | Inspect the row context before using a ZSTD-only flag in report text; MnSq size and substantive role remain primary. |\n| review | Criterion | Language | df_convention_difference | FALSE | 0.0220601020333296 | 0.567215766637269 | 0.26701052360377 | 0.289070625637099 | 0.329980070053908 | 0.341345692986484 | The df convention differs enough to affect ZSTD interpretation even if the flag status is unchanged. | res$components$fit_measures | res$components$fit_measures$df_sensitive | Inspect the row context before using a ZSTD-only flag in report text; MnSq size and substantive role remain primary. |\n| review | Criterion | Content | df_convention_difference | FALSE | 0.0123803495389581 | 0.580922036496649 | 0.252021787965132 | 0.26440213750409 | 0.222012409266447 | 0.224254826085049 | The df convention differs enough to affect ZSTD interpretation even if the flag status is unchanged. | res$components$fit_measures | res$components$fit_measures$df_sensitive | Inspect the row context before using a ZSTD-only flag in report text; MnSq size and substantive role remain primary. |\n\n## Evidence Boundary\n| EvidenceSource | Use | DoNotUseAs | RecommendedRoute |\n| --- | --- | --- | --- |\n| Model setup and convergence | Document estimation settings, data roles, and run stability. | Proof that the construct interpretation is valid. | summary(res)$overview; specifications_report(fit) |\n| Fit, separation, and precision | Separate fit-size, standardized fit, separation, reliability, and uncertainty evidence. | A single pass/fail psychometric rule. | summary(res$components$precision_review); precision_review_report() |\n| Category functioning | Describe how score categories function and where thresholds or curves need review. | Standalone validity evidence. | rating_scale_table(); category_structure_report(); category_curves_report() |\n| Bias and DFF screening | Identify candidate contrasts for follow-up fairness or interaction review. | Final fairness, bias, or invariance conclusion. | mfrm_results(fit, include = \"bias\"); estimate_bias(); bias_interaction_report() |\n| Misfit and pathway maps | Localize unexpected observations for case review and substantive interpretation. | Automatic exclusion rule for persons, raters, items, or observations. | mfrm_results(fit, include = \"misfit_review\"); unexpected_response_table(); plot(res, type = \"pathway\") |\n| Anchors, linking, and drift | Assess anchor readiness and operational scale-maintenance workflow. | Single-fit evidence of drift or completed equating. | mfrm_results(fit, include = \"linking\"); review_mfrm_anchors(); detect_anchor_drift(); build_equating_chain() |\n| Network and connectivity | Describe design overlap, sparseness, and connectedness. | A replacement for fit, precision, or bias diagnostics. | mfrm_results(fit, include = \"network\"); build_mfrm_network_review() |\n| Response-time QC | Describe rapid/slow-response timing patterns as separate QC context. | A fitted speed parameter, speed-accuracy model, or automatic exclusion rule. | mfrm_results(fit, include = \"response_time\", response_time = ..., response_time_data = ...); response_time_review() |\n| GPCM helper coverage | State which GPCM summaries are supported and which are caveated. | A claim that every RSM/PCM report pathway has an equivalent GPCM route. | gpcm_capability_matrix(); mfrmr_output_guide(\"gpcm\") |\n| APA-style wording | Draft report prose, captions, and section maps. | Final manuscript text without study-specific editing. | mfrm_report(res, style = \"apa\"); build_apa_outputs() |\n\n## Next Actions\n| Priority | Area | Action | Route | Reason | ReportDecision |\n| --- | --- | --- | --- | --- | --- |\n| 1 | Overview | Read the compact results summary. | summary(res) | Confirms input mode, model, method, section status, table coverage, and available figures. | Clear QC blockers before report export or reviewer handoff. |\n| 2 | Triage | Read the first-screen triage before branching. | summary(res)$triage | Triage orders unavailable, review, information, and OK signals across diagnostics, tables, plots, and reporting outputs. | Clear QC blockers before report export or reviewer handoff. |\n| 2 | Wright map | Create and inspect the required shared-logit scale map. | plot(res, type = \"wright\", preset = \"publication\", show_ci = TRUE, top_n = Inf) | The Wright map is the primary fitted-scale figure: compare person targeting with facet levels and step thresholds before branching into diagnostics. | Clear QC blockers before report export or reviewer handoff. |\n| 3 | Diagnostics | Review diagnostic key warnings before report drafting. | summary(res$diagnostics)$key_warnings | Diagnostic warnings identify the highest-priority fit, precision, residual, or category follow-up checks. | Clear QC blockers before report export or reviewer handoff. |\n| 4 | Visual diagnostics | Open the QC dashboard after reviewing the Wright map. | plot(res, type = \"qc\", preset = \"publication\") | The QC dashboard gives a focused follow-up view of fit, residual, and category summaries. | Clear QC blockers before report export or reviewer handoff. |\n| 5 | Fit pathway | Review Infit against measure, including selected person rows when useful. | plot(res, type = \"fit_pathway\", fit_stat = \"Infit\", include_person = TRUE, top_n_person = 12, person_labels = \"none\", facet_labels = \"flagged\", preset = \"publication\") | This follow-up separates measure uncertainty from fit displacement while keeping person inclusion explicit. | Clear QC blockers before report export or reviewer handoff. |\n| 11 | Tables | Create an appendix-ready summary-table bundle. | build_summary_table_bundle(res) | The bundle exposes table roles, plot readiness, and conservative appendix presets. | Clear QC blockers before report export or reviewer handoff. |"
mfrm_report(res, output = "html")
#> mfrmr Report HTML
#> Path: /tmp/RtmpIbcapd/mfrmr_report_2e7f4be392ac.html
# }
