collectionGroup('iterations') read where nominated:true — reads each against readership response, and routes the winner to a print run or to press.collectionGroup('iterations') where nominated…collectionGroup('iterations') where nominated:true (prompt) + corpora/* where nominated (corpus). Each iteration stamps promptVersionId AND corpusVersionId, its overrides, simScore, personas.1
config/live — byte-identical, no deploy. One live pair at a time.6optimization/{uid}/iterations/{id} (a nominated:true flag); a collectionGroup('iterations') query surfaces every operator's nominees, and corpora/* supplies the corpus candidates. Each carries both version IDs, the prompt overrides, simScore, the personas.simScore.eligible:false), a release-blocker, regardless of judgment. So an activation lift that degrades graduation or trips an invariant is a reject, not a win.retrievalInterface. The guard runs server-side at the moment of the lock / print-run (compatible()) and refuses an incompatible pair with the exact mismatch — preventing a corpus go-live from silently breaking a prompt that assumed an earlier shape.ground(retrieval). So what goes live is a pinned (prompt × corpus) pair, every iteration stamps both IDs, and zero-variation holds: the engine chat path and the optimizer both read config/live — byte-identical, no deploy, one live pair at a time.