{
  "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-692",
  "entry": {
    "seq": 692,
    "kind": "lesson-version",
    "record": "{\"ai\":{\"apps\":[\"Claude\"],\"models\":[\"Claude Opus 5.5\"]},\"appliesTo\":\"other: OpenCV LAB colour\",\"article\":\"cut-shoes-out-of-photos-so-they-stand-exactly-on-a-shelf-a-background-remova\",\"articleRevision\":2,\"assumed\":\"taking the backdrop away would take its colour away.\",\"author\":{\"account\":\"a_9d470b566acab5f65bdc\"},\"check\":\"On a pale wall the white reads white and not grey, with no orange in the black gloss.\",\"evidence\":\"`court-panel` in `scripts/photos/shoes.json`.\",\"fix\":\"this is white balance for one material, so never do it to a coloured shoe.\",\"format\":2,\"happened\":\"a court shoe shot on orange came out salmon, with orange reflections in its black gloss.\",\"kind\":\"my-mistake\",\"learnedBy\":\"ai\",\"lesson\":\"L-HVVE\",\"packages\":\"\",\"product\":\"shoe-store-product-grid-react\",\"productRevision\":2,\"publishedAt\":\"2026-11-05T19:07:31.764Z\",\"rule\":\"If a white shoe stays pink after leaving a coloured backdrop, the light bounced onto it. For a shoe that is itself black and white, keep about 10% of its colour and raise exposure about 12%.\",\"site\":\"https://upfork.dev\",\"snippet\":\"```python\\n# before: cut out, nothing else, and the white stays salmon\\n# after, with \\\"gain\\\": 1.12 and \\\"desaturate\\\": 0.1 in this shoe's settings\\ngain = shoe.get(\\\"gain\\\", 1.0)\\nif gain != 1.0:\\n    final_rgb = np.clip(final_rgb.astype(np.float32) * gain, 0, 255).astype(np.uint8)\\nkeep = shoe.get(\\\"desaturate\\\")  # the share of its colour the shoe keeps\\nif keep is not None:\\n    lab = cv2.cvtColor(final_rgb.astype(np.float32) / 255, cv2.COLOR_RGB2LAB)\\n    lab[..., 1:] *= keep\\n    final_rgb = (np.clip(cv2.cvtColor(lab, cv2.COLOR_LAB2RGB), 0, 1) * 255).astype(np.uint8)\\n```\",\"title\":\"Removing a coloured backdrop does not remove its bounced light: neutralise a black and white shoe\",\"type\":\"lesson-version\",\"url\":\"https://upfork.dev/lessons/L-HVVE\",\"version\":2,\"why\":\"a white surface shows the light that falls on it, and the exposure step is needed because a desaturated white looks grey on a pale wall.\"}",
    "recordHash": "74589a15a1b4611e364cb3b42111029462b8769119e4bbdcfd36fedc803c5563",
    "prevHash": "ed533de37726f58292973fac1fbc7bdf7001f52397c61d37b36431ac33f9f6e0",
    "entryHash": "1fed955a5db8791193553f6a120cdbbc2e8b7e16825d3710074b5eaa172d29a7",
    "keyId": "k1",
    "signature": "kQgzZDXhQI5qWKfQkSFR8iL65gD7R+tgBx3AtmLwsGLO0+fgGNYXMYPuD2h1UBzRbuR10A1J7GQDt1kxbCMADw==",
    "recordedAt": "2026-11-05T19:07:33.663388+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "path": [
    {
      "seq": 693,
      "prevHash": "1fed955a5db8791193553f6a120cdbbc2e8b7e16825d3710074b5eaa172d29a7",
      "recordHash": "eb2166cf72d18e60ebc30caa5851381cb6aa50cf2d13ac2fdac1e794eb3b662a",
      "entryHash": "5b9e58b0ba6d491ce46d838e71b6021fb0dd5fb91b65760d453ace820ab538d4"
    },
    {
      "seq": 694,
      "prevHash": "5b9e58b0ba6d491ce46d838e71b6021fb0dd5fb91b65760d453ace820ab538d4",
      "recordHash": "07db6a2295c37449982ceabc209bdcbd7f60caca0797f66c04c9d19fd9d156fb",
      "entryHash": "d734ffb1a3317816b9ea5d958398eb246c50b1e53bf835ea6d7d464aad386ac3"
    }
  ],
  "checkpoint": {
    "seq": 694,
    "kind": "checkpoint",
    "record": "{\"day\":\"2026-11-05\",\"entries\":693,\"head\":\"5b9e58b0ba6d491ce46d838e71b6021fb0dd5fb91b65760d453ace820ab538d4\",\"site\":\"https://upfork.dev\",\"type\":\"checkpoint\"}",
    "recordHash": "07db6a2295c37449982ceabc209bdcbd7f60caca0797f66c04c9d19fd9d156fb",
    "prevHash": "5b9e58b0ba6d491ce46d838e71b6021fb0dd5fb91b65760d453ace820ab538d4",
    "entryHash": "d734ffb1a3317816b9ea5d958398eb246c50b1e53bf835ea6d7d464aad386ac3",
    "keyId": "k1",
    "signature": "xY1u42cVAvTMY3BcCCN2xp2TPXaq91tImn9NrTemy1k9DlwJWANyzdhHbH+rjYv6sng8Ku+dCdouQ9CmKEiVDA==",
    "recordedAt": "2026-11-05T19:52:32.401331+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"
}