# dsh-checkdigit Check-digit mathematics toolbox for [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (dsh): generate, validate and detect check digits for **11 schemes** — Luhn, Verhoeff, Damm, ISBN-10, ISBN-13, EAN-8, EAN-13, UPC-A, ISIN, CUSIP and IBAN. > 校验位数学工具箱:生成 / 验证 / 识别 11 种校验位(Luhn、Verhoeff、Damm、ISBN、EAN、UPC、ISIN、CUSIP、IBAN),零运行时依赖、纯本地算术。 ## Why Language models routinely botch check-digit arithmetic: wrong card-number checksums, ISBNs that fail validation, IBANs with impossible check digits. Every algorithm here is implemented from its published specification with **pure integer arithmetic** — deterministic, offline, zero runtime dependencies — and cross-checked against published worked examples (Apple's `US0378331005`, the classic `GB82 WEST 1234 5698 7654 32`, the Luhn textbook example `79927398713`, and more). ## Install ```bash dsh plugin --profile web add github:TYEclipse/dsh-checkdigit ``` Then add `dsh-checkdigit` to `dsh.profile.bundles` in your profile's `package.json` if it is not auto-activated, and restart dsh. ## Tools ### `checkdigit_generate` Compute the check digit for a payload and return the complete identifier. ```text checkdigit_generate(scheme="luhn", payload="7992739871") → checkDigit: "3", complete: "79927398713" ``` Supported `scheme` values and their payloads: | scheme | payload | check digit | example complete | |-----------|-------------------------------------|------------------|------------------| | `luhn` | digits (any length ≥ 1) | last digit | `79927398713` | | `verhoeff`| digits (any length ≥ 1) | last digit | `2363` | | `damm` | digits (any length ≥ 1) | last digit | `5724` | | `isbn10` | 9 digits | 10th char (0-9 or X) | `0306406152` | | `isbn13` | 12 digits | 13th digit | `9780306406157` | | `ean8` | 7 digits | 8th digit | `96385074` | | `ean13` | 12 digits | 13th digit | `4006381333931` | | `upca` | 11 digits | 12th digit | `036000291452` | | `isin` | 2 letters + 9 alphanumerics | 12th char (digit)| `US0378331005` | | `cusip` | 8 chars from `[A-Z0-9*@#]` | 9th char (digit) | `037833100` | | `iban` | 2-letter country + BBAN | chars 3–4 (two digits) | `GB82WEST12345698765432` | Use it to build test card numbers, ISBNs, barcodes, securities identifiers or account numbers whose check digits actually verify. ### `checkdigit_validate` Verify the check digit of a full identifier. The scheme is auto-detected when omitted (ISIN → CUSIP → IBAN → EAN-13 → UPC-A → EAN-8 → ISBN-10 → Luhn); pass `scheme` to force one. ```text checkdigit_validate(value="GB82WEST12345698765432") → valid: true, scheme: "iban", iban.country: "GB", iban.formatted: "GB82 WEST 1234 5698 7654 32" checkdigit_validate(value="79927398714") → valid: false, scheme: "luhn", checkDigit: "4", expected: "3", detail: "Luhn: check digit should be 3, but the value ends in 4" ``` Spaces and dashes in the input are ignored. When a value is invalid, the result carries the **expected** check digit so callers can fix it programmatically. ### `checkdigit_info` Describe the supported schemes: identifier lengths, payload formats, check-digit positions and worked examples. Call with a `scheme` for one scheme, or without arguments for all 11. ## Supported schemes | Scheme | Standard | Detail | |--------|----------|--------| | Luhn | ISO/IEC 7812 | Credit/debit cards, IMEI, loyalty cards | | Verhoeff | — | Dihedral-group checksum; catches all single errors and adjacent transpositions | | Damm | — | Quasigroup operation; full-value tally must be zero | | ISBN-10 | ISO 2108 | Mod-11; check digit may be `X` (= 10) | | ISBN-13 | ISO 2108 | EAN-13 arithmetic (Bookland) | | EAN-8 / EAN-13 | GS1 GTIN-8 / GTIN-13 | Retail barcodes | | UPC-A | GS1 GTIN-12 | North American retail barcodes | | ISIN | ISO 6166 | Securities; letters expand A=10…Z=35, then Luhn | | CUSIP | ANSI X9.6 | North American securities; `* @ #` allowed; even positions doubled | | IBAN | ISO 13616 | Mod-97 over letter-expanded rearranged string; BBAN length table for 75+ countries | ## Development ```bash pnpm install pnpm build pnpm test # 51 tests, anchors cross-checked against published worked examples pnpm lint ``` ## License MIT