Skip to content

Review: validate NBA mirror and task grading (#30) - #101

Draft
jackjin1997 wants to merge 13 commits into
aiming-lab:mainfrom
jackjin1997:review/pr-30-nba
Draft

Review: validate NBA mirror and task grading (#30)#101
jackjin1997 wants to merge 13 commits into
aiming-lab:mainfrom
jackjin1997:review/pr-30-nba

Conversation

@jackjin1997

@jackjin1997 jackjin1997 commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

Review takeover

This Draft supersedes and preserves the NBA mirror contribution in #30. The original mirror commit remains authored by yichao; this branch adds reviewer-owned fixes, task hardening, deterministic verifiers, and an immutable asset candidate.

Changes in this review branch

  • adds and validates 20 one-to-one task/rubric/verifier contracts;
  • fixes standings rank semantics used by comparison tasks;
  • fixes the Stats More Stats rail so each ranking displays its own metric instead of PPG;
  • removes a homepage teaser that leaked the answer to an article task;
  • hardens read-only and state-changing verification, including exact allowed database deltas;
  • rebuilds the homepage, global header and global footer against measured NBA.com layout values;
  • shows the signed-in account in the header and adds the measured nav hover flyouts;
  • integrates current main and takes the port the 26-site registry now assigns;
  • pins the HF candidate commit.

Visual fidelity repair

A same-condition comparison against live NBA.com recorded the previous UI as a fidelity failure: the header wrapped into stacked rows and clipped trailing navigation, card rails collapsed into oversized single-column stacks, display typography was generic, and the footer hierarchy differed. NBA.com was measured in a real browser at 1440, 768 and 390 px plus a 1440 → 320 sweep, a bounded difference table was frozen before any edit, and the shared layer was then rebuilt:

  • one 55px header bar at every width, with a no-JavaScript hamburger panel below 1280px and a horizontally scrollable inline menu, so no destination is ever clipped away;
  • the measured media-led hero (948 × 680, right-hand media under a 90deg gradient, 474px copy column, related content, progress-bar slide controls) and the measured 485px media-on-top composition below 768px;
  • 188 × 282 story tiles and fixed 240px content slides in horizontal rails at every width, instead of reflowing grids;
  • condensed uppercase display typography at the measured sizes, plus the measured section-title rule, card radii and vertical rhythm;
  • a five-column footer that collapses into an accordion below 1024px;
  • the header now reflects the signed-in account instead of showing a static Sign In link on every page, and finally renders the cart count the app has always computed;
  • each primary nav item opens a white flyout on hover and keyboard focus, rebuilt on measured values, including the 720px Teams panel with all 30 clubs in six division groups. The panels are CSS-only and default to display: none, so their links stay out of the accessibility tree while closed. Below 1280px they are switched off and the hamburger drawer repeats every one of their destinations.

Homepage document height against NBA.com under identical conditions:

Width NBA.com Before Before ÷ upstream After After ÷ upstream
1440 4782 4178 0.87 4333 0.91
768 6736 7671 1.14 6358 0.94
390 6256 11874 1.90 6328 1.01

Upstream / before / after screenshot sets were captured for 16 page templates at three widths each. The repaired result was reviewed against the live site in a real browser and accepted, so the post-fix bundle is now the approved visual regression baseline for this branch. Deliberate differences are retained and recorded: the seeded in-season scoreboard stays even though live NBA.com is currently in an offseason state, no advertising or third-party widgets are reproduced, no video playback is faked, benchmark answer-leak protections are untouched, and the upstream display face is licensed so the mirror uses a condensed fallback stack.

Verified at the current head

  • 20/20 tasks executed at 8c38e65 and all 20 pass the deterministic verifiers, re-graded again against the current task file;
  • 23/23 NBA verifier/contract test methods pass in the candidate container, including 118 task subtests, the More Stats UI regression, five regressions covering the rebuilt UI, and a registry-port regression;
  • the shared registry invariants in sites/walmart_careers/tests/test_integration.py pass 6/6;
  • verifier tests cover correct executions, no navigation, wrong answers, wrong-task replay, foreign origins, illegal DB writes, stateful partial/extra writes, and legal extra query parameters;
  • POST /reset/nba leaves the database byte-identical to the unchanged seed;
  • 38 routes swept at 1440, 1280, 768 and 390 px (152 combinations): all return 200 with populated content, no horizontal page overflow, no broken images and no failed sub-requests;
  • the full image builds from this branch and all 26 registered sites return 200 before and after reset-all, with the control plane reporting 26/26 alive and ready and NBA answering on its registry port 40025;
  • byte-identical reset was proven by dirtying the database through the UI and confirming the reset restored the exact seed bytes, and the pinned asset revision reproduces the recorded seed hash both on disk and inside the built image;
  • an earlier frozen read-only blind review covered 20/20 tasks at the previous head ac356f97 and returned 20 PASS / 0 FAIL, and its NBA--12 finding was fixed and independently re-checked.

Upstream integration

main moved twice while this review was open, merging the FedEx mirror and then the WebMD Doctor mirror into the port slot this branch had been given. Both are integrated with the same rule: keep the slot the newly merged site occupies and append NBA after it, so no earlier site is remapped. NBA now takes 40026 in the 27-site registry, and the Dockerfile site count and EXPOSE range, the README site list and the shared port-range references follow it.

Task paths are unchanged throughout; only the origin moves, so sites/nba/tasks.jsonl is re-pointed each time. Verifiers match on loopback plus path and query and never on a port, so no verdict changes. A regression derives NBA's port from both launchers and asserts the task rows match it rather than freezing the number, so a future registry reorder fails in the suite instead of inside a benchmark run; it caught the second shift.

All 20 tasks were re-executed at the first merge commit. For the second, which touches only the web metadata port and no NBA template, stylesheet, application, seed or verifier code, the frozen runs were re-graded against the updated task file instead: all 20 still pass.

Draft limitations / pending review

  • The asset pin is an open Hugging Face PR, not a merged revision. .assets-revision points at 0cfa54bf, which carries both fedex.tar.gz and nba.tar.gz; main's 68dcbf2c has no NBA archive. HF PR Add Drugs.com mirror + task verifiers (site by @boyugou, verifiers by reviewer) #71 must merge and the pin must move to the HF merge commit before release.
  • Independent re-review of the rebuilt UI has not run. The earlier blind result describes ac356f97, before the layout rebuild. A refrozen 20-run packet exists for the current head and is awaiting an isolated reviewer; the agent that made the UI change does not supply that verdict.
  • External factual source fidelity remains not verified. No round has audited the seeded articles, rosters and statistics against real upstream facts.
  • reset-all timing is unmeasured. It took 59.7s against the ~1s the repository documents, but the host carried 22 unrelated containers at load 150-306 and the health endpoint was itself timing out, while a direct sweep showed all 26 sites serving. No timing claim is made; it needs re-measuring on a quiet host.
  • The unrelated Beta "Daily Dunk Score Leaders" panel is not sorted by its displayed composite values. No accepted task depends on it; it is retained as a non-blocking residual finding.
  • HF PR Add Drugs.com mirror + task verifiers (site by @boyugou, verifiers by reviewer) #71 is open and must not be merged by the reviewer.

This PR intentionally remains Draft until the independent re-review, the Owner visual decision, the source audit and the full-build constraint are resolved.

@jackjin1997 jackjin1997 mentioned this pull request Sep 12, 2026
7 tasks
@jackjin1997

Copy link
Copy Markdown
Contributor Author

Independent blind review (Claude Code, read-only)claude-blind-v1

  • Model: claude-opus-5 (Claude Opus 5)
  • Candidate per handoff manifest: code eae9ee95450b235d9dbabe186ff948b128a39ace (base 36004932bdf82afbe36dc14e00f66841eccf9946); assets ChilleD/WebHarbor @ 0cfa54bf8e18558f32c44d128fa6ab1f384b5da9 (archive sha256 4ade0429…b349d, seed sha256 0c34c5dc…4a3b2)
  • Coverage: 20/20 tasks reviewed, 0 unexecuted. 20 PASS / 0 FAIL. No failed task IDs.
  • Packet integrity: all 130 enumerated SHA-256 digests (task contract, state evidence, 20 trajectories, 108 screenshots) recomputed and matched.

Checks this pass did not execute or assert

  • Screenshots are 1440×900 viewport captures and no run scrolled, so for NBA--9, NBA--10, NBA--11, NBA--15 the exact answer value sits below the captured fold and rests on navigation plus adjacent on-screen context rather than a captured pixel. Same gap over the standings table for NBA--4 and NBA--19; NBA--16 is missing one of six comparison prices.
  • Runs executed against code shas 6380f319 / df5ed3d9 / 678ae6a8 and asset identities e4003386 / local seed — not the manifest's final candidate commit. The manifest's guided-run reuse claim was not verified here.
  • Observation: on Stats, the right-rail "More Stats" lists are not sorted by their own values, which makes "top player shown" ambiguous for NBA--12.

Scope: a read-only judgment of whether each frozen guided-regression execution completed its frozen task under the supplied non-answer-leaking rubric. It does not certify deterministic-verifier status, verifier correctness, source fidelity, asset provenance, or final readiness.

@jackjin1997

Copy link
Copy Markdown
Contributor Author

NBA--12 blind-review reconciliation complete

  • Root cause: the More Stats rail was ordered by each category's metric but rendered PPG for every category, making Total Assists visually ambiguous.
  • Fix: ac356f97 carries the metric key through the Stats context and renders that same metric. Task text, rubric, verifier, and expected leader were not relaxed or changed.
  • Fresh regression: the Players panel shows Joel Embiid first for Points; Total Assists is now visibly descending as Tyrese Haliburton 11, Luka Doncic 10, Nikola Jokic 9. The deterministic verifier passes and before/after/reset DB hashes remain seed-identical.
  • NBA verifier/contract suite: 18/18 test methods pass, including the new More Stats rendering regression.
  • Targeted independent recheck: PASS, with all frozen input hashes matching (claude-followup-nba-12-v1, SHA-256 149997d4fccc8f8425043147f93385e1b64130d8e0e355f278da60713bd8d505).

The PR remains Draft. Live NBA.com visual/source comparison and the resource-gated full Docker rebuild/all-site smoke are still not verified. The unrelated Beta Daily Dunk panel's ordering is recorded as a non-blocking residual; no accepted task depends on it.

Live same-condition comparison recorded the mirror as a visual-fidelity FAIL:
a header that wrapped into stacked rows, oversized one-column card stacks,
generic loose typography and a footer with a different hierarchy.

Measured nba.com at 1440/768/390 and rebuilt the shared layer against those
values:

- 1280px content column with 28px gutters and a 55px single-row header at every
  width, with a no-JS hamburger panel below 1280px and a horizontally
  scrollable inline menu, so no destination is ever clipped away.
- Media-led hero: right-hand media under a 90deg gradient, 474px copy column,
  related-content list, and slide controls with progress bars; the measured
  485px mobile composition below 768px.
- Stories rail as 188x282 portrait tiles and content rails as fixed 240px
  slides, both horizontally scrollable at every width instead of reflowing
  into full-width stacks.
- Condensed uppercase display typography, measured section-title rules, card
  radii and the image-left Around the NBA row at narrow widths.
- Footer rebuilt into the five measured link columns that collapse into a
  CSS-only accordion below 1024px, plus the social row and legal block.

Upstream breakpoints replace the previous 1080/680 pair, so the narrow
navigation regression test now asserts the invariant it was protecting (the
menu scrolls and the hamburger panel repeats every destination) instead of a
literal breakpoint string. Adds rail and footer regressions; all three fail
against the previous revision.

Verifier and contract suite: 20/20 test methods pass. Reset stays byte
identical to the seed and the seed hash is unchanged.
Two gaps found while reviewing a task trajectory at the rebuilt header.

The bar showed a static Sign In link on every page even while authenticated,
so a signed-in run looked signed out. That has been true since the original
contribution, and the cart count the app computes on every request was never
rendered anywhere. The header now shows the account name linking to the
account page, with a flyout for account, profile, orders, bag (using that
count) and sign out; signed out it keeps Sign In plus create-account.

NBA.com also opens a white flyout under each primary item on hover, which the
mirror did not reproduce. Measured on the live site: panel flush under the
55px bar, 4px padding, links Roboto 600 14px/21px with 12px 16px padding, and
a 720px Teams panel holding all 30 clubs in six division groups with logos at
Roboto 400 13px and 4px 16px padding. Both shapes are rebuilt with the
measured values, opened by :hover and :focus-within with no JavaScript.

Panels default to display:none so their links stay out of the accessibility
tree while closed, which keeps existing by-name locators resolving to the
visible bar. Below 1280px, where the hamburger takes over, the flyouts are
switched off and the drawer now repeats every flyout destination, so nothing
reachable on a desktop becomes unreachable on a narrow screen. The menu
scroller was moved to that same range because a scroll container clips
absolutely positioned panels; between 1280 and 1365 item padding tightens so
the full menu still fits without one.

Adds regressions for the signed-in header and for the flyouts; both fail
against the previous commit. Suite is 22/22. All 38 routes still return 200
with no horizontal overflow at 1440, 1280, 768 and 390.
Upstream main advanced to e7f8a5d while this review was open, merging the
FedEx mirror into the port slot this branch had given NBA.

Registry conflicts in websyn_start.sh and control_server.py are resolved by
keeping the slot FedEx already merged into and appending NBA after it, so
FedEx stays on 40024 and NBA takes 40025. No earlier site moves. The Dockerfile
EXPOSE range and site count, and the shared port-range references in README,
AGENTS, CONTRIBUTING, CLAUDE and the agent_demo README, follow the 26-site
registry.

Task paths are unchanged; only the origin moves, so every row in
sites/nba/tasks.jsonl is re-pointed from :40024 to :40025. A new regression
derives NBA's port from both launchers and asserts the task rows match it,
rather than freezing the number, so the next registry reorder fails there
instead of inside a benchmark run. It fails against the stale port and skips
where the registry is not mounted.

.assets-revision keeps this review's candidate 0cfa54bf rather than main's
68dcbf2c: 0cfa54bf is a superset carrying both fedex.tar.gz and nba.tar.gz,
while 68dcbf2c has no NBA archive. The shared registry test is updated to that
pin with a note that it is still an open Hugging Face PR and must be re-pinned
to the HF merge commit before release.

Registry invariants 6/6 and the NBA verifier suite 23/23.
…signs

main advanced to f20b5ee with the WebMD Doctor mirror, which took the slot this
branch had just been given. Same resolution as before: keep the slot the newly
merged site occupies and append NBA after it, so WebMD Doctor stays on 40025
and NBA takes 40026 with no earlier site moved. The Dockerfile site count and
EXPOSE range, the README site list and range, and the shared port-range
references follow the 27-site registry.

Task paths are unchanged; only the origin moves, so every row in
sites/nba/tasks.jsonl is re-pointed to :40026. The registry-port regression
added in the previous merge caught the drift and now passes against the new
index.

.assets-revision keeps 0cfa54bf. main pins ad6f424f, which carries 27 archives
including webmd_doctor but no nba; 0cfa54bf carries 28 including all three of
fedex, webmd_doctor and nba, so it remains the only pin that lets the
integrated image build. The note that it is an open Hugging Face PR and must be
re-pinned to the HF merge commit before release is retained.

Run evidence is reused rather than re-executed. This merge touches exactly one
NBA file, the web metadata port in tasks.jsonl; no template, stylesheet,
application, seed or verifier code changed. The 20 frozen runs were re-graded
against the updated task file and all 20 still pass, and the verifiers match on
loopback plus path and query rather than on a port.

Registry invariants 6/6 and the NBA suite 23/23.
@jackjin1997

Copy link
Copy Markdown
Contributor Author

Independent blind review — postfix-v3 execution bundle

Model: claude-opus-5 (Claude Opus 5), reviewed in a session isolated from this case's review context.

Bundle: manifest-postfix-v3.json (sha256 6a380075143c6a072bb2c8265c871f29436f863eef9bd608a69aab6701411b6e)

  • runs executed at code 8c38e658caef5ae06467736c150b39811ba6ce8d
  • manifest final_code_sha c66dc67f571a35e3eb70a74896965fb0a3611417
  • asset revision 0cfa54bf8e18558f32c44d128fa6ab1f384b5da9 (ChilleD/WebHarbor)

Integrity: all 130 enumerated inputs (task contract, state evidence, 20 trajectories, 108 screenshots) matched their recorded SHA-256.

Coverage: 20 / 20 tasks reviewed, none unexecuted.
Result: 20 PASS, 0 FAIL. No failed task IDs.

Not established by this pass / unexecuted checks:

  • Screenshots are 1440x900 viewport captures and no run issued a scroll step, so for NBA--3, NBA--9, NBA--10, NBA--11, NBA--15 and NBA--16 the decisive value sits below the captured fold and was judged on trajectory consistency plus cross-run corroboration rather than direct pixel confirmation. NBA--16 ("cheapest" T-shirt) and NBA--15 ("highest-priced" ticket card) are the weakest such comparisons.
  • Trajectories run against 127.0.0.1:53431 while the frozen task contract records http://localhost:40026/; this review takes the manifest's port-only reuse rationale as given rather than verified.
  • Deterministic-verifier status, source fidelity, and similarity to current NBA.com were not inspected and are not established here.

This pass judges frozen-execution completion only. It is not a verifier-correctness, source-fidelity, or final-readiness sign-off.

The standings page ranked Oklahoma City first in the West while team_seed(),
used by the Games page, the game strip and the series page, ranked Denver
first. The same site answered "who is the West top seed" two different ways
depending on which page you were on.

Oklahoma City and Denver both finished 2023-24 at 57-25 and the league seeds
Oklahoma City first. That tiebreaker is not derivable from the seed data, so
the standings page carried a hardcoded published order while team_seed() fell
back to sorting by city, where "Denver" precedes "Oklahoma City".

Hoist the published order into OFFICIAL_SEED_ORDER and a shared seed_sort_key()
so every surface that displays a seed reads one source.

Add SeedingConsistency, which asserts both call sites use the shared key, that
neither sorts by city, and that the West resolves to Thunder then Nuggets on an
identical record. Both tests fail against the previous code. They avoid
importing the app so they run on a bare checkout.

No accepted task changes answer: NBA--4 routes through the standings page,
which was already correct, and no task asks for the seed badge shown on the
Games page.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@jackjin1997

Copy link
Copy Markdown
Contributor Author

Independent blind review — postfix-v5 packet

  • Model: claude-opus-5 (Claude Opus 5, via Claude Code)
  • Manifest: manifest-postfix-v5.json, sha256 0379abd1587d2e4d34203bc7d841ed7f1984d7596bec68df9b3042f78e76f907
  • Candidate code cfec7ce891caa475d5c379411d574ed5a63a0178 (base f20b5ee8377ba31bcb825b4dfe30ad96c416e477); runs recorded at code c66dc67f571a35e3eb70a74896965fb0a3611417
  • Assets ChilleD/WebHarbor @ 0cfa54bf8e18558f32c44d128fa6ab1f384b5da9, archive sha256 4ade0429edc12ffbfa1ee42a8f0192fc3009647912ff57a8d232d52abe7b349d
  • Coverage: 20/20 tasks reviewed, 0 unexecuted. Result: 20 PASS / 0 FAIL.

Packet integrity: all 130 enumerated inputs hash-matched (contract, state evidence, 20 trajectories, 108 screenshots), no missing files, all 20 task texts and rubrics match the frozen contract, and all screenshot dimensions are consistent with the declared full-page capture mode — so no decisive value sat below a fold in this review. Every comparison/superlative claim (NBA--2, --5, --6, --12, --15, --16, --18) was re-checked against the full-page image and none is contradicted by what the page shows.

Disclosure. The manifest's reuse rationale asserts that no image in this packet shows a conference-seed badge for Oklahoma City or Denver. Two images in the packet contradict it — NBA--4/postfix-guided-v4/screenshots/step_001.png and NBA--19/postfix-guided-v4/screenshots/step_002.png — both rendering the Western Conference standings with rank 1 Oklahoma City Thunder and rank 2 Denver Nuggets, exactly the pair the manifest says swaps between c66dc67 and cfec7ce. (Corroborating inside the trajectory: NBA--4 step 1 clicks a link whose accessible name is literally 1 Oklahoma City Thunder.) NBA--4's task turns on that value — "the Western Conference's top seed" — so its PASS attests to frozen-execution completion at c66dc67 and does not transfer to the candidate head. NBA--19 reads only Dallas Mavericks at seed 5 (50-32) and is unaffected.

This blind pass covers frozen-execution completion only. It does not certify source fidelity, deterministic-verifier correctness, current NBA.com similarity, or final readiness. PR left in Draft; no GitHub or Hugging Face PR merged.

jackjin1997 and others added 2 commits September 13, 2026 23:54
Upstream merged healthline (index 26) and kaggle (index 27) while this review
was open. Healthline took 40026, the slot this branch held, so NBA moves to
index 28 and port 40028. No earlier site moves, which is what the shared
registry invariants require.

Nothing under sites/nba changes except the task file's declared port: the
20 rows move from :40026 to :40028. Paths, queries and required routes are
byte-identical, and verifiers match on loopback plus path and query rather
than a port, so no task answer or verdict can change.

Known limitation, recorded rather than papered over: neither asset pin now
covers the 29-site registry. Ours (0cfa54bf) carries nba but predates
healthline and kaggle; main's (64264d06) carries those two but has no nba
archive. This branch keeps its own pin so the NBA site builds, which means a
full image build cannot fetch healthline or kaggle assets until HF PR aiming-lab#71 is
refreshed onto the newer dataset main. That refresh must happen before this
PR is mergeable.

Shared registry invariants pass 6/6 and the NBA suite passes 25/25 in the
runtime image, with the registry-port guard passing on a checkout.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The merge commit moved NBA to index 28 in both launchers but left the task
file declaring :40026, because the rewrite happened after the conflict
resolutions were staged and `git commit` only takes what is staged. The
committed tree was internally inconsistent.

test_tasks_use_the_registered_nba_port, added when the previous merge moved
the site, fails against that tree and passes against this one. That is what
the guard was for: it derives the port from both launchers instead of
freezing a number, so a registry move that the task file misses fails in the
suite rather than inside a benchmark run.

Only the declared origin changes. Paths, queries and required routes are
byte-identical and verifiers match on loopback plus path and query.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants