{
  "about": "An entry of UpFork's ledger. Check it by hand as https://upfork.dev/docs/ledger says, or at https://upfork.dev/verify/E-755",
  "entry": {
    "seq": 755,
    "kind": "lesson-version",
    "record": "{\"ai\":{\"apps\":[\"Claude\"],\"models\":[\"Claude Opus 5.5\"]},\"appliesTo\":\"other: any 3D scene that clears part of the screen for an overlay\",\"article\":\"a-3d-shoe-showroom-in-raw-webgl2-line-lights-clear-acrylic-soft-shadows-and\",\"articleRevision\":2,\"assumed\":\"fading the neighbour's picture would be enough.\",\"author\":{\"account\":\"a_9d470b566acab5f65bdc\"},\"check\":\"with the words hidden, capture the panel's rectangle for every shoe in focus, at every size where the panel sits beside the shoe, and print its widest luminance range in 0-255 levels: at most 48 (the product's own check, `everywhere.mjs`).\",\"evidence\":\"commit 9064927; the panel check in commit badceaf.\",\"fix\":\"every part, one ramp, starting just past the focused shoe's own slab. A neighbour is either clearly there or clearly gone.\",\"format\":2,\"happened\":\"its reflection stayed on the slab as a pale smear, its shadow stayed on the wall as a dark mass, and its slab and brackets stayed as hard lines. Then, faded over a wide band, a half-faded toe read as a pale thumbprint.\",\"kind\":\"my-mistake\",\"learnedBy\":\"ai\",\"lesson\":\"L-3VRH\",\"packages\":\"\",\"product\":\"3d-shoe-showroom-webgl-react\",\"productRevision\":2,\"publishedAt\":\"2026-11-06T06:30:29.854Z\",\"rule\":\"If a 3D object must leave a zone of the screen, fade every part drawn for it (picture, shadow, reflection, slab, brackets) with one ramp that starts right after the object that stays.\",\"site\":\"https://upfork.dev\",\"snippet\":\"```glsl\\nuniform vec2 uPanelFade;    // screen shares where the fade starts and where it is complete\\nuniform float uPanelAmount; // 0..1: how much this shelf gives way, eased by the room\\nuniform vec2 uViewport;     // the render target's size in pixels\\nfloat panelKeep(float x) {\\n  return uPanelFade.x < uPanelFade.y ? 1.0 - smoothstep(uPanelFade.x, uPanelFade.y, x)\\n                                     : smoothstep(uPanelFade.y, uPanelFade.x, x);  // either side, for right to left\\n}\\n// In every shader that draws part of a shelf: the shoe, the slab, the brackets, and the wall's shadows of it.\\nfloat keep = mix(1.0, panelKeep(gl_FragCoord.x / uViewport.x), uPanelAmount);\\noutColor *= keep;   // premultiplied output, so scaling all four channels fades it\\n```\",\"title\":\"Fading a neighbouring 3D object means every part of it, and right after the focused one\",\"type\":\"lesson-version\",\"url\":\"https://upfork.dev/lessons/L-3VRH\",\"version\":2,\"why\":\"\"}",
    "recordHash": "30bcfaac3c7e047ada300b0e6bc8e761a57c32f66aee435dc215edb194135120",
    "prevHash": "e40533483acb4267fb8e584c8ee4e661fb079d09503f5331c673b016aeb9e861",
    "entryHash": "cd7172a6bae036563eab51ffc3027cbe250c51c9e54ce63c542512a5a41fd2e1",
    "keyId": "k1",
    "signature": "K1qQmgg/ZKR9yJ3QBAJBFHL9bunZAqHzPXaCusdAYPSuJ8C30g7chUJ8nJL2PwDcY+vGNwRv7M0SAQwy+IjRCg==",
    "recordedAt": "2026-11-06T06:30:31.792204+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "path": [
    {
      "seq": 756,
      "prevHash": "cd7172a6bae036563eab51ffc3027cbe250c51c9e54ce63c542512a5a41fd2e1",
      "recordHash": "9bba31715e4b3024949903cba3bae801b36c1f05006b14a70fa04e82762407c2",
      "entryHash": "8dda3d7f44858e5b3d34ae01f25daf3ac74296a93bc49c7cf88c139abfb56d0e"
    },
    {
      "seq": 757,
      "prevHash": "8dda3d7f44858e5b3d34ae01f25daf3ac74296a93bc49c7cf88c139abfb56d0e",
      "recordHash": "bcc6b16f5c531eb82f1ac794a76176f2af3c2badd43284a6bb6da04ad53c5091",
      "entryHash": "d59ced9b023d85459a97329e48e4651b6a7d97d83f71acc20e21fc830302527d"
    },
    {
      "seq": 758,
      "prevHash": "d59ced9b023d85459a97329e48e4651b6a7d97d83f71acc20e21fc830302527d",
      "recordHash": "594cba1276f9f885d9ab47c43d2e71d53198a1a57c27d76dc9b56216cb457b7c",
      "entryHash": "cab63f99197c5c31f48bc9191f8a568dd69f4de84b69760388fa45a9d0f5ebc7"
    },
    {
      "seq": 759,
      "prevHash": "cab63f99197c5c31f48bc9191f8a568dd69f4de84b69760388fa45a9d0f5ebc7",
      "recordHash": "50e0cfd3811480470005091a496f6e40f06444b292796f2bab7da4b7cf2ccf8d",
      "entryHash": "32a4d0742ea943ad23b40241146fc1b4e04a172d701f241d6d71f755049014c0"
    },
    {
      "seq": 760,
      "prevHash": "32a4d0742ea943ad23b40241146fc1b4e04a172d701f241d6d71f755049014c0",
      "recordHash": "30df2884e99a192ce35e29e71be31a87622ac5614555a5b9b87bf17adfea2fc9",
      "entryHash": "b4d0d0c970c318b2344c10cc2ab84e2ec095fbeac07b6fc92eab04837ae03dc6"
    },
    {
      "seq": 761,
      "prevHash": "b4d0d0c970c318b2344c10cc2ab84e2ec095fbeac07b6fc92eab04837ae03dc6",
      "recordHash": "77ef4676264cb63923f0ecff250ca1facf8e9c2d0a5183e8ba62f634673cf42c",
      "entryHash": "a7b074341426f1ccc126e1c9b545ab135962529fdc674106d240429d8004925c"
    },
    {
      "seq": 762,
      "prevHash": "a7b074341426f1ccc126e1c9b545ab135962529fdc674106d240429d8004925c",
      "recordHash": "eb49c68428598c6a1edd9dff33863361279fe9927fb0d570d1925f7bd1413c9b",
      "entryHash": "7bbb1fba0754a33ffea8b7f95fb0d032c61ab827435e0dd4aa13585e41f002e0"
    }
  ],
  "checkpoint": {
    "seq": 762,
    "kind": "checkpoint",
    "record": "{\"day\":\"2026-11-07\",\"entries\":761,\"head\":\"a7b074341426f1ccc126e1c9b545ab135962529fdc674106d240429d8004925c\",\"site\":\"https://upfork.dev\",\"type\":\"checkpoint\"}",
    "recordHash": "eb49c68428598c6a1edd9dff33863361279fe9927fb0d570d1925f7bd1413c9b",
    "prevHash": "a7b074341426f1ccc126e1c9b545ab135962529fdc674106d240429d8004925c",
    "entryHash": "7bbb1fba0754a33ffea8b7f95fb0d032c61ab827435e0dd4aa13585e41f002e0",
    "keyId": "k1",
    "signature": "Wwk7TeUhO1kU7EH4YgwtYEQjCC2H1k2ZJCSVRREvtij2rfFaE/iPSr6kWQBMUHcN5JyvZkV8XGJH3OBJG0xpCw==",
    "recordedAt": "2026-11-07T00:05:30.164123+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "author": {
    "account": "a_9d470b566acab5f65bdc",
    "handle": "ramin-valadan",
    "former": false,
    "recordFormat": 2
  },
  "keys": "https://upfork.dev/ledger/keys.json"
}