This is almost certainly a problem with applying the “width extension with linear decay” multiple times (i.e., this part:
# what was never sampled should have a small probability but not 0,
# so we'll extend the domain and use linear approximation of density on it
x = np.concatenate([[x[0] - 3 * width], x, [x[-1] + 3 * width]])
y = np.concatenate([[0], y, [0]])
You can basically see it as the bad left tail of the “updated” distribution. This has been noticed before: