Changelog
Source:NEWS.md
llmsa (development version)
CSV resume preserves text identifiers and responses. Seeded mock responses depend on the complete call key, so a new backend reproduces an interrupted run. Backend errors and empty responses are recorded without calling the parser; interrupts leave the next call available for resume.
Number parsing accepts Unicode minus. JSON field parsing uses
jsonliteto validate the first object and decode a top-level string or number. The ellmer adapter retains response model, provider and usage metadata.Validation reports add optional Westgard rule counts and positions, explicit conventions and model limits, all recorded model metadata, seed provenance and a canonical SHA-256 hash covering the complete run table. Missing metadata and seeds are reported explicitly.
pb_design(),msa_robustness()andmsa_boot()retain the supplied seed as provenance when used, without changing their numerical results.msa_agreement(fleiss = TRUE)adds Fleiss’ kappa without a standard error. Alpha counts excluded units at each scope. Empty items no longer count as fully correct, and degenerate Cohen kappas returnNAwith a message. References are checked for conflicts and for categories outside the scale. Help and reports distinguish the general modal tie rule from AP1 decisions.msa_bias()counts excluded pairs, retains empty conditions and supports studies with a single reference value. It reports both the handbook regression and the unweighted item-mean regression, with a confidence band and a handbook verdict checked throughout the reference range. Constant or numerically degenerate data have explicit undefined inference.The validation vignette computes seeded bias-interval coverage and MCSE for both specified scenarios from the loaded package at build time.
msa_robustness()acceptstransform = "logit"for finite proportions strictly between zero and one. Effects and response summaries then use the logit scale; the defaulttransform = "none"preserves existing results.The x-axis title of the robustness half-normal plot names the plotting convention of Daniel (1959). The help page explains that Lenth’s ME and SME are conservative and
alphais a nominal significance level.New offline
llm-stabilityandclinvar-ratersvignettes recompute agreement and latent variance components from reproducible, licensed frozen subsets. Data preparation records parsing failures, exclusions, selection rules and SHA-256 provenance. Missing answers stay missing; the stability article explains the source’s two non-label answer keys.The validation vignette reports all four full simulation studies with MCSE, dynamically identified component-bias and interval-coverage findings, and a separate ordinal convergence sensitivity. Help pages describe the observed underestimation of some prompt/model components and overcoverage of integer-valued ndc intervals. Core calculations and the operator’s simulation files are unchanged.
Robustness printing and reports now state that no factor exceeding ME does not establish pipeline robustness. Every active factor is labelled
above ME onlyoralso above SME; results and AP1 bands are unchanged.msa_boot()records failed and singular replicates separately asn_failedandn_singular. Percentile intervals retain finite singular refits and omit only non-finite values. Printing always reports both counts; older objects identify singular counts as not recorded.Latent gauge R&R summaries, reports and
?msa_grrexplain that Repeatability is the residual variance fixed by the link. Observed agreement between replicates is available frommsa_agreement().Ordinal fits default to
iter.max = 2000andeval.max = 4000. Explicitcontrolreplaces these limits; direct optimizer options in...followordinal::clmm()precedence. See?msa_fit.The
boot_coveragestudy and validation vignette report percentile interval coverage, width and bootstrap diagnostics with MCSE. The shipped short runs check reproducibility; full-run findings follow separately. All three latent recovery short runs are regenerated with the updated ordinal fitting limits.Ordinal and binary fits reject confounded random-effect variances before calling the engine, including interactions and terms spanned by fixed effects. The check includes the fixed latent residual variance and frequency weights: zero-weight rows contribute no information, and a random term with one observation per level cannot be separated from the residual. Errors name only the affected terms and explain residual confounding when present. Sparse cross-products preserve this check for designs with thousands of factor levels without dense projection blocks. Integer weights count as frequencies; if any retained weight is noninteger, each positive-weight row counts once in the check. Engine weights are unchanged. The help page documents the limitations of term selection with zero-weight rows. Identifiable designs retain their existing engine fits; ordinal singularity concerns random effects only.
Latent fits apply
subset,weights,offsetandna.actionbefore selecting model terms, so data and study counts describe the analysed rows. Ordinal offsets are kept indata$.msa_offset; with frequency weights,n$observationscounts rows andnobs(model)reports the weight sum. Stored engine calls retain evaluated arguments and can be evaluated again outside the original caller, including for binary refits and bootstraps.Explicit ordinal and binary
levelsmust contain distinct, non-missing, non-empty labels. They determine the coding independently of the response storage type and take precedence over an ordered factor’s levels.Ordinal and binary fits validate exact binary codes, explicit event labels, missing grouping values and constant categories. Dropped responses are counted in warnings and in the returned study size.
msa_fit()now reports final-engineconvergedindependently ofsingular. The actual clmm optimizer determines success, including its matrix fallback; stored ordinal and binary failure diagnoses produce warnings. Numeric fits retain their existing final-engine warning behavior.Two-level ordinal components always warn about the positive bias of the range method,
beta-hat^2 / 2, which does not subtract the AIAG correctionEV^2 / (n * r). Both print methods identify every derived component;msa_grr()retains the component names inderived. Thetwo_levelstudy and the validation vignette document the method and its limitations.The validation vignette adds live ordinal and binary comparisons, separates latent ICC from rptR’s default scale convention, and reads reproducible recovery-study results with MCSE. Offline anchor copies carry SHA-256 provenance. Three simulation scripts retain fit failures and seeds, support separate scenario runs, and ship short reproducibility runs; full simulation findings require the operator’s later runs.
Default numeric
msa_fit()preserves numeric input precision and completes REML using balanced-design formulas or an analytic constrained solution. The returned lme4 model stays on the original scale;numericsreports the method and diagnostics. Explicit fitting arguments retain the direct lme4 path, and bootstrap refits use ordinary lme4 optimization.Numeric fits diagnose constant or non-finite responses, missing grouping values, degenerate residual variance and original-scale precision loss. The default path checks the residual model space before starting lme4, including unbalanced multi-factor studies with missing responses or cells. Failed initialization now gives a named error with the engine’s cause and preserves start warnings, including for small positive residual variance. Arithmetic warnings and errors while constructing the original-scale model become named precision errors; final convergence warnings remain active. Numeric
NaNand the string"NaN"are treated as missing responses. Explicitsubset,weightsandoffsetexpressions use the fitting data; counts and row mappings describe the observations actually analysed. Stored fitting controls remain usable outside the original caller’s scope. A failed fit stopsmsa_plan()with its diagnostic.msa_grr()applies the minimum ndc convention and reports undefined ratios asNAwhen total variance is zero, with verdictundetermined. Custom thresholds must be finite, numeric, nonnegative and nondecreasing.The numeric validation vignette computes literature, NIST and package-oracle comparisons offline. Public builds include verified free NIST inputs and complete anchor copies; protected AIAG data remain local and their public comparison is marked as not rerun.
backend_openai_compatible()now omitstemperaturefrom the request whentemperature = NULL. It supports a per-row system message and records response IDs, model snapshots, usage, fingerprints and requested/reported provider routing.backend_openai_compatible()records a non-emptymessage.reasoningof the reply asmeta$reasoning(Qwen3-32B via OpenRouter returns its reasoning there).reasoning_detailsis not stored, and onlymessage.contentis parsed.backend_openai_compatible()recordsfinish_reasonandnative_finish_reasonof the first choice asmeta$finish_reasonandmeta$native_finish_reasonwhen they are non-empty strings, and the request timeout asmeta$timeout_s. The defaulttimeout = 120is unchanged.parse_choice(whole_word = TRUE)matches whole phrases, preferring longer phrases and rejecting ambiguous classifications. The default remains unchanged.msa_run(parse_by_prompt = ...)can select a parser for each prompt while retaining the raw response and the existing resumable store format. Numeric JSON metadata are now stored without rounding; small recorded API costs previously could be rounded to zero.msa_report(assessment = ...)accepts validated application criteria, an overall decision and additional report sections, including a robustness half-normal plot.The internal AP1 pipeline adds frozen study inputs, a YAML plan, an explicit mock/API runner, pilot checks and per-model assessment. Its functions are not exported. AP1 results are provisional until the M1 statistical validation.
The AP1 plan requires a client timeout per model (
timeout_s, 1800 s for all three models), which the runner passes tobackend_openai_compatible(). The AP1 pilot has a fifth pass rule,backend_errors: a backend error share of at mosterror_share_triggerper model, unreadable answers not counted. The pilot summary reports the maximum latency.The internal AP1 runner repeats a call that failed before its request was sent (name resolution, connection, TLS handshake, or a timeout in these phases) after pauses of 30 s, doubling up to 600 s and at most 12 h per call (plan field
network), instead of storing it as a backend error; then it stops without a row for that call. Such calls recordnetwork_retriesandnetwork_wait_s. The runner logs its progress with timestamps to stderr.
llmsa 0.1.0
First public release.
- Crossed study design (
msa_design()), execution with an audit trail and resumable store (msa_run()), import of external results (as_msa_runs()). - Backends:
backend_mock(),backend_ellmer(),backend_openai_compatible(); parsers for numbers, labels and JSON fields. - Variance components for numeric, ordinal and binary outcomes (
msa_fit()), gauge R&R statistics with AIAG classification (msa_grr()), parametric bootstrap intervals (msa_boot()). - Attribute agreement with Krippendorff’s alpha and Cohen’s kappa (
msa_agreement()), bias and linearity (msa_bias()). - Plackett-Burman robustness screening with Lenth’s method (
pb_design(),msa_robustness()). - Simulation-based study planning (
msa_simulate(),msa_plan()). - Westgard-rule control charts for system suitability (
msa_control_chart()). - Validation report template (
msa_report()). - Simulated demonstration data
acmg_demoandic50_demo.
Known limitations: no bootstrap for ordinal fits; batched multi-item prompts (position and carry-over effects) and free-text outcomes judged by a second model are planned for a later release.