So `DiscretizeGraphics` seems to always miss the first or last point of a `BSplineCurve` (it seems to do it with a `BezierCurve` as well). Here's the simplest example of this,

 pts = {{.5, 0}, {1, 0}, {1, 1}, {.5, 1}, {0, 1}, {0, 0}, {.5, 0}};
 GraphicsRow[{Graphics@#, DiscretizeGraphics@#} &@BSplineCurve[pts], 
 ImageSize -> 600]

[![enter image description here][1]][1]

Why does it do this? Not sure, hopefully one of the kernel developers that hang around here can chime in. But I've got a workaround. Just extract the points from the curve, create a `Line` object from them, and discretize that. Inspiration came from [this answer](http://stackoverflow.com/a/28860072/4712538) over on stackoverflow,

 discretizableBSplineCurve[pts_, opts : OptionsPattern[]] := 
 Line@(BSplineFunction[pts, 
 Evaluate[FilterRules[{opts}, Options[BSplineCurve]]]] /@ 
 Range[0, 1, .01])

Trying it on the above case,

 GraphicsRow[{Graphics@#, DiscretizeGraphics@#} &@
 discretizableBSplineCurve[pts], ImageSize -> 600]

[![enter image description here][2]][2]

Here it is applied to puzzle piece M.R. is drawing,

 p1 = {discretizableBSplineCurve[{{0.1288208346384372`, 
 0.24716061799090383`}, {0.18307091717113483`, 
 0.29633799186027077`}, {0.18104183370580254`, 
 0.25496700929944494`}, {0.22444189973196066`, 
 0.2943089083949385`}, {0.18307091717113483`, 
 0.29633799186027077`}, {0.23732099970383244`, 
 0.34551536572963765`}}, 
 SplineWeights -> {1, 15, 25, 25, 15, 1}], 
 discretizableBSplineCurve[{{0.1288208346384372`, 
 0.47866942629949966`}, {0.18307091717113483`, 
 0.41209239601456865`}, {0.13474007204408336`, 
 0.417023175115462`}, {0.17814013807024148`, 
 0.3637615508875172`}, {0.18307091717113483`, 
 0.41209239601456865`}, {0.23732099970383244`, 
 0.34551536572963765`}}, 
 SplineWeights -> {1, 15, 25, 25, 15, 1}], 
 Line[{{0.1288208346384372`, 
 0.24716061799090383`}, {0.1288208346384372`, 
 0.47866942629949966`}}]};
 {Graphics@p1, DiscretizeGraphics[p1]}

[![enter image description here][3]][3]

Another way to do it would be to modify 'DiscretGraphics`, that way you can work with objects that still have the head `BSplineCurve`. Here is how I thing that might work, (here `p` is defined as in the OP)

 SetAttributes[discretizeGraphics2, Listable];
 discretizeGraphics2[graphics_BSplineCurve] := 
 DiscretizeGraphics@
 Line@(Cases[{graphics}, BSplineCurve[a__] :> BSplineFunction[a], 
 Infinity][[1]] /@ Range[0, 1, .01]);
 discretizeGraphics2[graphics_] := DiscretizeGraphics@graphics
 discretizeGraphics2[p]

[![enter image description here][4]][4]

But sadly, this creates a list of `MeshRegion` objects, and I'm not sure how to combine them. Any help on this would be appreciated.


 [1]: https://i.sstatic.net/6tnIb.png
 [2]: https://i.sstatic.net/WM15g.png
 [3]: https://i.sstatic.net/FsZiO.png
 [4]: https://i.sstatic.net/9QmCw.png