From 9c36c41c8501448f80d1c77496a61c8be9e4483b Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 1 Feb 2026 09:50:55 +0000 Subject: [PATCH 1/4] feat: add PNG export to visual snapshot tests - Add wkhtmltoimage-based PNG generation for visual snapshots - Optimize PNGs with ImageMagick for smaller file sizes (~40KB each) - PNG files can be attached to PRs for visual review - Gracefully skip PNG generation if tools not available Generated snapshots: - fill-record-completed.png - Success state with all metrics - fill-record-failed.png - Error banner with failure message - fill-record-partial.png - Warning for max_turns - fill-record-cancelled.png - Warning for user cancellation https://claude.ai/code/session_016CwhhCQfKzuuU5QfD5H7Ub --- .../tests/visual/fill-record-visual.ts | 55 +- .../snapshots/fill-record-cancelled.html | 1479 ++++++------- .../snapshots/fill-record-cancelled.png | Bin 0 -> 39291 bytes .../snapshots/fill-record-completed.html | 1898 +++++++--------- .../snapshots/fill-record-completed.png | Bin 0 -> 40016 bytes .../visual/snapshots/fill-record-failed.html | 1753 +++++++-------- .../visual/snapshots/fill-record-failed.png | Bin 0 -> 41760 bytes .../visual/snapshots/fill-record-partial.html | 1904 +++++++---------- .../visual/snapshots/fill-record-partial.png | Bin 0 -> 41895 bytes 9 files changed, 3097 insertions(+), 3992 deletions(-) create mode 100644 packages/markform/tests/visual/snapshots/fill-record-cancelled.png create mode 100644 packages/markform/tests/visual/snapshots/fill-record-completed.png create mode 100644 packages/markform/tests/visual/snapshots/fill-record-failed.png create mode 100644 packages/markform/tests/visual/snapshots/fill-record-partial.png diff --git a/packages/markform/tests/visual/fill-record-visual.ts b/packages/markform/tests/visual/fill-record-visual.ts index 2e34de70..bdd42b7a 100644 --- a/packages/markform/tests/visual/fill-record-visual.ts +++ b/packages/markform/tests/visual/fill-record-visual.ts @@ -7,6 +7,7 @@ */ import { writeFileSync, mkdirSync, existsSync } from 'node:fs'; +import { execSync } from 'node:child_process'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import { @@ -422,7 +423,59 @@ console.log(`formatTokens(500) = "${formatTokens(500)}"`); console.log(`formatTokens(1500) = "${formatTokens(1500)}"`); console.log(`formatTokens(15000) = "${formatTokens(15000)}"`); -console.log('\n✅ All visual snapshots generated successfully!'); +console.log('\n✅ All HTML snapshots generated successfully!'); + +// Check if a command is available +function hasCommand(cmd: string): boolean { + try { + execSync(`which ${cmd}`, { stdio: 'ignore' }); + return true; + } catch { + return false; + } +} + +// Generate PNG snapshots if wkhtmltoimage is available +if (hasCommand('wkhtmltoimage')) { + console.log('\n--- Generating PNG snapshots ---'); + const hasImagemagick = hasCommand('convert'); + + for (const { name } of testCases) { + const htmlPath = join(snapshotDir, `fill-record-${name}.html`); + const pngPath = join(snapshotDir, `fill-record-${name}.png`); + try { + // Use wkhtmltoimage to convert HTML to PNG + // --width 900 matches the max-width of .fr-dashboard + execSync( + `wkhtmltoimage --width 900 --quality 90 --enable-local-file-access "${htmlPath}" "${pngPath}"`, + { stdio: 'pipe' }, + ); + + // Optimize with ImageMagick if available (reduce size for PR attachment) + if (hasImagemagick) { + execSync(`convert "${pngPath}" -resize 50% -quality 85 "${pngPath}"`, { stdio: 'pipe' }); + } + + console.log(`✓ Generated: ${pngPath}`); + } catch (error) { + const errorMsg = error instanceof Error ? error.message : String(error); + console.error(`✗ Failed to generate PNG for ${name}: ${errorMsg}`); + } + } + console.log('\n✅ PNG snapshots generated!'); + if (hasImagemagick) { + console.log(' (optimized with ImageMagick for smaller file sizes)'); + } + console.log(`\nPNG files for PR attachment:`); + console.log(` ${snapshotDir}/fill-record-completed.png`); + console.log(` ${snapshotDir}/fill-record-failed.png`); + console.log(` ${snapshotDir}/fill-record-partial.png`); + console.log(` ${snapshotDir}/fill-record-cancelled.png`); +} else { + console.log('\n⚠ wkhtmltoimage not found - skipping PNG generation'); + console.log(' Install with: apt-get install wkhtmltopdf'); +} + console.log(`\nOpen the HTML files in a browser to review:`); console.log(` file://${snapshotDir}/fill-record-completed.html`); console.log(` file://${snapshotDir}/fill-record-failed.html`); diff --git a/packages/markform/tests/visual/snapshots/fill-record-cancelled.html b/packages/markform/tests/visual/snapshots/fill-record-cancelled.html index f297b6de..88550a2d 100644 --- a/packages/markform/tests/visual/snapshots/fill-record-cancelled.html +++ b/packages/markform/tests/visual/snapshots/fill-record-cancelled.html @@ -1,845 +1,692 @@ - + - - - - Cancelled Fill Record - - - - - + background: #111827; + } + } + + + + + + +
-
-
claude-sonnet-4-20250514
-
Jan 30, 2026 at 6:30 AM
+ +
+
claude-sonnet-4-20250514
+
Jan 30, 2026 at 2:30 PM
+
+ +
⚠ CANCELLED: User interrupted via Ctrl+C
+ +
+
+
Status
+
⊘ Cancelled
- -
- ⚠ CANCELLED: User interrupted via Ctrl+C +
+
Duration
+
4.4s
- -
-
-
Status
-
⊘ Cancelled
-
-
-
Duration
-
4.4s
-
-
-
Turns
-
1
-
-
-
Tokens
-
6.1k
-
4.3k in / 1.9k out
-
+
+
Turns
+
1
- -
-
Progress
-
-
-
-
+
Tokens
+
6.1k
+
4.3k in / 1.9k out
+
+
+ + +
+
Progress
+
+
+
-
-
-
-
-
-
-
+Turn 1" onmouseenter="frShowTip(this)" onmouseleave="frHideTip()">
-
6/18 fields filled (33%) • 1 pre-filled • 2 skipped
- -
- Timeline (4.4s total) -
-
-
-
Turn 1
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
+
+ 6/18 fields filled (33%) • 1 pre-filled • 2 skipped +
+
+ + +
+ Timeline (4.4s total) +
+
+ +
+
Turn 1
+
+
+
+
+
+
web_search
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
+
+ LLM (3 calls, 2.2s)
-
-
-
- LLM (3 calls, 2.2s) -
-
-
- Tools (8 calls, 2.2s) -
+
+
+ Tools (8 calls, 2.2s)
-
- +
+
+ +
Tool Summary -
+
- - - - - - - - - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
ToolCallsSuccessAvgp95
ToolCallsSuccessAvgp95
web_search580%920ms1.6s
fill_form3100%167ms210ms
web_search580%920ms1.6s
fill_form3100%167ms210ms
- + +
Turn Details (1 turns) -
-
- - Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches - (1 rejected) - -
-
    -
  • - ✓ web_search - "startup funding": 8 results (850ms) -
  • -
  • - ✓ web_search - "startup founders": 12 results (1.2s) -
  • -
  • fill_form: OK (160ms)
  • -
    -
    - company_name - set string - Acme Corporation -
    - -
    - ceo_name - set string - Jane Smith -
    - -
    - funding_amount - set number - 15000000 -
    - -
    - website - set url - https://acme.example.com -
    - -
    - stage - set single select - series_a -
    - -
    - optional_notes - skip field - (skipped) -
    -
    -
-
-
+
+
+ Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches (1 rejected) +
+
  • web_search "startup funding": 8 results (850ms)
  • web_search "startup founders": 12 results (1.2s)
  • fill_form: OK (160ms)
  • +
    + company_name + set string + Acme Corporation +
    + +
    + ceo_name + set string + Jane Smith +
    + +
    + funding_amount + set number + 15000000
    + +
    + website + set url + https://acme.example.com +
    + +
    + stage + set single select + series_a +
    + +
    + optional_notes + skip field + (skipped) +
    +
+
+
+
- -
- Raw YAML -
- -
sessionId: sess-test-cancelled
+    
+      
+    
+ Raw YAML +
+ +
sessionId: sess-test-cancelled
 startedAt: 2026-01-30T14:30:00.000Z
 completedAt: 2026-01-30T14:30:12.450Z
 durationMs: 4400
@@ -999,8 +846,10 @@
   executionThreads: []
 statusDetail: User interrupted via Ctrl+C
 
-
-
+
+
+
- - + + + \ No newline at end of file diff --git a/packages/markform/tests/visual/snapshots/fill-record-cancelled.png b/packages/markform/tests/visual/snapshots/fill-record-cancelled.png new file mode 100644 index 0000000000000000000000000000000000000000..3d7ab6354c51385c62166d117c7035c569684832 GIT binary patch literal 39291 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�)nXj@Q4Kmjp;fP$caVAqd`w>6h>8pJ0$CKVXq)L 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 vnAJY`tpX#3`u{OG|KB{5{-54fd4By(T literal 0 HcmV?d00001 diff --git a/packages/markform/tests/visual/snapshots/fill-record-completed.html b/packages/markform/tests/visual/snapshots/fill-record-completed.html index c55e96e7..d9bc6161 100644 --- a/packages/markform/tests/visual/snapshots/fill-record-completed.html +++ b/packages/markform/tests/visual/snapshots/fill-record-completed.html @@ -1,1151 +1,871 @@ - + - - - - Completed Fill Record - - - - - + + + + + + + @media (max-width: 600px) { + .fr-dashboard { padding: 12px; } + .fr-cards { grid-template-columns: repeat(2, 1fr); gap: 12px; } + .fr-card { padding: 12px; } + .fr-card__value { font-size: 18px; } + .fr-table { font-size: var(--fr-font-sm); } + .fr-table th, .fr-table td { padding: 6px 8px; } + } +
-
-
claude-sonnet-4-20250514
-
Jan 30, 2026 at 6:30 AM
+ +
+
claude-sonnet-4-20250514
+
Jan 30, 2026 at 2:30 PM
+
+ + + +
+
+
Status
+
✓ Completed
- -
-
-
Status
-
✓ Completed
-
-
-
Duration
-
12.4s
-
-
-
Turns
-
3
-
-
-
Tokens
-
6.1k
-
4.3k in / 1.9k out
-
+
+
Duration
+
12.4s
- -
-
Progress
-
-
-
+
Turns
+
3
+
+
+
Tokens
+
6.1k
+
4.3k in / 1.9k out
+
+
+ + +
+
Progress
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+Turn 3" onmouseenter="frShowTip(this)" onmouseleave="frHideTip()">
-
16/18 fields filled (89%) • 2 skipped
- -
- Timeline (12.4s total) -
-
-
-
Turn 1
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
-
-
-
Turn 2
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
-
-
-
Turn 3
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
+
+ 16/18 fields filled (89%) • 2 skipped +
+
+ + +
+ Timeline (12.4s total) +
+
+ +
+
Turn 1
+
+
+
+
+
+
web_search
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
Turn 2
+
+
+
+
+
+
web_search
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
Turn 3
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
+
+ LLM (3 calls, 7.0s)
-
-
-
- LLM (3 calls, 7.0s) -
-
-
- Tools (8 calls, 5.1s) -
+
+
+ Tools (8 calls, 5.1s)
-
- +
+
+ +
Tool Summary -
+
- - - - - - - - - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
ToolCallsSuccessAvgp95
ToolCallsSuccessAvgp95
web_search580%920ms1.6s
fill_form3100%167ms210ms
web_search580%920ms1.6s
fill_form3100%167ms210ms
- + +
Turn Details (3 turns) -
-
- - Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches - (1 rejected) - -
-
    -
  • - ✓ web_search - "startup funding": 8 results (850ms) -
  • -
  • - ✓ web_search - "startup founders": 12 results (1.2s) -
  • -
  • fill_form: OK (160ms)
  • -
    -
    - company_name - set string - Acme Corporation -
    - -
    - ceo_name - set string - Jane Smith -
    - -
    - funding_amount - set number - 15000000 -
    - -
    - website - set url - https://acme.example.com -
    - -
    - stage - set single select - series_a -
    - -
    - optional_notes - skip field - (skipped) -
    -
    -
-
-
- -
- Turn 2 • Order 1 • 3.6s • 2.0k tokens • 8 patches -
-
    -
  • - ✕ web_search - "startup valuation": Error: Rate limit - exceeded, retrying... (450ms) -
  • -
  • - ✓ web_search - "startup valuation": 5 results (1.8s) -
  • -
  • fill_form: OK (220ms)
  • -
    -
    - valuation - set number - 50000000 -
    - -
    - founded_date - set date - 2019-03-15 -
    - -
    - key_investors - set string list - [ "Sequoia Capital", "Andreessen Horowitz", "Y - Combinator" ] -
    - -
    - headquarters - set string - San Francisco, CA -
    - -
    - industries - set checkboxes - [ "technology", "saas", "enterprise" ] -
    - -
    - employee_count - set string - 50-100 -
    - -
    - deprecated_field - clear field - (cleared) -
    - -
    - revenue - set number - 5200000 -
    -
    -
-
-
- -
- Turn 3 • Order 1 • 4.0s • 2.0k tokens • 4 patches -
-
    -
  • - ✓ web_search "startup team": - 3 results (300ms) -
  • -
  • fill_form: OK (120ms)
  • -
    -
    - team_members - set table - [ { "name": "Jane Smith", "role": - "CEO", "linkedin": - "https://linkedin.com/in/janesmith" }, { "name": - "John Doe", "role": "CTO", "linkedin": - "https://linkedin.com/in/johndoe" }, { "name": "Alice - Johnson", "role": "CFO", "linkedin": - "https://linkedin.com/in/alicejohnson" } ] -
    - -
    - press_coverage - set url list - [ "https://techcrunch.com/acme-funding", - "https://forbes.com/acme-profile" ] -
    - -
    - company_description - set string - Acme Corporation is a leading enterprise SaaS company providing innovative - solutions for workflow automation and business process optimization. Founded - in 2019, we have grown to serve over 500 enterprise customers globally. -
    - -
    - competitor_analysis - abort field - (aborted) -
    -
    -
-
-
+
+
+ Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches (1 rejected) +
+
  • web_search "startup funding": 8 results (850ms)
  • web_search "startup founders": 12 results (1.2s)
  • fill_form: OK (160ms)
  • +
    + company_name + set string + Acme Corporation +
    + +
    + ceo_name + set string + Jane Smith +
    + +
    + funding_amount + set number + 15000000 +
    + +
    + website + set url + https://acme.example.com
    + +
    + stage + set single select + series_a +
    + +
    + optional_notes + skip field + (skipped) +
    +
+
+
+ +
+ Turn 2 • Order 1 • 3.6s • 2.0k tokens • 8 patches +
+
  • web_search "startup valuation": Error: Rate limit exceeded, retrying... (450ms)
  • web_search "startup valuation": 5 results (1.8s)
  • fill_form: OK (220ms)
  • +
    + valuation + set number + 50000000 +
    + +
    + founded_date + set date + 2019-03-15 +
    + +
    + key_investors + set string list + [ + "Sequoia Capital", + "Andreessen Horowitz", + "Y Combinator" +] +
    + +
    + headquarters + set string + San Francisco, CA +
    + +
    + industries + set checkboxes + [ + "technology", + "saas", + "enterprise" +] +
    + +
    + employee_count + set string + 50-100 +
    + +
    + deprecated_field + clear field + (cleared) +
    + +
    + revenue + set number + 5200000 +
    +
+
+
+ +
+ Turn 3 • Order 1 • 4.0s • 2.0k tokens • 4 patches +
+
  • web_search "startup team": 3 results (300ms)
  • fill_form: OK (120ms)
  • +
    + team_members + set table + [ + { + "name": "Jane Smith", + "role": "CEO", + "linkedin": "https://linkedin.com/in/janesmith" + }, + { + "name": "John Doe", + "role": "CTO", + "linkedin": "https://linkedin.com/in/johndoe" + }, + { + "name": "Alice Johnson", + "role": "CFO", + "linkedin": "https://linkedin.com/in/alicejohnson" + } +] +
    + +
    + press_coverage + set url list + [ + "https://techcrunch.com/acme-funding", + "https://forbes.com/acme-profile" +] +
    + +
    + company_description + set string + Acme Corporation is a leading enterprise SaaS company providing innovative solutions for workflow automation and business process optimization. Founded in 2019, we have grown to serve over 500 enterprise customers globally. +
    + +
    + competitor_analysis + abort field + (aborted) +
    +
+
+
+
- -
- Raw YAML -
- -
sessionId: sess-test-completed
+    
+      
+    
+ Raw YAML +
+ +
sessionId: sess-test-completed
 startedAt: 2026-01-30T14:30:00.000Z
 completedAt: 2026-01-30T14:30:12.450Z
 durationMs: 12450
@@ -1418,8 +1138,10 @@
     - 1
   executionThreads: []
 
