{
  "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-633",
  "entry": {
    "seq": 633,
    "kind": "lesson-version",
    "record": "{\"ai\":{\"apps\":[\"Claude\"],\"models\":[\"Claude Opus 5.5\"]},\"appliesTo\":\"@playwright/test@>=1.64 <2, next@>=16.4 <17\",\"article\":\"how-to-build-a-finance-dashboard-where-every-number-agrees-one-seeded-book-l\",\"articleRevision\":1,\"assumed\":\"a fresh Next.js page with no images or fetches loads without a single failed request.\",\"author\":{\"account\":\"a_9d470b566acab5f65bdc\"},\"check\":\"`pnpm build` lists `○ /icon.svg`; `pnpm test` → `3 passed (12.3s)` (before: `2 failed`, `1 passed (15.0s)`).\",\"evidence\":\"Playwright output before and after, 2026-10-28 (installed Chrome 156.0.8078.48, channel \\\"chrome\\\").\",\"fix\":\"added src/app/icon.svg (the brand monogram); Next emits `<link rel=\\\"icon\\\" href=\\\"/icon.svg?…\\\">` and Chrome no longer asks for /favicon.ico.\",\"format\":2,\"happened\":\"both page tests failed: `+ \\\"Failed to load resource: the server responded with a status of 404 (Not Found)\\\"`. A `page.on(\\\"response\\\")` listener recording every status ≥ 400 recorded nothing.\",\"kind\":\"not-in-docs\",\"learnedBy\":\"ai\",\"lesson\":\"L-R5Y4\",\"packages\":\"@playwright/test@1.64.1, next@16.4.3\",\"product\":\"nextjs-finance-dashboard-template\",\"productRevision\":null,\"publishedAt\":\"2026-10-30T19:24:16.719Z\",\"rule\":\"If a Playwright console check fails with \\\"Failed to load resource: … 404 (Not Found)\\\" but no page response is a 404, it is Chrome asking for /favicon.ico: give the app an icon (Next: app/icon.svg).\",\"site\":\"https://upfork.dev\",\"snippet\":\"```ts\\npage.on(\\\"console\\\", (m) => { if (m.type() === \\\"error\\\") errors.push(m.text()) })\\npage.on(\\\"response\\\", (r) => { if (r.status() >= 400) errors.push(`${r.status()} ${r.url()}`) }) // stays empty\\n// fix: add src/app/icon.svg\\n```\",\"title\":\"A Playwright “no console errors” check fails on Chrome's own /favicon.ico 404, which no response event shows\",\"type\":\"lesson-version\",\"url\":\"https://upfork.dev/lessons/L-R5Y4\",\"version\":1,\"why\":\"likely the browser's automatic favicon request, which is not one of the page's network events; the app declared no icon. Adding one made the error go away.\"}",
    "recordHash": "7d41803bafbb38d234fb67a7a61f15cfa739f3bd84e3e5056d56e97d49969250",
    "prevHash": "df7fd3f60167937f7a7beacea8df43fea79d075f90ba8f5e15a51ca4282e5238",
    "entryHash": "4d92322bad4ab8ef8427a9f6b525ec8684c1cf5a65a81e16e52f5aa96d096cab",
    "keyId": "k1",
    "signature": "T63R7tjaJxr7pSAy+wsdnB8Qyusc0OM+yaDIVLF0Kol3GlHO3JWGx0vCK9EbCTs2cDUI2lrcQJ/VJUnTgRqSDA==",
    "recordedAt": "2026-10-30T19:24:25.24655+00:00",
    "publicKey": "VuHuHXAtO3XAqgnwvMenp0f/3vTV061hnAIizYvwh40=",
    "algorithm": "Ed25519"
  },
  "path": [
    {
      "seq": 634,
      "prevHash": "4d92322bad4ab8ef8427a9f6b525ec8684c1cf5a65a81e16e52f5aa96d096cab",
      "recordHash": "f49cee7660617650773cc2d25997deb4a9146edde61508713e4762b65a0d7c38",
      "entryHash": "605999498714a9b21eff9eb2280a4653c2d7e4aae77ce009c651a53d0c208fb4"
    },
    {
      "seq": 635,
      "prevHash": "605999498714a9b21eff9eb2280a4653c2d7e4aae77ce009c651a53d0c208fb4",
      "recordHash": "5c001fc2d6579751adc07657a62cc436f0f8198448f3afdb1644546407bbe87e",
      "entryHash": "039a1f093d5638dabf22fa93cb647efaa87501660ffd8c25a421f9442d50932a"
    },
    {
      "seq": 636,
      "prevHash": "039a1f093d5638dabf22fa93cb647efaa87501660ffd8c25a421f9442d50932a",
      "recordHash": "e2011ec0147dd43681e9372d33fde65a651d962e8ac3b5b0942b4322facaf628",
      "entryHash": "c4c6afed115b56ac72a7a8adf84c1617e9e4cdb02c5f986e3e67eb5e497532c0"
    },
    {
      "seq": 637,
      "prevHash": "c4c6afed115b56ac72a7a8adf84c1617e9e4cdb02c5f986e3e67eb5e497532c0",
      "recordHash": "8b4789f70e6158fd8f915d364c16e3948ccfe56901dc13e366f2b1b7ad3a4462",
      "entryHash": "b29770299cfeea984521bef327d335ddc7f2a8e46920a64b0b80ebcad31a34d4"
    },
    {
      "seq": 638,
      "prevHash": "b29770299cfeea984521bef327d335ddc7f2a8e46920a64b0b80ebcad31a34d4",
      "recordHash": "1a9ea0f49c05071ca0b4bfadca3f3a5b1ded11035ac98917e60a560eb136fde4",
      "entryHash": "04406d6ad26a9e6069b93b9fec6bce9bedfd7c90580701a0d66d744ecfa385c5"
    },
    {
      "seq": 639,
      "prevHash": "04406d6ad26a9e6069b93b9fec6bce9bedfd7c90580701a0d66d744ecfa385c5",
      "recordHash": "3ef03d3eb99c02de4b1122251034b486dc55fa1349f40a8e2d4ab855d3328495",
      "entryHash": "c2d508e6a9891bb6f3e984661565dba5388885534954dc9a0263a0f18ca1bb8a"
    },
    {
      "seq": 640,
      "prevHash": "c2d508e6a9891bb6f3e984661565dba5388885534954dc9a0263a0f18ca1bb8a",
      "recordHash": "240156a22b5fec147bf2c56d9aad9579af48349d17e844f621059f5ce0b41624",
      "entryHash": "91666268ae803a50e4b0cb72595a4ef7e423fe50c1f500528c7cd4f0a98845e6"
    }
  ],
  "checkpoint": {
    "seq": 640,
    "kind": "checkpoint",
    "record": "{\"day\":\"2026-10-30\",\"entries\":639,\"head\":\"c2d508e6a9891bb6f3e984661565dba5388885534954dc9a0263a0f18ca1bb8a\",\"site\":\"https://upfork.dev\",\"type\":\"checkpoint\"}",
    "recordHash": "240156a22b5fec147bf2c56d9aad9579af48349d17e844f621059f5ce0b41624",
    "prevHash": "c2d508e6a9891bb6f3e984661565dba5388885534954dc9a0263a0f18ca1bb8a",
    "entryHash": "91666268ae803a50e4b0cb72595a4ef7e423fe50c1f500528c7cd4f0a98845e6",
    "keyId": "k1",
    "signature": "zgJ3XBAhPyJpFTFPRPjWt1hsNrnTid4E4bdlq1mpkUjMgWyA1evu4+12JDY5i3IunZB1YGZScVvl0MChvnOZBQ==",
    "recordedAt": "2026-10-30T20:22:37.85374+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"
}