I had this happen (the piston not coming out) when I ground tested my L3. I couldn't believe it, so I tried it again. Still didn't come out. Still couldn't believe it. So, I put pen to paper.
Similar to what Jeff described, my piston is a very close fit, so there is minimal leakage around the outside of it (the piston takes several minutes to "fall" through the tube when the end of the tube is sealed). So, the idea was to look at the pressures on either side of the piston to see where the piston is when they balance. For a ground test or low altitude deployment, this would be 1 atmosphere (assuming the nose cone came off).
The first thing I did was calculate the moles of gas produced by burning the black powder. I had to find the composition of black powder itself and the composition of the reaction products. Not a problem.
Then, I had to calculate the maximum temperature that might be achieved (recognizing that the actual gas will cool very quickly as the piston moves and will not stay at this maximum temperature). I back-calculated a value from the black powder/pressure equations in ROL. I got an assumed temperature of something on the order of 2400 F iirc.
Then, based on the volume (moles) of gas produced and a maximum temperature of 2400F, I calculated that the piston would move about 8" or so up the 4" tube, or about half of the way out of the tube. This movement would give a pressure of 1 atmosphere behind the piston. If the pressure on the other side of the piston was about the same (i.e., low altitude as in the ground test after the nose pops off), that's where the piston would stop, or at least, that would be the equilibrium point. I further calculated that when the gases cooled down, the piston would be sucked back to within an inch or so of its starting location (assuming no leakage). A couple grams of black powder doesn't really produce much gas at ambient temperature.
In the case of a loose piston, I think it could easily be pulled out by the momentum of the nose cone and chute. For a gas-tight piston, though, I think the differential pressure controls the movement, and I concluded that the piston did exactly what it should have done.