{
  "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-690",
  "entry": {
    "seq": 690,
    "kind": "lesson-version",
    "record": "{\"ai\":{\"apps\":[\"Claude\"],\"models\":[\"Claude Opus 5.5\"]},\"appliesTo\":\"other: SciPy ndimage\",\"article\":\"cut-shoes-out-of-photos-so-they-stand-exactly-on-a-shelf-a-background-remova\",\"articleRevision\":2,\"assumed\":\"keeping small holes open, the limit from L-9XG6, was the safe default on every shoe, for lace gaps and pull loops.\",\"author\":{\"account\":\"a_9d470b566acab5f65bdc\"},\"check\":\"On a dark wall and on magenta: no patches through the mesh, and the marked loops are open.\",\"evidence\":\"`fill_holes` in `scripts/photos/pipeline.py`. A shoe with loops and no mesh may still set `fill_below`.\",\"fix\":\"a seed keeps the whole hole it sits in open, whatever its size.\",\"format\":2,\"happened\":\"on two shoes the mesh cells have the backdrop's grey, and the wall showed through the shoe in patches. A first version of the seed only removed the seed's own pixels, and left a ring of backdrop around it.\",\"kind\":\"my-mistake\",\"learnedBy\":\"ai\",\"lesson\":\"L-ECJB\",\"packages\":\"\",\"product\":\"shoe-store-product-grid-react\",\"productRevision\":2,\"publishedAt\":\"2026-11-05T19:07:31.764Z\",\"rule\":\"If a wall shows through a mesh upper, a small-hole limit (L-9XG6, the earlier attempt) left its cells open. Close every hole by default, and keep a real hole by placing a background seed inside it.\",\"site\":\"https://upfork.dev\",\"snippet\":\"```python\\n# before: fill_below 60 on every shoe\\nclose = np.asarray(ndi.sum(np.ones_like(parts), parts, index=range(1, count + 1))) < 60\\n# after: close every hole, except those holding a bg seed\\nclose = np.ones(count, bool)\\nmarked = np.unique(parts[keep & (parts > 0)])\\nclose[marked - 1] = False\\n```\",\"title\":\"Keeping small holes open punches holes through mesh: close every hole, and mark a real one with a seed\",\"type\":\"lesson-version\",\"url\":\"https://upfork.dev/lessons/L-ECJB\",\"version\":2,\"why\":\"\"}",
    "recordHash": "6988e938c51ee92b37193521ad4ddd173420a75b6a165f8a41deaf5a61cfae68",
    "prevHash": "f7e261b4a8fbdcb02c6f9726605bbb2d38f630d1da850472a673e98f90349d09",
    "entryHash": "4266569d2ed633630e3a41a96e03296ea2f95144e9b12ba78fab9674b5b3cbb9",
    "keyId": "k1",
    "signature": "h3gMWaGvPI1MUn2N928uCs74B7vtq5glZrqAddmW4mG0xtXmXzrXW00tcus5a3d3uz6Wf2w4xkalkZEw2mFZDg==",
    "recordedAt": "2026-11-05T19:07:33.650989+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "path": [
    {
      "seq": 691,
      "prevHash": "4266569d2ed633630e3a41a96e03296ea2f95144e9b12ba78fab9674b5b3cbb9",
      "recordHash": "0fe4a478344dba3b8c2ba00aaa73c10e36f07cbfe0f527d1708c417747c6f3ed",
      "entryHash": "ed533de37726f58292973fac1fbc7bdf7001f52397c61d37b36431ac33f9f6e0"
    },
    {
      "seq": 692,
      "prevHash": "ed533de37726f58292973fac1fbc7bdf7001f52397c61d37b36431ac33f9f6e0",
      "recordHash": "74589a15a1b4611e364cb3b42111029462b8769119e4bbdcfd36fedc803c5563",
      "entryHash": "1fed955a5db8791193553f6a120cdbbc2e8b7e16825d3710074b5eaa172d29a7"
    },
    {
      "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"
}