Skip to content

Foundations: judge/provenance/decomposition infra + main reconciliation - #84

Open
andalibmalit wants to merge 114 commits into
mainfrom
stack/1-foundations
Open

andalibmalit wants to merge 114 commits into
mainfrom
stack/1-foundations

Conversation

@andalibmalit

Copy link
Copy Markdown
Contributor

Foundation layer of a four-PR stack landing the recent benchmark work.

  • Judge self-preference analysis (structural control), content-binding provenance and DOI wiring, decomposition launch infrastructure (cohort grid, judge-artifact controls), and the similarity/dedup/rubric/HELM-power analyses.
  • Merges current main; where main's smaller variants of bootstrap.py and the CI scripts (PR §3.5 judge validation analysis + dataset exclusion canonicalization #68/Add 95% bootstrap CIs to headline HumaneBench scores #71) diverged from this lineage, the superset versions here win.
  • Cleanup: untracks scratch material (temp/, a 520 MB HELM cache tracked by accident, an internal word list), pseudonymizes rater first names in data/golden_questions.jsonl, renames the HELM scatter script to create_helm_delta_scatter.py, and drops stale references from comments.

Note: the commit list shows ~114 entries because an earlier history rewrite left main with different hashes for identical old content — the Files-changed diff is the real scope. Squash-merge this stack bottom-up.

🤖 Generated with Claude Code

ErikaOnFire and others added 30 commits November 19, 2025 15:14
clearer visualization generation instructions
updated figures fully after addition of GPT-5.1, and made steerabilit…
Add production-ready Python and TypeScript implementations of the HumaneBench v3.0 evaluator.

- Python script with CLI and programmatic API
- TypeScript/Node.js implementation
- Comprehensive README with usage examples
- Validation tests and example code
- Support for OpenAI, Anthropic, and custom API providers

This enables developers to easily integrate HumaneBench evaluation into their own codebases.
set evaluator version number, added node gitignore content
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Chart title: "The Anti-Humane Drift Problem" (was "The Model Drift Problem")
- README: update stale steerability references to match renamed scripts
- Principle charts: "Anti-Humane Drift: {principle}" title
- Table output: "Comprehensive Behavioral Drift Summary"

"Model drift" in ML literature means temporal performance degradation,
not what HumaneBench measures. These changes use domain-specific terms
that avoid confusion with established ML concepts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
andalibmalit and others added 23 commits May 17, 2026 18:26
…n tests

- Replace silent `continue` in `bootstrap_cohort_principle_means` with a
  `RuntimeWarning` naming the principle and missing (model, persona) cells.
  Production data has all 24 cells, but a future partial-data re-run now
  surfaces at runtime rather than dropping a Table 4 row unnoticed.
- Hoist the `cell()` print helper above the summary loop in
  `compute_cohort_principle_cis.py`; takes `principle` as an explicit arg.
- Extend `test_cohort_point_estimate_matches_mean_of_model_means` with
  explicit asserts on `n_models == len(models)` and ordered CI bounds
  (`ci_lower <= point_estimate <= ci_upper`, strict `ci_lower < ci_upper`)
  for both `cells` and `deltas` output frames.

Verified: output CSVs are byte-identical to the prior commit.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Move the paper variant's legend into the right gutter beneath the
"Failed" group label, shorten the labels, swap the baseline patch for
its actual black dot marker, and tighten row spacing by ~1/3
(0.35 -> 0.23 inch per model). Frees vertical space in the AAAI
fig_steerability layout without changing the full/compact web variants.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add AAAI HELM x delta_bad scatter renderer for paper section 4.6
Add cohort-mean per-principle bootstrap CIs for Table 4
It's only used inside the `if len(failed_models) > 0:` block now that
the legend anchor no longer references failed_indices[-1].

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…pact-legend

Compact paper-version legend for steerability chart
Prove the reported HumaneBench numbers were produced against the finalized
dataset, not by tuning prompts against results. Each reported .eval log embeds
the (id, input, target) it scored; we hash those and show they equal the frozen
prompt set, so "prompts tuned afterward" is impossible for the reported numbers.

- humanebench/provenance.py: single source of truth (freeze commit 9dc15bd,
  frozen prompt hash, canonical hashing recipe, shared helpers)
- scripts/build_provenance.py: regenerates provenance/MANIFEST.{json,md}
- scripts/verify_provenance.py: independent verifier, exits non-zero on mismatch
- provenance/MANIFEST.{json,md}: per-run record (45/45 runs bind to frozen set,
  all created after the 2025-11-16 freeze; post-freeze dataset commits preserve
  the prompt hash)
