Changes in version 0.1.0 (2026-09-09) First release. - Nine instrument definitions, each checked against its primary source publication: ipss, oabss, icsi, icpi, udi6, iiq7, isi, isi3, bii. References live on the definition itself, and severity bands carry their own citation when it differs from the scoring citation (oabss). - One generic engine, score_instrument(), with sum, mean-scaled (0-100), and product scoring types, plus the score_ipss() wrapper. Items validate against per-item permitted value sets; the ICSI bladder-pain item accepts 0, 2, 3, 4, 5 and rejects 1. - Missing items follow the published rule where one exists (UDI-6/IIQ-7: mean of answered items, at most 2 missing) and give NA otherwise. Requesting proration for an instrument without a published rule is an error. - classify_severity() assigns severity by band membership; scores falling between non-contiguous bands (Sandvik index) give NA with a warning. - Impossible totals are rejected. classify_severity() and responder() check scores against achievable_totals(), the exact set of totals an instrument can produce given its items and missing-item rule (Sandvik products, prorated UDI-6/IIQ-7 fractions included). A 5 lies inside the Sandvik moderate band, but no frequency and amount combination produces it; it now gives NA with a warning instead of a label. - Severity band definitions must not overlap. register_instrument() warns instead of messaging when it overwrites a definition, with a sharper warning for built-ins. The print method shows per-item ranges when items differ (oabss: 0-2, 0-3, 0-5, 0-5). - Input guards throughout: duplicated item columns, non-numeric scores, and mismatched responder() vector lengths are errors instead of silent misbehavior; mean-scaled definitions must have items starting at 0; the print method marks instruments whose permitted values are not contiguous. - mid_estimates() lists published anchor-based change statistics (Barry et al., 1995) with the anchor, subgroup, and citation on every row. responder() classifies change against a threshold the analyst chooses explicitly; there is no default.