Alternative to redefining a @generated function to observe (subsequently static) state

Why not lift it into the type domain right away, and do away with named tuples?

abstract type GenVar

gen(tup::NTuple{N, GenVar}, m, s, a) where N = ntuple(i->gen(tup[i], m, s, a), N)

#Implementors must do stuff like
struct MyGenvar <: GenVar end
gen(::MyGenvar, x::SomeModel, s, a) = ...

Then users will need to call things like x, y, z = gen((X(), Y(), Z()), m, s, a).

That also avoids name-clashes if two downstream packages define genvars with the same name.