Add Target WebHarbor mirror - #51
Conversation
|
Reviewed end-to-end (Playwright + built from the paired HF assets). Given the size of the gap I'll take this on: I'll rebuild toward real target.com fidelity and author the 20 verifiers/rubrics, then open a follow-up PR based on this one. Thanks @Lxr-max for the solid mechanical base and the honest Known-Limitations note. |
|
Hi @Lxr-max , Thank you for your contribution. We noticed that the submitted website has poor quality and many submitted websites are generated from "best buy" template which do not qualify the accept criteria. Could you please have a check on your other submitted PRs? This PR (target website) will be assigned to @1171-jpg Thank you! |
Reviewer verifiers + content rebuild → submitted as #72The deterministic verifiers, judge rubrics and the content rebuild for this site are up as Review —
|
| Check | Result |
|---|---|
Syntax (py_compile app.py / seed_data.py) |
OK |
| Site isolation | no cross-site imports |
| Path hygiene | BASE_DIR-relative |
| Port registration | target = index 15 → 40015, self-consistent across the three files |
| Build | succeeds |
| HTTP 200 sweep | 16/16 sites return 200 |
Control plane /health |
ok, target alive |
| Byte-identical reset | FAIL — see F1 |
F1 (BLOCKING) — byte-identical reset fails
Consecutive builds of the seed DB produce different md5s (a9b540ea… vs 10771a85…), so
POST /reset/target cannot restore a byte-identical database.
Root cause: TimestampMixin defaults created_at to datetime.utcnow, and six seeded models
inherit it (User, Review, CartItem, WishlistItem, CompareItem, SupportTicket). Every
build stamps a different time. Function-level gating is present and correct — the invariant
breaks on the timestamps, not on re-seeding.
Fixed in #72 by rewriting seed_data.py with a fixed SEED_TIMESTAMP, explicit created_at
on every row and no RNG. Consecutive builds now yield an identical md5.
2. Visual fidelity — FAIL
F2 (BLOCKING) — placeholder imagery throughout
static/images/ contains 312 generated SVGs and no photography. 156 of them are named
BBY*.svg. Product cards, category tiles, store pages and the homepage hero all render flat
coloured blocks.
clone-website is explicit: "use REAL images from the live site … Never use placeholders,
coloured rectangles, AI-generated stock photos", and notes this is the #1 reason agents
reject reviews.
Fixed in #72: 1,932 real product photographs scraped from target.com via Playwright, plus
18 category images. Zero placeholders remain; a broken-image sweep across 30 pages reports 0.
F3 — Best Buy provenance in the catalog
The catalog is Best Buy's product set with Target branding: laptops, monitors, GPUs, camera
kits. Content-line comparison against the Best Buy PR shows 93.3% duplication (365 identical
content lines), and 156 image files still carry the BBY prefix. The real target.com sells
groceries, apparel, home goods, baby and beauty — none of which appear.
To be fair to the author, I checked cross-author copying separately: maximum overlap with any
other contributor's site is 4.8%, i.e. normal scaffolding. This is one author reusing their own
earlier work, not copied from someone else.
Fixed in #72: 1,932 real target.com products across 18 real departments.
F4 — mojibake in two templates
鈽? renders where a star glyph is intended (_product_cards.html:15,
product_detail.html:12,133) — a UTF-8 sequence written through a non-UTF-8 encoder. All 36
files in the directory also carry a UTF-8 BOM.
F5 — button overlaps discount text on /deals
.button lacks display:inline-flex, so the "Open product" control overlaps the savings line.
Automated checks miss this: the button is still clickable, so a click-and-assert test passes.
F6 — cart row image overflows its container
.cart-row img has no fixed dimensions and covers the product name and price.
3. Functional depth — FAIL
F7 (BLOCKING) — search is strict-AND
/search requires every token to match, so "coffee maker" returns 0 results while
"coffee" returns many. clone-website requires scored token-overlap, not strict AND;
review-env lists this as pitfall #3 with "Boston Celtic" as the canonical probe.
Fixed in #72: token-overlap with per-token scoring and relevance ordering.
F8 — no sign-out control in the UI
/logout exists as a route but nothing links to it, so a signed-in agent cannot sign out by
navigating.
Worth recording how this was found: my automated pass initially reported logout as PASS because
it requested /logout directly. Driving the URL routes around the defect. The human pass
caught it.
F9 — checkout accepts any card number
The payment step defaults payment_last4 to '1111' and performs no validation; an empty or
malformed card advances the flow.
F10 — product listings are unpaginated
/products renders all catalog items in one response. With the rebuilt catalog this became a
55 MB page. Fixed in #72 with 24-per-page pagination, matching target.com.
F11 — comparison table is always empty
compare_page reads section.get("items", []) while specs were emitted as a flat list, so the
lookup silently yields nothing and the table renders with no rows. No error is raised.
F12 — cart quantity does not accumulate
/cart/add assigns rather than adds, so pressing "Add to cart" twice leaves the quantity at 1
and the second press silently does nothing.
F13 — missing routes required by the contract
No /account/edit (listed under clone-website's required routes), no review-submission form
and no way to create a support ticket, though SupportTicket exists in the schema and seeded
rows are displayed.
4. Task quality — FAIL
F14 (BLOCKING) — tasks reference products that do not exist
tasks.jsonl cites Dell Horizon 14 OLED Laptop, Apple MacBook Air 13 Sky M3,
Acer NitroMesh 27, WD Vault 2TB, Canon Vista R10, Sony QuietWave XM6 and categories
monitors and Storage & Accessories. None of these are real target.com products, and none
survive a catalog rebuild.
All 20 were rewritten in #72 against verified facts.
F15 — several tasks are answerable from the search-results page
Answers such as price and rating are printed on the product card, so the detail page never has
to be opened. review-env §5 treats this as a leak.
5. Findings that were checked and debunked
An automated diff initially suggested this branch deletes sites/merriam_webster/, guts
agent_demo/eval_judge.py, rewrites .assets-revision and breaks .gitignore. All four are
artifacts of a two-dot diff against a branch forked at af0765d. Comparing against the merge
base (git diff $(git merge-base main HEAD)...HEAD) shows this branch touches none of them.
Recording this explicitly so the finding list is not inflated with things you did not do.
Separately: .gitignore on this branch does fail to ignore scraped_data/ and instance/,
because those two rules carry trailing # comments and .gitignore only treats # as a
comment at the start of a line. That is inherited from the fork point, not introduced here —
the three-dot diff for .gitignore is empty, and upstream main has since fixed it. Syncing
the branch to main resolves it.
6. Release mechanics
- The paired HF assets PR (discussion Add Discogs mirror site (port 40015) #34) is unmerged, so
target.tar.gzis absent from
the dataset and a clean clone cannot fetch the seed DB or images. .assets-revisiontherefore cannot yet be pinned to an immutable merge SHA.
Both are carried forward in #72: the HF PR must merge first, then the SHA gets pinned.
Summary
| Area | Verdict |
|---|---|
| Mechanical | FAIL (F1 byte-identical reset) |
| Visual fidelity | FAIL (F2 placeholders, F3 Best Buy catalog) |
| Functional depth | FAIL (F7 strict-AND search) |
| Task quality | FAIL (F14 tasks cite non-existent products) |
The app skeleton is worth keeping and #72 keeps it. Everything above is fixed there, with
your commit preserved at the base of the branch so the site authorship stays with you.
…erifiers Adds the Target mirror as the 17th site (index 16, port 40016), rebuilt from real target.com data scraped with Playwright. Catalog: 1,932 products across 18 categories, 562 brands, with real product photography, 19,821 specification rows and 2,350 scraped guest reviews. Tasks: 20 WebVoyager tasks in sites/target/tasks.jsonl, each anchored on a fact that only appears on a detail page. Grading contract: sites/target/verify/ with verify_lib.py and one deterministic verifier per task, recorded as verifier_path + judge_rubric on every task row. Ground truth lives only in the verifiers, never in tasks.jsonl. Assets uploaded to HF as target.tar.gz (discussions/46). Based on the Target site skeleton from aiming-lab#51 by @Lxr-max, which was reassigned for rebuild after review. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PLRyFZ4TjY9pC7uZkKJC6H
Summary
Implementation Summary
sites/target/using Flask, SQLAlchemy, SQLite, Jinja templates, and local CSS/JS.websyn_start.sh,control_server.py,Dockerfile, and README quickstart guidance.Seed Row Counts
Benchmark Users
TestPass123!Tasks
Key Routes
/,/home/categories,/category/<category_slug>/products,/product/<sku>/deals,/stores,/stores/<store_slug>/support,/help,/search?q=/cart,/checkout,/checkout/shipping,/checkout/pickup,/checkout/payment,/checkout/review,/checkout/confirmation/login,/register,/logout,/account,/account/orders,/account/rewards,/account/wishlist/order-lookup,/order/<order_number>Verification Commands and Results
py -3 -m py_compile sites/target/app.py✅py -3 -m py_compile sites/target/seed_data.py✅py -3 -m py_compile sites/target/_health.py✅sites/target/tasks.jsonlJSONL/schema validation ✅ (20 tasks)docker build -t webharbor:target-pr .✅docker run -d --name webharbor-target-submit -p 8401:8101 -p 44000-44015:40000-40015 webharbor:target-pr✅http://localhost:8401/health✅ (16/16sites alive)/,/home,/categories,/products,/cart,/checkout,/order-lookup,/support,/login,/stores,/deals,/search?q=pickup✅http-smoke-ok TGT-240061)Docker Result
scripts/build.shandscripts/extract_assets.shdirectly.Smoke Test Result
Reset + MD5 Result
POST /reset/targetreturnedready: true✅f7dc6396667b9dccb784c8d8612ea672 /opt/WebSyn/target/instance/target.dbf7dc6396667b9dccb784c8d8612ea672 /opt/WebSyn/target/instance_seed/target.db200and MD5 stayed identical ✅Screenshot Paths
sites/target/scraped_data/submission_review/home.pngsites/target/scraped_data/submission_review/search_results.pngsites/target/scraped_data/submission_review/product_detail.pngsites/target/scraped_data/submission_review/stores.pngsites/target/scraped_data/submission_review/support.pngsites/target/scraped_data/submission_review/login.pngsites/target/scraped_data/submission_review/checkout.pngsites/target/scraped_data/submission_review/order_lookup.pngsites/target/scraped_data/submission_review/deals.pngsites/target/scraped_data/submission_review/mobile_home.pngKnown Limitations
.assets-revisionwas not modified at this stage; it should only be updated after the upstream HF asset change is merged and a stable merge revision is available.HF Asset Status
C:\Users\34475\Desktop\VScode\wh-static-pr-target\target.tar.gz--create-prsucceeded:Manual Review Notes