y_post draws new parameters because any random variables it depends on in the computational graph are redrawn. The same happens if you try to fetch
x in the program
theta = Beta(1.0, 1.0); x = Bernoulli(probs=theta, sample_shape=50).
Consider what this means mathematically. The first line represents the posterior predictive,
p(xnew | x) = \int p(xnew | theta) p(theta | x) d\theta
The second line represents the likelihood with parameters given by the posterior mean,
p(xnew | theta = mean(p(theta | x))).
In general, to calculate something like the posterior predictive mean you should fetch
y_post many times and average.