Skip to content

Add Recreation.gov task verifiers (site by @Chubi-alt, verifiers by reviewer)#66

Open
Django-Jiang wants to merge 4 commits into
aiming-lab:mainfrom
Django-Jiang:review/recreation_gov-verifiers
Open

Add Recreation.gov task verifiers (site by @Chubi-alt, verifiers by reviewer)#66
Django-Jiang wants to merge 4 commits into
aiming-lab:mainfrom
Django-Jiang:review/recreation_gov-verifiers

Conversation

@Django-Jiang

Copy link
Copy Markdown
Contributor

Reviewer grading contract for the Recreation.gov mirror. Based on @Chubi-alt's original PR #8 (site + 20 tasks); this branch stacks on that base and adds the deterministic verifiers + judge_rubric that the reviewer role is responsible for. Ground truth lives only inside the verifiers — tasks.jsonl gets verifier_path + judge_rubric only (no answer key).

Review summary

Mechanical: PASS

  • 17 sites HTTP 200; control plane healthy
  • Byte-identical reset on recreation_gov (md5 of instance/ vs instance_seed/ match)
  • reset-all ~0.7s

Visual + functional: PASS

  • Homepage / detail / Media Gallery fidelity with real imagery (no placeholders)
  • Login, register, save, add-to-cart, checkout, cancel reservation, account edit, and review submission all work end-to-end (driven via Playwright)

Task quality: PASS — no task changes required

  • All 20 tasks are solvable on-site; ground truth is unique and anchored on page-specific facts (not real-world recall)
  • Login credentials present in ques for all auth tasks; no no-op stateful tasks (every target state differs from seed); no answer leaks on listing cards

Grading contract added

  • sites/recreation_gov/verify/verify_lib.py + verify_0.pyverify_19.py (one per task)
  • tasks.jsonl: verifier_path + judge_rubric backfilled for all 20 tasks
  • Deterministic-first: navigation evidence (anti knowledge-shortcut) + answer/token match against frozen ground truth + SQLite after-state checks for the stateful tasks (11–16, 19). LLM utilities are anchored on ground truth and used only where exact matching is brittle.

Grading validated three ways

  • no-op run (homepage only, empty answer, clean DB) → FAIL on all 20 (no false positives)
  • correct solve → PASS on all 20 (13 factual via synthetic trajectories; 7 stateful via reset → Playwright mutation → verify against the live instance DB)
  • wrong-answer / no-navigation / DB-unchanged (self-reported success) → FAIL as expected
  • Also confirmed through the primary eval_judge.py --verifier True entry point.

Chubi-alt and others added 4 commits May 14, 2026 00:04
…eviewer)

Add the reviewer grading contract for the Recreation.gov mirror (site + 20 tasks
by @Chubi-alt, PR aiming-lab#8):

- sites/recreation_gov/verify/verify_lib.py: shared deterministic + anchored-LLM
  utilities (trajectory navigation, answer match, SQLite after-state helpers).
- verify_0.py .. verify_19.py: one deterministic verifier per task.
- tasks.jsonl: backfill verifier_path + judge_rubric for all 20 tasks.

Grading is deterministic-first: navigation evidence (anti knowledge-shortcut),
answer/token match against frozen ground truth, and DB after-state checks for the
stateful tasks (save / cart / checkout / cancel / account edit / register / review).
LLM utilities are anchored on ground truth and used only where exact matching is
brittle.

Validated: a no-op run FAILs all 20; a correct solve PASSes all 20 (factual via
synthetic trajectories, stateful via reset -> Playwright mutation -> verify);
wrong-answer, no-navigation, and DB-unchanged cases FAIL as expected.
Address code-review findings on the recreation_gov grading contract:

- verify_lib: LLM checks no longer fail-close. _verdict returns a None verdict
  when the model is unavailable and Judge.check skips it, so a correct answer is
  never failed just because no LLM was configured; a real LLM verdict still
  gates. count_present now matches tokens on word boundaries (e.g. "date" no
  longer matches inside "updated"). Removed unused helpers carried from the
  template (screenshot utilities, answer_equals, extract_ints, user_emails).
- tasks.jsonl: rewrite judge_rubric entries to state grading rules only; drop
  the ground-truth answer values that had leaked into the agent-facing file.
- Tighten deterministic gates: verify_18 requires naming both permit types
  (not the bare word "both"); verify_16 checks the required visit date;
  verify_13 no longer uses a brittle exact-list status compare. verify_5's
  permit-vs-campground classification is LLM-arbitrated (a blunt substring ban
  wrongly failed the correct "a permit, not a campground" phrasing).

Validated against a live instance: a no-op run FAILs all 20; changed gates
PASS a correct answer and FAIL the specific wrong case; stateful tasks pass via
real mutation; container reset remains byte-identical.
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