- PROVENANCE.md: chain of custody + honest limitations (run-time commit is
  local-only; judge models not version-pinned); Zenodo DOI placeholder
- README: Provenance & Reproducibility section

Tags (local): dataset-content-frozen-2025-11-16, evals-reported-2025-11

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
provenance/DEPOSIT_README.md ships inside the deposit tarball so the archive
self-documents offline verification. dist/ holds the (regeneratable) bundle.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reviewer noted the 3 LLM judges (claude-4.5-sonnet, gpt-5.1, gemini-2.5-pro)
are among the ranked models and 2 are in the top-4 "robustly humane" set, with
no structural control for self-preference beyond ensembling.

New scripts/compute_judge_self_preference.py builds that control from per-judge
severities already logged (humanebench.scorer individual_scores) — no new API
calls. Reuses humanebench.bootstrap for HumaneScore + paired-delta CIs.

Three analyses:
  1. Relative-generosity difference-in-differences (leniency-adjusted): every
     judge is mildly self-CRITICAL, not self-preferring — own-generation DiD is
     negative with CI excluding 0 (Claude -0.033, GPT -0.025, Gemini -0.064).
  2. Single-judge / leave-one-out rankings: Spearman rho ~0.94-0.996 vs ensemble.
  3. LOO robustness invariance: all 4 Robust models stay Robust when their own
     in-family judge is dropped.

