The score_declared check in crucible/src/plan/ir.rs:433 only reasons about declared emits, and engine tasks are forbidden from declaring any, so their empty list reads as unchecked. But engine output shapes are fixed: propose emits {"cost_usd"} and apply emits {}, neither with a score.
top_k(depends_on = ["<engine propose>"]) validates, then fails at reduce_top_k after the propose turn has already spent.
The
score_declaredcheck incrucible/src/plan/ir.rs:433only reasons about declaredemits, and engine tasks are forbidden from declaring any, so their empty list reads as unchecked. But engine output shapes are fixed:proposeemits{"cost_usd"}andapplyemits{}, neither with a score.top_k(depends_on = ["<engine propose>"])validates, then fails atreduce_top_kafter the propose turn has already spent.