The Bug
Usually sticky pistons pull blocks back that are placed in front of them. A piston, that is powered using a short pulse, however, leaves its block behind when retracting. This behavior broke in this week's snapshot.
This was an actually intended feature, see: MC-5726.
Speculations
I can imagine that this happend by accident when cleaning the code. It was the case before, that a sticky piston that updated and is no longer powered, would tell the block in front of it to immediately turn from block 36 to its normal block again. Maybe some rewriting changed when that happens, and thus the block now turns into a normal block before the piston starts retracting again.
Linked issues
Comments 38
I would like to do the same, against that:
https://www.reddit.com/r/Minecraft/comments/5c752g/help_us_decide_should_observers_update_at_1_or_2/
Allows tricking sticky pistons into dropping blocks (note that this behavior is technically a bug and not future proof anyway)
Then why was MC-5726 marked as WAI? And why has that not been updated if this is intended behaviour? It should be resolved, not working as intended, if this really was intentional.
In any case it doesn't look like we can fix it without making other major changes to the system.
Now those changes have been made, back then, intended, now, not anymore.
And on Nov 10th, 2015 _jeb marked MC-5726 WAI. I guess he changed his mind, but it has been codified in the games source code since then in a very explicit and intentional way.
Final reply: sticky pistons dropping off blocks will return in the next snapshot; but is not guarenteed to stay forever.
Please take any further discussion to the r/mojira subreddit.
This really did need to change they can add a new type of piston for more features if needed and terracotta blocks are a thing people.
@unknown This is also very controversial, but if you actually intend to have a feature in the game, that replaces this "bug", glazed terracotta is not the way to go, for reasons others already mentioned above.
However, a kind of replacement could be introducing a sort of slippery piston. The slippery piston always can only do one action, no matter what pulse length it receives. You could realize that by having a block state for that piston that stores information about whether it has pushed a block the last time or not.
I would like to provide some evidence of the intended nature of the block dropping behavior in case there is some confusion there. Here is the relevant section of code from 1.12.2:
Inside the large if statement are two others. The first checks if the piston has finished extending or not by looking for block 36 2 blocks ahead of the direction the piston is facing. If it find block36, it "drops" the block there (the call to "clearPistonTileEntity" does this). It then sets a flag that causes the next if statement to evaluate false, and that statement is the one that "pulls" the block with the call to "doMove".
The code is very explicitly and intentionally written to drop blocks. It's not accidental as somebody had to expend effort to put this there.