Back to blog

Where this model is wrong

Five errors this calculator has actually shipped, what each one produced, and what changed. Published because a site that traces other people’s sourcing failures should be able to show its own.

Updated Sep 1, 2026Kevin Fan

Most of the posts here trace somebody else's number to a source it does not have. This one is about ours.

Five errors this model has shipped, what each produced, and what changed. They are logged in the repository as they happen; this is the readable version.

1,782 hours for A2 Chinese

The first version applied a flat 3× penalty to app-only study at every level. Asked for A2 Chinese — simple everyday exchanges — it returned 1,782 hours.

That is most of a bachelor's degree to learn how to order lunch.

Every test passed. The tests checked relations: harder languages take longer, higher levels take longer, worse methods take longer. Every relation held. Nothing checked whether the magnitude was sane, because I had not thought of magnitude as a separate property from ordering.

What changed. Method penalties became two coefficients interpolated across the level range rather than one constant — 1.25× to 1.7× for self-study, 1.3× to 3.5× for app-only. And a second class of test now exists: sanity checks on absolute values, separate from the relational ones. Unit tests verify relations; only a human or an explicit magnitude check verifies that a number is not absurd.

A $260 course displayed as "Free"

Prices were modelled as a single number: monthly cost. A one-off purchase has no monthly cost, so it was entered as zero.

Two consequences. The course displayed as "Free". And because zero is affordable on any budget, it was recommended to people who had entered a budget of zero.

That is the worst error on this list, because unlike a wrong estimate it could have taken money from a reader.

What changed. Price is now a tagged union — free, subscription, one-off, per-lesson — with display and ranking separated: display always shows what you will be charged, ranking amortises internally and never shows the amortised figure, and a zero budget disqualifies anything priced.

A citation to a page that did not exist

The level factors — how much of the full figure each CEFR level costs — carried a source URL to Cambridge English. The URL was fabricated and returned 404.

The real page supported using Cambridge's cumulative curve as an input, but it also showed why the factors must not be described as a level-by-level fit: 0.27 times the 750-hour C1 midpoint gives 202.5 hours at A2, just above Cambridge's 180–200 band. For some period this site displayed a citation to a page that had never existed while criticising other sites for unsourced numbers; the URL and the overstatement have both been corrected.

What changed. Every URL in the citation registry must have been actually requested, with the date recorded. A 403 is marked as bot-blocked rather than deleted, because publishers and help centres refuse automated fetches and a 403 is not a dead link.

An interpreting body cited on the Latin page

Two pages here cover languages the current NFATC page does not name — American Sign Language and Latin — and both cite substitute frameworks instead of inventing a current baseline.

Those substitutes were pooled into one shared list. So the Latin page cited the Registry of Interpreters for the Deaf.

What changed. Substitute sources are per page, with a test forbidding two pages from sharing one. Evidence for the absence of a current baseline is specific to the language; there is no generic "no baseline" bibliography.

A current endpoint described with legacy numbers

The first model stored 600 / 900 / 1,100 / 2,200 as though they were the current State Department training table. Those familiar numbers still circulate widely, but the current NFATC page uses a different endpoint and different values: Category I spans 24–30 weeks, Category II is 828 class hours, Category III is 1,012, and Category IV is 2,200.

The difference is not just an annual data refresh. The current page targets an integrated ILR 3 in speaking and listening. A separate current Foreign Affairs Manual table uses S-3/R-3 and gives Spanish 24 weeks rather than the NFATC page's 30. Combining an hour value from one with the endpoint label from the other created a dataset that no official page actually published.

What changed. The model is now versioned as nfatc-integrated-ilr3-v2. Every estimate carries that version in its analytics profile, so results collected before and after the migration are not silently compared. Category I is stored per language — 552 or 690 hours, transparently derived from the published weeks and 23-hour class week — and the old five-category table remains only as labelled historical context. The current page publishes no numerical “usually harder” surcharge, so the old 15% within-band penalty was removed rather than smuggled into v2.

What these have in common

Four of the five passed a full green test suite. The pattern is not carelessness — it is that the tests encoded what I had thought of, and each error was a category I had not.

Which is the honest limit of any of this. The estimates here are better sourced than most in this field and they are still a model, built by one person, with coefficients that are marked as estimates because that is what they are. The methodology page lists every factor, its source, and its confidence.

If you find one that is wrong, it is worth telling me. Two of the five above were caught by looking at output and thinking "that cannot be right", which is a technique available to anybody.

Sources

Every figure above, and where it came from. A post that traces other people's unsourced numbers does not get to have any of its own.

  1. Foreign Language Training — US Department of State, National Foreign Affairs Training Center

    The current NFATC training timelines: a typical week is 23 class hours plus 17 hours of self-study, aimed at an integrated ILR 3 in Speaking and Listening. Category I lists 24–30 weeks; using the page's typical class week, this site derives 552–690 class hours. Categories II–IV print 828, 1,012 and 2,200.

  2. 3 FAM 3910 — Language Incentive Pay Program — US Department of State, Foreign Affairs Manual

    The separate current S-3/R-3 normal-course table: Spanish is 24 weeks, French 30, Category II 36, Category III 44 and Category IV 88. Its endpoint differs from the current NFATC integrated Speaking + Listening score, so the two tables must not be merged.

  3. FSI Language Difficulty Ranking — fsi-language-courses.org

    A legacy five-category reproduction and its older 600 / 900 / 1,100 / 2,200 values. It is cited only to explain why older category labels and numbers still circulate, not as the model v2 baseline.

  4. Guided learning hours — Cambridge English

    The cumulative shape between CEFR levels. Cambridge publishes guided-learning-hour bands for its English qualifications (A2 180–200, B1 350–400, B2 500–600, C1 700–800, C2 1,000–1,200). Our factors are normalised against C1 rather than fitted to every band; for example, 0.27 × the 750-hour C1 midpoint is 202.5, just above the A2 band.

  5. ILR scale — Wikipedia

    That no official ILR-to-CEFR crosswalk exists. Published academic tables place ILR 3/3+ at C1; others put C1 nearer ILR 4. We take the lower reading, which makes our estimates the more conservative of the two.