The stub's mark (Manifest.Stubbed) is no field of a manifest's JSON, so an input a node-engine sent the check's sandbox lost it: node-tools, held by its manifest's verdict, read as a tool runner with no bundle and refused every module of ace, g14 and shanks for "its build produced 0 bundle(s)". compose.Input now writes its held modules (catalogue and each node's kept) beside its fields and marks them again on reading; an input from an engine before the mark is read by its contract, every module Refused names held as its stub. The sandbox composer also says, in the module's read, why the input's node-engine holds a module the case carries, so the check names the cause, not a rule about the stub. One subtest round-trips an input holding a refused tool runner, in both shapes; it refused for 0 bundles before. Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn