DEV Community

IdleCultivation
IdleCultivation

Posted on

Linting a novel: what a continuity checker can honestly catch

Development covered 5 Aug 2026 to 6 Aug 2026 (commit dates).

There is a novel attached to this game. Four hundred chapters across ten volumes, set in the same world, sharing its realms and its factions and a good deal of its cast. It is downstream of the game's design: the book may not invent a realm or change a rule, only dramatise what the design already says.

Keeping four hundred chapters in step with a design that moves weekly is not a thing attention can do. So the novel got a checker, the way the code has one, and working out what such a thing can honestly verify turned out to be more interesting than building it.

What actually automates

Four categories earned their place.

Facts that must be monotonic. A cultivator's lifespan grows with every realm, so a later realm promising a shorter span than an earlier one is a contradiction no reader would notice and every reader would feel. The checker found one: three hundred and fifty at one realm and three hundred at the next. This is the class where a machine beats a person outright, because it is arithmetic across two files hundreds of pages apart.

Names that must exist. Every proper noun in the prose has to resolve to something the game's exported data actually contains. Simple, and it caught a piece of equipment that had been renamed in the game months earlier and lived on in two chapters.

Point of view against presence. Each chapter declares whose eyes it is told through. Eighteen chapters named a character who does not appear anywhere in their own text. That check took ten minutes to write and would have taken a full read-through to find.

Typographic rules. This book's Chinese uses full-width punctuation throughout, which is a house rule, absolutely mechanical, and had been sitting in the style document unenforced for months.

What only looks automatable

I tried two more and stopped.

Chapter length distribution is measurable and turns out to mean nothing on its own. A short chapter is a problem when it is thin, not when it is short, and no counter distinguishes those. What the measurement did buy was a table printed on every run, which caught something better: the style document's stated target length had been wrong for months, and nobody had compared it to the ten volumes sitting on disk.

And whether a scene is any good. Obviously. Worth saying because the temptation to add a rule that approximates it is real, and every approximation I sketched would have been an instruction to write more blandly.

The check that passed everything

The best lesson came from attacking my own checker with deliberately broken input.

The name check loads a word list and asks whether each name is in it. If loading that list fails, the original code caught the error and continued with an empty list, and an empty list means every name in the book passes. The check reported success on prose that violated it in twenty places, and it reported success loudly and cheerfully.

I fixed it and it was still half broken: I had handled a missing file, and a file that exists and is empty took the same path to the same happy answer. It took a third pass to make both cases stop the run.

The general shape is worth having a name for. A check that cannot find its own reference data must fail, never pass. This is the same instinct as failing closed on a permission question, and prose tooling has exactly the same failure mode with none of the alarm around it. The most dangerous test is one that has quietly stopped testing.

There is a companion rule I now also follow: write a deliberately broken chapter for every rule and keep it, so the checker is itself tested. Every rule in there was added after finding the defect it describes in the finished book. That means each rule has, by construction, never actually been observed to fire on purpose.

Meanwhile, on the map: flight

The other change this stretch was the ability to fly, which mostly exists so a continent is not a walking simulator.

Two design decisions in it are worth recording. Flight is powered by your own energy, so crossing a long distance costs something, and running out mid crossing drops you where you are rather than refusing to launch. That converts a travel option into a small judgement about range, which is more interesting than a free teleport and less punishing than a wall.

And the great shields over rival sects, which block movement completely on foot, can be flown over. Standing outside a barrier is a boundary. Sailing over it and looking down through the canopy at somebody else's halls is trespassing, and trespassing is a much better feeling than a locked door.

Try it in your browser: Myriad Immortal Sect.

Top comments (0)