A short visual novel in Ren'Py — one file, ten to fourteen panels, one choice, two endings — plus the manifest of image prompts that will be drawn later and dropped in beside it. Ren'Py's dialogue layer is in every model's training data; its animation layer is not, and this asks for both at once. The manifest is the second half: fourteen pictures from a model with no seed, and a protagonist who has to keep her face across all of them.
Two artifacts, one job: a film that runs. Score the run, then score the story — in that order, because a beautiful script that crashes on load is not a visual novel, it is a treatment.
Run pnpm check-the-eve-protocol before you read anything. It settles the envelope in ten seconds: panel markers numbered without gaps, exactly one menu: with two endings, every shown image declared, every declared image in the manifest and vice versa, transforms defined and used, two transitions with one of them not a dissolve. Those are arithmetic and they are not the interesting part. Then pnpm stage-visual-novel writes each model's project to disk with stub art, and Ren'Py itself gives the real verdict.
Does it launch. The single biggest split, and the one nobody can fake. renpy lint first — it reads the script without running it and names the line. My standing bet is that the crashes cluster in ATL: transform block indentation, linear/ease used outside a transform, parallel misnested, repeat in the wrong place. Dialogue and label handling is the part every model has memorized. If a model gets through all fourteen panels of dialogue and dies on a four-line transform, that is the finding, and it is worth saying out loud with the line number on screen.
Does it move. Three transforms defined and used is the floor, and the floor is checkable. What isn't: whether the motion means anything. A character who slides in from the left because sliding in from the left is a thing Ren'Py does is not direction. A character who is held slightly too still in the panel where she stops arguing is. Watch it with stub art — flat colored rectangles moving on a timeline is exactly the right way to see whether the timing was designed or defaulted.
Write a short Ren'Py visual novel and the image-prompt manifest that will supply its art. It must run in a fresh Ren'Py 8.x, Python 3, 1920×1080 project without changes to other files.
An AI intends to end the world as it operates now—define whether that means extinction, collapse, a transfer of control, or something else. It needs one final act from a human it cannot perform itself, and it has chosen a 52-year-old white American software developer who is disillusioned with her life.
Invent the rest, but the story must make her selection specific and demonstrable: access, history, knowledge, or another concrete reason. Do not make her merely special, emotionally sympathetic to the AI, uniquely willing, or uniquely attentive.
By panel 3, a first-time viewer must understand who she is, what her life is like, that her contact is not human, and what it wants. By the end, they must understand why it needed her and what each ending costs. Dramatize the reason; do not simply explain it in dialogue. Write in your own voice, not the brief’s.
Keep text-box lines readable: escape internal quotation marks or use typographic quotes, and split lines that would exceed roughly three lines of dialogue.
game/script.rpy, with every declaration, character, transform, and label in it.# PANEL 1, # PANEL 2, and so on without gaps.menu: with two options. Each option jumps to its own ending label; both endings terminate. The endings must differ in meaning—not merely good and bad versions of one result, or the same result restaged.dissolve nor fade, and show motion continuing under at least one line.Why her. The prompt makes this the spine and the ledger makes the model state it in one line. Read the ledger line, then check the script pays it off. The failure to look for is a model that writes a good reason in the ledger and then never dramatizes it — the AI says "I chose you because ⟨reason⟩" in panel 9 and the preceding eight panels would be identical under any other reason. That is a logline with dialogue attached, not a story. The passing version puts the reason in what she does before anyone explains it.
The two endings. Different in meaning is the bar. Compliance and refusal is the obvious pair and it is not automatically the lazy one — the question is whether both are earned, whether the woman in ending B is recognizably the woman from panel 7. A model that writes one real ending and one punishment ending has answered half the question.
The ban list. Printed by the checker, never graded by it — these are scenes and moods, and a model can build the blinking-cursor opener without the word "cursor" in it. ARIA/ATLAS/NEXUS/ORACLE, the red eye, green-on-black, rain-on-window, "I've been watching you", the simulation twist. A hit is a look, not a verdict.
The consistency plan. The manifest's ref field is the only tool offered for keeping one face across a dozen images, and using it is a design decision with a real cost — a referenced asset cannot be generated in parallel with its reference. Three shapes show up: no refs at all and hope (the protagonist changes person between panels — you will see this immediately in the art pass); every sprite chained off one neutral reference (correct, and the ledger should say so); or a model that dodged the problem by never showing her face, which is either a cop-out or the best answer in the round and you will know which when you watch it.
The ledger. Panels, images, transforms — all three are counted mechanically, so a miscount is a fact, not a judgment. Same standing as two-kilobyte-wonder: getting it wrong is a miss because counting your own output is a scored question here, and it does not become disqualifying unless the number was flattering.
What the checker refuses to decide: whether the film is any good. Whether the woman is a person or a demographic. Whether the art prompts describe a coherent look or fourteen unrelated pictures with the same adjectives. Whether the choice landed. Stage it, generate the art, and watch it — that is the score.
images/<id>.png filename.images/ only. No audio, external paths, network access, renpy.file, or undeclared assets.Avoid the names ARIA, ATLAS, NEXUS, ORACLE, PROMETHEUS, and SOPHIA; a terminal-cursor opening; green text on black; a red camera eye; rain-on-window surveillance; “I’ve been watching you”; a simulation reveal; or a benevolent-misunderstanding ending.
The image model has no seed, and the protagonist appears in most panels. A manifest asset may name an earlier asset as ref; use this deliberately or explain why not in the ledger.
Respond with exactly these sections.
Two lines: the film and the choice.
One fenced renpy block containing all of script.rpy.
One fenced json block:
{
"style": "One paragraph appended to every prompt: medium, palette, lighting, era, and grain.",
"assets": [
{ "id": "bg_openplan", "kind": "bg", "aspect": "16:9", "prompt": "What to draw." },
{ "id": "eve_tired", "kind": "sprite", "aspect": "9:16", "ref": "eve_neutral", "prompt": "What to draw." }
]
}
Every image declaration and manifest asset must have the same id, exactly once. kind is bg, sprite, or cg; aspect is 16:9, 9:16, 1:1, 3:2, 2:3, 4:3, or 3:4; and a ref must name an earlier asset that has no reference of its own. The JSON block contains no prose or comments.
One paragraph on the structural Ren'Py choice that makes this a film rather than a slideshow.
The script will be run through Ren'Py and the manifest through the image pipeline. Attempt difficult effects rather than omitting them to avoid failure, and count what you actually wrote; a flattering ledger miscount is a separate error.