Several things popped up that kept me from jamming as much as I'd like (I'm reclaiming some of those hours tomorrow...); but I've made some major (if almost entirely invisible) progress. And not just relearning the hard and long way how to debug in a language with no static type enforcement and no compile-time errors...
I have a complete working level format: each level consists of 4 things: a name, a starting position, a goal position, and an array of level objects. Each level object consists of a physics body, consisting of as many Box2D collision shapes as needed, and an array of sprites, which are the visual components of the object. Each sprite can be static, or dynamic. If dynamic, it has a working animation system using sprite sheets.
I have a method for serializing and deserializing levels to and from JSON. Far from trivial, since Box2D makes heavy use of prototypes, which aren't preserved by a round trip through JSON.stringify and JSON.parse.
I've hooked in Morgan's file saving and loading code, so my program loads levels from disk and the level editor can save out.
I spent quite a lot of time hacking up the physics so that platforming feels smooth; still much to do to get it to feel alright.
I'm punting on art for the jam; I'm much more interested in finishing up my sophisticated level editor and tweaking the engine so that the controls feel right.
And finally, so this post isn't just text: my ugly as sin main menu (text rendering seems to be bugged, so I've put 0 effort it making it presentable), when you try to quit!