portafilter.svg · 99 lines
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="850" viewBox="0 0 1200 850">
<defs>
<linearGradient id="steel" x1="0" y1="0" x2="1" y2="0"><stop stop-color="#66747b"/><stop offset=".18" stop-color="#e3e9e8"/><stop offset=".42" stop-color="#9ba8aa"/><stop offset=".68" stop-color="#f4f6f3"/><stop offset="1" stop-color="#75848a"/></linearGradient>
<linearGradient id="steelDark" x1="0" y1="0" x2="0" y2="1"><stop stop-color="#dce3e2"/><stop offset=".45" stop-color="#8e9b9e"/><stop offset="1" stop-color="#4a5a61"/></linearGradient>
<linearGradient id="basket" x1="0" y1="0" x2="1" y2="0"><stop stop-color="#65747a"/><stop offset=".2" stop-color="#e7ece9"/><stop offset=".5" stop-color="#aeb9b8"/><stop offset=".77" stop-color="#f2f3ef"/><stop offset="1" stop-color="#647279"/></linearGradient>
<linearGradient id="wood" x1="0" y1="0" x2="0" y2="1"><stop stop-color="#633b25"/><stop offset=".28" stop-color="#bd8050"/><stop offset=".56" stop-color="#98603a"/><stop offset=".82" stop-color="#c18a58"/><stop offset="1" stop-color="#57331f"/></linearGradient>
<filter id="shadow" x="-30%" y="-30%" width="160%" height="170%"><feGaussianBlur in="SourceAlpha" stdDeviation="7"/><feOffset dy="7"/><feComponentTransfer><feFuncA type="linear" slope=".22"/></feComponentTransfer><feMerge><feMergeNode/><feMergeNode in="SourceGraphic"/></feMerge></filter>
<pattern id="holes" width="17" height="13" patternUnits="userSpaceOnUse"><circle cx="4" cy="4" r="1.45" fill="#45545a" opacity=".78"/><circle cx="12" cy="10" r="1.25" fill="#45545a" opacity=".65"/></pattern>
<style>.label{font:600 15px 'Arial',sans-serif;letter-spacing:1.7px;fill:#26363d}.sub{font:12px 'Arial',sans-serif;letter-spacing:.6px;fill:#728087}.leader{fill:none;stroke:#76868b;stroke-width:1.4}.dot{fill:#bd7948}.fine{fill:none;stroke:#e9efed;stroke-width:1.5;opacity:.7}.dash{stroke:#98a5a8;stroke-width:1.2;stroke-dasharray:4 7;opacity:.75}</style>
</defs>
<rect width="1200" height="850" fill="#f5f4ef"/>
<path d="M55 109H1145" stroke="#c9d0cd" stroke-width="1"/>
<text x="58" y="58" font-family="Arial,sans-serif" font-size="25" font-weight="700" letter-spacing="3" fill="#24343b">PORTAFILTER</text>
<text x="59" y="84" font-family="Arial,sans-serif" font-size="12" letter-spacing="2.4" fill="#738087">EXPLODED ASSEMBLY / DOUBLE-SPOUT • REMOVABLE BASKET</text>
<text x="1140" y="61" text-anchor="end" font-family="Arial,sans-serif" font-size="11" letter-spacing="1.7" fill="#879397">ESPRESSO HARDWARE · 01</text>
<text x="1140" y="83" text-anchor="end" font-family="Arial,sans-serif" font-size="10" letter-spacing="1.4" fill="#a1aaa9">PARTS SHOWN IN ASSEMBLY ORDER</text>
<!-- exploded alignment -->
<path class="dash" d="M510 147V724"/>
<path d="M500 159l10-13 10 13M500 711l10 13 10-13" fill="none" stroke="#9ba7a8" stroke-width="1.2"/>
<!-- removable basket -->
<g filter="url(#shadow)">
<!-- perforated tapered wall -->
<path d="M400 208 Q510 235 620 208 L594 327 Q510 351 426 327Z" fill="url(#basket)" stroke="#536269" stroke-width="2"/>
<path d="M414 223 Q510 247 606 223 L585 320 Q510 340 435 320Z" fill="url(#holes)" opacity=".93"/>
<path d="M426 327 Q510 351 594 327 Q510 372 426 327Z" fill="url(#steelDark)" stroke="#536269" stroke-width="1.5"/>
<ellipse cx="510" cy="207" rx="112" ry="31" fill="url(#steel)" stroke="#45545b" stroke-width="2"/>
<ellipse cx="510" cy="207" rx="98" ry="22" fill="#58676c" stroke="#f0f2ed" stroke-width="2"/>
<ellipse cx="510" cy="207" rx="87" ry="16" fill="#a9b4b2" opacity=".7"/>
<path d="M403 209Q510 238 617 209" fill="none" stroke="#f7f8f4" stroke-width="2" opacity=".85"/>
</g>
<!-- basket lip marks -->
<path d="M421 238Q510 261 599 238M428 270Q510 291 592 270M434 299Q510 318 586 299" fill="none" stroke="#eef1ed" stroke-width="1" opacity=".55"/>
<!-- retaining spring, exploded below basket -->
<g filter="url(#shadow)">
<ellipse cx="510" cy="391" rx="82" ry="19" fill="none" stroke="#46575e" stroke-width="8"/>
<ellipse cx="510" cy="391" rx="82" ry="19" fill="none" stroke="url(#steel)" stroke-width="5"/>
<path d="M584 381q19 1 16 13q-3 9-17 9" fill="none" stroke="#58686e" stroke-width="5" stroke-linecap="round"/>
<path d="M588 381q12 3 9 11" fill="none" stroke="#eef1ec" stroke-width="1.5"/>
</g>
<!-- portafilter head with locking ears -->
<g filter="url(#shadow)">
<!-- ears / bayonet lugs -->
<path d="M405 466L350 453Q338 451 337 463L335 482Q335 491 347 493L406 498Z" fill="url(#steelDark)" stroke="#46565d" stroke-width="2"/>
<path d="M615 466L670 453Q682 451 683 463L685 482Q685 491 673 493L614 498Z" fill="url(#steelDark)" stroke="#46565d" stroke-width="2"/>
<!-- cylindrical head -->
<path d="M405 450 Q510 420 615 450 L615 508 Q510 538 405 508Z" fill="url(#steelDark)" stroke="#425259" stroke-width="2"/>
<ellipse cx="510" cy="450" rx="105" ry="31" fill="url(#steel)" stroke="#425259" stroke-width="2"/>
<ellipse cx="510" cy="450" rx="88" ry="22" fill="#58676c" stroke="#e2e8e5" stroke-width="2"/>
<ellipse cx="510" cy="450" rx="77" ry="16" fill="#26373e" stroke="#89979a" stroke-width="1"/>
<path d="M410 451Q510 479 610 451" fill="none" stroke="#f1f3ee" stroke-width="2" opacity=".65"/>
<!-- ear highlights -->
<path d="M343 463l57 12M679 463l-57 12" stroke="#f0f3ef" stroke-width="2" opacity=".75"/>
<!-- threaded handle boss -->
<path d="M608 477h52q15 0 21 11l9 14-13 17h-68z" fill="url(#steel)" stroke="#45555c" stroke-width="2"/>
<path d="M656 481v34M664 482v32M672 489v20" stroke="#586970" stroke-width="2"/>
</g>
<!-- handle, extending right -->
<g filter="url(#shadow)">
<path d="M683 491 C738 489 780 482 824 480 L1009 480 Q1038 480 1049 495 Q1057 508 1047 521 Q1038 533 1013 535 L823 535 Q777 530 682 517Z" fill="url(#wood)" stroke="#533620" stroke-width="2.4"/>
<path d="M716 496 C790 495 818 489 868 489 L1008 489 Q1030 489 1038 498" fill="none" stroke="#e0ac76" stroke-width="3" opacity=".65"/>
<path d="M717 511 C784 515 818 527 871 527 L1009 527 Q1028 526 1037 518" fill="none" stroke="#4e301f" stroke-width="2" opacity=".6"/>
<path d="M760 495q20 12 1 29M785 493q18 14 2 34M811 492q17 15 2 38" fill="none" stroke="#dfaa74" stroke-width="1.2" opacity=".45"/>
<ellipse cx="1039" cy="507" rx="9" ry="15" fill="#654127" stroke="#d5a16d" stroke-width="1.5"/>
</g>
<!-- separate double spout assembly below head -->
<g filter="url(#shadow)">
<!-- threaded inlet and central manifold -->
<path d="M487 567L533 567L529 592Q527 600 520 606L510 613L500 606Q493 600 491 592Z" fill="url(#steel)" stroke="#45555c" stroke-width="2"/>
<path d="M493 574h34M492 581h34M493 588h32" stroke="#59696e" stroke-width="2"/>
<path d="M500 602 C495 615 480 620 463 628 C448 635 443 648 445 662 L448 681 Q450 690 460 690 Q470 690 471 680 L470 659 Q469 653 478 649 L510 635 L542 649 Q551 653 550 659 L549 680 Q550 690 560 690 Q570 690 572 681 L575 662 C577 648 572 635 557 628 C540 620 525 615 520 602Z" fill="url(#steelDark)" stroke="#45555c" stroke-width="2.2"/>
<path d="M453 650Q461 646 471 651M549 651Q559 646 567 650" fill="none" stroke="#f1f3ef" stroke-width="2" opacity=".85"/>
<!-- two distinct outlet lips -->
<ellipse cx="459" cy="684" rx="12" ry="6" fill="#45545a" stroke="#dce3df" stroke-width="2"/>
<ellipse cx="561" cy="684" rx="12" ry="6" fill="#45545a" stroke="#dce3df" stroke-width="2"/>
<ellipse cx="459" cy="684" rx="6" ry="2.5" fill="#1c2b31"/>
<ellipse cx="561" cy="684" rx="6" ry="2.5" fill="#1c2b31"/>
<path d="M482 611Q510 620 538 611" fill="none" stroke="#f3f5f0" stroke-width="1.5" opacity=".7"/>
</g>
<!-- labels left -->
<g>
<text class="label" x="66" y="214">01 FILTER BASKET</text><text class="sub" x="66" y="235">Removable, perforated stainless cup</text>
<path class="leader" d="M284 227H350L391 245"/><circle class="dot" cx="391" cy="245" r="3"/>
<text class="label" x="66" y="383">02 RETAINING SPRING</text><text class="sub" x="66" y="404">Seats basket securely in the head</text>
<path class="leader" d="M286 396H375L427 391"/><circle class="dot" cx="427" cy="391" r="3"/>
<text class="label" x="66" y="535">03 PORTAFILTER BODY</text><text class="sub" x="66" y="556">Locking lugs engage the group head</text>
<path class="leader" d="M294 546H327L355 487"/><circle class="dot" cx="355" cy="487" r="3"/>
</g>
<!-- labels right -->
<g>
<text class="label" x="805" y="622">04 DOUBLE SPOUT</text><text class="sub" x="805" y="643">One inlet divides into two outlets</text>
<path class="leader" d="M795 635H690L573 656"/><circle class="dot" cx="573" cy="656" r="3"/>
<text class="label" x="856" y="560">05 SCREW-ON HANDLE</text><text class="sub" x="856" y="581">Turned hardwood grip</text>
<path class="leader" d="M850 568H817L808 529"/><circle class="dot" cx="808" cy="529" r="3"/>
</g>
<path d="M58 770H1142" stroke="#c9d0cd" stroke-width="1"/>
<text x="60" y="798" font-family="Arial,sans-serif" font-size="10" letter-spacing="1.3" fill="#8b9697">EXPLODED VIEW · COMPONENTS SEPARATED ALONG INSERTION AXIS</text>
<text x="1140" y="798" text-anchor="end" font-family="Arial,sans-serif" font-size="10" letter-spacing="1.3" fill="#8b9697">ILLUSTRATIVE — NOT TO SCALE</text>
</svg>round 1 of 2

Exploded portafilter: GPT-6 Luna
modelopenai/gpt-6-lunataskexploded-portafilter@v1, checks c1, harness h1date2026-10-05rounds2 of 8 allowed, 12 minutes on the clockcost$0.0041thinkingmediumtokens42,092 in, 5,543 out, of which 1,264 reasoningtime1 min 11 s
All five partsdecided by looking · Pass if every listed part is drawn as a separate shape and each has a label naming it. A part only named in a label or a comment, with nothing drawn, fails it. The label must say what the part is, in any words: a name that only says where it sits ("top plate") or what it is made of, or a mention in another part's caption, does not count.pass
Stack orderdecided by a number, from the filepass
Parts fitdecided by looking · Pass if each listed pair of mating parts looks as if it would go together as stated: the right angle, nested inside, or sitting on top. One pair that plainly could not fails it.pass
Two assembly axesdecided by looking · Pass if one line runs through the middle of every part on each listed axis, and every leader line leaves from the same side. One part pushed off its axis fails it.pass
Labels matchdecided by looking · Pass if following each leader line from its label ends on the part that label names. One label pointing at the wrong part, or at nothing, fails it.pass
There is no post about this one, since only some results need one, so the picture, the source and the scoring are here instead.
run 1 · 2r · $0.0040
run 2 · 7r · $0.0128same prompt, other modelsall 22 runs on Exploded portafilter →
Draw an exploded assembly diagram of an espresso machine portafilter, as an SVG. Use a double-spout portafilter with a removable basket rather than a bottomless one.Frozen at v1. This model got this and nothing else.
On a vertical axis, top to bottom: filter basket, retaining spring, portafilter body, double spout. The handle is on a horizontal axis off the body, so this is the one member with two axes. Checked against parts sellers, since no maker's exploded diagram could be fetched: Espresso Parts and Zirkus Coffee on the spring that clips into a groove inside the body and grips the basket rim, Espresso Parts on the spout that screws onto the bottom of the body, and Nepo Coffee on handles that screw onto a stud on its side. How it is scored, and this run's files on GitHub.