Two men and a faceless woman
In a campaign on the live server, two men came round the corner. One record appeared in the game state:
npc_watchers_men descriptor = «двое мужиков из-за угла»
One character for two people. From then on everything the game knows how to do with a character was done to the pair at once: one portrait between them, one attitude towards the hero, one trust score. They could only die together, too.
The faceless woman
Almost immediately a second report arrived, apparently about something else entirely: in a fresh campaign a character has no portrait. A woman on a porch, the hero talks to her, no picture.
The first suspicion was that image generation had broken. We went to look at the logs.
And they were empty. Not a single error: requests answering as they should, the cache filling up, the last picture drawn a few minutes ago.
The empty log was the answer. Generation was not failing — nobody had asked it for anything.
A portrait is drawn from one field, appearance: a line or two about the face, the clothes, distinguishing marks. For the woman on the porch that field was empty. No description means nothing to build the image key from; no key means nothing to queue. The character was left faceless not because the illustrator could not cope, but because no order was ever placed.
A separately useful observation: we deliberately log every generation failure. That is why an empty log here is not “nothing to see” but a conclusion in its own right. If failures were not recorded, the same emptiness would have meant nothing, and the evening would have gone on hunting a breakage that did not exist.
What they have in common
The Master’s instructions say both of these things. A crowd, or “two men”, must not be created as a single record. appearance is mandatory for a face-to-face meeting.
Neither was checked by anything. We have written about this disease already, in the post about the smith: until something checks a rule at the output, it stays a wish. We will not repeat ourselves — this time the more interesting question was the next one.
Where to send the refusal
Our usual home for checks like this is the validator: it parses the world changes the Master proposed and rejects the impossible ones. That is where these were asking to go: see “two men”, reject; see an empty description, reject.
And that would have been a worse mistake than the original.
A rejected change is simply discarded. The turn’s text, meanwhile, has already been written and already shown to the player. So the woman on the porch would have stayed in the text — and never entered the world. The Master would have gone on talking to her while the game believed nobody was there.
A character without a picture is a minor annoyance. A character the player can see and the game cannot is precisely the text-versus-state desynchronisation we have been fighting all along. We would have swapped a scratch for a fracture.
So the refusal was raised a level, into the parsing of the turn itself. The difference is who finds out about the error. A rejection in the validator tells nobody anything. An error in parsing the turn goes back to the Master with an explanation, and it rewrites the whole turn — this time with one person instead of two, and with a description of the face.
The rule that follows is simple: a refusal must not cost more than the mistake it prevents. Before forbidding something, it is worth looking at what will be left standing where the forbidden thing was.
One word
The “crowd” check looks only at the first word of the description. That is not thrift, it is necessity.
“Gang leader” is a perfectly legitimate character: one person, named through the group he commands. He appears in our own examples as a model of a good description. A check that looked for the word “gang” anywhere in the string would have struck him out.
The first word carries the meaning: a description starting with “two”, “a crowd”, “a squad” is about many. One starting with “leader” is about one.
The word list there is short and knowingly incomplete. Parsing Russian morphology properly for this is not worth it: missing a rare case is survivable, whereas forbidding a legitimate character is not.
What next
Both checks are already on the live server. What happens next we genuinely do not know: the Master may start creating one person at a time from a group, as intended, or may start arguing with the check. We will see the second case too — rewritten turns are visible in the logs.
While we were there we checked on the live server the thing this nearly broke in the other direction: “gang leader” is still created without objection. One person named through his gang is a legitimate character, and the check is obliged to let him through.
And the two men round the corner will stay a single record in that old campaign. We did not go back to repair past saves.