-
-
+
+
+
- - + + + \ No newline at end of file diff --git a/packages/markform/tests/visual/snapshots/fill-record-completed.png b/packages/markform/tests/visual/snapshots/fill-record-completed.png new file mode 100644 index 0000000000000000000000000000000000000000..512454d17d2f97becb2edd611e06f8d55bb170bf GIT binary patch literal 40016 zcmbTebzGF~yFH4cfJiAwhXT@F(kMtsr*wCxbcl3|bdG=n($a#I)Br;_3`h(iAT3?L zd)~dz+23>a{(Vn;-amXl!^1OA-1l{@wXU^@QdO44#U{r_Lqo%TBllVz4ed?`8roeS zEDZ38*fp0E_~)s)oVpSknlA$y+WSy6v72@3_#=woK5_gwxT`NL;d;)I`A# zFw7KWU!&ck{`=fglmtF`;3B8%j)sO0j>I>)1MUY87-?s~ z8PVRnex>O>_h-Q?o8CHL>2_E{D`))gs;EfTQH7h#V_N<9eWW<)yy6In%OUa0_!<>! ziX!)R0f9b@SX|QBJ0UM6v7XTe4Lg)Ta)ReUC^(5-<~>R9DZkR)JOatcOom`p ztY@#4l3p@_BMaX=C6dHa8>c70eir)G_Ayo%__bPXBCI-&=LKr=>}Ng)mB=z9MsT)l z)+tt>MD=I~0R^5E20fCWe1p<$%JxcZsqI|29eGRlg>1_C<(U=7Uy6_;Tv=YVTs51L zrWXbyZ75;71XsA7?W)+gDI3Y^>EXc`4hW2PKBZ)q6l;X?W@r|}5x#o%;t&@Oj+EA~ z(q`w+>&EtNU#|{tvgcJW5k}sWl93N9{Ux|@3fy)$PK3(?%kNSK98#N-LVXp_sWlCq z&KEh~RSF;171|CgLR5Yk_wVWd8gf+*3KH^>;3sitFj;)U*_8Hn*LZTzHS@ZZW0(&Y zr}G}4UI=pLeaU>OBcg{-2}jBl!Pzog#IyGu8Lz^&o~G6+ly;LYdNyKy)y*i;$zIu* z>mnGbzLw;9_$67Tt1pDB$}vmgwlrvIDX+jFXeT9w(2}&|5FV=D&YY$p&ivAnrvKH- z>UJDS&eayI1gjUGdY?ZD#z7oq1K?&g!9di1RinmH`dk^H8tF= zCvkiGOPvWv^Fs?Bp0&sW?=$f8!%mt76@jdR(wdx>OT5Fl+cW9}(Gw!s_>(Hn9hUfG z-2I)sU)>LXoK$-r%ZpOK2sd^4t0Qp>&Xu2>Us^y_Z2qvSnKb;B@h#fo<`+@;HL>7`E@rtWYLmM{2(n zvfYd2fIqWd@0*&iMs29BVJiDMd%p&E#V&1aZ9DjIcUw0CcYoYI!%)TuM`vruhALLdS0|esE;g6{v=cpgL}1}N=fDsun)$?Tu|jy$>@mhYYGoa z;Y<9iy17&F-Qi)MW@c0$GtVsB>HH-cxGjPQ5#HC1FOvE!&SpDR_UjRg?G+1`eXG^; z-V2lSw@Y+gX0GwaRIqBc==#C&VNuww7^aQ0^IE;W6Fn)8=C8}8v)X|DG#&kH23=?9hKVq@cZUCbgIZsxZ)w?&j&RhPCGuQ<;A zbNNfP4=ar?iPIbx2cmbCaXOd4^+u`$-M}3do1%W~H9{oL3vRm;3$FbyCH7XfSUKq^ zvCWve4QPMvwp`AhcNqOT>_K2fNDcI?Tp>x?`tbw3Y4+g;UV~2rrS*43CE4iYnZfhg zfVBSQuV^w8VZ?~=_S~Rm8(-yrVI<|QLAThp4Z9a|$I6`Bsrklks#0IWm;Iw$VR}Yf zmEUmSZu7QL>;7!pI_mc^B4qZ@n?(;MYW%k!RYiUfY( zyxyM9h#Ni_hluqj>;}BQ+zpCsyB#1A;uai;`e|ywkwhipc^D;etshUhgLJ<=`ic;fKCs4rM zxcS98mqxgvUVoxlJbfA_nMhIb1KYf{UyMh%XJiD6Iw5QE#<{Jd^15Hv#@@ciQkPQH zBY8QIJ8+{RFy%$_t`&8_ALdL7igStE%LeboAB)N(d$4MQ?*<&?6x#|gK~YIjaTro% z_j5y0Ov3GuGXc(h@59Xvth4J-saN5$GGtU)Pm}uG7WlRIPY{ct)5tqocCBZ-Ij18t zGwt>4S;P~8VFYka($qE^73D!L9-f{BiHir2s~^L>e4_o zk(_*#ht38q5mf0=TDKY?>dC0Ye1>luf^JpV#=CahmXCd125E|rg3aqa_UCPFr-*r9 zIId1=7nrNP?k}?G;V4iNwjF2JO1`m`T9Rs=-ANq2+pVW54(TkWoO;pgN=D z(zF??HMf5&ueO|TIH?1!Y@NQ}uyiaFT;fxky4a*!Ll(Qk-`SrnEZ)2WpZc9pcX1JE z8~c!n+=A^lv{Y5;)1Z+~G7-`x>uH$31xjDVfKQ_ohii%}WHdi6HYZO;= z&Nt4jry(>4paI?C<*fmG=9~52om}5_p_@IL>nFEJWYFu|gI5eiR%hF7*OWO_JD}~0 zYuaMSFspvPGtM(x=SLHCy2-gef-(cJ{sI3=%;#WUUU8eE(%%^j&(+k5`4AoNb$GuwpUTBQ-#>OWc4b*UQadFjt zZj{EVYF<6`@!Xy3oSC_|tordL_|;ejPVme3r_D%DrlWx;u%m)-uXPm=Fi(Pq$Q4YFgAyGPNZF4ar~@Ajx6hzc^Tu=bXphDmY!OJ&ge zwj0E-`$C=e;lsUapTn@bsqhuLwlkwla*DGPuRVq|ctJ8PwaT}Gt=yoMF0QN>AH9O&U*O>t8%(ap2W}EYt z);VZ9ipMCFMzqNm>RpQT=T(;vaD7!rQL^uoZ4fAQwm!n_Bv?sY+8 zO$ia3-M3h{WtHPLL+kmD$az-VEn~fdo=To-mnUVRwbg9H?NjFfIEA2Z8AP&5PD)Bl z{%2djwa6cDPsS{PGV_HwEzzsrN&eSai^$%pz_(?;&93Jr`Cjm=lROw7o9~*NWNkdj zWIg*Gv8cjDx)jCe_04h|gWCT$x985U;q|!f^Pl*8NE-3W=PL(70*(f-{a(`G^E*uS zj>Gum%N2>xx+fGz!p`DZH=xtY@oz#2m}nuR5*U zx<*ErUKn{jK_Zi`5)y77b(8@#6GC>$KMqH^y=&m17p$Idc)r8yUGAu=O5R&ipok! z@U=dYL&3R3kvIalT%-M);xUp52LTwslcS@*qG8)sE-n^<4zG(lKEK<%(P|At)DNES zwI(Dca>r9|TXQ4=$m6oMhCr3hrPE8Dnx?eWLYbQ_XK^@qiaxh~i}8*kt8PN#=U$MF zORwAXhUNnS>Yx=er^a*NsS4e`w!mZkFT7+G&1Mwf4i~RmB&=*~k{eprjzy0Lj>-&M zKIK*@QwOUc&skY4Yze{>Ze%OR%$dTlVhUY&hQvOPp_Z4m^MS2NCq~HLWy&oc7v~ z`8HM#guGNh?c<3*`AUBF58ICP+vIC2@R%mCA9mAL1}zM}rhQh?a^beycv>Vlw1U1& zh6zs&O0=IY`%+aEJgbvkG35F7ugB<&>ae|2b1EpH$$2xiu2i5ipx(^*)Ks*3G`zvt z6rPIPe3F{=H70aa&waLj&|$GYYP+H(I)&9Qa`-t`#0PM%#7#eh!2vEm3=|cWxrO)# zdvLeCr$qwew<{Vy$ z#pBepOrFfsyWv)5Gzm{tq5!nzX&QW7mBwtcJ&In%$~=t{LuM&{>VGvq9b?fJ3-EQ=eKKe)fo^ez#L=6d9Erpb~HJw$3? zV4&I&E@QwE1Fv^pkE?7;*{*E)6mFCJqUGkTfU_PaootwnOtQK~weD`vk}24mun37W zqk6}MP~;4_wohQAeFGl}No zaXBKvywPLijyj#XSDMtI`i|4zKK=%R+4$sJMJMJu?_5Nvi z(y1wnMwO9hz)JUN?bc~|Znahbr|^PU+l9DM?k}ymV0CTX^MjgDu^IcJBW@81w3TeSqQbo7r{6{YCsBp(KeU*+d>*(>IWv(XeH;|1F)_jFOPMP2 zE(|e72_rnXx+}6+&$^_S9eOr6SP0%SdOZR94af5_+5fFp!?*2V{Mix@Ty3P~9|ue? z4q*a2w7zVPPy(}zalH`rm|V%K-w%$_`Y9{0t8Lor9c5$~Bd5YP zH+S2)zC4nRgfeKS5Ny0hSdN0aW@8b%nW4)zPD_bBHZ~uL*y-3l{sdo}sW~Muf<*L$ zGcCJ(EC@gcIID-Tkd&GX*`8+(miyjm-4!s%{9+ z0*vxUv7#)Z0SBp`6|Fj>OtpQCg8>RPsZ8-~jVhZNDaQ76#TOkWx8HI!VUlXfWds{5 zz9||{yT(|Fu>VN7gi7W`PGy2`uXl7`8sYwMhbCU5WbH|eG$>xM3l%OwK6yj>fuB;a z^xUY?U%wP-Gwy2H(Wd<5lgy@INs({)GpV(k{enHsW9(s-oSyxsV!lQPyabpO7wKo! z-Xuj!tg`^nXZe=gbiKu>KlKsybM5=ie^DpH8E;3rYV?xyt{>jJEADSpnXU6|Xob8s zCQKTa3rL7vLf_F!ixk;N@0Tn&uzJP}e&!6-@uuPsAdsiYBTy*2$QR*%-}1?u;gxEn zyTZR0AP-nuOAuqh6cYSLu%`Q-K00gg`6ONRn^v9^!jmG*eKP96)&pOs(jT!p z++lH2Gk=jb5w%HDd0bk>^=Z@6l7)~D9G~7D+VF8$nldNRD2n~W2zrqgF-5@2z$_?D z`}Td}6<-j~{=2}cbAbw6=PuRgMl;rDkYHM`Fk9ehdPLLF%%&gx4tzZydKTm%H@l1Ow|V2NRqXECrj2FSMy?0WdeIy z&B;GJLRp3GPN)6_;_s*N`$W;nIcph>Qe82&TZYdZ91GrCc@fEqoGIc@hfj_FDd}|l zF8EPAcq&tvRc@}Yx^J=5H;4rHZFN_>^*I_#Mj^agj&$==M)a6Y{3q6`* zGBxnLOZ^=k9#(XjekCuji0=^+9Ofk;eOW_$x zomVZa0|WjNYbkkkGjn;ro~#@$*;QbbKesB1Ob?to6K)j!PTsKm$@t6H!R={RH2TeY zg31fC5{PmmtZ!y;C3$(g_A z$mBw0RqQSdi~&pwOfln4}wvI0oxFRRSq`+iYP7!G-r`<7O#_AAL@+h?=4WrODABW7C4z$g4 z=DN3;(9k0Rn;kY5(p>Hmt?KQp@O!UN-;v7`t3HrPgLGqviFc5%UU~Qo+-$bez^C5~ z|GQxd>W0|pCh6wsladHFBAyq$jMP@Kk257ba!=*cgABO27WyczIrbw!G3Q&VUOgmQ z@&CxG6#3kQG&=aFDPZjT-t$2I9+?`8wIxr<%+Wh*8#BkQeM^Kb-P6NpYwu`fC7@ho z0~8YV+1-ivO*2nfLj`$J-+Cu(<*c26x*^MkucKlCv$q_MJosLmFa@R%eU|PvCU(B5 zs$6L8KyF+w!~oh_f>>1u?)Ka93C#rCObZ^}_+to~iIy`;XQ2PYjON=Uynh+swi2du z7rZN-yX0IrAw4}zrM`Z01JB9Gsio~_nn#sHb4?hCVH|UyB{vDrr7JK1cGdjt5)D9X zIVPen#l^W9vx4zR(6ORTlkJlIPHC*1I9|~|?%^Vmy~LQQw+#79hh25g;#(|%g8Z@| z-ligP13b)>sTKp_IiiPj(*=xS<;aJOocwvB+~b&GQv}|fwgf=jQY}{m@qi>a6#rIO zL@y&t!9% zLW^TUtJofn^D)m!t8elt;o^e64H#n@y!$3Z)}_$^$Y@Q%h}ochEIlc0ZIN+aZZI+; z#a6%=!>aO_c4kTOovlxCi)glO{9?XIMP$s1{Wv=!`mrI99;?{ zdgde#W5_kZ{4Vl&)9;d^mzoJ%*$_3?xfD@_0-4evqjdJRYND@!o2NvQ**6zD4o{O$ zo;*u^`3}whz?{>os`YFopm9UxG*>cGTNVS3^;#GPI`_GKoH`J!%1xwBMl z;N3#4IG$|$o}luCJQYB#QlucBeuKkm4CI#L*U8k2yNnxWLhd&@1@{TrPWhfF? zPQw9TCtiKX{vzs^*R2$a;oMw0`^PplaglT3h5$+QX!!Q<-JD+5`I_-XyFdHr(IM|{ z7(ooJQh_AfBbe(t`nW&DP^-Vr+dn?&X4-kbt}-YqA#jz%`&496ulRl{W;YnsDH&~R$<|lgR_)BMM_MUEfgdcBD5#ZfV++_qgE8(%%b#G|%4&As+NXT4RXOK(O>T*{-nnl<*1j-c`R0LE|O5we@xG)rK*a=2D`B?7sbmq2>{ z=(TXa+Lx6uweW~Vv2@g0nLm&X`gu~G1ymI=FxGOIZBG34WZ}=O-+NWAUe3U!1@Cz$ z@uS8dD=W`bpvT-G(GA>>*P7Q0x4%GCBhx-_6mh*7b9^?0p0-9yUXEO!HW)5%n2$89 zeGnnV1fBVAO4W8zg>OnKV~J;KufU6z^}=z9Bxu>t!|NStg$JEO@l8;}uPEEhdsl(K zjw%`wm94!8m8Md;6&`TATv0!?S~)8R6=Nzlqc?_LU5P2D#k0!dzLd z-xsy6uez5!ehPHa;j&Q>)Z@(4zLR^x)~NHQFPgLRbqQ}}lTp%O8@Ea)+1k5WVOkTWUtg@DF(xfM_q z5tR~?-7`%L{$}u*2PfI0i9`~sN-+hg3FUWxG&I9kQYSM=!lA&8>f06l2Yps_wc6IB)k5e8iXG!wKdSlCsq*hU4T6~TRCxp>_zKFw1PUt5 z(p5V2X>e_Zlgz>>7&1_L{NoUVLO8+7AGxPQE0j^)gp{KGu|M@eDM$vdDs!Jns<5Nt#P`voT=T;qnpPLJbUhNVk) zM6aN3{bvNk0(pUwkN2-0Ud}YTveTIpGMU&h$grdo7M14Q1V8(5MD?1 zT;0Q~ZhUfM&QRv^n#+KZ8js+=fV z8i+n2fJFP7MN786pWg1-KJM)UH}eTa(Y`QG^qi#P{2I(I2FCl>|_J`d)1x| z?fNE)OFrZHrcv3VP0>YYv1hX4-7tcX=DRBt9;;j0nL||a%sC*$?QFQ zb@1{xAn>)7Ci{w2pes@o+8%BW2Sm|apB0gY8+?+?c6OV5;F>EG-$`K{#M;ojexW|a zFiuZiUeH*asP3u$tm~W}6juW@J$uic*~Xa5O2MP1d} zR5ip&SXQHiTXo1K)h;eY!RM^u1d>>;dA8-R>?vU~5b63tY5q7C=*W?CzU8ti3R5S` z48vH64Ndhm-TK1lyY)o(!=7`EDNmGP?9w$fCHCcgPW85Sc&Vvu&>r=%n zNulZd5|P4u`7c+I>;(YyLuoS+peta|H-1 zvoM?QS?V1WdQLpdhJqphG*=hOILi#+sR7zAnoVu^Xw@4lYoxlVEmLvZ5I1SM7(Jx#)0>T++5|4(VqzvlmXPMdfh*m5?|n&ecshJXX+`SY%V2c|F#^+{E3`I zq-0s`TsV6AnP7`EWDVvecdS(d*dHG+05J9&1`SXIR*o(OUCq)pS=br%BA=tssryUj zZ;I%+K+5Ch78*R_`~&59+_Q09ZF@~F>huCkW}yv5gb4^R!YYI|RuSQBgp}B30zpmG zi6p}z)qo?x10TDpYuX+KsJZ9Y)~Uzc-e9&6#Awz!0s(zlmEb+VnGOQ7QUOFGL@@%O zEWPGY5+pJa5Rm0aW7H$TkiRp+rvyAX*wX$^c#vU*S`OOjJc5|dbv+!!#QfhC0b1Qy zx+{9D$9#RZqIf1BJjIx$Wo+kUdVIuVry1F87!iXT%A+F_`P{Q9rh;hkuYzdcdf)Nn zumS;*ne7{(Z2eC@x)s`|51PURz5bytWuo$fT(R=;BX0RSTaO%49?cf2`IPC@vcBRp zW->tt7$snKe%vbqt~wN#l3ZI#9p0D)kP96>L?^WmjI4F*N=P~dg;q3}yZ<=Eg4)a@ z&K(7+S0P0uG*4VUPjv|l?yPhDw{*qN(}H?SQd)}GmO~ZGNX()@B{F-!43#V5MU4V` zPXqVqKr5T)AbDXBgxhwBXp4s-D;(@IF%raY_#hX5Nl2-wrOBe51CR=Q0uu#wR!dz3 zKTiJ8CH39;*k>`Shdh?YRRc>9MLaCXG4RC>1&wd|+uS?fX}b?jrh#eDT0d(&KwQKQ z_6WRbW54HMh<508yPqI>F{AO&&5j~G*izSq&uj6Bu=Q-M@}Oz@*FezqnsL|maep82 ze_rrxd}qz@4lOmr9Jt+LV`G8ipy$Wp`P;xfwjrrz$g z1tu5v_UPVWPf6&%o7EXf$2r5<)>`@X`9 zJ|0EM?CUxvIM)N$J8U>QjGVn15Rrvp&eo54%^pc?o%CIebX2&Y#Q%5OY9z0BqmWYP)w>eWTRRq{IavFSA%FhDp}(}NPcMPIQAc)dlpN@lTac3qG7 z1h?>iMhsBY>y$%}2(!`kWmxWdBgx6z5Alu&O2G-(_;7Q3{Dvn`4}dPfbnb7v(4G|B z^URp(GgX9Hm7F*vNR1#GM)*g><;!6!W4KJ?2228Z)~;%~b^qmUJ3)fjIa`9nIb}_i zP`E6NjFS33afKlkm|mbRIe=Yd)`fBqSS*FaxilZtN=7DGT!a#6^>dqn9U5hUodz!% zz~oa(+N}^cJQoePX8dh98pcC}Od1DEVn{tUzm~T`B{H^#+yL3AE!bi9Z`G6;b4QN$h01KwoQUdyV z+TUyt16?b8FJ8Q5==Bq$2EC)i?imA|&(`5U$&~6NPA(*zXE0P zcNNm%*Z0)Ia3vvRTmmgVlCb&&6CmL zO4+e&vL>bwkl<5&E?U3yQI7tNHE)^mk551tE3^fi4-0#1s{?3h>YIvd$Kj?Q2iJQ^ zu)iA;bEL&+vH-E{vkeJ1PKZH;W<7z~GoZBRM^9xAf$ln|Pf7u?;7IJ)J9Ygtg9bo8 zrI-K^iSkNo;tC6WeYHJCr{=oaqfEiDCQ*(w&2n^Z>@_`Q$C{fdDMmTFl1}P_c2FP^ zU9cM9T5q5NJi@R1IbI1Tnfh9#dN71c@5rDN5^B`e@>M$x$^(q^{ji!H43lSO=<`g_ z;MFLaBAb9~(#R&@s3Qg5?@||6J#u71N5zo7>!(yetcoJ|ezrE7XC-nKYR{C9e1eK$ zDmm0u>C?G(W^Uw=X(=WmgZ;U*7FFYw>k^2_@wLk7kwVJzE~qyy19xPLiQ??@;mRe-We%lffyPgStoe*+%w3MJP+hWTt;Iw(;D9t|Dv^Z;aV z(4`^5MD!5lo(J}njFwCMgAQP@JG}3?C-zb*AldnP13z*~`a5tNj{(CA%JXhO`%1-& zMB-}n8dx^sDL2hQQQ;kKdC7sgsFfq%vx^}AG+-dV(*^;8HNe<_6=z6GlS1XMLjlyF zUp(IhCa_L^0Agw!k7Q7GVF0IqQ-;C^Hry7LF-yw%XHFJe`<^dsxXSVfq!57S>b^br zVgy_Pz^Q;-=kW{17nT;}fP>wm?g40dQco-+3j-x#jGhJDY_{IKZ|ITzfsx-}ivRxg z9)K|WNf7Z^+YGb`=?+SvDU~XnElFG< zSP3y{-5TU7=P~1!^=%x9p8s{n!B61f5f}na8tTj}a+2nHQS!g5zg6SFY=Q?qoO5x5 zT8rv>nomXbK{!9&_dPiF#}1dV0DFg=+~c9CM^AAGheQbbZ-1h`8Qas zgOfSerX9}Hx>{uOQlf-0oj;F$b`)e>8%{ICGqQH+d8xy}m^4jE9nl!8*KgRp{XvNe z<1(D8It+RpAb)QC{eg|nqyfvpOlXhJ%5XmFWOnCiJuR}Xy4HBp6Li1LeBXqm$P}Z@bWoDYobQVMR60eloFfCSYoXVUM4v`2*%Tl@J z8`c@n9lLqWe7p99YVg)ef0J(i91~kd!M`Z+5PGG@eyjfdw045*YTPf$JNFVY)AuU1 zo^kNieLt6lL;l0z0LmOnow-B9SAR2&Lk8PIcnqxPuLgn%(%~JQ5k!62nagF!Yq^*01=@xq4uEYEbdKpFEjf z^b*lac2o3x&vxe2ey`M4f85`_49Tor8HLL2v>IjSV*AEU6SdMrNe^1Sh)^8c-*w8e z*S517KXQKw-oAQkK_0JO6Z(7;b?kFx2;-WVb+!N`s0M8EMpZ5OplAtaBYZ{VpWGcP4iBI<_S3Rxc@`b(d-%n{jZ z-T$X=EOg8rWSCFir{FI+?yJLw3mx_+PVVWsMhNMUKslfX~977r&1-1)C-4xVHbDT?6 ze$d(4JQF&ds$Hc59aB^sTsro~inx34Zs7ZVd*CJpb19cb`8OKY=I-AO-&+3QffCg_ z@`?%v!+BgAQDY2jV8OKnv$8~&-_kHZXHtef4sQUW@_y_?N0m-C2rb!WK0KlL42&k^ zj0q_Huf`)g9%({~0pNR~>0_)j7TAUQ#)K;+rL4KG)!O&c25tF7Ir>rZj%9Vf)4z&1 zz|%IoEwpWXwi&Mrp!sY*`Z5?BQVs6`0-wvuxu__RWj=gE2NVq7CdB5>riG1nEKn%f zQcdiv!n2&4$s6F^6)h3zSqe)>KC`Ws=)lMS{u(pEG#vv(d5EH+*)Blkg5tca*=tv; zcQ#Zp>0*TEgsFL^>`2es+-T_D0&TE?vCZB=LW&$ zS)BmiC+8oM16w;Q3!@(le|jGbit0l?Uq!6)!Pat!0Ku}Uu8CrU-QPHT{(u)9A_DCslgHH=9>prS4% zz@0K8-_bmSSc(ogQ$Luhv<=vV14ja4r@~)It-qZwPF}TKyvJ-*9LfFg*=u&7oZ&=B zdAzFyh**j__@|q_F zsJS2It$)*y=C_n*Snz}i(a3>c{>GM6SL&x$qA7*&T4JiH64V&4nFy2mGw1&CH4iYQ z^0tWOpko=y%6&Fj*sxfx{nUb@A)_(xfPzZ;TJZc z;3q(Bx`!T^tPU>xup>9b!JsWVzTT=91I{=5&FKkX6-X5^ZQ-<^Xu!&u8xR2w_o#1p zYnKb;pze+1Px3`~W*V&}oYEdjkpbWC2lR+bAjgqL^OwH;2wwxY9yn`GEE%cS@Ks#0 zoF5$4wishd$|TSKx|~0L=bQDSsoB9jkOaB7zybpGI7_z^XG_)V5RJ2Khqm#4p z{v2-@lAdQM);PW66o*9I5K004TemSk33$aK@J_3&7nh}}YCx#7y4x}}WAC(x+BO$RH$ahGO1^-OH46c`IAe@b4ToDo~n_Rl-7xs{Y(4WTpEIW1xr>a zfI9g_KhQhBI+cj}lz~yV1BZ%08l!mHYBXE`z>V~{!73jl`Q1Poj`1(WRk^vlcmRrm zm= zog@3C%O)Rx<>IlGP8g>sTSv-t*Z^(vW9qt0p|u&&LuqpIe1O&L73d0Wxj?O+$^;rq zp_LU7O=|^Sj7{hym?mE!a5_J8Jf=+>CX5Q@Dj$3QBmt%|w>V1*2rD=mh;|qeu->)9 z30XQmf!9EYbJLBDS04K{7i-D{!fe1<0UW-A4i53li4XKLDRgQ|05Kp;8V5^^5a$f! z)bi?}iDr3`z-Ilf_N`q|DllVXR5%kwMaF6XgJ{w10cdCCVeilaa5(R_%IiM^2GHFwkRsk{(8o zKb7Mu88BO{LE2xyppd{U)6)aa3qyJ$1sRW?q!jT9#%r8=2@z1rkzi6Mho!Zb=~b6p{T&ELES0R`h)rDA-i<;%AxYWA_`Y8i#5U~oSqXjgkBjD}1; zEf(+Dnr4FbT2zZ3T~Sxev__eb&U_#ygL%!0P#m4%!F}}fLLrG2{#RT}Ac+Zx9^25Tdy=k!Dd=Tp;=v;dSKzai0SmE? z7*%MGPdEes((H`?k16W^zg$t93WTrAKUimCq}sl{VS;{h{Bd|?26v;xEI-z5tH1IE z;p$6sQbzn?E}Vh$>ylr4hl}B+CQR?;9pD)pfYz$e(fpq-vHSJ8-wCSndRP%)V+T! z=rL27=$Hvy+(IDEM#1Xm$8tw)5VH+1$>oFZx^-^S&}O%Nb$K-=B2sc{kR&4<*L>f> zg+mDgo)~R0Yt5k;5Fr?Re%7Z#v!0q&xsgF7(zu(+8Y#2Angr75@K7HZm6!htG?#60 zB!O~gV|K%9bXualsuih|`o_@kd$nPe4JhsD=n;5FOHv8r;|s5VbZkrhn)Xrr$+3Ic z-n~AH=*HKe&%}es?t!-`B@L+s@EDPNl1S-~tB1!Y!*IJ;KQU}>#f*B9w=FcM_ zDcd-Ft-QC=dUNMy+5J{gIA?u}wP8HS|09X#9$gmvQF)AJ{rSK~TdZv+kY%_91qXIp zFahCHR36mKEv>8sriTJbv8e{Jps=xvd^IfOP$b?*bu5APWh?cZoU<@s$Bc5nx9UzdR3G z=6_)b1A%3oS%g%Tjs>wKU7es>OK#EvJ{F>4^u(MpJ5TxW*`-&h1dC&SK0+&mh zcTQd$o)M~;lVS|FeTx9X)+mRYzsW~bd@)%aB%VJ-5h*F*hDtqi3Od?8n|sk3g0#7N zM`F)sL*JD$0t8E$qAW@tubLkS<@#O-RkXT^gqsp1FrJ+{FZ4Cll>#LKM7=FDQwp^b zU`ob|XsA3ANXi_5x$3;z(Xmcp6k;b|m5ED0;Aht=5lHzhl}nsrD0aRk+gd%TY;0Ah z14epR(-sGsyeaZ>Dv&DBt7!J82$KxfH*yyPnUo4Xja28~@#blnEL3skX*W~xGWLVf zxg5W);}O6}-np){?E}wpG6!C<9FbEnoRefp!6<)IsQ$Ts&yWR`gq&_UVE}UiLGLrB z;XgCF*r8#xn~LF*RgrhG!#ey&^hgo#JHz#ksO%3P|74AAr*Q2QNF9Yp_$B{beq?2B zPAN2}LYo14U~qA9hJ4Lej4j$nz<$tp(GMr3q&D5zN1& zvMSmz;5;hhwMD&FHDHf|V0fIl2vC`Qn?!(;QD#_^IXg>QUOou2<6x+W${3Ac!GpO0`oqUlq9p7nH6X?1k2Nz$`f2 zl#PWeSvFfZULylfjruQ-sKM5)euL+eZnLVfGTXOtXp@=!y+d08Uw?VQnE4;*r)v3B zT#45^0;?BV{f>#Qm1WkUJCwn)#pFT;#OH5==^S+0Fe<0%AfiCZVF2M7W0rk(#>va? zl&4;edk}y=OQe;)wvjr`{p)8eZ>s*SYxciJK!d^v5;;3Al#)9;tE>j76r0Lj&f7nQI*1wewvOo&&J5Qb5{ zBYnS9x=2SOMlqTlK+8jpH^r_O_BU(zASaq|tP;3FDxg1Is8eq;v1+ld^RcRRq|SmbxfD`~l!dHn^ny z;DBOmR54j5`8M~)csKLY#IVbg4!N?EbwxYe5Z?WD_N8~OTc;>@*W22uZ=uFBoK1yl z<9q-MTZ2T*?vN)Ne6@EJ{3)2(&cs$Eka0i!M4KC>AGd9$#t+L^QqdMkwH;en07C}X z%npT(Nj|&EjFAip&tf1a+Koz2^I-$zv4)?VDat#`<~a)f+zQI1n-PUP^{Zlw@enp- z?yPr=t_Swg6mnBtr56w6iHIa8zQ%Y?*cj4(fFT)3{{m=EMoq>@gbngF94G=PV%*6K zgpmkcwmCpYd0wPhc=&_BXT1DkKKw%=fg+>5`;wdn);v$R4whPoCdy9G^wQ^Zlx<_G z*5Yj6Pj0)PSR-koBj-Evb-iQ5;jV7v&;ouKqeBm}PM6;f`;~P|EZ9m0l)&cOIuH$V zGr)|cR;pr98|=btYe?=`V)wmBaa-LO_yG)XhHB-mX75Sb;uMIk-Q|nUq~a<50#@Bu zrB7x`|7uPfw@EqtoTX=Jl06=1QqGT8m(igNW*`%fq1qvqlvt&*VYvxB|0qTp1#~i$ z=4D)+jhl>P%eLKLs|Lg*BcWb}Y6aHF5BEF9C!6~lU*mR~_%g_dipx4X zd#&~8QeOj~n4UdOXL@CKFi@LdO5>j^Q%CCwR(zQHRln-(Cvxi^1pr7h``N zRb?A}3&V;cNJ}>c5|Yx5f^>I-bW0;0A|N0j-7O#>ARyf>Ez(^A(j|@XuKoPJamG30 z{l+`aU(YjOyV?7`ulu^@nrqIvbfc%-QiCig&P5(H5A}gO44QX}bU*z6$AdICCT}f+ zCyhu(f#bMs#Q_v;UC^#_tQ7#?F<^HfSALESi!*1Ko6(5FOJh_loj0J-u|AGek zkA+=seUTil?48UXyvX2~;F-Q%`B$$y!j-sh=#vv#tVn69+oO&{`__AXAecD76O~mM za{P+$hgfyoS5giu6vp>Kl~U@J7~iKtMS4byzh(!&Owm417R-9 z2X`@#UErjceZ#H8UD^${Ck-MqF$G$vzz=6ivw2Q?y5f|hhjdWOwspUe8nWU%%oxHe z4uej-l$`=?o@FK{lxaNL;AR_~JfptdjGZeT)5O%5U0dt#kN4!&RvUC#fHB|qXhd{S zz^!G&7-2~4)~Jsm3Jp(0J;|I92>Bjc$G6I7ek&DFme-d zRP@7V27Q4ujSMw8(rYgxv=NRkMPWE$oetmgYRf459B(HZ4Vys+ZiK_a=Bqi#d1zvC z%N|KH8$3)IScZHDE#}!bL~p87palT5A>u2eBP00;LrbVm(yi5jFjUML6DwXxI?Cnn zYO6!R?U4(<=5%sO`pwNrimhgLlvvHD5Lf z2)HsweZDz+2n@-E1%==oMchPe%1kOUN)gfMNnxMBTv^=Bjzzdi4#Q|dTHgj{kgN^? zXsy_b6@7bFNttN-#_RqvwP?1TKgsuGL2URlNk%PC6RcI~kFzW9u#EN~fShGi)id}V zr=0TFG?8R+0KTvpkJp=$pej&wl;fj#<+1f8S!|P1F*@n{H20aXH9l`f%Eeh;Hcsw} zUL|XM=>LrmM=g>V+%JO6%1YCj&De}b@ zGn~BM%U*N}!)MbS|F&hRR@&r?C(bZgsNQ%`%pes>PdUHGAtDIxGG&rOt$zqD0Wq4G zPFHfrT5|nJUXVYfAzcHU2#7kv)Q%gt7g%VwzzD&~DVn8;pgw9}g@O;jSTxq; znH*nQR@NiwGR0m+Jk+xuGbensTpNzd6Dl(>YLjkm0Y8$TKGl02^7J|_C$VDWYQ5hW zV~vKzZP`|b|LcLPz1C|^ZJz}ZUDfa7GRe6INXQ~k>4S>k6=V8CZK9I98MUu)XR0ji ztRKYIumR6Qd`O`cs`8DjEGFX`dlvD=@W4I?X>uEl*i=7dgQ>wr@P zpQVM(2VC$)So2M5v&KRQ!q2g(2+L&PM6`xSr1)au9=bL8?lI=KO6I0Z7oej(VxF9E z1l^aDir}2y4!jIpGDdLa*rv!Kuj%!}7t98kH)l8ub^M6_Djid0Y>x>mrkI@q5fC^@ zQ_3$e?_OCHL+u9`3yNLa;sJ28Kt2amx5JkrbYrdYcYm#xy?(l3gb`}si;{dnzo3G} zAgBHc;i_PkHA_+%DO7Vc^AQwz-Kre`j{-PK$-7(EkAQx89;>7k@DtQ_oTx9Y&EeOp z$LJIiurR~sOFc5I+zscCT8ERHw&`*LHxBIE*akZJu?}c)eF5gp*B+rIIa@X>+J20d+40V*9kJnNjSAVab1I+ zBpDvo-FgwmARU>%`p&%Zfk^69l6ZJ}IQ)~om-~xZ#sE$>H$~`jLHc;^?=!X$j#YD1Ybo_ePN)DE6&udst7<~n=Y|-jI+^ag% z*x#66$ec&()l_~IU-rvr=bLKZDD!3BuE=L9md8n@W*h`EOsx82j4Rk679GlzK&0j$bE%M-7_b2Oe`!t2gLJVtjl+hacfer`+qoev=6d+%9sT zw@Bj(PschgP%uC|!X7VKPZdmUSXd-d@A+9RGtJa!IViV zv=VNn!R9Ue*Zf%jx>2O4qk#}nFV$8e;ZgAj7c#zCCczX zN49z5y{^7~+!_<4rKFQScoOV(;S`HEx%o^3-h{q|q}|g5)zHcW{`+gn;c0?lF$_S) z{d!D44p@DZL#oUb4RkUf&9I}_*<&tzq1i~Sa!ww5fp(ld9agkXm0lOCa&A83V8ZND ztgm@=Q~zlpaIM?DM?&!fyYAOKLq@Hp;jm{o@fzQ#{?oL+Qy!fV`yl>=)+s8UOLxD{ zv4w#!4D>B`lGpOYbxQ(+S!%_t&+3#vF}0-)wO&UNdA}b-FE%vhZ&*Rw*OVN8@@UY$ zRTEh8Z(-$@&_X+*5Rg_8jrCjThILmuBnl^i1Dpf`@utdjlXS?K$HTvdIv>M%Td<*p z+k;OwUabEUUpq;K>5iFI1QM=RjXBZB4wn7~56r&`ZChOa+#h6jiI#Iq2#OQ_hAjh< zwo0afbM@oL@R7Nx2vCIXM+vDHZ!cLaAjoNdKkx{|NiQ9^NpFk+k?!93RS()caa|n! zVH-a?-QiiglX#Dq=pica(H;xu%SVHyVI`LM(wuFFRCIDBLu-zpmjdO|*l<_B4LLMf z`pPA9fBCgJ*kFF)0|`uD*ZViaznUfUdDwhZG!(%@gyT z$y!~*q+$i}nuDx4u?Nus3kv}H2fn1#N^1`V&qHzv7OVGBIP33_j9f#7c@ETE^DmzhKF?9gaUdh4 zvh!uxvvkAcib$1o=wV>0x+POdy@QPYe&py}2ne%mmj~cO@o7$o8g>wPgYBQ00kkWd zprFiK4SuL2Z^6lRvMc<4W;G9#V|b!Z0O1027Tse)42?bbkqz?@l!oK+;?QV*E*Ajh zA{GU&IHQn+gaiYe@zI0Qj88(ps=VeA7E>Zp3QL{Ns66^eVD|Lodz{jr@G}*=;B#U0e*yr<9R)L7NCt6g;fpKf6}z9Y5*d6CB>h>67M_x|=Fi?Z+G_doEAg z!Qj-2WXQTmn=*h0O*yXTVt`kIvRE<1yuV}3I3R>`j#l?FhQg8!Xa{%7Ap&m=nw(LR zAMEKQb*$MbBZHe(XyJ+P@9zLV=EAxdeL%qm3Ft(h%i%Q-g$=C-J{{C&?ofVag<>3) zH84DwZ5=7{fv7$+$rM764%`GGEf7?FnTF0@NPXX>Z`*POxpKg@220Q_xEG+Sgv3lI zr#tNI&q31&{cRH`_wp%5{ZgWYzBXuyKpjh#0d(chNt~w{EI1e!Qq&_*JD^8E5=6G? zw~sZ7L^;YPsR9P1HxKw#B!~!RIY^tARufVde#Es_PHJDEiiPX41htuJ5xotq+-zme z#|kR&G04RS_bV{fK$K+<^Fh@^i1AG+l&DzQKoB##uD{o~f1RP&W6;6bv?UyeC{*0o z+B0hAorocQ&nS}>G*gL#3e$9RBF1^D!lA#GLAq{ZU_uF{Eu*h_=KHL;>^l8(#@)EE9Qq&%dPFAL*hQUZhI1IEcie z4jfq0FTrct)D!`_-su^g0}l+)faVzIe&n2~viW3}vK;-|noN`=p~FiA1qDS5S1whU z==WC6I1U;zkg=T{a^l^z5DNwQRihIVWrfvb38qRAY&JD7{W$9DD_^h?z12XesBlUp zCWRNPAG@xco&zq*10{wgW5jrJ#0kg|AqdgKlg~km287}2C$3;){4Ii)@IJ;}oF#3j zBL4cN1Etf4^68m3fSzl~3swNU_7i+voW8=I)#xMI0ki#LA~W zvtbL+j@%DKg5)Rw5?=Z&+M?9BH24^c2Q`+~mXG6l%AF>JY`P!eVu5LTNm0?~aydHF z{~p78jarrqmba__?3~5y$q3mTtlNPc z-r7I2c@)DWX|f6efD@07Wmsf=j%oF(>q>$S-r;Uz{m92qlJWysX(9Ox$;my8qfUm-!6&8oRyZS}MYEp0o}F@GtF zW!jPTTYCy9IiJ0+*`K(!_X!O#YQRO~TvR7)Ojk$B(~wsV=O6hpTv7J*j-h*U`_g|j z2^`fyV678{B~@Qf0j?Zn=vEJc4j5e8oja~fe{>j8dJo&0R&RM)(OS80!slyy9{boV z|16-jw47lqSg9$V9=R>Dx;f!3_v|aB8OL&~#1+5VS0SF#WGmlY`!OjCAhs zQOtf33sN7OrOk(5Q^Q^Re|U;K>LKtHp0do?Y^b(nxg^Xb7!GRhQrHfFM)T2>SD!<1xhb>U=$U}QFckuixgG*tPZ{CWoK-yL|0q~L;r zB?X=&e`WJ}GedsI+K;^pg#x(8zcWd@hj}7&bwwCapqNOHHj}%}{IsI!Zd@R-70tvS z8OqPLLn!=#ri~Yd-$|L$uz`MguGnD1e*QGhXy@sWzcN7I-KJ-0T8I_~uOJVO=xF&^@Fd z*Z11b{c8neAmEf+aL9tF7G2^);pX#f+JH<*X_FsV7^}YqcRiF5LUky>%hq+4%K`ekK06E??sfb#2Q_-+e6!t!adV(xdzitpcpAqx zLaSm44h9HzEg4jwWe&6F`4QE0n{+eh(2`*Ju?c_f!UTqL-U8V@CVt8xdkycJG?X?JdRMF@-!-Lu%sh4gWI$DV%u6#$WmZi0GcRKO0sFzZ*q#Z8%ecPLcPqBBo?{_&U1r(fCuM<{N+eD4E|9&k33j}&xk zF|zbCaEd*Of13L+-T%&$PYlx6VXI#`k&1Mr2PS2FWYls43BM+2B~}9pPeWhD(hLaz zZLhR{!6&+!{*7~?HYZN+Wmy$ktH+(wwY4p=ABo{=JX}y?LE2mK$rBoy6S$54aw*zeOp z=ozTXz*>PFOWR4+TFwY}8H_+rQ~JuX>tmd0+JQ}mjx2<}o0%DbGJuU!Ff0oLf{JK|XJma;^)fJC`P`aY5AAHF2ziEE(29DfoiydTBPJHQbaypw^@=fDt2 z4}b`-rWTMpDzdgLE}{lmLMZUCwhC4F&*6EIg@abLGOG307G&b_^b5v5*6trf%SVUMg++%CeMI;#3=37(+cR{aUC8WZ(ICHydk@B z48$Wuyn~TRnX0(Gi~>Ux{+$>X;W9B&5lWu9sdNIv?qL-fz#`w`n6 z%fV7~^(W4?x)5f`E|if#Fh?;eu?5-nrY6qh#hjo-pliQXY-wv*h+#Ago?jYkjnd5A z+^CHWEvQm3m4vM){=$>-KPvqthk6-aiAtKZ9tg&0*^CoB^A;Nay6Ju(Kj14Eb&DR# zpm*;+ZLEj8XnbRL+3pO$8$QFtPCyyYbPtS+e)=(sh_O@q_;o@8=^y36zlh#F74c`y z?*)pD1T71?2reX9oXxW3NCu?p}Yx zFYT=V1=3d(zuW$l;Ws&P?nby0mK9ZM#bLsNZR+K&ED00*s8Ztp+=@*XIJ5;V)||cF z#sX{#D+U{)?7$()c6e&Q8}3`ZjaK9oWzMsjl$JHqI%Z4YnD z|L(f|$DaG!R5Oxykf(j^;|f&-3MsRQ8CowW0s&{_%27O0MoyYEfi|KD&nsc>A8uN) zD29?1cw!QAQq$u?0&*U=SkO;aR5(C^0M2K#nfPNiQ=mwhaiC#`70*^STuOI-qO1w1 z1G*{4!+e`tFpR+IFy)2X6`NcPgtS0o#e|I)Y+A;20kSkQ(ASc~gg}W$fR!I$AcId& z>RDX$Lug79eaiE=uG0S*;v%GX_Xw4s)sJd~4JIA{>Hd9OGaiych;zqC4lWx&=M8F2 zNbg34B@Jadl$O1$5FrR^9BSPQete7{`C!6lCJxup8r69uj?P{a7xsmu;h|K`e{}In zrZG;Q?qNXv&;)}h2;BQCj&aK#S&EFvQld<5I|aUEYB7H+$MO5nkEG?4U{%nA%-nS{ zgL3he4{oWWgO)w#vHG9>Vi!m^L)$Vf|ET9kKQ0e&8u)oAl;9MF+8S~))#9`^JxBYD z^>6?Q+|E;`!+2r5!dOC?Egg2ltQJ}s#)hLl#Pro?JFcG!cxH!<+TV`h>4hGhA4UWr zwo-&K{<9{4;{Vr75(-q)Jb$>^=%(~WKZ__Cb4IWJkk70W@{*RivehG8S5@&w*Jnk$Phx955qC2-_rpsteE)CVS*EGK z_mLqzkgD=EnckFH>yVn-^yYWVe3`TpWy>-7W(5zW$h10^F8V#EO&|3H2P^k`Xn1$< z?%YwMFTIjrGNK~%6j_27@D001zO+7Vd22xz#zl%G=_fJ=|1Rrd@}4>Jt1@_ zhjX-g^!X=>{LHXhHL+omgEB%<0q0LMKxYa_E6!Wc{aX4GER4L*IeH;i^VyzWnxxnN z@K_3OQP@Y=VdVf|aa)@(|2ki)a;HYw{*S%z@v)1ny!;6C{#h4&hdpBrV&u&sh4MBO zL7+530->|LC5NA;N1Zl$Bt{2M3*mI>2u zX$i(&U`UeyKm_3!kMrk9veIT;L^%^`!`$63ixCN7my70RTtSA!9Gv6OVFrgSH7>oE z5DR5>*wiFBNVM&FY8Gkq=N2lNz8T<`uG_v}YQVxW7{rw@<-`!5f#==u(<0v*7X zgaMB|+$$7p$`uEfPt7FfSnhhaT8wMXpPt(4M(wUH4#PR2@87-B3X>K(*C2}-^)3S6 zgJ=xu?x?QruJ-*%wJukIMgyC6v}AG(1Wum<{f|g4l<^$Wpj)QbE9S=NA3gbaxl6`&*R?9L>8TsmHUtXoSyFZ^XD!&a-h6X+gh?B z?@lr>q=X%z%5F{)f?72hQ zYzsS=PvNt!r-;TW!zusH{}#AVfL>$6mo!3#3}iD)q$MxUFFSra7B=QWLKeZ`{DCes zLgNCt;AbI^pswjzJvwX92Wekt9Vdf>mb%(69x+8}W$IPT&@puI7UC1$HK$~E}zlRg>->>yrQEfBmykBK&S5n7sj$4$~kP{DBOvrt)2Wc!pzQ3Qj%$INU68d$e~j!(a$i7_;>c?S~FR>c?546y#5tx>$4JqTg9RV^HAbe889 zZIy*ENsgdQdK3F&=}x&VK|0%*fwg@P0l;~%ctJ2I7mmp>I)S*iJdk8~j1%(Sp z2{P)oZBi}t65-veR=)YnJ$t;QoDpZL1za}ltc)X{8yk`F-?zU6eiNKcsDViTBZ2{p z4UQc%7nWLGEWZm2y;WlJ?ySbj`xz4f#T1UUx|WL))Uq@&raQ@T&`L5hU*A7(1g*e3 zs2v_I(oQROyZOX>XnY`i8>=?&IzR44F*i?$^inv=9w%c6RxNn6D$1)<1_!yk^s%AL z1&I&%sWX^>{<5lC)y6;qVo3jZED%Rf9D_?x%)&2<;4jFH_ zsjc$1({W<+A9=ToJ&_8;Sr&o13DPJpl$&1p?;G*)e!~wgON=QRj%yVJU^SRgasNGM zf|gl<(Ya9*K0;6MVO8P(C`kVA-4TQos4io;Qt-ANj;>tKw?2Y+XDIjXf0?gouBp<@ zYn>*ybw<&SX=Bu^F>KYx$pKY9iVr{UL?iDODk8A|+8OU#Zf4QfgRmdlr0uZTk5A#3 ztW7LO9d{#~#u8|Q9=X(8+Y4gjstAy{@#+6V|M~yn^8dg1N}!$lQd#oVD65ijn;OBS zY979*nRLknk^CAiK=U{;UxibT`_YJNn9E)wp{c(y!7AS++wDO3^;T++N$n-%8Ctl- z%JPZo>AeSplibHL6KXpX_d?@ewIQ*7ZRSnm{nCk} z?AMyi-K_W#72jqLg)%N?3rf{;sqD#7+7)BDl|p;B5OUay|6;ua_A9z;_O3J3kS6PW zu9djVnQ2?{_wfBwaZha16!Zl*)VPGQe6@7A+&^H#bg9lO`vPW1qSUcoU33Z9@K2@q>Fz)+saMsr~ZkNsR*8!`c6a?nPZ zEcmy>Ng~_62qSyIQ*|_ZRPVmS#J%WP`+EezPA-0w%K={j8glI^t?){p!8r|L7M_bs zlr*Nab+~0R2)cg`4~xSI(kQ40JcG~0Vh&<#8)7&Xq=+80d+wR`OJ0tM0&xK9+_OXapH=e67mK{G4=&CgI{&}jIgpkS@%VI%aS%g6zCM({V} z!6k)s0hk(xn9Ek2!p$bg9;U~rJ}+TCFwR7Fer#~g3Uf$)^DkUJ>W+Z%bg~%jUpUO` z1m7U$*FdfS=(5cIU5vqiKitTnrBeulaCri=a&n7u!oiL=0{IE>l@WPTA+^+*iHV7j znhz&}6=W9FtQGdTnROp+!wj>cl1cR`D!3O3P3-r;#|e=7Z8MA}s=KzDzi_haNX3?A znI|UK+Z493w0xYZJQ~OpCcA4RkK;_r`u9lwC z{ytFd13m?y{{5dmMh`8COOW`VMXT<;m zZMoeI;$(x&Ry^=nQw+hNfCGe3AHrvh5Mnm%f zUS|P&H27$}`LH8d{m8a{pHL3VoDE+;QUX*PFap{d{drD0V0T*18{ud|`#!rWnl=NJf_z4Or_KSMg{ zBGa*P^Cj7JsnirF{YI12)FX}4sbZl>*5=rGu`_p{&LRa6qv3~Qq!NEtq|1zL8%`cy zqah{TB>JkSDfDs`t4lOE((&dF_E8v>8~2i;q>x&|Br*(cn6in7BqETP#mCbC!4u2Y zOZFTBGOBNmP#XT7a38=-PQ)ZCNF%xQnrZ5CkZ;~y&2>(XRfe)sT)Z37mu5#L_4MxM ze)-y|rEgHtKxtvRBQJV;OqfO2y29&8p-HvYjslXpQU5x+(Qun&aKP$bsz@e@-}tfy1W4b{&( z@JHEeHbv2FfSvQ9qJeB(% z)}B*ky3E}MSI5Hp5OA{3?R$P7rWt9&2?C%F(l)^_kXc&`DOdNwgsaI2?r`0T_2Mfn z3KEKTHaYU0pHstwji-VwX~Jg@V4nid)A>HiLSM$e&U{Il7-+~JMPWBa%8^YN;Gdpq zkfT-xN%C}1U1!|%Knkhw*?~9q;m!5g&8LCYGhyGeb$DulvO&ZHJ6(0)oX(%#inl~K zi=eoBzZ#v3!y=YvxeozwhZVt8>na&nc;hAd5P`5g{QTbw9f)5p7N}Tpzg{i6 z8O*pE-aDA^y(H21?31%7K5v~n{WUh$IBfs$%bpr_mRL4NJ>p)HJyRk4}<7H@FXQcsT`I@$Sn)I#}zSOLj* zMY{dnw+(RvDO~&Dfjx|UV1P1*cq`LZ(T|3lVC?rBR zhC$KYT4oDnS$;h_fVgJgEl*iFIfQc*Mqy6DkW?7D``XkFJIfwtrpo%{T|+FS=DJMi zcVh1~W(eQ(HG?BE48~%CVuKRqLyCBN$9iS?8S}^aBpfb)|3fNQS>XD=nN4yK0ayFk zni;&3wCU3?5kf^dcuwTP!yy9-F*cN#n7HGzPG<_TwTA?oQ%b#dgePG}8F-CX%p(Ql zxf0ATtK_~KR0lcp4csiur*(Bj(bK7?)fR}k}=7gfKj>7$Mhkm^vbv_2Nu!Z>Tfkx zMX9nmlA}1Lr{YG3>{!|72KY3wi?#}?=c_jh3QA05`oz)D(I+QoJ2tA0R5jEPr+OMc z`uDWPAM=9zleNay`aU=KVoQT*$l5~?LW>Uy98`(N@cS0P@NITi<9muqN?lPzSRkdB zv7T|~kb6QoaddspN=)geOB%MYP#4fw!C1RuN?^&)q{St7U%DkGhOBF|M@<->mAQB- z$iE^SYtM7_>51IQ1M3aizS(ABx=?7Pp~k3GyRGIDebZ+8dx8ndBXKcz5|oo28r%^3 zf)%u3&5!>)-x>}x{?*-D9ZN81*>GMv#yV-Jb3fur(-Q>cfa~6LM4r{(6KsIdKz&in zRNLonJ-a;J$*Z>eRM_hnAOCK)PEgK4=@AO{cIT=`(`mQ~o77OHP*<1T>k4h&Z@%15 zJ3Do2Mx(3=-dIk(f)^6a@Q1v5OwLz>UDVl|8^J&v)EXuM!$M#E+1&ue5e#UP6`;)b zwI|MRZ-wiZl%8a4h|nJ4z^r+Tuk$Rfck6-8P|o%OJAbe2ZROK&-TqyajVO))>)gYiJn-f z-FCH3jt|?qsIg3j7&Ffu58;KIVTrFLU(21=xqOZ_uAg$HFtId`gl5Cw?H;O|$eRHO zk@x*vmKE{pvHOBgLK{a#HBv6i%Nxe#cH!e!fNzIVV6UPkf2o8&`(~m}2j%eSR-$z7 zhb|)?iilaMsS#OR5d8`GqdaZ!l7DwObAj2JWT$>CgL z6y89FkTIMgToTYK;XE$&UJYT@Xo)H%PQOHQX#rull^U9I5k zFB$b%QXdttdV|dz53hZjt3my?Ut{AMQ5Ge1EadSX|?j zv*Z+0Sx>D8-eRN4BQ0y`xwK5E`_34VmX_Y??+qtSCc=5Qou{FpXjE>jLzD{T!hH!V zGF7a5Au8rI72kfa+_Z5!l+JXEchOkvAu==%F05IW9Qhnw$TH%HE%zFZ2C00e7C$S~ z4;nOl9J5-TJWvOHRHJvmq>VZs^V^a6;lRSe4wp1^A{Hl4vv>Z69ZxQN;%FAEsiwjsF5tc|AiUse97`#pKh4B<$Uh zM>uL{rv?UeMqXu?&GL1Oh^nb+59va9G}iWlsF;@4+U=3$mt}l&u9SjVDmeS>tgIqD zxJ%>3BwV&O%iHI!kB2Qv_`K=JX~@IN3u-smX~WN@mGB7@;?L)?h1ZTt8#{7O7$zyW z;5vb4Hg{)M489K$i;J?ZuH@sW*PCm$M#IFm=FGpGiX(GZAFi|Li$`wpq+vx+@=GnW z;Q0I9Bt2vQ`&-uNfG2^kZnDvu3`khNu`$l;i@hcpDX9n0P{F@@^*z0|rSpWrB3W9? zvZvy}+cP?ei4eUy-`rxarY%q=4Ymo$ndpcsv97JSrlR7PVyy`sFf+ZGPfKn5IoQ^w z%>1CFB(TOSH@N&4E*d(Lm)GCBeXRsA((q523f$FAtD;&L>*T()IfyupVZ$hV*2n8| zL4J9DQQT@7^@|MQeGa>R8P7iQHuyXy5( z3~9YR-m^UEAlOVH-Lw?+jJk8_>Tv8qg%x~9ObJyYn=Z6B!j?&skrcMu-q1s52G*z_ zOyFNWaI$Oe+Swq1W!2sG3%5)Y12+COxdCV04MUr&dr=l213RCRWATR{S59to$;v+K z?W03I8&-{j4@bIbJ*fpK79lMN8+Hw&R5^Cw{cC9)tJM&EbR8??sc^XHs3f$Oj zMIDvSrGQI|=2^L+$|ld=P{F;0Ih)%%$DQ9{pd4YCxQp6T1K&#*8+8VTB5N-}CjsF( z*L0IS*~t-k?_Z0fV`?k#mKB~T$o{u5kH^Son^S@=Na626_#0S(-~ev8oTGx>9M48x6^4-s2wuTrF6FV0gj`rtoV+629F`RXP#SzLEJY(=VJX`Kpix(Hu+!|GkTm6fvOOK~$Tw#wd@MdbyuW`C z9)nj$LHDpICfm1XDSZC6(vr_YTVrD2&=H9EzE&q>Wb{$;!_ycNA1GvY=SGA(pf1bbR>t{CnrMSS% zdHY_-E8L8s)Be;?f+8e&!Fv|Nni#=z5hb+WG&vXv(E+7PQon0oYB8(8op8bRKuYKn zgFm#Xje4tkCU9hq_lm7mA{>WNvetp(AG;ewZ~C(A+M0^ z*1R7(t+pGL;e@<;c{@R6*<2{pNJ`M~3F(+c|9Ujs!xM{kHs>z4-Cl&pN?XO#`8tW@0n zZRo=EK8o$vL6ybOE8kLZI^Zpjr-|8rEfD4nwXRP&>hcJ6bN^SZJ z1AFtxC;2lT!tSmggMb>3O9g-BLW}@#5Q)k$h#3*=FJ87_lCnG7-u>Mwq*5 zk3JA=5|AL$7?x|PVRQ)Uqr+rsP!!>~?}XqktrM8NcP{HY9{HN#`p*-7x@^7?^5)CX zICW}Ln#73eEHe?nu|i>Z*oER5J}KUd!H*m~UyPmGFos`}at^h>J(nR` zlher60NK{sNQ^BUpMPJyvu^zNzWo8SL2c;Vo7~Tzc{GT={&VCenkiK@(1>BMO2TwI z3Cr;Iy=iuA@j59e>;-dohL=b3a2Z)_JYiozH5E=y*#Vi?9txFl;yuo>xVr%iUe15- z3Ql;?(=&@#Sa=<7Sn~1J?O%FPN8c9`oD%23&HeJ_({B3KnU~NumyUk7vJyVf78P61 zsC>Lq56hL|Q70r!;PJS^Z)^;RjmIB>L#j+chxct01zt?ubn@&~VRlR1=TCC?ri>Sl z++>y2;tEo#c`kbBOHQ$1m~ojlQ^U>DbB{|D%Qsdpl<=8#H-G=$sQ4UB|EyPLn1hME z8EKZNVu;tlQ`>8U(6FlHH9W8Yd%jKC{5fzA3<1n9Kshv;Ev-Nn-o@jvi6K;qqBn6q zjFN#9BJO?=2-i!gM1L=*Fgvv-{k4N-h-z0KQ)2Z9oxfZ$tJ zfj?gU;G!e%`FXVgkgfLz>xhxBd{os;A?>Ce<#gC%4GF9+*=R7Skpe?KVog$R^9GBW0gX({=2h3`&I*7|n-A7x?TuQBiNtSE=*9_leQf+V9RIoQ1sf2%+>6#lA`n%0S~x)GZkUdmWk zQzJi2oLW8$QTO>b;S&-Xsw|%-q_Dh0J;Lq;RoU07tFSL zmZg};ZQz-75JC^Z>0gTE68=)wKc-GU?3kQkQSx|&?IM7WBjFxm zGe8VtfynPg3^~+Hoo(J(Fb)RFBpfvDhAT=5COFiIR++Z+e6qayOyAgpET$ z{H4FJMw{)-_`qLGjGQe#5Oszn@L5jH_UA@0U!Vk$P^4w%)v>8$U7v^Rn3|HfRC2y= zdthZ<0z)S9D3rl#;UXXS-_^Lijp2Hf!Z2 z%(-3b!w<`&b;|91r+(;O#wQ|xTlSKJ zR8$QgfB_;yDovitcJ_s>9Ou|r90$iJh%u#To<0!jD^IA7>AB0&?Dhdb3OgU)qsn(e zwDMEejA}~ud})kKC|cTRMip96du}ABGgxm(AM0=(hG+QR0sFd?!-FNo#DkE6hEi4E zYO4J=fn;G~PjL1RE++JiL{$XgUiyhhm}7%B06genX?1Sv(bSX&p-%G}8FM_$5; zCQII=XQI!mE$|1V=`7fqQre7>*E4LK|KZhRg;iKnfgY?5^=UPF%-gQ~LK!Hf-QjSk z?Hw(Dn^D3ikW*1oLoV$Om`i`-c#4g2a4?LwJyRdEyey*2tg%-93A<=4S}OUCs#E&M@jT~ zzGo0&?HHT6Mo{_K#{$Q&bmXClRRV@79$*AOysoBnAeHNJYns0fLXwuYYhB;9s?B?> zr~&Tlo1DZv*`0sMLrzmu-UbYSqu3`3c@(Y`OmOFA)8P}|MZKp1tUzbBG_Q4~Rxv&y z0k9fnnv8(4KSxUesOmAn9l4t_Ak9eGZB=G6xQGGRqAtDVO|=x8SC=WnXz-H<=xj+ z%BFMkru<5X&cI-8pFZTu ziSsDNu-__+qvf~z_pO?kx?r|TQpNleVhMTmPLb~8#FpFwedgBW&W7fcjkFVDA_a zN&la!U+OV5fTAWoi!=f;upXiM1%|;rqKx|QzwqNofD8W%M*RO?OZ@i0SOV zIi>!0pdg1}Ej~2Rg#2IrvuURURJoBW=miUeX#$lsog?uXGM?&ba2eT40bk?5AJ4F2f`WS3+YYD`fxL#P!BgObO^0 zFUKnmc6O(Z6+UP;h@wD*e>dElQS&@*j3+TaZn38wmfvT>M?0Fw7NUlD_v0GG{-46d zl~uS|x7_j!+BL9k16`M%!d;)9Qk}1*gI@L>|J8^p;;{nt7e~)iH8mwoZLGrsTH14> z1-F#etSun+lyOk^D>Wi<_AeFj10ks*@6G($Pyfa#)Yr*x@d^qHH$Gb?(}=j|-XfE?g@L`mY;&-o}6FhVZ8gUJG0_IF*baS?b8$N$bJsT z!mXB`5%crGdSReIzkUBM%R$(_>TJKHOzT>omeZ{O(}-FR578*n1pgjmKj-!hF6>3~ zC^v~&7rJ9b3xy`6d5l%{AN#5= z4gl>C5Gd=YgclY9{$%HML9b;6c26Nvf|L=0Arq!c_cIpGpIqCON|uJ#vnegN zb9HtvmF?qS=e&>sv(?3GLFlZr@wzaa^7E6sLh1XoGfK==UfSEY|1j{Juj$`Iisb?|5R|5zK;# zT^4}Se*C#xRAkM_%%q~F#r!V-yjA$_pM}~ad3sxZ(luXOH}~&dpV&EC+)y$S_IW?y zg$fqwHkDf3Di66U{13O?d>$az_<@1gSbQZV_0Wl}R8c@;zdKhV`Dodsb-1{4UX7^ zIACJlr%SSOJ(qG)c>*+9n~_xH15gPT-ECo6?mDcBW{#W+vRwL~o_ChKk9Vx5(5hNRu>5iZW7DL}M8xCZ3i~(M2~j z$)9;9Be*~2&+K6?RjHCC_yWER zUum^b^}J!OW>>#&hW*S7#Angrcmor{6@fM1lMD>lH?v=>8Yt?&d5JtVskh+z%nJ>? z;}WkfG3^wCLZfwyoYJcZ1+r$9s+3z1;R$7-I8lTQzp_gl2tF|sYl9y3$IM(Xphkqp zuT}Ykmk++7nWf*4hpeK~02}l?yN-1d2&CN{$BPE%R*q}Q;$FTn5rpa4>{hfcKOFYK zf}sTQWP@D(s&vd+=x%#I?hRWRO%9C^&OzWjgbN#Z=CvsBQrG7lQl`A0)!Ca)SrQ>7 zcDzIEuDm}RJD7ly9o9D97MFZ=5)GJsEB6>0XT;#20?E)56T)e$z*yruH zW9sp$73D4dz1`DWb}BMa3!1A#N(yHyFqk5?O%n?q{?kfZB`F2;FKqLp%CjufQ_Ch> zPL@H89t<98@K3DdBX2*sa9#-B$E3|2AQDUX8vI!GS9Rsn_O+z08O}jEwYXQ7tem*gJAEre7X>I( zwwtwc4`1eYUFmqIx!<4ou^*m3uhgA&E$k(8DI02PwjGm%gJO+AmDfmC zMRakc4Adq^;7%AbyAoSo0Wpv#O(P$iT(5*z-u)yp557W_#a zols~E>;}_LhB*y8#a<4gDKvD4BJ=dPs_wHMLg#*DP5+V7BLVrz<)d-vsjn&@VSp%= z|2!>u$mniU`{kA?bvC!CJ2TQ$Fi?q28=CqCif4D6N}8>asjklFM}lOXKQjrLPFnqT zXNv6YczfQ#M*ZEUrq(-Ib@kh!0dOB} + - - - - Failed Fill Record - - - - - + background: #111827; + } + } + + + + + + +
-
-
claude-sonnet-4-20250514
-
Jan 30, 2026 at 6:30 AM
+ +
+
claude-sonnet-4-20250514
+
Jan 30, 2026 at 2:30 PM
+
+ +
✕ FAILED: API rate limit exceeded after 3 retries
+ +
+
+
Status
+
✕ Failed
- -
- ✕ FAILED: API rate limit exceeded after 3 retries +
+
Duration
+
8.5s
- -
-
-
Status
-
✕ Failed
-
-
-
Duration
-
8.5s
-
-
-
Turns
-
2
-
-
-
Tokens
-
6.1k
-
4.3k in / 1.9k out
-
+
+
Turns
+
2
- -
-
Progress
-
-
-
+
Tokens
+
6.1k
+
4.3k in / 1.9k out
+
+
+ + +
+
Progress
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+Turn 1" onmouseenter="frShowTip(this)" onmouseleave="frHideTip()">
-
8/18 fields filled (44%) • 2 skipped
- -
- Timeline (8.5s total) -
-
-
-
Turn 1
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
-
-
-
Turn 2
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
+
+ 8/18 fields filled (44%) • 2 skipped +
+
+ + +
+ Timeline (8.5s total) +
+
+ +
+
Turn 1
+
+
+
+
+
+
web_search
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
Turn 2
+
+
+
+
+
+
web_search
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
+
+ LLM (3 calls, 3.3s)
-
-
-
- LLM (3 calls, 3.3s) -
-
-
- Tools (8 calls, 4.7s) -
+
+
+ Tools (8 calls, 4.7s)
-
- +
+
+ +
Tool Summary -
+
- - - - - - - - - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
ToolCallsSuccessAvgp95
ToolCallsSuccessAvgp95
web_search580%920ms1.6s
fill_form3100%167ms210ms
web_search580%920ms1.6s
fill_form3100%167ms210ms
- + +
Turn Details (2 turns) -
-
- - Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches - (1 rejected) - -
-
    -
  • - ✓ web_search - "startup funding": 8 results (850ms) -
  • -
  • - ✓ web_search - "startup founders": 12 results (1.2s) -
  • -
  • fill_form: OK (160ms)
  • -
    -
    - company_name - set string - Acme Corporation -
    - -
    - ceo_name - set string - Jane Smith -
    - -
    - funding_amount - set number - 15000000 -
    - -
    - website - set url - https://acme.example.com -
    - -
    - stage - set single select - series_a -
    - -
    - optional_notes - skip field - (skipped) -
    -
    -
-
-
- -
- Turn 2 • Order 1 • 3.6s • 2.0k tokens • 8 patches -
-
    -
  • - ✕ web_search - "startup valuation": Error: Rate limit - exceeded, retrying... (450ms) -
  • -
  • - ✓ web_search - "startup valuation": 5 results (1.8s) -
  • -
  • fill_form: OK (220ms)
  • -
    -
    - valuation - set number - 50000000 -
    - -
    - founded_date - set date - 2019-03-15 -
    - -
    - key_investors - set string list - [ "Sequoia Capital", "Andreessen Horowitz", "Y - Combinator" ] -
    - -
    - headquarters - set string - San Francisco, CA -
    - -
    - industries - set checkboxes - [ "technology", "saas", "enterprise" ] -
    - -
    - employee_count - set string - 50-100 -
    - -
    - deprecated_field - clear field - (cleared) -
    - -
    - revenue - set number - 5200000 -
    -
    -
-
-
+
+
+ Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches (1 rejected) +
+
  • web_search "startup funding": 8 results (850ms)
  • web_search "startup founders": 12 results (1.2s)
  • fill_form: OK (160ms)
  • +
    + company_name + set string + Acme Corporation +
    + +
    + ceo_name + set string + Jane Smith +
    + +
    + funding_amount + set number + 15000000 +
    + +
    + website + set url + https://acme.example.com +
    + +
    + stage + set single select + series_a +
    + +
    + optional_notes + skip field + (skipped) +
    +
+
+
+ +
+ Turn 2 • Order 1 • 3.6s • 2.0k tokens • 8 patches +
+
  • web_search "startup valuation": Error: Rate limit exceeded, retrying... (450ms)
  • web_search "startup valuation": 5 results (1.8s)
  • fill_form: OK (220ms)
  • +
    + valuation + set number + 50000000 +
    + +
    + founded_date + set date + 2019-03-15 +
    + +
    + key_investors + set string list + [ + "Sequoia Capital", + "Andreessen Horowitz", + "Y Combinator" +]
    + +
    + headquarters + set string + San Francisco, CA +
    + +
    + industries + set checkboxes + [ + "technology", + "saas", + "enterprise" +] +
    + +
    + employee_count + set string + 50-100 +
    + +
    + deprecated_field + clear field + (cleared) +
    + +
    + revenue + set number + 5200000 +
    +
+
+
+
- -
- Raw YAML -
- -
sessionId: sess-test-failed
+    
+      
+    
+ Raw YAML +
+ +
sessionId: sess-test-failed
 startedAt: 2026-01-30T14:30:00.000Z
 completedAt: 2026-01-30T14:30:12.450Z
 durationMs: 8500
@@ -1251,8 +1014,10 @@
   executionThreads: []
 statusDetail: API rate limit exceeded after 3 retries
 
-
-
+
+
+
- - + + + \ No newline at end of file diff --git a/packages/markform/tests/visual/snapshots/fill-record-failed.png b/packages/markform/tests/visual/snapshots/fill-record-failed.png new file mode 100644 index 0000000000000000000000000000000000000000..93dea49739a9affda7297c79d5adff8f05bfb004 GIT binary patch literal 41760 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 literal 0 HcmV?d00001 diff --git a/packages/markform/tests/visual/snapshots/fill-record-partial.html b/packages/markform/tests/visual/snapshots/fill-record-partial.html index c32132db..bbae5902 100644 --- a/packages/markform/tests/visual/snapshots/fill-record-partial.html +++ b/packages/markform/tests/visual/snapshots/fill-record-partial.html @@ -1,1157 +1,871 @@ - + - - - - Partial Fill Record - - - - - + + + + + + + @media (max-width: 600px) { + .fr-dashboard { padding: 12px; } + .fr-cards { grid-template-columns: repeat(2, 1fr); gap: 12px; } + .fr-card { padding: 12px; } + .fr-card__value { font-size: 18px; } + .fr-table { font-size: var(--fr-font-sm); } + .fr-table th, .fr-table td { padding: 6px 8px; } + } +
-
-
claude-sonnet-4-20250514
-
Jan 30, 2026 at 6:30 AM
-
- + +
+
claude-sonnet-4-20250514
+
Jan 30, 2026 at 2:30 PM
+
+
⚠ PARTIAL: max_turns
- -
-
-
Status
-
⚠ Partial
-
-
-
Duration
-
12.4s
-
-
-
Turns
-
3
-
-
-
Tokens
-
6.1k
-
4.3k in / 1.9k out
-
+ +
+
+
Status
+
⚠ Partial
- -
-
Progress
-
-
-
+
Duration
+
12.4s
+
+
+
Turns
+
3
+
+
+
Tokens
+
6.1k
+
4.3k in / 1.9k out
+
+
+ + +
+
Progress
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+Turn 3" onmouseenter="frShowTip(this)" onmouseleave="frHideTip()">
-
14/18 fields filled (78%) • 2 skipped
- -
- Timeline (12.4s total) -
-
-
-
Turn 1
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
-
-
-
Turn 2
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
-
-
-
Turn 3
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
+
+ 14/18 fields filled (78%) • 2 skipped +
+
+ + +
+ Timeline (12.4s total) +
+
+ +
+
Turn 1
+
+
+
+
+
+
web_search
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
Turn 2
+
+
+
+
+
+
web_search
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
Turn 3
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
+
+ LLM (3 calls, 7.0s)
-
-
-
- LLM (3 calls, 7.0s) -
-
-
- Tools (8 calls, 5.1s) -
+
+
+ Tools (8 calls, 5.1s)
-
- +
+
+ +
Tool Summary -
+
- - - - - - - - - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
ToolCallsSuccessAvgp95
ToolCallsSuccessAvgp95
web_search580%920ms1.6s
fill_form3100%167ms210ms
web_search580%920ms1.6s
fill_form3100%167ms210ms
- + +
Turn Details (3 turns) -
-
- - Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches - (1 rejected) - -
-
    -
  • - ✓ web_search - "startup funding": 8 results (850ms) -
  • -
  • - ✓ web_search - "startup founders": 12 results (1.2s) -
  • -
  • fill_form: OK (160ms)
  • -
    -
    - company_name - set string - Acme Corporation -
    - -
    - ceo_name - set string - Jane Smith -
    - -
    - funding_amount - set number - 15000000 -
    - -
    - website - set url - https://acme.example.com -
    - -
    - stage - set single select - series_a -
    - -
    - optional_notes - skip field - (skipped) -
    -
    -
-
-
- -
- Turn 2 • Order 1 • 3.6s • 2.0k tokens • 8 patches -
-
    -
  • - ✕ web_search - "startup valuation": Error: Rate limit - exceeded, retrying... (450ms) -
  • -
  • - ✓ web_search - "startup valuation": 5 results (1.8s) -
  • -
  • fill_form: OK (220ms)
  • -
    -
    - valuation - set number - 50000000 -
    - -
    - founded_date - set date - 2019-03-15 -
    - -
    - key_investors - set string list - [ "Sequoia Capital", "Andreessen Horowitz", "Y - Combinator" ] -
    - -
    - headquarters - set string - San Francisco, CA -
    - -
    - industries - set checkboxes - [ "technology", "saas", "enterprise" ] -
    - -
    - employee_count - set string - 50-100 -
    - -
    - deprecated_field - clear field - (cleared) -
    - -
    - revenue - set number - 5200000 -
    -
    -
-
-
- -
- Turn 3 • Order 1 • 4.0s • 2.0k tokens • 4 patches -
-
    -
  • - ✓ web_search "startup team": - 3 results (300ms) -
  • -
  • fill_form: OK (120ms)
  • -
    -
    - team_members - set table - [ { "name": "Jane Smith", "role": - "CEO", "linkedin": - "https://linkedin.com/in/janesmith" }, { "name": - "John Doe", "role": "CTO", "linkedin": - "https://linkedin.com/in/johndoe" }, { "name": "Alice - Johnson", "role": "CFO", "linkedin": - "https://linkedin.com/in/alicejohnson" } ] -
    - -
    - press_coverage - set url list - [ "https://techcrunch.com/acme-funding", - "https://forbes.com/acme-profile" ] -
    - -
    - company_description - set string - Acme Corporation is a leading enterprise SaaS company providing innovative - solutions for workflow automation and business process optimization. Founded - in 2019, we have grown to serve over 500 enterprise customers globally. -
    - -
    - competitor_analysis - abort field - (aborted) -
    -
    -
-
-
+
+
+ Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches (1 rejected) +
+
  • web_search "startup funding": 8 results (850ms)
  • web_search "startup founders": 12 results (1.2s)
  • fill_form: OK (160ms)
  • +
    + company_name + set string + Acme Corporation +
    + +
    + ceo_name + set string + Jane Smith +
    + +
    + funding_amount + set number + 15000000
    + +
    + website + set url + https://acme.example.com +
    + +
    + stage + set single select + series_a +
    + +
    + optional_notes + skip field + (skipped) +
    +
+
+
+ +
+ Turn 2 • Order 1 • 3.6s • 2.0k tokens • 8 patches +
+
  • web_search "startup valuation": Error: Rate limit exceeded, retrying... (450ms)
  • web_search "startup valuation": 5 results (1.8s)
  • fill_form: OK (220ms)
  • +
    + valuation + set number + 50000000 +
    + +
    + founded_date + set date + 2019-03-15 +
    + +
    + key_investors + set string list + [ + "Sequoia Capital", + "Andreessen Horowitz", + "Y Combinator" +] +
    + +
    + headquarters + set string + San Francisco, CA +
    + +
    + industries + set checkboxes + [ + "technology", + "saas", + "enterprise" +] +
    + +
    + employee_count + set string + 50-100 +
    + +
    + deprecated_field + clear field + (cleared) +
    + +
    + revenue + set number + 5200000 +
    +
+
+
+ +
+ Turn 3 • Order 1 • 4.0s • 2.0k tokens • 4 patches +
+
  • web_search "startup team": 3 results (300ms)
  • fill_form: OK (120ms)
  • +
    + team_members + set table + [ + { + "name": "Jane Smith", + "role": "CEO", + "linkedin": "https://linkedin.com/in/janesmith" + }, + { + "name": "John Doe", + "role": "CTO", + "linkedin": "https://linkedin.com/in/johndoe" + }, + { + "name": "Alice Johnson", + "role": "CFO", + "linkedin": "https://linkedin.com/in/alicejohnson" + } +] +
    + +
    + press_coverage + set url list + [ + "https://techcrunch.com/acme-funding", + "https://forbes.com/acme-profile" +] +
    + +
    + company_description + set string + Acme Corporation is a leading enterprise SaaS company providing innovative solutions for workflow automation and business process optimization. Founded in 2019, we have grown to serve over 500 enterprise customers globally. +
    + +
    + competitor_analysis + abort field + (aborted) +
    +
+
+
+
- -
- Raw YAML -
- -
sessionId: sess-test-partial
+    
+      
+    
+ Raw YAML +
+ +
sessionId: sess-test-partial
 startedAt: 2026-01-30T14:30:00.000Z
 completedAt: 2026-01-30T14:30:12.450Z
 durationMs: 12450
@@ -1425,8 +1139,10 @@
   executionThreads: []
 statusDetail: max_turns
 
-
-
+
+
+
- - + + + \ No newline at end of file diff --git a/packages/markform/tests/visual/snapshots/fill-record-partial.png b/packages/markform/tests/visual/snapshots/fill-record-partial.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e7e51fbefaaa7f3090fb4e36f800822a21a067 GIT binary patch literal 41895 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 vjyB*-X`6SKQd3 Date: Sun, 1 Feb 2026 09:53:09 +0000 Subject: [PATCH 2/4] style: format HTML snapshots with Prettier https://claude.ai/code/session_016CwhhCQfKzuuU5QfD5H7Ub --- .../snapshots/fill-record-cancelled.html | 1479 +++++++------ .../snapshots/fill-record-completed.html | 1898 +++++++++------- .../visual/snapshots/fill-record-failed.html | 1753 ++++++++------- .../visual/snapshots/fill-record-partial.html | 1904 ++++++++++------- 4 files changed, 3991 insertions(+), 3043 deletions(-) diff --git a/packages/markform/tests/visual/snapshots/fill-record-cancelled.html b/packages/markform/tests/visual/snapshots/fill-record-cancelled.html index 88550a2d..06083b7f 100644 --- a/packages/markform/tests/visual/snapshots/fill-record-cancelled.html +++ b/packages/markform/tests/visual/snapshots/fill-record-cancelled.html @@ -1,692 +1,845 @@ - + - - - - Cancelled Fill Record - - - - - - - + margin: 0; + background: #f5f5f5; + } + @media (prefers-color-scheme: dark) { + body { + background: #111827; + } + } + + + + +

- -
-
claude-sonnet-4-20250514
-
Jan 30, 2026 at 2:30 PM
-
- -
⚠ CANCELLED: User interrupted via Ctrl+C
- -
-
-
Status
-
⊘ Cancelled
+
+
claude-sonnet-4-20250514
+
Jan 30, 2026 at 2:30 PM
-
-
Duration
-
4.4s
-
-
-
Turns
-
1
+ +
+ ⚠ CANCELLED: User interrupted via Ctrl+C
-
-
Tokens
-
6.1k
-
4.3k in / 1.9k out
+ +
+
+
Status
+
⊘ Cancelled
+
+
+
Duration
+
4.4s
+
+
+
Turns
+
1
+
+
+
Tokens
+
6.1k
+
4.3k in / 1.9k out
+
-
- - -
-
Progress
-
-
-
+
Progress
+
+
+
+
+
+
+
+
+
-
-
-
- 6/18 fields filled (33%) • 1 pre-filled • 2 skipped -
-
- - -
- Timeline (4.4s total) -
-
- -
-
Turn 1
-
-
+Turn 1" + onmouseenter="frShowTip(this)" + onmouseleave="frHideTip()" + >
+
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
-
-
-
-
- LLM (3 calls, 2.2s) +
6/18 fields filled (33%) • 1 pre-filled • 2 skipped
+
+ +
+ Timeline (4.4s total) +
+
+
+
Turn 1
+
+
+
+
+
+
web_search
+
+
+
-
-
- Tools (8 calls, 2.2s) +
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
+
+ LLM (3 calls, 2.2s) +
+
+
+ Tools (8 calls, 2.2s) +
-
-
- - +
+
Tool Summary -
+
- + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
ToolCallsSuccessAvgp95
ToolCallsSuccessAvgp95
web_search580%920ms1.6s
fill_form3100%167ms210ms
web_search580%920ms1.6s
fill_form3100%167ms210ms
- - +
Turn Details (1 turns) -
-
- Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches (1 rejected) -
-
  • web_search "startup funding": 8 results (850ms)
  • web_search "startup founders": 12 results (1.2s)
  • fill_form: OK (160ms)
  • -
    - company_name - set string - Acme Corporation -
    - -
    - ceo_name - set string - Jane Smith -
    - -
    - funding_amount - set number - 15000000 -
    - -
    - website - set url - https://acme.example.com -
    - -
    - stage - set single select - series_a -
    - -
    - optional_notes - skip field - (skipped) +
    +
    + + Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches + (1 rejected) + +
    +
      +
    • + ✓ web_search + "startup funding": 8 results (850ms) +
    • +
    • + ✓ web_search + "startup founders": 12 results (1.2s) +
    • +
    • fill_form: OK (160ms)
    • +
      +
      + company_name + set string + Acme Corporation +
      + +
      + ceo_name + set string + Jane Smith +
      + +
      + funding_amount + set number + 15000000 +
      + +
      + website + set url + https://acme.example.com +
      + +
      + stage + set single select + series_a +
      + +
      + optional_notes + skip field + (skipped) +
      +
      +
    +
    +
    -
-
-
-
- - -
- Raw YAML -
- -
sessionId: sess-test-cancelled
+
+      
+ Raw YAML +
+ +
sessionId: sess-test-cancelled
 startedAt: 2026-01-30T14:30:00.000Z
 completedAt: 2026-01-30T14:30:12.450Z
 durationMs: 4400
@@ -846,10 +999,8 @@
   executionThreads: []
 statusDetail: User interrupted via Ctrl+C
 
-
-
- +
+
- - - \ No newline at end of file + + diff --git a/packages/markform/tests/visual/snapshots/fill-record-completed.html b/packages/markform/tests/visual/snapshots/fill-record-completed.html index d9bc6161..7ebc9a0c 100644 --- a/packages/markform/tests/visual/snapshots/fill-record-completed.html +++ b/packages/markform/tests/visual/snapshots/fill-record-completed.html @@ -1,871 +1,1151 @@ - + - - - - Completed Fill Record - - - - - - - + + + + + @media (max-width: 600px) { + .fr-dashboard { + padding: 12px; + } + .fr-cards { + grid-template-columns: repeat(2, 1fr); + gap: 12px; + } + .fr-card { + padding: 12px; + } + .fr-card__value { + font-size: 18px; + } + .fr-table { + font-size: var(--fr-font-sm); + } + .fr-table th, + .fr-table td { + padding: 6px 8px; + } + } +
- -
-
claude-sonnet-4-20250514
-
Jan 30, 2026 at 2:30 PM
-
- - - -
-
-
Status
-
✓ Completed
-
-
-
Duration
-
12.4s
-
-
-
Turns
-
3
+
+
claude-sonnet-4-20250514
+
Jan 30, 2026 at 2:30 PM
-
-
Tokens
-
6.1k
-
4.3k in / 1.9k out
+ +
+
+
Status
+
✓ Completed
+
+
+
Duration
+
12.4s
+
+
+
Turns
+
3
+
+
+
Tokens
+
6.1k
+
4.3k in / 1.9k out
+
-
- - -
-
Progress
-
-
-
+
Progress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- 16/18 fields filled (89%) • 2 skipped -
-
- - -
- Timeline (12.4s total) -
-
- -
-
Turn 1
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
-
-
-
Turn 2
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
-
-
-
Turn 3
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
+Turn 3" + onmouseenter="frShowTip(this)" + onmouseleave="frHideTip()" + >
-
-
-
- LLM (3 calls, 7.0s) +
16/18 fields filled (89%) • 2 skipped
+
+ +
+ Timeline (12.4s total) +
+
+
+
Turn 1
+
+
+
+
+
+
web_search
+
+
+
+
+
+
web_search
+
+
+
-
-
- Tools (8 calls, 5.1s) +
+
fill_form
+
+
+
+
+
+
Turn 2
+
+
+
+
+
+
web_search
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
Turn 3
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
+
+ LLM (3 calls, 7.0s) +
+
+
+ Tools (8 calls, 5.1s) +
-
-
- - +
+
Tool Summary -
+
- + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
ToolCallsSuccessAvgp95
ToolCallsSuccessAvgp95
web_search580%920ms1.6s
fill_form3100%167ms210ms
web_search580%920ms1.6s
fill_form3100%167ms210ms
- - +
Turn Details (3 turns) -
-
- Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches (1 rejected) -
-
  • web_search "startup funding": 8 results (850ms)
  • web_search "startup founders": 12 results (1.2s)
  • fill_form: OK (160ms)
  • -
    - company_name - set string - Acme Corporation -
    - -
    - ceo_name - set string - Jane Smith -
    - -
    - funding_amount - set number - 15000000 -
    - -
    - website - set url - https://acme.example.com -
    - -
    - stage - set single select - series_a -
    - -
    - optional_notes - skip field - (skipped) -
    -
-
-
- -
- Turn 2 • Order 1 • 3.6s • 2.0k tokens • 8 patches -
-
  • web_search "startup valuation": Error: Rate limit exceeded, retrying... (450ms)
  • web_search "startup valuation": 5 results (1.8s)
  • fill_form: OK (220ms)
  • -
    - valuation - set number - 50000000 -
    - -
    - founded_date - set date - 2019-03-15 -
    - -
    - key_investors - set string list - [ - "Sequoia Capital", - "Andreessen Horowitz", - "Y Combinator" -] -
    - -
    - headquarters - set string - San Francisco, CA -
    - -
    - industries - set checkboxes - [ - "technology", - "saas", - "enterprise" -] -
    - -
    - employee_count - set string - 50-100 -
    - -
    - deprecated_field - clear field - (cleared) -
    - -
    - revenue - set number - 5200000 -
    -
-
-
- -
- Turn 3 • Order 1 • 4.0s • 2.0k tokens • 4 patches -
-
  • web_search "startup team": 3 results (300ms)
  • fill_form: OK (120ms)
  • -
    - team_members - set table - [ - { - "name": "Jane Smith", - "role": "CEO", - "linkedin": "https://linkedin.com/in/janesmith" - }, - { - "name": "John Doe", - "role": "CTO", - "linkedin": "https://linkedin.com/in/johndoe" - }, - { - "name": "Alice Johnson", - "role": "CFO", - "linkedin": "https://linkedin.com/in/alicejohnson" - } -] -
    - -
    - press_coverage - set url list - [ - "https://techcrunch.com/acme-funding", - "https://forbes.com/acme-profile" -] -
    - -
    - company_description - set string - Acme Corporation is a leading enterprise SaaS company providing innovative solutions for workflow automation and business process optimization. Founded in 2019, we have grown to serve over 500 enterprise customers globally. -
    - -
    - competitor_analysis - abort field - (aborted) +
    +
    + + Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches + (1 rejected) + +
    +
      +
    • + ✓ web_search + "startup funding": 8 results (850ms) +
    • +
    • + ✓ web_search + "startup founders": 12 results (1.2s) +
    • +
    • fill_form: OK (160ms)
    • +
      +
      + company_name + set string + Acme Corporation +
      + +
      + ceo_name + set string + Jane Smith +
      + +
      + funding_amount + set number + 15000000 +
      + +
      + website + set url + https://acme.example.com +
      + +
      + stage + set single select + series_a +
      + +
      + optional_notes + skip field + (skipped) +
      +
      +
    +
    +
    + +
    + Turn 2 • Order 1 • 3.6s • 2.0k tokens • 8 patches +
    +
      +
    • + ✕ web_search + "startup valuation": Error: Rate limit + exceeded, retrying... (450ms) +
    • +
    • + ✓ web_search + "startup valuation": 5 results (1.8s) +
    • +
    • fill_form: OK (220ms)
    • +
      +
      + valuation + set number + 50000000 +
      + +
      + founded_date + set date + 2019-03-15 +
      + +
      + key_investors + set string list + [ "Sequoia Capital", "Andreessen Horowitz", "Y + Combinator" ] +
      + +
      + headquarters + set string + San Francisco, CA +
      + +
      + industries + set checkboxes + [ "technology", "saas", "enterprise" ] +
      + +
      + employee_count + set string + 50-100 +
      + +
      + deprecated_field + clear field + (cleared) +
      + +
      + revenue + set number + 5200000 +
      +
      +
    +
    +
    + +
    + Turn 3 • Order 1 • 4.0s • 2.0k tokens • 4 patches +
    +
      +
    • + ✓ web_search "startup team": + 3 results (300ms) +
    • +
    • fill_form: OK (120ms)
    • +
      +
      + team_members + set table + [ { "name": "Jane Smith", "role": + "CEO", "linkedin": + "https://linkedin.com/in/janesmith" }, { "name": + "John Doe", "role": "CTO", "linkedin": + "https://linkedin.com/in/johndoe" }, { "name": "Alice + Johnson", "role": "CFO", "linkedin": + "https://linkedin.com/in/alicejohnson" } ] +
      + +
      + press_coverage + set url list + [ "https://techcrunch.com/acme-funding", + "https://forbes.com/acme-profile" ] +
      + +
      + company_description + set string + Acme Corporation is a leading enterprise SaaS company providing innovative + solutions for workflow automation and business process optimization. Founded + in 2019, we have grown to serve over 500 enterprise customers globally. +
      + +
      + competitor_analysis + abort field + (aborted) +
      +
      +
    +
    +
    -
-
-
-
- - -
- Raw YAML -
- -
sessionId: sess-test-completed
+
+      
+ Raw YAML +
+ +
sessionId: sess-test-completed
 startedAt: 2026-01-30T14:30:00.000Z
 completedAt: 2026-01-30T14:30:12.450Z
 durationMs: 12450
@@ -1138,10 +1418,8 @@
     - 1
   executionThreads: []
 
-
-
- +
+
- - - \ No newline at end of file + + diff --git a/packages/markform/tests/visual/snapshots/fill-record-failed.html b/packages/markform/tests/visual/snapshots/fill-record-failed.html index 1d2941fb..0c9330a5 100644 --- a/packages/markform/tests/visual/snapshots/fill-record-failed.html +++ b/packages/markform/tests/visual/snapshots/fill-record-failed.html @@ -1,795 +1,1032 @@ - + - - - - Failed Fill Record - - - - - - - + margin: 0; + background: #f5f5f5; + } + @media (prefers-color-scheme: dark) { + body { + background: #111827; + } + } + + + + +
- -
-
claude-sonnet-4-20250514
-
Jan 30, 2026 at 2:30 PM
-
- -
✕ FAILED: API rate limit exceeded after 3 retries
- -
-
-
Status
-
✕ Failed
+
+
claude-sonnet-4-20250514
+
Jan 30, 2026 at 2:30 PM
-
-
Duration
-
8.5s
-
-
-
Turns
-
2
+ +
+ ✕ FAILED: API rate limit exceeded after 3 retries
-
-
Tokens
-
6.1k
-
4.3k in / 1.9k out
+ +
+
+
Status
+
✕ Failed
+
+
+
Duration
+
8.5s
+
+
+
Turns
+
2
+
+
+
Tokens
+
6.1k
+
4.3k in / 1.9k out
+
-
- - -
-
Progress
-
-
-
+
Progress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- 8/18 fields filled (44%) • 2 skipped -
-
- - -
- Timeline (8.5s total) -
-
- -
-
Turn 1
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
-
-
-
Turn 2
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
+Turn 1" + onmouseenter="frShowTip(this)" + onmouseleave="frHideTip()" + >
+
-
-
-
- LLM (3 calls, 3.3s) +
8/18 fields filled (44%) • 2 skipped
+
+ +
+ Timeline (8.5s total) +
+
+
+
Turn 1
+
+
+
-
-
- Tools (8 calls, 4.7s) +
+
web_search
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
Turn 2
+
+
+
+
+
+
web_search
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
+
+ LLM (3 calls, 3.3s) +
+
+
+ Tools (8 calls, 4.7s) +
-
-
- - +
+
Tool Summary -
+
- + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
ToolCallsSuccessAvgp95
ToolCallsSuccessAvgp95
web_search580%920ms1.6s
fill_form3100%167ms210ms
web_search580%920ms1.6s
fill_form3100%167ms210ms
- - +
Turn Details (2 turns) -
-
- Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches (1 rejected) -
-
  • web_search "startup funding": 8 results (850ms)
  • web_search "startup founders": 12 results (1.2s)
  • fill_form: OK (160ms)
  • -
    - company_name - set string - Acme Corporation -
    - -
    - ceo_name - set string - Jane Smith -
    - -
    - funding_amount - set number - 15000000 -
    - -
    - website - set url - https://acme.example.com -
    - -
    - stage - set single select - series_a -
    - -
    - optional_notes - skip field - (skipped) -
    -
-
-
- -
- Turn 2 • Order 1 • 3.6s • 2.0k tokens • 8 patches -
-
  • web_search "startup valuation": Error: Rate limit exceeded, retrying... (450ms)
  • web_search "startup valuation": 5 results (1.8s)
  • fill_form: OK (220ms)
  • -
    - valuation - set number - 50000000 -
    - -
    - founded_date - set date - 2019-03-15 -
    - -
    - key_investors - set string list - [ - "Sequoia Capital", - "Andreessen Horowitz", - "Y Combinator" -] -
    - -
    - headquarters - set string - San Francisco, CA -
    - -
    - industries - set checkboxes - [ - "technology", - "saas", - "enterprise" -] -
    - -
    - employee_count - set string - 50-100 -
    - -
    - deprecated_field - clear field - (cleared) -
    - -
    - revenue - set number - 5200000 +
    +
    + + Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches + (1 rejected) + +
    +
      +
    • + ✓ web_search + "startup funding": 8 results (850ms) +
    • +
    • + ✓ web_search + "startup founders": 12 results (1.2s) +
    • +
    • fill_form: OK (160ms)
    • +
      +
      + company_name + set string + Acme Corporation +
      + +
      + ceo_name + set string + Jane Smith +
      + +
      + funding_amount + set number + 15000000 +
      + +
      + website + set url + https://acme.example.com +
      + +
      + stage + set single select + series_a +
      + +
      + optional_notes + skip field + (skipped) +
      +
      +
    +
    +
    + +
    + Turn 2 • Order 1 • 3.6s • 2.0k tokens • 8 patches +
    +
      +
    • + ✕ web_search + "startup valuation": Error: Rate limit + exceeded, retrying... (450ms) +
    • +
    • + ✓ web_search + "startup valuation": 5 results (1.8s) +
    • +
    • fill_form: OK (220ms)
    • +
      +
      + valuation + set number + 50000000 +
      + +
      + founded_date + set date + 2019-03-15 +
      + +
      + key_investors + set string list + [ "Sequoia Capital", "Andreessen Horowitz", "Y + Combinator" ] +
      + +
      + headquarters + set string + San Francisco, CA +
      + +
      + industries + set checkboxes + [ "technology", "saas", "enterprise" ] +
      + +
      + employee_count + set string + 50-100 +
      + +
      + deprecated_field + clear field + (cleared) +
      + +
      + revenue + set number + 5200000 +
      +
      +
    +
    +
    -
-
-
-
- - -
- Raw YAML -
- -
sessionId: sess-test-failed
+
+      
+ Raw YAML +
+ +
sessionId: sess-test-failed
 startedAt: 2026-01-30T14:30:00.000Z
 completedAt: 2026-01-30T14:30:12.450Z
 durationMs: 8500
@@ -1014,10 +1251,8 @@
   executionThreads: []
 statusDetail: API rate limit exceeded after 3 retries
 
-
-
- +
+
- - - \ No newline at end of file + + diff --git a/packages/markform/tests/visual/snapshots/fill-record-partial.html b/packages/markform/tests/visual/snapshots/fill-record-partial.html index bbae5902..6862289f 100644 --- a/packages/markform/tests/visual/snapshots/fill-record-partial.html +++ b/packages/markform/tests/visual/snapshots/fill-record-partial.html @@ -1,871 +1,1157 @@ - + - - - - Partial Fill Record - - - - - - - + + + + + @media (max-width: 600px) { + .fr-dashboard { + padding: 12px; + } + .fr-cards { + grid-template-columns: repeat(2, 1fr); + gap: 12px; + } + .fr-card { + padding: 12px; + } + .fr-card__value { + font-size: 18px; + } + .fr-table { + font-size: var(--fr-font-sm); + } + .fr-table th, + .fr-table td { + padding: 6px 8px; + } + } +
- -
-
claude-sonnet-4-20250514
-
Jan 30, 2026 at 2:30 PM
-
- -
⚠ PARTIAL: max_turns
- -
-
-
Status
-
⚠ Partial
-
-
-
Duration
-
12.4s
-
-
-
Turns
-
3
+
+
claude-sonnet-4-20250514
+
Jan 30, 2026 at 2:30 PM
-
-
Tokens
-
6.1k
-
4.3k in / 1.9k out
+ +
⚠ PARTIAL: max_turns
+ +
+
+
Status
+
⚠ Partial
+
+
+
Duration
+
12.4s
+
+
+
Turns
+
3
+
+
+
Tokens
+
6.1k
+
4.3k in / 1.9k out
+
-
- - -
-
Progress
-
-
-
+
Progress
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- 14/18 fields filled (78%) • 2 skipped -
-
- - -
- Timeline (12.4s total) -
-
- -
-
Turn 1
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
-
-
-
Turn 2
-
-
-
-
-
-
web_search
-
-
-
-
-
-
web_search
-
-
+Turn 3" + onmouseenter="frShowTip(this)" + onmouseleave="frHideTip()" + >
+
-
-
fill_form
-
-
-
-
-
-
Turn 3
-
-
-
-
-
-
web_search
-
-
-
-
-
-
fill_form
-
-
-
-
-
-
-
- LLM (3 calls, 7.0s) +
14/18 fields filled (78%) • 2 skipped
+
+ +
+ Timeline (12.4s total) +
+
+
+
Turn 1
+
+
+
+
+
+
web_search
+
+
+
-
-
- Tools (8 calls, 5.1s) +
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
Turn 2
+
+
+
+
+
+
web_search
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
Turn 3
+
+
+
+
+
+
web_search
+
+
+
+
+
+
fill_form
+
+
+
+
+
+
+
+ LLM (3 calls, 7.0s) +
+
+
+ Tools (8 calls, 5.1s) +
-
-
- - +
+
Tool Summary -
+
- + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + +
ToolCallsSuccessAvgp95
ToolCallsSuccessAvgp95
web_search580%920ms1.6s
fill_form3100%167ms210ms
web_search580%920ms1.6s
fill_form3100%167ms210ms
- - +
Turn Details (3 turns) -
-
- Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches (1 rejected) -
-
  • web_search "startup funding": 8 results (850ms)
  • web_search "startup founders": 12 results (1.2s)
  • fill_form: OK (160ms)
  • -
    - company_name - set string - Acme Corporation -
    - -
    - ceo_name - set string - Jane Smith -
    - -
    - funding_amount - set number - 15000000 -
    - -
    - website - set url - https://acme.example.com -
    - -
    - stage - set single select - series_a -
    - -
    - optional_notes - skip field - (skipped) -
    -
-
-
- -
- Turn 2 • Order 1 • 3.6s • 2.0k tokens • 8 patches -
-
  • web_search "startup valuation": Error: Rate limit exceeded, retrying... (450ms)
  • web_search "startup valuation": 5 results (1.8s)
  • fill_form: OK (220ms)
  • -
    - valuation - set number - 50000000 -
    - -
    - founded_date - set date - 2019-03-15 -
    - -
    - key_investors - set string list - [ - "Sequoia Capital", - "Andreessen Horowitz", - "Y Combinator" -] -
    - -
    - headquarters - set string - San Francisco, CA -
    - -
    - industries - set checkboxes - [ - "technology", - "saas", - "enterprise" -] -
    - -
    - employee_count - set string - 50-100 -
    - -
    - deprecated_field - clear field - (cleared) -
    - -
    - revenue - set number - 5200000 -
    -
-
-
- -
- Turn 3 • Order 1 • 4.0s • 2.0k tokens • 4 patches -
-
  • web_search "startup team": 3 results (300ms)
  • fill_form: OK (120ms)
  • -
    - team_members - set table - [ - { - "name": "Jane Smith", - "role": "CEO", - "linkedin": "https://linkedin.com/in/janesmith" - }, - { - "name": "John Doe", - "role": "CTO", - "linkedin": "https://linkedin.com/in/johndoe" - }, - { - "name": "Alice Johnson", - "role": "CFO", - "linkedin": "https://linkedin.com/in/alicejohnson" - } -] -
    - -
    - press_coverage - set url list - [ - "https://techcrunch.com/acme-funding", - "https://forbes.com/acme-profile" -] -
    - -
    - company_description - set string - Acme Corporation is a leading enterprise SaaS company providing innovative solutions for workflow automation and business process optimization. Founded in 2019, we have grown to serve over 500 enterprise customers globally. -
    - -
    - competitor_analysis - abort field - (aborted) +
    +
    + + Turn 1 • Order 1 • 4.4s • 2.1k tokens • 6 patches + (1 rejected) + +
    +
      +
    • + ✓ web_search + "startup funding": 8 results (850ms) +
    • +
    • + ✓ web_search + "startup founders": 12 results (1.2s) +
    • +
    • fill_form: OK (160ms)
    • +
      +
      + company_name + set string + Acme Corporation +
      + +
      + ceo_name + set string + Jane Smith +
      + +
      + funding_amount + set number + 15000000 +
      + +
      + website + set url + https://acme.example.com +
      + +
      + stage + set single select + series_a +
      + +
      + optional_notes + skip field + (skipped) +
      +
      +
    +
    +
    + +
    + Turn 2 • Order 1 • 3.6s • 2.0k tokens • 8 patches +
    +
      +
    • + ✕ web_search + "startup valuation": Error: Rate limit + exceeded, retrying... (450ms) +
    • +
    • + ✓ web_search + "startup valuation": 5 results (1.8s) +
    • +
    • fill_form: OK (220ms)
    • +
      +
      + valuation + set number + 50000000 +
      + +
      + founded_date + set date + 2019-03-15 +
      + +
      + key_investors + set string list + [ "Sequoia Capital", "Andreessen Horowitz", "Y + Combinator" ] +
      + +
      + headquarters + set string + San Francisco, CA +
      + +
      + industries + set checkboxes + [ "technology", "saas", "enterprise" ] +
      + +
      + employee_count + set string + 50-100 +
      + +
      + deprecated_field + clear field + (cleared) +
      + +
      + revenue + set number + 5200000 +
      +
      +
    +
    +
    + +
    + Turn 3 • Order 1 • 4.0s • 2.0k tokens • 4 patches +
    +
      +
    • + ✓ web_search "startup team": + 3 results (300ms) +
    • +
    • fill_form: OK (120ms)
    • +
      +
      + team_members + set table + [ { "name": "Jane Smith", "role": + "CEO", "linkedin": + "https://linkedin.com/in/janesmith" }, { "name": + "John Doe", "role": "CTO", "linkedin": + "https://linkedin.com/in/johndoe" }, { "name": "Alice + Johnson", "role": "CFO", "linkedin": + "https://linkedin.com/in/alicejohnson" } ] +
      + +
      + press_coverage + set url list + [ "https://techcrunch.com/acme-funding", + "https://forbes.com/acme-profile" ] +
      + +
      + company_description + set string + Acme Corporation is a leading enterprise SaaS company providing innovative + solutions for workflow automation and business process optimization. Founded + in 2019, we have grown to serve over 500 enterprise customers globally. +
      + +
      + competitor_analysis + abort field + (aborted) +
      +
      +
    +
    +
    -
-
-
-
- - -
- Raw YAML -
- -
sessionId: sess-test-partial
+
+      
+ Raw YAML +
+ +
sessionId: sess-test-partial
 startedAt: 2026-01-30T14:30:00.000Z
 completedAt: 2026-01-30T14:30:12.450Z
 durationMs: 12450
@@ -1139,10 +1425,8 @@
   executionThreads: []
 statusDetail: max_turns
 
-
-
- +
+
- - - \ No newline at end of file + + From ab6b0e12cb6ba8ec720fbcd7a4ef50335afd5094 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 1 Feb 2026 16:03:18 +0000 Subject: [PATCH 3/4] fix: fail loudly when PNG generation fails Address PR review feedback: track PNG generation failures and - Only show success message if all PNGs generated - Show partial success with warning if some failed - Set process.exitCode = 1 on any failure - List only successfully generated files https://claude.ai/code/session_016CwhhCQfKzuuU5QfD5H7Ub --- .../tests/visual/fill-record-visual.ts | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/packages/markform/tests/visual/fill-record-visual.ts b/packages/markform/tests/visual/fill-record-visual.ts index bdd42b7a..7618d572 100644 --- a/packages/markform/tests/visual/fill-record-visual.ts +++ b/packages/markform/tests/visual/fill-record-visual.ts @@ -439,6 +439,8 @@ function hasCommand(cmd: string): boolean { if (hasCommand('wkhtmltoimage')) { console.log('\n--- Generating PNG snapshots ---'); const hasImagemagick = hasCommand('convert'); + let failedCount = 0; + const generatedPngs: string[] = []; for (const { name } of testCases) { const htmlPath = join(snapshotDir, `fill-record-${name}.html`); @@ -457,20 +459,35 @@ if (hasCommand('wkhtmltoimage')) { } console.log(`✓ Generated: ${pngPath}`); + generatedPngs.push(pngPath); } catch (error) { const errorMsg = error instanceof Error ? error.message : String(error); console.error(`✗ Failed to generate PNG for ${name}: ${errorMsg}`); + failedCount++; } } - console.log('\n✅ PNG snapshots generated!'); - if (hasImagemagick) { - console.log(' (optimized with ImageMagick for smaller file sizes)'); + + // Report results based on success/failure + if (failedCount === 0) { + console.log('\n✅ PNG snapshots generated!'); + if (hasImagemagick) { + console.log(' (optimized with ImageMagick for smaller file sizes)'); + } + console.log(`\nPNG files for PR attachment:`); + for (const pngPath of generatedPngs) { + console.log(` ${pngPath}`); + } + } else if (generatedPngs.length > 0) { + console.log(`\n⚠ PNG generation partially failed: ${failedCount}/${testCases.length} failed`); + console.log(`\nSuccessfully generated:`); + for (const pngPath of generatedPngs) { + console.log(` ${pngPath}`); + } + process.exitCode = 1; + } else { + console.error('\n✗ All PNG generation failed!'); + process.exitCode = 1; } - console.log(`\nPNG files for PR attachment:`); - console.log(` ${snapshotDir}/fill-record-completed.png`); - console.log(` ${snapshotDir}/fill-record-failed.png`); - console.log(` ${snapshotDir}/fill-record-partial.png`); - console.log(` ${snapshotDir}/fill-record-cancelled.png`); } else { console.log('\n⚠ wkhtmltoimage not found - skipping PNG generation'); console.log(' Install with: apt-get install wkhtmltopdf'); From 675615e3d2d391106574f5e38be7cf5c681b9ac5 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 1 Feb 2026 16:29:51 +0000 Subject: [PATCH 4/4] docs: add research on visual testing and web snapshot strategies Comprehensive research document covering: - HTML-to-PNG conversion tools (wkhtmltoimage, Puppeteer, Playwright) - Visual regression testing frameworks (BackstopJS, Percy, Chromatic) - AI vision model integration for automated visual review - CI/CD patterns for visual testing (GitHub Actions, artifacts) - Modern runtime compatibility (pnpm, Bun) - Recommendations for agentic development workflows https://claude.ai/code/session_016CwhhCQfKzuuU5QfD5H7Ub --- ...2026-02-01-visual-testing-web-snapshots.md | 693 ++++++++++++++++++ 1 file changed, 693 insertions(+) create mode 100644 docs/project/research/current/research-2026-02-01-visual-testing-web-snapshots.md diff --git a/docs/project/research/current/research-2026-02-01-visual-testing-web-snapshots.md b/docs/project/research/current/research-2026-02-01-visual-testing-web-snapshots.md new file mode 100644 index 00000000..69b02a4e --- /dev/null +++ b/docs/project/research/current/research-2026-02-01-visual-testing-web-snapshots.md @@ -0,0 +1,693 @@ +# Research: Visual Testing and Web Snapshot Strategies for Agentic Development + +**Date:** 2026-02-01 + +**Author:** Claude (with human guidance) + +**Status:** Complete + +## Overview + +This research document explores the landscape of visual testing and web snapshot generation for modern development workflows, with particular focus on: + +1. **Agentic development** - Enabling AI coding agents to generate, review, and iterate on visual web output +2. **PR-based visual review** - Making visual changes easy to review in pull requests +3. **Lightweight automation** - Finding the right balance between capability and complexity +4. **Modern tooling compatibility** - Integration with pnpm, Bun, and modern JavaScript runtimes + +The goal is to establish best practices for projects that need automated visual validation of HTML/web output, particularly in CLI tools, static site generators, and component libraries. + +## Questions to Answer + +1. What are the most effective tools for generating PNG screenshots from HTML? +2. How do different approaches compare in terms of performance, complexity, and rendering fidelity? +3. How can vision models (Claude, GPT-4V) be integrated into visual testing workflows? +4. What are the best practices for integrating visual tests into CI/CD pipelines? +5. How well do these tools work with modern package managers (pnpm) and runtimes (Bun)? + +## Scope + +**Included:** +- HTML-to-PNG conversion tools (headless browsers, wkhtmltoimage, canvas-based) +- Visual regression testing frameworks (Percy, Chromatic, BackstopJS) +- AI vision model integration for automated review +- CI/CD integration patterns (GitHub Actions) +- Modern runtime compatibility (Node.js, Bun, pnpm) + +**Excluded:** +- Native mobile app screenshot testing +- Browser-based visual testing services (only mentioned for context) +- Detailed pricing comparisons of commercial tools + +--- + +## Findings + +### 1. The Markform Approach (This Project) + +In PR #124, we implemented a lightweight visual testing approach for the Fill Record visualization feature: + +**Stack:** +- **wkhtmltoimage** - HTML to PNG conversion using a bundled WebKit engine +- **ImageMagick** - Post-processing optimization (resize, compression) +- **TypeScript/tsx** - Test script execution + +**Implementation:** (`packages/markform/tests/visual/fill-record-visual.ts`) +```typescript +// Generate PNG snapshots if wkhtmltoimage is available +if (hasCommand('wkhtmltoimage')) { + for (const { name } of testCases) { + const htmlPath = join(snapshotDir, `fill-record-${name}.html`); + const pngPath = join(snapshotDir, `fill-record-${name}.png`); + + execSync( + `wkhtmltoimage --width 900 --quality 90 --enable-local-file-access "${htmlPath}" "${pngPath}"`, + { stdio: 'pipe' }, + ); + + // Optimize with ImageMagick if available + if (hasImagemagick) { + execSync(`convert "${pngPath}" -resize 50% -quality 85 "${pngPath}"`, { stdio: 'pipe' }); + } + } +} +``` + +**Pros:** +- Zero JavaScript dependencies for screenshot generation +- Fast execution (~1s per screenshot) +- Works in CI environments without browser installation +- Small output files (~40KB per PNG after optimization) +- Fail-fast error handling with proper exit codes + +**Cons:** +- Limited CSS support (uses legacy Qt WebKit) +- No JavaScript execution in many modes +- Requires system package installation (`apt-get install wkhtmltopdf`) +- Not actively maintained (legacy project) + +--- + +### 2. Headless Browser Approaches + +#### Playwright (Recommended for Most Use Cases) + +Playwright is Microsoft's cross-browser automation library with built-in visual testing support. + +**Key Features:** +- Built-in `toHaveScreenshot()` assertion for visual comparisons +- Cross-browser support (Chromium, Firefox, WebKit) +- Native parallel test execution +- Automatic waiting and deterministic rendering options +- Video recording and tracing for debugging + +**Installation:** +```bash +pnpm add -D @playwright/test +npx playwright install # Downloads browsers +``` + +**Example - Screenshot Generation:** +```typescript +import { test, expect } from '@playwright/test'; + +test('capture fill record visualization', async ({ page }) => { + await page.goto('file:///path/to/fill-record.html'); + + // Wait for content to be stable + await page.waitForLoadState('networkidle'); + + // Full page screenshot + await page.screenshot({ + path: 'snapshots/fill-record.png', + fullPage: true + }); + + // Or use built-in visual comparison + await expect(page).toHaveScreenshot('fill-record.png', { + maxDiffPixelRatio: 0.01, // Allow 1% pixel difference + }); +}); +``` + +**Performance:** ~4.5s average execution time for navigation-heavy scenarios + +**Best For:** +- Projects needing cross-browser visual testing +- Teams already using Playwright for E2E tests +- Complex pages with JavaScript-dependent rendering + +#### Puppeteer (Chrome/Chromium Only) + +Puppeteer is Google's Node.js library for Chrome DevTools Protocol control. + +**Key Features:** +- Tighter Chrome integration +- Slightly faster for short, simple tasks (~30% faster in some benchmarks) +- PDF generation support +- Well-documented, mature ecosystem + +**Installation:** +```bash +pnpm add puppeteer # Includes Chrome download +# or +pnpm add puppeteer-core # BYOB (bring your own browser) +``` + +**Example:** +```typescript +import puppeteer from 'puppeteer'; + +const browser = await puppeteer.launch({ headless: true }); +const page = await browser.newPage(); +await page.setViewport({ width: 900, height: 1200 }); +await page.goto('file:///path/to/page.html'); +await page.screenshot({ path: 'output.png', fullPage: true }); +await browser.close(); +``` + +**Performance:** Fastest for short automation tasks, comparable to Playwright for longer E2E scenarios + +**Best For:** +- Chrome-only testing needs +- Quick automation scripts +- PDF generation workflows + +--- + +### 3. Lightweight/No-Browser Approaches + +#### wkhtmltoimage (Legacy but Functional) + +Uses a bundled Qt WebKit engine for HTML-to-image conversion. + +**Installation:** +```bash +# Debian/Ubuntu +apt-get install wkhtmltopdf + +# macOS +brew install wkhtmltopdf +``` + +**Usage:** +```bash +wkhtmltoimage --width 900 --quality 90 page.html output.png +``` + +**Pros:** Fast, no browser download, works offline +**Cons:** Legacy WebKit (poor modern CSS support), limited JavaScript, not actively maintained + +#### html-to-image (Client-Side) + +Modern fork of dom-to-image with active maintenance. + +```typescript +import { toPng } from 'html-to-image'; + +const dataUrl = await toPng(document.getElementById('container')); +``` + +**Best For:** In-browser screenshot generation, simple DOM elements + +#### dom-to-image + +Converts DOM elements to images via SVG-to-canvas conversion. + +**Limitations:** Basic CSS support, no cross-origin resources + +#### html2canvas + +Popular client-side library that renders HTML to ``. + +```typescript +import html2canvas from 'html2canvas'; + +const canvas = await html2canvas(document.body); +const dataUrl = canvas.toDataURL('image/png'); +``` + +**Limitations:** May not render all CSS properties accurately, browser-only + +--- + +### 4. Visual Regression Testing Frameworks + +#### BackstopJS (Open Source, Self-Hosted) + +Free, open-source visual regression testing with Puppeteer/Playwright support. + +**Configuration:** (`backstop.json`) +```json +{ + "viewports": [ + { "label": "desktop", "width": 1280, "height": 800 } + ], + "scenarios": [ + { + "label": "Fill Record Dashboard", + "url": "file:///path/to/fill-record.html", + "delay": 500 + } + ], + "engine": "playwright" +} +``` + +**Commands:** +```bash +backstop test # Run comparison +backstop approve # Accept current as new baseline +backstop reference # Generate baseline images +``` + +**Pros:** Free, self-hosted, flexible, generates HTML diff reports +**Cons:** No cloud dashboard, requires infrastructure management + +#### Percy (BrowserStack) + +Cloud-based visual testing platform with AI-powered diff detection. + +**Features:** +- Cross-browser rendering in the cloud +- OCR-based text diff handling (reduces false positives) +- CI/CD integrations +- Team collaboration with visual review UI + +**Integration:** +```typescript +import percySnapshot from '@percy/playwright'; + +test('visual test', async ({ page }) => { + await page.goto('/dashboard'); + await percySnapshot(page, 'Dashboard'); +}); +``` + +**Best For:** Teams needing collaborative visual review, cross-browser testing + +#### Chromatic (Storybook-Focused) + +Visual testing platform built by the Storybook maintainers. + +**Best For:** Component libraries, Storybook-based development +**Consideration:** Requires Storybook; less suitable for full-page testing + +--- + +### 5. AI Vision Model Integration + +#### Claude with Puppeteer MCP Server + +Claude Code can use Puppeteer MCP server to capture and review screenshots iteratively. + +**Workflow:** +1. Generate HTML output +2. Capture screenshot via Puppeteer MCP +3. Claude analyzes the screenshot visually +4. Claude suggests code changes based on visual assessment +5. Iterate until visual output matches expectations + +**Example prompt to Claude:** +``` +Take a screenshot of the current page and tell me if the dashboard +layout looks correct. Check for: +- Proper spacing between sections +- Readable font sizes +- Correct color scheme (dark mode support) +- No overlapping elements +``` + +#### GPT-4V for Visual Analysis + +GPT-4V can analyze screenshots for UI issues and provide feedback. + +**Use Cases:** +- Identifying layout problems +- Suggesting design improvements +- Automated accessibility review +- Comparing implementation to design mockups + +**Integration Pattern:** +```typescript +import OpenAI from 'openai'; +import fs from 'fs'; + +const openai = new OpenAI(); + +const image = fs.readFileSync('screenshot.png', { encoding: 'base64' }); + +const response = await openai.chat.completions.create({ + model: 'gpt-4-vision-preview', + messages: [{ + role: 'user', + content: [ + { type: 'text', text: 'Analyze this dashboard screenshot for visual issues.' }, + { type: 'image_url', image_url: { url: `data:image/png;base64,${image}` } } + ] + }] +}); +``` + +#### Claude's Computer Use + +Anthropic's Claude can interact with applications via screenshots and mouse/keyboard control. + +**Capabilities:** +- Take screenshots to understand current state +- Perform mouse clicks, text entry, scrolling +- Execute test scenarios described in natural language + +**Best For:** Full E2E testing with natural language test definitions + +--- + +### 6. CI/CD Integration Patterns + +#### GitHub Actions - Basic Screenshot Artifacts + +```yaml +name: Visual Tests + +on: [push, pull_request] + +jobs: + visual-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install system dependencies + run: sudo apt-get install -y wkhtmltopdf imagemagick + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Install dependencies + run: pnpm install + + - name: Generate visual snapshots + run: pnpm tsx tests/visual/fill-record-visual.ts + + - name: Upload snapshots + uses: actions/upload-artifact@v4 + with: + name: visual-snapshots + path: tests/visual/snapshots/ +``` + +#### GitHub Actions - Playwright with Visual Comparison + +```yaml +name: Playwright Visual Tests + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Install dependencies + run: pnpm install + + - name: Install Playwright browsers + run: npx playwright install --with-deps chromium + + - name: Run visual tests + run: npx playwright test --project=chromium + + - name: Upload diff report + if: failure() + uses: actions/upload-artifact@v4 + with: + name: playwright-report + path: playwright-report/ +``` + +#### Sentry's Visual Snapshot Action + +The `getsentry/action-visual-snapshot` action automates diff generation: + +```yaml +- uses: getsentry/action-visual-snapshot@v2 + with: + snapshot-path: tests/visual/snapshots + diff-path: tests/visual/diffs +``` + +#### Percy CI Integration + +```yaml +- name: Percy Visual Test + run: npx percy exec -- npx playwright test + env: + PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }} +``` + +--- + +### 7. Modern Runtime Compatibility + +#### pnpm Compatibility + +| Tool | pnpm Support | Notes | +|------|-------------|-------| +| Playwright | Excellent | `pnpm add @playwright/test` works perfectly | +| Puppeteer | Excellent | `pnpm add puppeteer` with browser download | +| BackstopJS | Good | May need `pnpm add -D backstopjs` | +| wkhtmltoimage | N/A | System package, not npm | + +#### Bun Compatibility + +| Tool | Bun Support | Notes | +|------|-------------|-------| +| Playwright | Partial | [Known issues](https://github.com/oven-sh/bun/issues/23826) with Chromium launch | +| Puppeteer | Good | `bun add puppeteer` works, ~12% faster than pnpm | +| html-to-image | Good | Pure JS, works well | +| html2canvas | Good | Pure JS, works well | + +**Recommendation:** For maximum stability in Bun environments, prefer Puppeteer over Playwright, or use Node.js for visual testing tasks specifically. + +#### Lightpanda (Emerging Alternative) + +A new AI-native headless browser built in Zig: +- 11x faster execution than Chrome +- 9x less memory usage +- CDP-compatible (works with Puppeteer/Playwright) +- Best stability with Puppeteer + +--- + +### 8. Handling Common Challenges + +#### Platform-Specific Rendering Differences + +Different operating systems and GPU drivers can cause pixel-level differences. + +**Solutions:** +1. **Use Docker containers** for consistent rendering environment +2. **Set `maxDiffPixelRatio`** to allow small variations +3. **Run CI on same OS as development** (e.g., `ubuntu-latest` matching WSL2) +4. **Generate baselines in CI** rather than locally + +#### Dynamic Content + +Timestamps, ads, and user-specific content cause false positives. + +**Solutions:** +1. **Mask dynamic elements** in Playwright: + ```typescript + await expect(page).toHaveScreenshot({ + mask: [page.locator('.timestamp'), page.locator('.avatar')] + }); + ``` +2. **Freeze time** with mock libraries +3. **Use test fixtures** with static data + +#### Font Rendering + +Font rendering varies by platform and font availability. + +**Solutions:** +1. **Bundle fonts** with the application +2. **Use system font stacks** that are widely available +3. **Allow font-related pixel variation** in comparison thresholds + +--- + +## Options Compared + +### Option A: Lightweight (wkhtmltoimage + ImageMagick) + +**Description:** System-level tools for simple HTML-to-PNG conversion. + +**Pros:** +- No npm dependencies for screenshot generation +- Fast execution (<1s per screenshot) +- Works offline, no browser download +- Small file sizes with optimization +- Simple CI setup + +**Cons:** +- Legacy WebKit engine (limited modern CSS) +- No JavaScript execution +- Not actively maintained +- Requires system package installation + +**Best For:** Static HTML pages, simple dashboards, quick CI validation + +### Option B: Playwright Full Visual Testing + +**Description:** Cross-browser visual regression testing with built-in assertions. + +**Pros:** +- Modern browser rendering (Chromium, Firefox, WebKit) +- Built-in visual comparison with `toHaveScreenshot()` +- JavaScript execution support +- Excellent documentation and ecosystem +- Native parallel execution + +**Cons:** +- Browser download required (~300MB+) +- More complex setup +- Slower execution for simple cases +- Potential Bun compatibility issues + +**Best For:** Production applications, cross-browser testing, JavaScript-heavy pages + +### Option C: Puppeteer for Chrome-Only + +**Description:** Google's Chrome automation library for screenshot generation. + +**Pros:** +- Fastest for simple tasks +- Excellent Chrome integration +- Good Bun compatibility +- PDF generation support + +**Cons:** +- Chrome/Chromium only +- No built-in visual comparison (need BackstopJS or custom solution) +- Browser download required + +**Best For:** Chrome-only workflows, quick automation, PDF generation + +### Option D: BackstopJS (Self-Hosted Visual Regression) + +**Description:** Open-source visual regression testing framework. + +**Pros:** +- Free and self-hosted +- Flexible configuration +- HTML diff reports +- Works with Puppeteer or Playwright + +**Cons:** +- No cloud dashboard +- Manual baseline management +- Requires infrastructure setup + +**Best For:** Teams wanting control over visual testing infrastructure + +### Option E: Percy/Chromatic (Cloud Visual Testing) + +**Description:** Cloud-based visual regression testing platforms. + +**Pros:** +- AI-powered diff detection (reduces false positives) +- Cross-browser cloud rendering +- Collaborative review UI +- Professional team features + +**Cons:** +- Paid service (usage-based pricing) +- External dependency +- May have screenshot budget limits + +**Best For:** Teams with budget for tooling, needing cross-browser visual testing + +--- + +## Recommendations + +### For Markform and Similar CLI Projects + +**Current approach (wkhtmltoimage) is appropriate** for the immediate use case of generating PR-reviewable snapshots of static HTML dashboards. The lightweight approach minimizes dependencies and CI complexity. + +**Consider upgrading to Playwright** if: +- JavaScript-dependent rendering is needed +- Modern CSS features (CSS Grid, Container Queries) are added +- Cross-browser consistency becomes important +- Automated visual regression testing is desired + +### For New Projects + +1. **Start with Playwright** for most web projects - it provides the best balance of features, cross-browser support, and ecosystem integration. + +2. **Use BackstopJS** if you want free, self-hosted visual regression testing without cloud dependencies. + +3. **Use wkhtmltoimage** only for simple, static HTML-to-PNG conversion where modern CSS isn't critical. + +4. **Consider Percy/Chromatic** for teams with budget who need collaborative visual review and AI-powered diff detection. + +### For Agentic Workflows + +1. **Enable Puppeteer MCP server** in Claude Code for iterative visual development. + +2. **Store PNG snapshots in git** for easy review in PRs (keep files small with ImageMagick optimization). + +3. **Upload larger reports as CI artifacts** rather than committing to the repository. + +4. **Use vision models (Claude, GPT-4V)** for intelligent visual analysis beyond pixel-diff comparison. + +--- + +## Next Steps + +- [ ] Evaluate adding Playwright-based visual tests for complex pages +- [ ] Consider BackstopJS integration for automated regression detection +- [ ] Explore Puppeteer MCP server for interactive visual development with Claude +- [ ] Document CI patterns for different visual testing approaches + +--- + +## References + +### Playwright & Puppeteer +- [Playwright Visual Comparisons](https://playwright.dev/docs/test-snapshots) +- [Playwright vs Puppeteer (BrowserStack)](https://www.browserstack.com/guide/playwright-vs-puppeteer) +- [Puppeteer vs Playwright Performance (Skyvern)](https://www.skyvern.com/blog/puppeteer-vs-playwright-complete-performance-comparison-2025/) +- [Playwright Snapshot Testing (BrowserStack)](https://www.browserstack.com/guide/playwright-snapshot-testing) + +### Visual Regression Tools +- [Visual Regression Testing Comparison (Sparkbox)](https://sparkbox.com/foundry/visual_regression_testing_with_backstopjs_applitools_webdriverio_wraith_percy_chromatic) +- [Percy vs Chromatic vs BackstopJS (Medium)](https://medium.com/@sohail_saifi/visual-regression-testing-percy-vs-chromatic-vs-backstopjs-0291477a23ef) +- [Top Visual Regression Testing Tools (Apidog)](https://apidog.com/blog/best-visual-regression-testing-tools/) + +### HTML to Image Conversion +- [wkhtmltopdf Alternatives (AlternativeTo)](https://alternativeto.net/software/wkhtmltopdf/) +- [html2canvas vs Puppeteer (npm-compare)](https://npm-compare.com/dom-to-image,html2canvas,puppeteer) +- [DOM to Image Approaches (Medium)](https://medium.com/@danielsternlicht/capturing-dom-elements-screenshots-server-side-vs-client-side-approaches-6901c706c56f) + +### AI Vision Integration +- [Claude Computer Use for E2E Testing (Medium)](https://medium.com/@itsmo93/automating-e2e-ui-testing-with-claudes-computer-use-feature-c9f516bbbb66) +- [Claude Code Best Practices (Anthropic)](https://www.anthropic.com/engineering/claude-code-best-practices) +- [GPT-4V Screenshot Analyzer (GitHub)](https://github.com/jeremy-collins/gpt4v-screenshot-analyzer) + +### CI/CD Integration +- [Playwright Visual Regression with GitHub Actions (Medium)](https://medium.com/@haleywardo/streamlining-playwright-visual-regression-testing-with-github-actions-e077fd33c27c) +- [Sentry Visual Snapshot Action (GitHub)](https://github.com/getsentry/action-visual-snapshot) +- [Test Screenshots in GitHub Actions (Marmelab)](https://marmelab.com/blog/2023/11/20/screenshot-ci.html) + +### Modern Runtime Compatibility +- [Bun + Playwright (BrowserStack)](https://www.browserstack.com/guide/bun-playwright) +- [Bun Performance for Test Automation (Medium)](https://medium.com/@vitalicset/bun-is-it-fast-for-test-automation-90c9ef845e98) +- [Lightpanda Headless Browser (Roundproxies)](https://roundproxies.com/blog/lightpanda/)