Drafted with AI assistance and reviewed, fact-checked and edited by hand before publishing - see our AI transparency page for how we use AI across the app.
Here are three words a Year 5 child got wrong last week: fanciful, pitiful, merciful.
Until recently your progress report would have shown you exactly that: three rows in a table, three red marks, three separate things to worry about. Which is a fair description of what happened and a poor description of what it means. Because it is not three problems. It is one problem, three times.
All three words end in -ful. All three have a base word ending in y - fancy, pity, mercy - and in English that y turns into an i before the ending goes on. A child who has learned "fancy" and then writes "fancyful" has not made a random slip. They have applied a sensible rule that happens to be the wrong one, and they will keep doing it on every word of that shape until somebody points at the pattern.
The report now points at the pattern. This post is how we built the thing underneath that lets it.
What actually changed on the screen
Three things, all in the tricky words section of the progress report.
The rule gets a name and a sentence. Words that share a spelling pattern are grouped under one heading with one plain explanation. Not "3 words missed" but "When a word ends in a consonant followed by y, the y changes to an i before most endings are added." A single word with a diagnosable pattern is not left silent either - it keeps its row and gets the rule named alongside it, in lighter text.
Long words show how they are built. Under the word itself, where we know: fancy + -ful. hiero + glyph + -s. per- + severe + -ance.
Tap the word and you get where it came from. Behind the chevron on each row: the origin line, "From Latin: per- (through, thoroughly) + severe (strict, serious) + -ance (the state or quality of)", and the word family, "Words built the same way: persevere, severe, severity".
That last one is the bit we think matters most for an older child. "Perseverance" is a hard word to memorise and an easy word to understand. Once you can see the severe sitting in the middle of it, the double-checking stops being about letters and starts being about meaning.
Why this needed a lexicon rather than a clever feature
The app has always been able to tell you that a word went wrong. It has been able to classify how for a long time too: a swapped pair of letters, a doubled consonant that should be single, a suffix chosen wrongly. What it could not do was say anything useful about the resulting label.
That is because those labels lived in code, as short internal names. There was nowhere for a sentence to live. Nowhere for "this rule belongs to that family of rules." Nowhere for "this word is built from these pieces." Writing a better explanation of a spelling rule meant a developer editing a source file and shipping a release.
So the linguistic knowledge moved into the database. There is now one row per error type the app can name, carrying its parent-facing name, the plain sentence, and which of the curriculum's categories it belongs to. There is a separate inventory of morphemes - the meaningful pieces words are built from - and a table linking words to the pieces that make them up.
The practical effect: improving the explanation of a spelling rule is now a content change, not a code change. That matters more than it sounds. It means the sentence a parent reads can be rewritten by whoever writes best, as often as it needs rewriting, without touching the app.
Some numbers, as it stands today:
- 74 nameable error types, of which 68 carry a written parent-facing explanation
- 19 categories, built on the 18 in the KS2 Spelling Pattern Reference plus one we added for word endings
- 52 grapheme-confusion rules (the "ph written as f", "augh written as or" family), every one of which carries its own description rather than inheriting a vaguer one from its group
- 145 Latin and Greek roots, plus prefixes, suffixes and their variant forms
- Around 660 word decompositions in total across the two seeds
The rules we gave ourselves
This is the part I would want to read if I were a parent, because it is the part that decides whether you can trust what the report tells you.
A wrong split shown to a child is worse than no split at all. English is full of words that look like they decompose and do not. "Early" is not "ear + -ly". "Capable" is not "cap + -able". "Sentence" is not "sent + -ence". "Dentist" is not "dent + -ist". A system eager to show its working will produce all four, confidently, and teach a child something false.
So the splitting is deliberately timid. Every decomposition in the seed is one where the base is a real, free-standing English word, or a root genuinely productive across several words a KS2 child will meet. Words whose base is bound or contested simply have no entry: "possible", "horrible", "terrible", "important", "parliament" are all left alone, and the report shows the word by itself. When the app does work a split out on the fly rather than reading a stored one, it only accepts the answer if the base it implies is a word some child is actually being set.
A group needs at least two words to earn a heading. One word under a rule heading is not a pattern, it is a word wearing a hat, and it costs you a whole section to read something you already knew.
A rule with no written explanation cannot head a group. This is the safety valve that makes the whole thing degrade gracefully. If we have not yet written the sentence for a rule, the report does not invent one and does not show an empty heading. It falls back to exactly the plain list it always showed. Silence, never a guess.
We check the etymology, and we record that we checked. Every root carries a flag for whether a human has verified its meaning and origin against an external source. The origin line is the one claim in the whole report that no automated test can catch being wrong - a test can confirm we display what we stored, not that what we stored is true. So before switching it on we took a random sample of 30 roots and checked each one by hand against an etymology reference, judged against that root's own family words rather than its most distant ancestor. Thirty out of thirty were right, which was the bar we had set for shipping the rest.
That last method point is worth expanding, because it is where the interesting errors were. Not in the roots themselves but in the families hung on them. Early on, "panic" sat under the pan- root meaning "all", as in panorama and pandemic. It does not belong there: panic comes from the god Pan. "Tricycle" and "octopus" sat under Latin numeral roots when both reach English through Greek. Each is the kind of mistake that looks completely plausible in a table and is simply false when shown to a child. The principle we settled on: origin is a property of the word's derivation path, not of the root form, so the line has to be true of the word in front of the parent, not of the root's most impressive ancestor.
The practice data is what improves the rules
Here is the part that surprised us, and it is the best argument for building this the way we did.
Two thirds of the words children miss now land under a named rule, up from about half before this month. The interesting question is what was standing in the way of the rest, so we went and looked at every word the report still could not name.
The obvious answer would be "we need more rules." It was wrong. Of the words still unnamed there were 323 distinct error shapes, and 301 of them happened to exactly one word. Only 22 recurred across two or more words, and all 22 together accounted for fewer than fifty. There is no rich seam of missing rules to mine. The tail is long and flat.
What we found instead was that a rule we already had could not see far enough. Better than a quarter of the remaining words were one vowel swapped for another: "tolerance" written "tolarance", "occurrence" written "occurrance", "perseverance" written "perseverence". That is the schwa, the squashed "uh" sound in an unstressed syllable, and it is such a well-known cause of spelling difficulty that we had already written the rule and the explanation for it.
It was firing on eleven words. Not eleven kinds of word: eleven.
The reason is worth explaining, because it is the whole point. To say "the vowel in this word is the unstressed one children get wrong," you cannot just look the word up in a pronunciation dictionary. Long words have several unstressed vowels and only one of them is usually the troublemaker. What tells you which is a real misspelling from a real child. Without that you are guessing, and guessing is what this feature must not do.
So the list could only ever grow as fast as someone hand-collected examples. Eleven was what a person could curate.
Except we now have thousands of real attempts, each one a word paired with exactly what a child actually wrote. That is precisely the missing ingredient. We took every still-unnamed word, filtered to the ones where the child had swapped a single vowel, and let the existing tooling do the rest: derive the position from the misspelling, then check against a speech synthesiser that the vowel really is unstressed and not the stressed one.
Eleven words became forty. The checker rejected more than half the candidates, which is exactly what it is for: "caught" written "cought" looks like the same shape but the vowel there carries the main stress, so it is not a schwa and we do not claim it is.
Then the small stuff: three new rules, each earned by recurring across at least two different words. "-ise" written "-ize", "-tal" written "-tle" (hospital, accidental), and the dropped "e" in "achieve" and "believe".
Two more were written and then deleted before they shipped. A rule for "-ly" written "-ley" also fired on "reply" and "supply", where those letters are not the "-ly" ending at all. A rule for "or" written "our" also fired on "storm" and "important". Both would have shown a parent a confident, fluent, wrong explanation, which is worse than the plain "a letter was added" they got before. The rules that survive are the ones we could not break.
What it still cannot do
A third of missed words are still not named, and after all that we think that is close to the honest ceiling for this approach. The remainder is mostly that long flat tail: one-off shapes, a child typing something unrelated, a photographed sheet misread, or a mistake that genuinely does not belong to a pattern.
Two other things this deliberately is not. It is not a morphological analyser - it will not decompose arbitrary English on demand, and it is not trying to. And the mechanical descriptions - "a letter was left out", "two letters were swapped" - deliberately carry no explanation and can never head a group. Telling a parent that four of their child's words are missing a letter names a symptom, not a rule, and they could see that themselves.
A note on what this data is, and is not
The pattern rules, the roots, the word structures: none of it is about your child. It is reference material about the English language, the same for every family using the app, and it holds no personal data of any kind. The classification of your child's own mistakes happens in your own browser as the report draws, and the app asks our servers only for the name and explanation of a rule it has already worked out locally. If that request fails, the report simply renders the way it did before.
Sources and thanks
Almost none of the linguistic content here is original to us, and it would be poor form to present it as though it were.
The UK National Curriculum, English Appendix 1. The backbone. The spelling rules, the suffix and prefix teaching, the Year 1/2 common exception words and the Year 3/4 and Year 5/6 statutory word lists all come from the Department for Education's own document, which also supplies the example words for each rule. Where our word decompositions go slightly beyond the statutory lists, it is to cover Appendix 1's own worked examples for the affixes it teaches. Crown copyright, published under the Open Government Licence.
SCOWL, Kevin Atkinson's long-running free English word list project, which sits behind the dictionary checks in several parts of the app.
Standard classical-roots lists of the kind used in UK primary and 11-plus teaching, for the Latin and Greek root inventory - cross-checked by hand against etymology references rather than taken on trust, which is exactly how we found the panic and octopus problems described above.
Any errors in how we have applied any of it are ours.
What comes next
Not "more rules", which is what we assumed before measuring. The rules are close to done. What keeps improving is the evidence behind them, and that arrives on its own every time a child practises.
The schwa list went from eleven words to forty because the data reached a size where it could. It will reach forty-odd more, and the same tooling will find them, because the input it needs is simply a word plus what a child really wrote. Nothing about that step needs a person to sit down and think of examples, which is what capped it at eleven for so long.
That is the part worth saying plainly, because it runs against the instinct: a bigger dictionary would have helped us less than our own practice data did. We measured both. The gains came from a tie-break fix, forty-three sentences that had never been written, and a rule that could finally see past eleven words. No imported word list at any point.
If you spot a split, an origin or an explanation that looks wrong, the Feedback button in the bottom corner of the app reaches us directly, and it goes to a real person. Given what this post is about, a report that we have told a child something untrue about their language is the single most useful message you could send us.