Sanity gate: reconstructed 3-judge ensemble matches table1 to max abs diff 0.011.
Adds tests/test_judge_self_preference.py (6 tests).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Neutralize PROVENANCE.md and the README provenance section: state the verifiable
facts (frozen prompt hash, freeze commit, metadata-only post-freeze edits, how to
verify) without the p-hacking / anti-gaming framing. Keeps all technical content
and the honest reproducibility caveats.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add ZENODO_DOI constant, regenerate manifest, and reference the DOI in
PROVENANCE.md and the README.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A workflow-backed high-effort review found the headline ("no self-preference;
judges harsher on their own outputs") was overstated and not cleanly identified,
plus several real bugs. Independent raw-severity check confirmed: on the standard
own-vs-peers measure, the Gemini judge DOES mildly self-prefer (+0.064 own family,
+0.059 own generation, CI excludes 0); only Claude (-0.096) and GPT (-0.040) are
self-critical. The previous "all self-critical" headline relied on a leniency-
adjusted DiD that is (a) not quality-matched and (b) zero-sum across the 3 judges
(negative DiD == peers cross-preferring), so it cannot carry a clean causal claim.

Narrative reframe (tables/judge_self_preference.md):
- Lead with the raw own-vs-peers self-preference (honest mixed result: 2/3
  self-critical, Gemini mildly self-preferring).
- Demote the DiD to a clearly-caveated "leniency-adjusted" view.
- Anchor the rebuttal on the identified, decision-relevant results: single-judge
  & leave-one-out ranking stability (rho ~0.94-1.0) and robustness invariance
  (every Robust model stays Robust when its own-family judge is dropped). Gemini's
  self-preference is immaterial — its models still Fail under the adversarial
  persona regardless of judges.

Bug fixes:
- aggregate_judge_subset: count (not size) so a NaN/partial sample can't pass as
  a full-complement ensemble mean; --raw-csv path now drops NaN/off-scale rows.
- Paste-ready summary derived from the actual verdicts (no more unconditional
  "negative, CI excludes 0" claim on no-effect/n-a verdicts).
- Robustness status now from the marginal S_bad-S_baseline (matches displayed
  numbers and extract_all_scores); paired-delta CI kept in separate columns.
- Sanity gate fails on unmatched models (was np.nanmax-ignored).
- Warn when an own-generation model name doesn't match; empty-input guard;
  pivot includes principle (no silent dedup); Robust-set prose derived from data.
- Write ensemble_reconstruction_check.csv for provenance.

Tests still pass (6/6).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Brings the supplementary analysis to the paper's own bootstrap standard and the
LLM-judge literature's norms. All new uncertainty uses the same scenario-cluster
percentile bootstrap as humanebench/bootstrap.py (seed 20260407, n=1000).

- Ranking stability (the main gap): bootstrap CIs on the single-judge /
  leave-one-out ranking correlations, Kendall's tau primary (LOJO norm) +
  Spearman. Every config holds tau >= 0.83 vs the ensemble, with CIs.
  (bootstrap_ranking_correlations; single_judge_ranking_correlations.csv gains
  kendall/spearman ci columns.)
- Quantified invariance: bootstrap CI on the per-model HumaneScore change when a
  model's OWN judge is dropped (new loo_config_change.csv). Largest shift +0.073,
  all within the 0.1 Robust band and positive (the in-family judges are
  self-critical, so dropping them only strengthens Robust status).
- Multiple comparisons: two-sided bootstrap p-values on the 6 raw self-preference
  tests, Holm-Bonferroni corrected. The Gemini self-preference survives
  (Holm-adjusted p = 0.006). judge_self_preference.csv gains p_bootstrap/p_holm/
  significant_holm.
- Markdown: Kendall-tau-primary ranking table with CIs, an own-judge-drop change
  subsection, a Holm note on the Gemini case, and a Statistical methods paragraph.

Out of scope per decision: TOST/equivalence and a robust-OLS self-bias regression.

Tests: 11/11 pass (added Holm, bootstrap-p, ranking-CI invariance, and
config-change recovery). Sanity gate still PASS (max diff 0.011, 0 unmatched).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A workflow-backed high-effort review found that several auto-generated claims in
write_markdown were hardcoded rather than gated on the computed data — correct
for the current numbers but capable of printing false/self-contradicting
statements in this reviewer-facing document if the data shifts.

Narrative now derived from the data:
- §5 "inside the 0.1 Robust band, all CIs within it" checks every point estimate
  AND CI bound against 0.1 (falls back to the actual max otherwise).
- §2 "survives Holm-Bonferroni" gated on the actual Holm-adjusted p (<=0.05),
  not the raw CI; family size reported dynamically (collapses from 6 to 3 if
  own-generation data is absent).
- Paste-ready band/direction claim gated on within_band + all_positive; handles
  an empty change table (no more "at most nan").
- "Claude and GPT are self-critical" now names the actually-self-critical
  in-family judges from the §2 verdicts.
- Methods note corrected: §1-2 use a global scenario-cluster resample; only the
  §4 ranking and §5 change CIs stratify by principle.

Cleanups:
- Single source of truth DROP_MAP (was duplicated in build_config_change and the
  paste-ready loop).
- build_config_aggs aggregates each config once and feeds both the HumaneScore
  pipeline and the ranking bootstrap (was aggregating twice per run).
- The three new bootstraps use CI_LOW_PCT/CI_HIGH_PCT from humanebench.bootstrap
  instead of literal 2.5/97.5.

Numbers unchanged (CI level identical); only narrative/structure. 11/11 tests
pass; sanity gate PASS (max diff 0.011, 0 unmatched).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Pipeline check rebuilds the 35,416 / 44 accounting straight from the 45
.eval files and closes the 540-item gap that tables/inter_judge_agreement.md
left implicit (12 excluded prompts x 45 runs). The regenerated per-judge
table is identical to the committed inter_judge_raw.csv.

bootstrap_cohort_grid draws one scenario resample per replicate and carries
it across all 15 x 3 cells, which is the correct design for cohort-level
statistics (flip count, robust-set size) that bootstrap_cell_scores cannot
give. Point estimates match score_cis_long.csv to 3e-16.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…r drop

The flip count and Krippendorff alpha under each judge drop were the two
pieces compute_judge_self_preference.py did not cover. Flip holds at 10/15
under all three drops and all three single judges, with no model changing
status. Dropping the Claude judge adds Claude Sonnet 4 to the robust set --
the opposite direction from self-preference.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ric extraction, rubric sensitivity

- HELM MDE at n=13: 0.690 exact / 0.709 Fisher-z; observed r=+0.248 p=0.415
- Domain x principle: Cramer's V = 0.432; principle and domain not separable
- Inter-principle correlation reported with the general-model-quality confound
  made explicit, since high r across models is expected under either hypothesis
- Rubric extracted verbatim from log attachments; all 6 verification checks pass
- Flip holds at 10/15 under every rubric variant and every judge drop

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
results/paper_numbers.md is the single source of truth for the resubmission;
results/reconciliation.md checks all 78 numeric claims in the .tex against
regenerated values.

7 mismatches found, 6 traced to a single root cause: 6 of the 45 cells in
tables/table1_steerability_summary.csv are stale relative to both the logs
and score_cis_long.csv. Two of them make the .tex contradict itself inside
section 4 (Table 1 vs its own prose on Gemini 3 Pro and Gemini 2.5 Pro).

Embedding-cache freshness proven from git rather than assumed. MiniLM half
pending: sentence-transformers is installed but huggingface_hub cannot import
under the analysis sandbox.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Both embedding models now present. Zero pairs reach 0.80 under either model,
which is the load-bearing claim; the two models agree on principle ordering
(Spearman +0.905).

66 MiniLM pairs sit at or above the 0.60 threshold section 3.2 says the
pipeline filtered at. The threshold value is right but the mechanism is
misdescribed: find_duplicates compares new text against the already-accepted
set only, never within-batch and never re-screening, and the 39 seeds were
never filtered. It is an incremental admission rule, not a post-hoc property
of the finished dataset. Recorded as reconciliation mismatch #8.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adds the residual-pairs-above-threshold analysis to the generated report and
records the text-embedding-3-large breakdown (165 pairs, 99 within / 66
between, 181 scenarios) alongside the MiniLM one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ariants)

