[{"data":1,"prerenderedAt":1214},["ShallowReactive",2],{"navigation_docs":3,"-manifest-format":93,"-manifest-format-surround":1209},[4,41,46,89],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":40},"Learn","i-lucide-book-open","\u002Flearn","1.learn",[10,15,20,25,30,35],{"title":11,"path":12,"stem":13,"icon":14},"What visual regression testing is","\u002Flearn\u002Fwhat-is-visual-regression-testing","1.learn\u002F1.what-is-visual-regression-testing","i-lucide-eye",{"title":16,"path":17,"stem":18,"icon":19},"How image diffing works","\u002Flearn\u002Fhow-image-diffing-works","1.learn\u002F2.how-image-diffing-works","i-lucide-diff",{"title":21,"path":22,"stem":23,"icon":24},"Why screenshots flake","\u002Flearn\u002Fwhy-screenshots-flake","1.learn\u002F3.why-screenshots-flake","i-lucide-shuffle",{"title":26,"path":27,"stem":28,"icon":29},"Baselines and approval","\u002Flearn\u002Fbaselines-and-approval","1.learn\u002F4.baselines-and-approval","i-lucide-check-check",{"title":31,"path":32,"stem":33,"icon":34},"Running in CI","\u002Flearn\u002Frunning-in-ci","1.learn\u002F5.running-in-ci","i-lucide-workflow",{"title":36,"path":37,"stem":38,"icon":39},"Choosing a tool","\u002Flearn\u002Fchoosing-a-tool","1.learn\u002F6.choosing-a-tool","i-lucide-list-checks",false,{"title":42,"path":43,"stem":44,"icon":45},"Compare the tools","\u002Fcompare","2.compare","i-lucide-scale",{"title":47,"path":48,"stem":49,"children":50,"icon":53},"Manifest","\u002Fmanifest","3.manifest\u002F1.index",[51,54,59,64,69,74,79,84],{"title":52,"path":48,"stem":49,"icon":53},"The run manifest","i-lucide-file-json",{"title":55,"path":56,"stem":57,"icon":58},"The format","\u002Fmanifest\u002Fformat","3.manifest\u002F2.format","i-lucide-file-code",{"title":60,"path":61,"stem":62,"icon":63},"Reading manifests","\u002Fmanifest\u002Freading","3.manifest\u002F3.reading","i-lucide-book-open-check",{"title":65,"path":66,"stem":67,"icon":68},"Merging the manifests of a run","\u002Fmanifest\u002Fmerging","3.manifest\u002F4.merging","i-lucide-merge",{"title":70,"path":71,"stem":72,"icon":73},"Writing manifests","\u002Fmanifest\u002Fwriting","3.manifest\u002F5.writing","i-lucide-pencil-line",{"title":75,"path":76,"stem":77,"icon":78},"Converting to and from other formats","\u002Fmanifest\u002Fconverting","3.manifest\u002F6.converting","i-lucide-arrow-left-right",{"title":80,"path":81,"stem":82,"icon":83},"Reference","\u002Fmanifest\u002Freference","3.manifest\u002F7.reference","i-lucide-list",{"title":85,"path":86,"stem":87,"icon":88},"Schema reference","\u002Fmanifest\u002Fschema","3.manifest\u002F8.schema","i-lucide-braces",{"title":90,"path":91,"stem":92,"icon":14},"Viewer","\u002Fviewer","4.viewer",{"id":94,"title":55,"body":95,"description":1201,"extension":1202,"links":1203,"meta":1204,"navigation":1206,"path":56,"seo":1207,"stem":57,"__hash__":1208},"docs\u002F3.manifest\u002F2.format.md",{"type":96,"value":97,"toc":1199},"minimark",[98,130,710,876,879,1195],[99,100,101,102,106,107,110,111,114,115,118,119,122,123,125,126,129],"p",{},"The normative description is the JSON Schema (draft 2020-12) at ",[103,104,105],"code",{},"https:\u002F\u002Fvisual-regression.dev\u002Fschema\u002Fv1.json",", shipped as ",[103,108,109],{},"schema.json"," (in the package, and in the repository under ",[103,112,113],{},"src\u002F",") and importable as ",[103,116,117],{},"visual-regression-manifest\u002Fschema.json"," or the ",[103,120,121],{},"manifestSchema"," export. The TypeScript types (",[103,124,47],{},", ",[103,127,128],{},"ManifestEntry",", ...) mirror it. A trimmed example:",[131,132,137],"pre",{"className":133,"code":134,"language":135,"meta":136,"style":136},"language-jsonc shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"reportFormat\": \"visual-regression-manifest\",\n  \"specVersion\": \"1.0.0-beta.1\",\n  \"createdAt\": \"2026-09-22T10:00:00.000Z\",\n  \"updatedAt\": \"2026-09-22T10:03:12.481Z\",\n  \"projectRoot\": \"\u002Fhome\u002Frunner\u002Fwork\u002Fapp\u002Fapp\", \u002F\u002F every relative path below resolves against it\n  \"platform\": {\n    \"osPlatform\": \"linux\",\n    \"arch\": \"x64\",\n    \"osRelease\": \"6.8.0-1021-azure\",\n  },\n  \"ci\": {\n    \"provider\": \"github\",\n    \"repositoryName\": \"acme\u002Fapp\",\n    \"repositoryUrl\": \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\",\n    \"commit\": \"0f1e2d…\", \u002F\u002F on pull_request events: the merge commit\n    \"pullRequest\": {\n      \"number\": 42,\n      \"headSha\": \"9a8b7c…\",\n      \"headRef\": \"feat\u002Fnew-header\",\n      \"baseRef\": \"main\",\n    },\n    \"buildId\": \"1234567890\",\n    \"buildName\": \"CI\",\n    \"buildUrl\": \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\u002Factions\u002Fruns\u002F1234567890\u002Fattempts\u002F1\",\n    \"runAttempt\": \"1\",\n    \"workspace\": \"\u002Fhome\u002Frunner\u002Fwork\u002Fapp\u002Fapp\", \u002F\u002F the checkout directory\n  },\n  \"tool\": {\n    \"name\": \"@pixsame\u002Fcypress-plugin-visual-regression-diff\",\n    \"version\": \"4.3.0\",\n  }, \u002F\u002F what wrote the file\n  \"options\": { \"updateImages\": \"failures-only\" }, \u002F\u002F the tool's global options, in its own vocabulary\n  \"runner\": {\n    \"name\": \"cypress\",\n    \"version\": \"16.1.0\",\n    \"testingType\": \"e2e\",\n    \"mode\": \"run\",\n  }, \u002F\u002F what ran the tests; only `name` is required\n  \"summary\": {\n    \"entries\": 1,\n    \"passed\": 0,\n    \"failed\": 1,\n    \"missingBaseline\": 0,\n    \"created\": 0,\n    \"updated\": 0,\n    \"approved\": 0,\n    \"needsHuman\": 1,\n  },\n  \"entries\": [\n    {\n      \"name\": \"home page renders_#0\", \u002F\u002F the baseline file stem\n      \"test\": {\n        \"filePath\": \"cypress\u002Fe2e\u002Fhome.cy.ts\",\n        \"titlePath\": [\"home page\", \"renders\"],\n        \"retry\": 0,\n      },\n      \"status\": \"failed\",\n      \"comparison\": { \"diffRatio\": 0.0231, \"threshold\": 0.01 },\n      \"images\": {\n        \"baseline\": {\n          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.png\",\n          \"width\": 1280,\n          \"height\": 720,\n        },\n        \"actual\": {\n          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.actual.png\",\n          \"width\": 1280,\n          \"height\": 720,\n        },\n        \"diff\": {\n          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.diff.png\",\n        },\n      },\n      \"baselineWritten\": false,\n      \"recordedAt\": \"2026-09-22T10:03:12.480Z\",\n      \"duration\": 840, \u002F\u002F ms, when the writer measured it\n      \"platform\": {\n        \"osPlatform\": \"linux\",\n        \"arch\": \"x64\",\n        \"browser\": { \"name\": \"chrome\", \"version\": \"130.0.0.0\" },\n      },\n      \"viewport\": { \"width\": 1280, \"height\": 720 },\n      \"renderer\": {\n        \"backend\": \"native\",\n        \"browser\": \"chrome\",\n        \"browserVersion\": \"130.0.0.0\",\n      },\n      \"hashes\": { \"baseline\": \"3b7e…\", \"actual\": \"9d21…\", \"diff\": \"c0ff…\" }, \u002F\u002F sha256, only for files that exist\n      \"message\": \"Image diff factor (2.31%) is bigger than maximum threshold option 1%.\",\n    },\n  ],\n}\n","jsonc","",[103,138,139,147,153,159,165,171,180,186,192,198,204,210,216,222,228,234,243,249,255,261,267,273,279,285,291,297,303,312,317,323,329,335,341,350,356,362,368,374,380,386,392,398,404,410,416,422,428,434,440,445,451,457,466,472,478,484,490,496,502,508,514,520,526,532,538,544,550,556,561,566,571,577,583,588,593,599,605,614,620,626,632,638,643,649,655,661,667,673,678,687,693,698,704],{"__ignoreMap":136},[140,141,144],"span",{"class":142,"line":143},"line",1,[140,145,146],{},"{\n",[140,148,150],{"class":142,"line":149},2,[140,151,152],{},"  \"reportFormat\": \"visual-regression-manifest\",\n",[140,154,156],{"class":142,"line":155},3,[140,157,158],{},"  \"specVersion\": \"1.0.0-beta.1\",\n",[140,160,162],{"class":142,"line":161},4,[140,163,164],{},"  \"createdAt\": \"2026-09-22T10:00:00.000Z\",\n",[140,166,168],{"class":142,"line":167},5,[140,169,170],{},"  \"updatedAt\": \"2026-09-22T10:03:12.481Z\",\n",[140,172,174,177],{"class":142,"line":173},6,[140,175,176],{},"  \"projectRoot\": \"\u002Fhome\u002Frunner\u002Fwork\u002Fapp\u002Fapp\",",[140,178,179],{}," \u002F\u002F every relative path below resolves against it\n",[140,181,183],{"class":142,"line":182},7,[140,184,185],{},"  \"platform\": {\n",[140,187,189],{"class":142,"line":188},8,[140,190,191],{},"    \"osPlatform\": \"linux\",\n",[140,193,195],{"class":142,"line":194},9,[140,196,197],{},"    \"arch\": \"x64\",\n",[140,199,201],{"class":142,"line":200},10,[140,202,203],{},"    \"osRelease\": \"6.8.0-1021-azure\",\n",[140,205,207],{"class":142,"line":206},11,[140,208,209],{},"  },\n",[140,211,213],{"class":142,"line":212},12,[140,214,215],{},"  \"ci\": {\n",[140,217,219],{"class":142,"line":218},13,[140,220,221],{},"    \"provider\": \"github\",\n",[140,223,225],{"class":142,"line":224},14,[140,226,227],{},"    \"repositoryName\": \"acme\u002Fapp\",\n",[140,229,231],{"class":142,"line":230},15,[140,232,233],{},"    \"repositoryUrl\": \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\",\n",[140,235,237,240],{"class":142,"line":236},16,[140,238,239],{},"    \"commit\": \"0f1e2d…\",",[140,241,242],{}," \u002F\u002F on pull_request events: the merge commit\n",[140,244,246],{"class":142,"line":245},17,[140,247,248],{},"    \"pullRequest\": {\n",[140,250,252],{"class":142,"line":251},18,[140,253,254],{},"      \"number\": 42,\n",[140,256,258],{"class":142,"line":257},19,[140,259,260],{},"      \"headSha\": \"9a8b7c…\",\n",[140,262,264],{"class":142,"line":263},20,[140,265,266],{},"      \"headRef\": \"feat\u002Fnew-header\",\n",[140,268,270],{"class":142,"line":269},21,[140,271,272],{},"      \"baseRef\": \"main\",\n",[140,274,276],{"class":142,"line":275},22,[140,277,278],{},"    },\n",[140,280,282],{"class":142,"line":281},23,[140,283,284],{},"    \"buildId\": \"1234567890\",\n",[140,286,288],{"class":142,"line":287},24,[140,289,290],{},"    \"buildName\": \"CI\",\n",[140,292,294],{"class":142,"line":293},25,[140,295,296],{},"    \"buildUrl\": \"https:\u002F\u002Fgithub.com\u002Facme\u002Fapp\u002Factions\u002Fruns\u002F1234567890\u002Fattempts\u002F1\",\n",[140,298,300],{"class":142,"line":299},26,[140,301,302],{},"    \"runAttempt\": \"1\",\n",[140,304,306,309],{"class":142,"line":305},27,[140,307,308],{},"    \"workspace\": \"\u002Fhome\u002Frunner\u002Fwork\u002Fapp\u002Fapp\",",[140,310,311],{}," \u002F\u002F the checkout directory\n",[140,313,315],{"class":142,"line":314},28,[140,316,209],{},[140,318,320],{"class":142,"line":319},29,[140,321,322],{},"  \"tool\": {\n",[140,324,326],{"class":142,"line":325},30,[140,327,328],{},"    \"name\": \"@pixsame\u002Fcypress-plugin-visual-regression-diff\",\n",[140,330,332],{"class":142,"line":331},31,[140,333,334],{},"    \"version\": \"4.3.0\",\n",[140,336,338],{"class":142,"line":337},32,[140,339,340],{},"  }, \u002F\u002F what wrote the file\n",[140,342,344,347],{"class":142,"line":343},33,[140,345,346],{},"  \"options\": { \"updateImages\": \"failures-only\" },",[140,348,349],{}," \u002F\u002F the tool's global options, in its own vocabulary\n",[140,351,353],{"class":142,"line":352},34,[140,354,355],{},"  \"runner\": {\n",[140,357,359],{"class":142,"line":358},35,[140,360,361],{},"    \"name\": \"cypress\",\n",[140,363,365],{"class":142,"line":364},36,[140,366,367],{},"    \"version\": \"16.1.0\",\n",[140,369,371],{"class":142,"line":370},37,[140,372,373],{},"    \"testingType\": \"e2e\",\n",[140,375,377],{"class":142,"line":376},38,[140,378,379],{},"    \"mode\": \"run\",\n",[140,381,383],{"class":142,"line":382},39,[140,384,385],{},"  }, \u002F\u002F what ran the tests; only `name` is required\n",[140,387,389],{"class":142,"line":388},40,[140,390,391],{},"  \"summary\": {\n",[140,393,395],{"class":142,"line":394},41,[140,396,397],{},"    \"entries\": 1,\n",[140,399,401],{"class":142,"line":400},42,[140,402,403],{},"    \"passed\": 0,\n",[140,405,407],{"class":142,"line":406},43,[140,408,409],{},"    \"failed\": 1,\n",[140,411,413],{"class":142,"line":412},44,[140,414,415],{},"    \"missingBaseline\": 0,\n",[140,417,419],{"class":142,"line":418},45,[140,420,421],{},"    \"created\": 0,\n",[140,423,425],{"class":142,"line":424},46,[140,426,427],{},"    \"updated\": 0,\n",[140,429,431],{"class":142,"line":430},47,[140,432,433],{},"    \"approved\": 0,\n",[140,435,437],{"class":142,"line":436},48,[140,438,439],{},"    \"needsHuman\": 1,\n",[140,441,443],{"class":142,"line":442},49,[140,444,209],{},[140,446,448],{"class":142,"line":447},50,[140,449,450],{},"  \"entries\": [\n",[140,452,454],{"class":142,"line":453},51,[140,455,456],{},"    {\n",[140,458,460,463],{"class":142,"line":459},52,[140,461,462],{},"      \"name\": \"home page renders_#0\",",[140,464,465],{}," \u002F\u002F the baseline file stem\n",[140,467,469],{"class":142,"line":468},53,[140,470,471],{},"      \"test\": {\n",[140,473,475],{"class":142,"line":474},54,[140,476,477],{},"        \"filePath\": \"cypress\u002Fe2e\u002Fhome.cy.ts\",\n",[140,479,481],{"class":142,"line":480},55,[140,482,483],{},"        \"titlePath\": [\"home page\", \"renders\"],\n",[140,485,487],{"class":142,"line":486},56,[140,488,489],{},"        \"retry\": 0,\n",[140,491,493],{"class":142,"line":492},57,[140,494,495],{},"      },\n",[140,497,499],{"class":142,"line":498},58,[140,500,501],{},"      \"status\": \"failed\",\n",[140,503,505],{"class":142,"line":504},59,[140,506,507],{},"      \"comparison\": { \"diffRatio\": 0.0231, \"threshold\": 0.01 },\n",[140,509,511],{"class":142,"line":510},60,[140,512,513],{},"      \"images\": {\n",[140,515,517],{"class":142,"line":516},61,[140,518,519],{},"        \"baseline\": {\n",[140,521,523],{"class":142,"line":522},62,[140,524,525],{},"          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.png\",\n",[140,527,529],{"class":142,"line":528},63,[140,530,531],{},"          \"width\": 1280,\n",[140,533,535],{"class":142,"line":534},64,[140,536,537],{},"          \"height\": 720,\n",[140,539,541],{"class":142,"line":540},65,[140,542,543],{},"        },\n",[140,545,547],{"class":142,"line":546},66,[140,548,549],{},"        \"actual\": {\n",[140,551,553],{"class":142,"line":552},67,[140,554,555],{},"          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.actual.png\",\n",[140,557,559],{"class":142,"line":558},68,[140,560,531],{},[140,562,564],{"class":142,"line":563},69,[140,565,537],{},[140,567,569],{"class":142,"line":568},70,[140,570,543],{},[140,572,574],{"class":142,"line":573},71,[140,575,576],{},"        \"diff\": {\n",[140,578,580],{"class":142,"line":579},72,[140,581,582],{},"          \"path\": \"cypress\u002Fe2e\u002F__image_snapshots__\u002Fhome page renders_#0.diff.png\",\n",[140,584,586],{"class":142,"line":585},73,[140,587,543],{},[140,589,591],{"class":142,"line":590},74,[140,592,495],{},[140,594,596],{"class":142,"line":595},75,[140,597,598],{},"      \"baselineWritten\": false,\n",[140,600,602],{"class":142,"line":601},76,[140,603,604],{},"      \"recordedAt\": \"2026-09-22T10:03:12.480Z\",\n",[140,606,608,611],{"class":142,"line":607},77,[140,609,610],{},"      \"duration\": 840,",[140,612,613],{}," \u002F\u002F ms, when the writer measured it\n",[140,615,617],{"class":142,"line":616},78,[140,618,619],{},"      \"platform\": {\n",[140,621,623],{"class":142,"line":622},79,[140,624,625],{},"        \"osPlatform\": \"linux\",\n",[140,627,629],{"class":142,"line":628},80,[140,630,631],{},"        \"arch\": \"x64\",\n",[140,633,635],{"class":142,"line":634},81,[140,636,637],{},"        \"browser\": { \"name\": \"chrome\", \"version\": \"130.0.0.0\" },\n",[140,639,641],{"class":142,"line":640},82,[140,642,495],{},[140,644,646],{"class":142,"line":645},83,[140,647,648],{},"      \"viewport\": { \"width\": 1280, \"height\": 720 },\n",[140,650,652],{"class":142,"line":651},84,[140,653,654],{},"      \"renderer\": {\n",[140,656,658],{"class":142,"line":657},85,[140,659,660],{},"        \"backend\": \"native\",\n",[140,662,664],{"class":142,"line":663},86,[140,665,666],{},"        \"browser\": \"chrome\",\n",[140,668,670],{"class":142,"line":669},87,[140,671,672],{},"        \"browserVersion\": \"130.0.0.0\",\n",[140,674,676],{"class":142,"line":675},88,[140,677,495],{},[140,679,681,684],{"class":142,"line":680},89,[140,682,683],{},"      \"hashes\": { \"baseline\": \"3b7e…\", \"actual\": \"9d21…\", \"diff\": \"c0ff…\" },",[140,685,686],{}," \u002F\u002F sha256, only for files that exist\n",[140,688,690],{"class":142,"line":689},90,[140,691,692],{},"      \"message\": \"Image diff factor (2.31%) is bigger than maximum threshold option 1%.\",\n",[140,694,696],{"class":142,"line":695},91,[140,697,278],{},[140,699,701],{"class":142,"line":700},92,[140,702,703],{},"  ],\n",[140,705,707],{"class":142,"line":706},93,[140,708,709],{},"}\n",[711,712,713,743],"table",{},[714,715,716],"thead",{},[717,718,719,725,728,733,738],"tr",{},[720,721,722],"th",{},[103,723,724],{},"status",[720,726,727],{},"meaning",[720,729,730],{},[103,731,732],{},"images.actual.path",[720,734,735],{},[103,736,737],{},"images.diff.path",[720,739,740,741],{},"as CTRF ",[103,742,724],{},[744,745,746,770,790,810,832,854],"tbody",{},[717,747,748,754,757,762,766],{},[749,750,751],"td",{},[103,752,753],{},"passed",[749,755,756],{},"within threshold",[749,758,759],{},[103,760,761],{},"null",[749,763,764],{},[103,765,761],{},[749,767,768],{},[103,769,753],{},[717,771,772,777,780,783,786],{},[749,773,774],{},[103,775,776],{},"failed",[749,778,779],{},"above threshold, actual and diff images kept for review",[749,781,782],{},"path",[749,784,785],{},"path (if any)",[749,787,788],{},[103,789,776],{},[717,791,792,797,800,802,806],{},[749,793,794],{},[103,795,796],{},"missing-baseline",[749,798,799],{},"no baseline and the tool was told not to create one",[749,801,782],{},[749,803,804],{},[103,805,761],{},[749,807,808],{},[103,809,776],{},[717,811,812,817,820,824,828],{},[749,813,814],{},[103,815,816],{},"created",[749,818,819],{},"no baseline, the actual image became the baseline",[749,821,822],{},[103,823,761],{},[749,825,826],{},[103,827,761],{},[749,829,830],{},[103,831,753],{},[717,833,834,839,842,846,850],{},[749,835,836],{},[103,837,838],{},"updated",[749,840,841],{},"baseline overwritten on request",[749,843,844],{},[103,845,761],{},[749,847,848],{},[103,849,761],{},[749,851,852],{},[103,853,753],{},[717,855,856,861,864,868,872],{},[749,857,858],{},[103,859,860],{},"approved",[749,862,863],{},"baseline replaced from a review UI",[749,865,866],{},[103,867,761],{},[749,869,870],{},[103,871,761],{},[749,873,874],{},[103,875,753],{},[99,877,878],{},"Rules every writer and reader follows:",[880,881,882,909,935,960,977,1015,1039,1095,1113,1126,1140,1159,1169],"ul",{},[883,884,885,889,890,893,894,897,898,901,902,904,905,908],"li",{},[886,887,888],"strong",{},"Paths"," are relative to ",[103,891,892],{},"projectRoot"," with ",[103,895,896],{},"\u002F"," separators and may point outside the project (",[103,899,900],{},"..\u002F…","). ",[103,903,892],{}," is the tested project, not necessarily the repository root: ",[103,906,907],{},"ci.workspace"," is the checkout directory.",[883,910,911,919,920,922,923,926,927,930,931,934],{},[886,912,913,915,916,918],{},[103,914,776],{}," and ",[103,917,796],{}," need a human."," Copying ",[103,921,732],{}," over ",[103,924,925],{},"images.baseline.path"," approves them. ",[103,928,929],{},"baselineWritten"," says whether the working tree changed, whatever the status. ",[103,932,933],{},"summary.needsHuman"," counts them, so a consumer can decide without reading the entries.",[883,936,937,947,948,950,951,953,954,956,957,959],{},[886,938,939,942,943,946],{},[103,940,941],{},"tool"," wrote the file, ",[103,944,945],{},"runner"," ran the tests."," A Cypress plugin reports itself as ",[103,949,941],{}," and Cypress as ",[103,952,945],{},"; a converter reports itself as ",[103,955,941],{}," and the tool it converted from as ",[103,958,945],{},".",[883,961,962,972,973,976],{},[886,963,964,967,968,971],{},[103,965,966],{},"platform"," is where the test ran, ",[103,969,970],{},"renderer"," is where the pixels came from."," Under ",[103,974,975],{},"native"," the renderer is the test browser itself. Entries with different renderers are different baselines.",[883,978,979,982,983,986,987,990,991,993,994,997,998,125,1000,125,1003,1006,1007,1010,1011,1014],{},[886,980,981],{},"Browsers are optional."," Desktop and mobile tools leave ",[103,984,985],{},"platform.browser"," out and describe what they captured in the entry's ",[103,988,989],{},"target"," (device, OS version, display density and orientation, locale, theme, app, driver). The run-level ",[103,992,966],{}," is the host that ran the tests, not necessarily the device. ",[103,995,996],{},"renderer.backend"," is an open string (",[103,999,975],{},[103,1001,1002],{},"docker",[103,1004,1005],{},"cloud",", or your own, e.g. ",[103,1008,1009],{},"device","); ",[103,1012,1013],{},"renderer.name"," names what rendered the pixels.",[883,1016,1017,1023,1024,1026,1027,1030,1031,1034,1035,1038],{},[886,1018,1019,1022],{},[103,1020,1021],{},"variant"," is the baseline identity you control."," Entries of the same screenshot name with a different ",[103,1025,1021],{}," (",[103,1028,1029],{},"iphone-16-ios18-dark",") never overwrite each other when manifests are merged. Without one, identity is ",[103,1032,1033],{},"platform.osPlatform"," + ",[103,1036,1037],{},"platform.browser.name"," + renderer.",[883,1040,1041,1051,1052,1054,1055,1058,1059,1062,1063,1065,1066,1026,1069,125,1071,125,1074,125,1077,1080,1081,1026,1084,125,1087,1090,1091,1094],{},[886,1042,1043,1046,1047,1050],{},[103,1044,1045],{},"subject"," says what was captured, ",[103,1048,1049],{},"extra"," carries tool-specific detail."," ",[103,1053,1045],{}," is a tool-neutral ",[103,1056,1057],{},"{ id, kind }"," (for example a Storybook story id with kind ",[103,1060,1061],{},"story",") for tools that group or match entries by the thing shown rather than by the test. ",[103,1064,1049],{}," is an open object keyed by namespace, on the run, an entry, an image or an attachment: ",[103,1067,1068],{},"design",[103,1070,941],{},[103,1072,1073],{},"file",[103,1075,1076],{},"node",[103,1078,1079],{},"version"," of the design-software source a baseline was exported from) and ",[103,1082,1083],{},"storybook",[103,1085,1086],{},"args",[103,1088,1089],{},"globals",") are the conventional ones; ",[103,1092,1093],{},"visualRegression"," is reserved for the CTRF converters. Neither takes part in baseline identity, and readers ignore namespaces they do not know.",[883,1096,1097,1103,1104,125,1107,125,1110,1112],{},[886,1098,1099,1102],{},[103,1100,1101],{},"attachments"," are any other files"," of an entry (a trace, a video, a DOM snapshot), in CTRF's attachment shape (",[103,1105,1106],{},"name",[103,1108,1109],{},"contentType",[103,1111,782],{},").",[883,1114,1115,1118,1119,915,1122,1125],{},[886,1116,1117],{},"Baseline, actual and diff share one image extension"," (PNG for every current writer); ",[103,1120,1121],{},".actual",[103,1123,1124],{},".diff"," go before it.",[883,1127,1128,1131,1132,125,1134,125,1137,1139],{},[886,1129,1130],{},"Every entry is self-sufficient"," (its own ",[103,1133,966],{},[103,1135,1136],{},"viewport",[103,1138,970],{},"), so the entries of several manifests (a matrix of machines, one file per worker, e2e + component) can be merged.",[883,1141,1142,1145,1146,1149,1150,1026,1153,1156,1157,959],{},[886,1143,1144],{},"One file per writer process",", named ",[103,1147,1148],{},"visual-regression-manifest[.\u003Clabel>].json",", rewritten after every comparison, so it is complete even when the run is aborted. ",[103,1151,1152],{},"**\u002Fvisual-regression-manifest{,.*}.json",[103,1154,1155],{},"MANIFEST_FILE_GLOB",") finds all of them in an artifact and nothing named merely alike. Merging warns when one run reports the same screenshot identity twice with different results; give such entries a distinct ",[103,1158,1021],{},[883,1160,1161,1164,1165,1168],{},[886,1162,1163],{},"Consumers ignore keys they do not know."," The major of ",[103,1166,1167],{},"specVersion"," is bumped on breaking changes only; a reader accepts every version with the major it knows.",[883,1170,1171,1172,1175,1176,1179,1180,1183,1184,1187,1188,915,1191,1194],{},"On GitHub ",[103,1173,1174],{},"pull_request"," events ",[103,1177,1178],{},"ci.commit"," is the temporary merge commit; use ",[103,1181,1182],{},"ci.pullRequest.headSha"," \u002F ",[103,1185,1186],{},"headRef"," to write to the branch. ",[103,1189,1190],{},"ci.buildId",[103,1192,1193],{},"ci.runAttempt"," locate the workflow artifact.",[1196,1197,1198],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":136,"searchDepth":149,"depth":149,"links":1200},[],"The normative description is the JSON Schema (draft 2020-12) at https:\u002F\u002Fvisual-regression.dev\u002Fschema\u002Fv1.json, shipped as schema.json (in the package, and in the repository under src\u002F) and importable as visual-regression-manifest\u002Fschema.json or the manifestSchema export.","md",null,{"generated":1205},true,{"icon":58},{"title":55,"description":1201},"t8pET-8JrmcdCLktvpom0Zr-wrVHGcfJRj2Yth05E6o",[1210,1212],{"title":52,"path":48,"stem":49,"description":1211,"icon":53,"children":-1},"One JSON file per test run that lists every screenshot comparison, built upon CTRF, written by several tools and read by PR bots and review apps.",{"title":60,"path":61,"stem":62,"description":1213,"icon":63,"children":-1},"import {",1791993875572]