Round #118Score 2.5/5Retail / e-commerce

The series' lowest score built its biggest missing component

Route: /retail-rewards
Desktop preview
Mobile preview

Captured at a 375px viewport. Long pages scroll inside the frame.

The screenshots stay in Japanese. Every round is a real screen for a real Japanese industry, so an English re-render would no longer be the screen the agent actually produced.

Write-up

The series' lowest score built its biggest missing component

⁠Build log series⁠: I hand a real screen to an AI that has never seen Gunjo (@gunjo/ui) and let it build. This round covered a consumer-facing retail screen: a ⁠membership app⁠ (point balance, member tier, coupons, point history).

After airline miles in and rail points in , retail points. The thing to watch this time: ⁠whether the hero block that shows balance and tier gets hand-rolled a third time⁠.

Result: 2.5/5, the lowest in the series. And the third sighting landed

Type checking passed, the phone-width layout held, and errors stayed at zero. But ⁠the score was the series' lowest at 2.5⁠, and ⁠that made it a goldmine of missing components⁠. The verdict from an agent that had never touched Gunjo:

⁠Staff-facing components are being bent onto a consumer screen.⁠ ⁠The points-and-tier hero block is entirely hand-rolled. That is the number one missing component.⁠ Not one component brings balance, points, and member tier together. "The part that is the face of the screen is all improvised handwork. ⁠The most important thing to add.⁠"

⁠Three in a row⁠: airline miles in , rail points in , and retail points here. ⁠Three separate cold agents each independently hand-rolled the membership hero block.⁠ The third sighting landed. ⁠I built it.⁠

Built: LoyaltySummaryCard, the membership summary card

<LoyaltySummaryCard tone="brand"        // a hero surface painted with the Gunjo gradient (or "default" for a plain card)
  meta="Happy's Drug Members"
  tier={<Badge variant="outline">Gold member</Badge>}
  balanceLabel="Point balance" balance="3,480" unit="P"
  secondary={[{ label: "Purchases this year", value: "¥86,200" }]}
  progress={{ value: 86200, max: 100000, label: "¥13,800 to Platinum", caption: "¥86,200 / ¥100,000" }}
  alert="200 P expire on 2026-06-30"
  action={<Button size="lg" variant="secondary" className="w-full">Show membership barcode</Button>} />
  • A hero balance display plus a tier badge, secondary figures, ⁠progress to the next tier⁠ (more is better, so it never turns red like a depletion meter), an expiry warning, and an action button.
  • ⁠With tone="brand" you get a hero surface painted in the Gunjo gradient⁠ (a showpiece face without hand-writing any colors). This directly advances the goal of raising the warmth of consumer screens (issue #367). "default" stays a plain card.
  • Issue #364 closed (PR #368): verified at phone width on a real device, with the gradient surface, a screen-reader-ready progress bar, both looks, zero overflow, zero errors.

The docs component search got fixed too

The component search on the docs site had no entry at all for points or member tiers, and in , , and here it kept misdirecting hero balance displays toward StatGroup and AnalyticsCard. I added "points, balance, and tier hero display: LoyaltySummaryCard" and drew the line against StatGroup (numbers in a row) and AnalyticsCard (a trend chart).

⁠The code built this round is LoyaltySummaryCard⁠ (the third sighting made the case). ListCard was reused across industries once again⁠ for coupons and history (the agent: "the only component on this screen that truly fit").

What I took away: a low-scoring consumer round produced the third go-anywhere component

Staff-facing rounds turned StatGroup, AmountBreakdown, ActionQueue, and Gantt into components; consumer rounds did the same for SeatMap and ListCard. This round's LoyaltySummaryCard spans airline, rail, and retail: ⁠a basic component for nearly any consumer screen⁠. The hunch I recorded in (rail needs points too) held up, the retail case here made three, and the build followed.

⁠The consumer deep dive ( through #118) produced two large components, SeatMap and LoyaltySummaryCard, and the latter stepped into warmth with the Gunjo gradient surface.⁠ The lowest-scoring round filled the largest gap. Low-scoring consumer rounds keep being where the missing components are found.

Components added to Gunjo so far

ComponentState
AmountBreakdown / ActionQueue / ListCard / Gantt / SeatMap / ⁠LoyaltySummaryCard⁠⁠Built⁠
TicketStub (boarding pass, membership card) / SegmentedControl / Gantt (time axis)one or two sightings each

Next up: build log

  • Consumer-facing bus or taxi (does SeatMap get discovered on its own in another industry), a membership barcode screen (a second TicketStub sighting), or consumer warmth (issue #367).

The run

The membership hero card, hand-rolled three times over, became a component on the spot, Gunjo gradient included. The lowest score in the series filled its biggest gap.

This series is co-created with AI (Claude and Codex). A human designs the experiments, makes the calls, and fact-checks before publishing; the AI does the hands-on work and drafting.

Components from @gunjo/ui

The components this screen's source imports directly.

The code the agent actually wrote

Click a file to expand its source.

業界別「AI指示書パック」、先行登録を受付中です。