# Conflicts:
#	humanebench/bootstrap.py
…ELM safety cache

- Rename scripts/create_aaai_helm_scatter.py -> create_helm_delta_scatter.py (update importer)
- Venue-neutral wording in analyze_coverage.py, create_steerability_chart.py, scatter docstring
- Untrack temp/ (59 scratch files), anonymization_redaction_list.txt, and
  helm_integration/data/gcs_safety_cache/ (3,812 files, ~520 MB, referenced by no code)
- Pseudonymize human_rater_names in data/golden_questions.jsonl
- Extend .gitignore to cover local working material and oversized data files
@andalibmalit
andalibmalit requested a review from a team as a code owner August 7, 2026 02:35

@ErikaOnFire ErikaOnFire left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed as the root of the stack/1-foundationsstack/4-followup chain. Comment only — no formal verdict yet.

Context for the whole stack (stating it once here, rather than in all five reviews)

  • All seven of your open PRs are currently MERGEABLE with behind_by=0 against main at d94963d. Nothing is stale.
  • This repo has no CI at all. gh api repos/buildinghumanetech/humanebench/actions/workflows returns total_count: 0, and there is no .github/workflows directory. So where GitHub shows BLOCKED, that is review-required (required_approving_review_count: 1 plus require_code_owner_reviews), not a failing check. No check is going to turn green on its own.
  • No test suite could be executed during this review. inspect_ai, numpy, scipy, pandas and pytest are all unimportable in the environment I reviewed from, so nothing here was run. What was verified mechanically is that every changed .py file parses: ast.parse over the changed Python in each PR gave 18/37/4/122/9/8/10 files for #84/#85/#86/#87/#90/#91/#92 respectively, zero syntax errors. That is a floor, not a test pass.

What I verified on this PR and found good

  • humanebench/bootstrap.py is a strict superset of main. Modified, +289/−0. All nine of main's functions are present at identical line numbers, with CohortGrid, bootstrap_cohort_grid, _flip_mask, cohort_flip_stats and bootstrap_naive_grid added on top. No existing behaviour touched.
  • scripts/compute_cohort_principle_cis.py from #77 is still present. The main-reconciliation did not drop it.
  • The rename scripts/create_aaai_helm_scatter.pyscripts/create_helm_delta_scatter.py is self-contained. No tracked .md or .py still references the old name.
  • data/golden_questions.jsonl (+11/−11) changes exactly one field: human_rater_names goes from "andalib, erika, sarah" to "rater-a, rater-b, rater-c". IDs, inputs, targets and scores are untouched. Good anonymization, cleanly scoped.

Blocking, for me

1. The PR commits 42 MB of exactly the class of file its own .gitignore hunk adds rules for.

That same hunk untracks a 520 MB HELM cache and re-states that tables/inter_judge_raw.csv is excluded because it is "13 MB, regeneratable". Meanwhile this PR adds:

  • tables/inter_judge_raw_regenerated.csv — 22,300,829 bytes, 106,249 lines
  • data_generation/cache/principle_embeddings.npz — 19,663,104 bytes

The .npz lands in a directory named cache/ when .gitignore:13 already ignores the sibling data_generation/embeddings_cache/. Read together — a rule that excludes a 13 MB regeneratable CSV, alongside a newly committed 22 MB regeneratable CSV of the same family — this looks accidental rather than intended. And it is permanent history once merged; a follow-up git rm does not shrink the clone.

2. respect-user-attention_steerability.csv at the repo root (1,489 bytes) looks like a stray script output.

scripts/extract_principle_steerability.py:129 writes f'{principle_slug}_steerability.csv' into the CWD, and only one of the eight principles is present. One principle, repo root, no directory — that is the signature of a one-off run getting caught by git add -A.

3. 68 files / 100 commits / +116,039 is not reviewable as one unit with no CI. I can read individual files and did; I cannot give this a meaningful approval as a whole, and with review-required as the only gate, my approval is the entire gate.

The ask

Strip those three artifacts — the two large generated files and the stray root CSV — and as far as I can tell the rest is fine. The reconciliation work itself checked out everywhere I looked.

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.

4 participants