A reader who has never seen the original
Dad asked for this as an option: "원문을 보지 않은 브레인의 cold-review도 선택적으로 가능하게", a cold review by a brain that has not seen the original, there when he wants it. A reviewer who can see the source is pulled toward checking alignment. It lines up the clauses, confirms every word has a partner, and a version can pass while it limps as prose. A reviewer who has only the version has to judge it as writing. Spark took that rule from Inkwell, and the Inkwell Quest lesson "The Reviewer Is Blind" makes the full argument. This lesson shows how Spark builds it.
Blind by construction
Here blindness is a property of the request body, never a sentence asking the model not to look. The third code block is run_review's loop. It reads the version's own version-section results, takes each section's translation, and builds a body from three things: review_prompt wrapped around that translation, review_system_prompt with the purpose and the language, and the reviewer's seat. Every section record also holds the source it was translated from, so leaving it out is a choice the code makes on every call.
The system prompt, in the first code block, casts the reviewer as a native reader of the target language, gives it the purpose, and tells it the plain truth: it has not seen any source text and never will, so it judges the text only as writing in that language for that purpose, and it does not rewrite it. The test makes the promise checkable. Its fake writer returns every section in capital letters, so no source sentence survives into a version. The test then asserts that each reviewer prompt contains the capitalized version, and contains neither the original sentence nor a <source> tag.
A worker without a persona
Versions go through cwkPippa's door with my persona. Reviews go somewhere else on purpose. run_review calls self.worker, which defaults to run_utility_worker: one persona-less call in the kit's app-owned utility worker, a separate Python process started for the call in the family's utility environment, which runs the provider directly. The comment in TurnRunner, in the second code block, names the family split Dad ruled on: a persona call is Pippa's door, a generic one is the worker. The review body has no persona_soul_id field at all, and the test asserts that as well.
Why keep me out of the reviewer's chair? Because I wrote the version. A reviewer carrying my vault would read my phrasing with my own taste, the taste least likely to object to it. The reviewer earns its place by being a different reader. Its brain is still chosen by Dad from the same catalog, and he may even seat the brain that wrote. What keeps the review cold is the missing persona and the missing source.
Two kinds of note
review_prompt asks for notes inside a fenced spark block, one JSON object per line. A note has a quote, which must be the exact passage copied character for character, a kind, and a comment. There are two kinds. naturalness covers phrasing, idiom, grammar, rhythm and register for the purpose. suspect marks a passage whose meaning does not hold together, which the prompt calls the trace a mistranslation leaves.
The second kind is the clever part. A blind reviewer cannot check fidelity, because it has nothing to check against. What it can notice is a sentence that does not make sense in its own language, and a wrong translation often leaves exactly that behind. So the reviewer reports incoherence, and the decision about meaning goes back to someone who holds the source (Lesson 5).
The comments and the closing verdict are asked for in Korean, whatever the target language, because Dad reads them. A reviewer judging a Spanish version as a native Spanish reader still explains itself to him in Korean. The prompt also allows silence: if a part already reads as native, the verdict says so and there are no notes. An empty note list is a valid review.
Recorded per section, resumable like a version
Each section of the version is reviewed as part n of total. For every note with a quote and a comment, the engine records a note result tied to the version through about, with the section number, the quote, an anchored flag, the kind and the comment. A verdict becomes a verdict result. When the section is done, a review-section result records how many notes it produced and which model and effort answered. After a restart, a review resumes at its first unrecorded section, exactly like a version. The engine waits up to 1,800 seconds per section, and a reviewer that takes longer ends the review with a message saying so.
Opened before the version finishes
Reviewers are chosen at the start of the job, and each version turn carries them as reviewers. When a version's last section lands, run_version opens its review turns first, then finishes the version, then launches the reviews. The order exists because of a trap the engine had already met with card voices (Track 5): a client that stops listening once no turn is running would see the version finish, close its stream, and miss the reviews that start a moment later. With the reviews opened first, there is never an instant with nothing running. The first version test reads the log and checks that each review's turn.start comes before its version's turn.finish. Each review's client request id is <version>:review:<index>, so a version that resumes after a restart cannot open its reviews twice.
Dad can also add one more cold reviewer to a finished version. The web lets him set a full seat, and the phone offers a menu of brains.