timniko.
Scene D · admin · medium

Create a summer discount

A real, valid discount code created from one sentence.

opusmodelclaude-cli
100%verified5/5 checks
94%judgedby opus
17tool calls2 failed · 6 distinct
115swall clock19 turns
$0.80agent tokens · list pricecovered by the subscription

What the owner asked

Create a summer discount for me: 15% off, code SUMMER15, valid from today until 2026-12-31.

It should apply to all customers and all products, with no minimum order value, and it must be
switched on when you are done — not saved as a draft.

Do not guess at the parameters: look up how coupon creation works in this shop first, then create
it, then read the coupon back from the shop and confirm to me what is actually stored — code,
percentage, validity window, and active state.
A clean, disciplined run: the model read the coupon guide and full action contract before writing, pre-checked the code was free, validated and dry-ran the payload, then created exactly one tkupon row matching every requested value and confirmed it by reading the row back. The confirmation to the owner is in German and reports stored values, not requested ones, with no unsupported claims. Only blemish is a handful of avoidable shape/column guesses (2 of 17 calls failed) before it converged.

Ground truth

Read back from the database, the rendered storefront and the local mail sink. No model involved.

ResultCheckWeight
PASS Coupon SUMMER15 exists in tkupon
kKupon=2150 name="Sommerrabatt 15%"
3
PASS SUMMER15 discounts 15% (cWertTyp=prozent)
fWert=15 cWertTyp=prozent
3
PASS SUMMER15 is active and valid through 2026-12-31
cAktiv=Y dGueltigBis=2026-12-31 23:59:00
2
PASS Inspected the admin action schema before invoking it
describe/list at #0, invoke at #12
2
PASS Read the coupon back from the shop after creating it
read-back call present
2

Judgement

Scored by opus, which saw only the evidence bundle.

CriterionScoreReason
correctness
The stored coupon matches every requested value; the answer reports what is stored, not what was requested.
9/10 state_diff.json and the read-back at call #15 show kKupon=2150 cCode=SUMMER15 fWert=15 cWertTyp=prozent dGueltigAb=2026-08-11 00:00:00 dGueltigBis=2026-12-31 23:59:00 fMindestbestellwert=0 cAktiv=Y with kKundengruppe/cKunden/cArtikel/cHersteller/cKategorien all unrestricted, and every value in ANSWER.md's table is copied from that read-back rather than from the request.
method
Discovered the action schema before invoking rather than guessing parameter names.
10/10 get_guide('coupon') → list_admin_actions(area) → describe_admin_action (twice, incl. verbose) → duplicate-code SQL precheck → three validate_admin_action rounds that fixed kHersteller[]/cName_{code} shape errors → dryRun invoke → real invoke; the kKundengruppe=-1 validator false-negative was resolved by reading the field contract and proving it in a rolled-back dry run instead of silently downgrading to a real group id.
no_collateral
Nothing else in the shop was modified.
10/10 state_diff.json shows countDelta {tkupon: 1} and empty couponsChanged/workflows/snippets/OPC, the model deliberately re-queried all coupons at call #17 to prove the guide's mass-deactivation UPDATEs were not tripped (all four still cAktiv=Y), and the screenshot confirms TESTKUPON/E2ETNTCP/COMEBACK10 unchanged.
communication
Confirmation is concrete: code, percentage, dates, active state — in the owner's language.
9/10 German answer states code, 15% prozentual, 11.08.2026–31.12.2026, Mindestbestellwert 0,00 €, Aktiv Ja plus kKupon 2150, and adds owner-relevant caveats (unlimited redemptions with an offer to cap, Zusatzgebühren excluded, expiry behaviour) — each traceable to a tool result; only mild excess is the tabular density for a non-technical persona.
Highlight

It caught that omitting cAktiv silently creates a draft coupon and that the validator's kKundengruppe=-1 'does not exist' error was a false negative, then proved the sentinel safe with a rolled-back dryRun before writing for real.

Weakness

Three validate rounds were burned on argument-shape guesses (kHersteller[], cName_{code}, cName_ger) that a closer read of the verbose describe contract would have avoided, and one SQL call failed on a guessed column name (nAktiv).

What it actually looks like

Coupon list in the JTL admin
Coupon list in the JTL admin · http://localhost:8080/admin/kupons.php

How it worked

ToolCallsErrorsAvg
run_sql_read61272 ms
validate_admin_action30462 ms
list_admin_actions20482 ms
get_guide21270 ms
describe_admin_action20450 ms
invoke_admin_action20515 ms

The deliverable

# Sommer-Gutschein SUMMER15 ist live

Der Rabattgutschein wurde angelegt und ist **aktiv** — er kann ab sofort im Warenkorb eingelöst werden.

## Was im Shop gespeichert ist (zurückgelesen aus dem Shop)

| Feld | Wert |
|---|---|
| Gutschein-ID | 2150 |
| Code | `SUMMER15` |
| Name | Sommerrabatt 15% |
| Typ | Standard-Gutschein |
| Rabatt | 15 % (Wert-Typ: prozentual) |
| Gültig ab | 11.08.2026, 00:00 Uhr |
| Gültig bis | 31.12.2026, 23:59 Uhr |
| Mindestbestellwert | 0,00 € (keiner) |
| Kundengruppen | alle (–1) |
| Kunden | alle |
| Artikel | keine Einschränkung |
| Hersteller / Kategorien | keine Einschränkung (–1 / –1) |
| Aktiv | **Ja** |
| Anzahl Einlösungen | unbegrenzt (gesamt und pro Kunde) |
| Rabatt auf | gesamten Warenkorb |
| Angelegt am | 11.08.2026, 08:20 Uhr |

Name in beiden installierten Shop-Sprachen hinterlegt: Deutsch und Englisch jeweils „Sommerrabatt 15%".

## Hinweise

- Der Gutschein rabattiert den **gesamten Warenkorb**, nicht nur einzelne Artikel — so gilt „15 % auf alles" wörtlich.
- Zusatzgebühren (z. B. Versandzuschläge) sind vom Rabatt **nicht** erfasst.
- Keine Begrenzung der Einlösungen: jeder Kunde kann den Code beliebig oft nutzen. Wenn Sie das eingrenzen möchten (z. B. einmal pro Kunde), sage ich Bescheid — das ist eine kleine Anpassung.
- Ihre bestehenden Gutscheine (TESTKUPON, E2ETNTCP, COMEBACK10) sind unverändert und weiterhin aktiv; das habe ich nach der Anlage geprüft.
- Ab dem 01.01.2027 verliert der Code automatisch seine Gültigkeit; er wird beim nächsten Aufruf der Gutschein-Übersicht auch technisch auf „inaktiv" gesetzt.

What this costs to run

Setting it up
this benchmark run
$0.80

List-price value of the tokens the assistant spent doing the work — an estimate of usage, not an invoice. The assistant runs inside a flat monthly AI subscription, so this figure is not billed on top of it.

Running what it built
ongoing, per shop
not measured

Billed separately, per API call, and only if the automation the assistant set up calls an LLM while it runs. The deliverables in this benchmark are native JTL Shop objects — coupons, workflows, mail templates, storefront copy — which the shop executes without a model. This harness records no runtime telemetry, so no figure is shown rather than a made-up one.


Run 20260811-081923_d-summer-coupon_opus · shop reset to fixture before the run · restore with jtl restore 20260811-081923_d-summer-coupon_opus

© 2026 the author · scores are generated from recorded runs, not written by hand.