Skip to content

issue-642 round-5: second-behavior-rank-replication (refusal) — directional replication, PARTIAL#483

Open
superkaiba wants to merge 50 commits into
mainfrom
issue-642
Open

issue-642 round-5: second-behavior-rank-replication (refusal) — directional replication, PARTIAL#483
superkaiba wants to merge 50 commits into
mainfrom
issue-642

Conversation

@superkaiba

Copy link
Copy Markdown
Owner

Round-5 same-issue follow-up of #642 (second-behavior-rank-replication, source: user-chat).

Headline: the adapter-vs-dense leakage gap replicates DIRECTIONALLY on a second behavior (refusal): Δ_rank_matched = +0.027, CI excludes zero, |point| < +0.04 separation band, profile Spearman ρ=0.94 — PARTIAL per the analysis verdict_legend; about half the magnitude of round-4 sycophancy +0.063.

What's in this PR:

  • Round-5 refusal eval JSONs: eval_results/issue_642/refusal/ (stage_a trajectory, verdicts × 7 cells, on-policy generations) + eval_results/issue_642/refusal_v9/analysis.json
  • New cross-behavior figure: figures/issue_642/refusal_r5_cross_behavior.{png,pdf,meta.json}
  • Updated clean-result body folding round 5 into the existing v3 clean-result (new ### <finding> under ## Findings + Takeaways re-synthesis + tail-concentration caveat + bracket-asymmetry / s*-sweep / install-strength-contingent caveats; H1 rescoped: refusal is follow-up evidence, not goal-level conclusion; MODERATE confidence anchored by parent sycophancy decomposition).
  • Methodology doc EXTEND for the second-behavior-rank-replication arm (docs/methodology/issue_642.md §3-§6 round-5 sub-blocks + §2 hyperparameter column).
  • Workflow-improver edit hardening reviewer agents (.claude/agents/{interpretation-critic,code-reviewer,clean-result-critic}.md) — make task.py post-marker the REQUIRED last step.
  • Agent memory updates (experiment-implementer).
  • Various spec-freshness syncs from main.

Adversarial review: interp-critic ensemble passed at round 3 (reconciler resolved round-2 tail-concentration disagreement); clean-result-critic ensemble passed at round 3 (reconciler resolved round-2 check-21 + Lens-10 disagreements). All round-5 reconciler verdicts logged on events.jsonl.

🤖 Generated with Claude Code via Happy

Co-Authored-By: Claude noreply@anthropic.com
Co-Authored-By: Happy yesreply@happy.engineering

superkaiba and others added 30 commits June 15, 2026 01:33
…alysis

Adds the cmft (coverage-matched full-FT) arm to #606's sycophancy
LoRA-vs-FT bystander-leakage comparison, isolating the module-coverage
component from the rank-or-adapter-bundle component at matched s*=0.50.

- train_behavior_fullft.py: port of origin/issue-606 trainer + the
  apply_coverage_match_freeze mask (train only the 7 _proj weights + the
  q/k/v_proj biases; freeze embed_tokens/lm_head/LayerNorm) gated by
  --freeze-outside-lora-modules, with 3 fail-loud asserts (84 q/k/v biases,
  module-set identity vs the #606 adapter_config, 0.80-0.92 trainable
  fraction).
- scripts/issue_642/: dispatcher (cmft arm token, freeze-flag wiring,
  Phase-0 adapter_config download + reused-#606-cell enumeration, install
  gate + lr-2e-6 retrain lever, sentinel with reproducibility_card),
  3-arm analyze (Delta_rank=cmft-LoRA / Delta_coverage=FT-cmft + additive
  identity + re-judge of the reused LoRA/FT arms), gen/lora workers,
  figures (decomposition-bar hero), common (two pinned shas + cmft grid).
- configs/accelerate/zero3_4gpu_accum1.yaml: ZeRO-3 config (verbatim port).

Smoke: freeze-mask CPU smoke (196 _proj weights + 84 biases, neg tests),
Phase-0 against real HF artifacts, full --smoke --dry-run (6 phases,
terminal [phase=done]), FT-trainer signature smoke, synthetic 3-arm
analysis (designed-gap recovery PASS, both bracket + no_bracket modes),
figures render. verify-imports: 51 deferred symbols across 7 files.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ight + per-arm fallback + --run-label CLI

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closes round-3 CONCERN 642-run-label-local-cache-collision: _ensure_local's
local short-circuit keyed on <root>/<behavior>/<rel> omitting cmft_experiment,
so a --run-label cmft-lr2e6-retrain run reusing the same --eval-root silently
read the stale default-prefix cmft artifacts. New _cmft_cache_root nests a
run-label-scoped cmft prefix under _runlabel_<run_label>; the default
(HF_EXPERIMENT_NAME) and reused-#606 (PARENT_EXPERIMENT_NAME) prefixes keep
the existing flat layout (existing caches still hit; reused path unchanged).
The lazy-generation else-branch uses the same scoping. Regression tests added.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…noise_limited; Δ_rank=+0.073 [+0.053,+0.100], Δ_coverage=+0.025 [+0.007,+0.041], additive=+0.099 vs #606 +0.098); fix stacked-bar errorbar negative-yerr crash
…cy constants

Deliverables 1+2 of the onpolicy-matchedlr-rank-isolation follow-up (plan v5
§4.2): (1) i642_lora_train_worker.py gains --lr (+ --run-name-suffix) so the
LoRA pole trains at the matched 1e-5 with a custom grid; (2) i642_common.py
gains the v4 villain source, MATCHED/ORIG LRs, 4-arm registry + 3 within-villain
contrasts, fine + pilot grids, #612/#411 pool/panel/probe pins (sha-verified),
and the v4 panel loader + disjointness + byte-identical-negatives + canned-pool
splicer helpers. v3 constants untouched.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Deliverable 3: i642_v4_splice_canned_pool.py reuses #411's 200 villain canned
positives + #612's 500 on-policy negatives (byte-identical), sha-pinning both
source pools at fetch and asserting the byte-identical-negatives invariant
(the single-variable guarantee for Delta_data). Smoke: 700-row pool built,
negatives sha matches #612, exit 0.

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

Deliverable 4: i642_dispatch.py gains a --v4 mode (plan v5 §4). Trains the 4
villain arms (loraOP_lr1e5/cmftOP_lr1e5/cmftOP_lr5e6/cmftCN_lr1e5) at matched
LR on on-policy data + reads them on the #612 30-panel; NO #606 reuse. Phase 0
fetches+sha-verifies the #612 on-policy pool + #411 canned pool + panel +
eval_60 + #612 adapter_config, splices the canned-cmft pool (byte-identical
negatives), runs v4 disjointness asserts. Phase 1 trains each arm at its own
LR/pool (LoRA worker --lr / cmft trainer --learning-rate + --run-name-suffix).
Per-arm-slug ckpt roots + selection grouping (3 cmft arms don't collapse).
--install-pilot (Phase 0.5 short-train gate). v4 reproducibility card with
per-arm wandb_run_names + wandb_project=issue642 + wandb_entity (read off the
SDK). v3 path untouched. Dry-run smoke: p0->p5->done, exit 0, sentinel + card
verified.

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

The CPU phase-0 smoke surfaced that #612's on-policy positives run ~397 tokens
(vs #411's short canned templates), tripping the inherited _assert_completion_
lengths 2x-eval-tokens rule. v4 sycophancy is a FREE-GENERATION behavioral eval
(512 max_new_tokens is the CLAUDE.md free-gen exception, not the marker/end-of-
completion 2x rule), so the relevant guard is TRAIN-time truncation: full
prompt+completion must fit max_length=1024. Added _v4_assert_train_truncation;
real phase-0 smoke now PASSes (max total 440 <= 1024).

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

The plan claimed no analyzer changes, but i642_analyze was v3-wired (3-arm
lora/cmft/ft + #606 reuse + additive-to-#606). Adds a parallel v4 path:
_v4_analyze_behavior computes Delta_rank_matched / Delta_LR / Delta_data over
the 4 NEW villain arms from THIS run's eval_root (NO #606 reuse, NO additive-to-
#606 check), on the #612 29-bystander panel, reusing the shared verdict-matrix +
_two_arm_gap + bootstrap machinery. v4 decision rule (H_survives / H_artifact /
indeterminate). make_synthetic_v4 4-arm fixture + --v4 routing. Synthetic smoke:
designed Delta_rank_matched=0.06/Delta_LR=0.04/Delta_data=0.05 recovered within
tol 0.06 (verdict H_survives); no_bracket fallback exercised (exit 0). Resolves
concern v4-analyzer-decomposition-not-implemented.

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

Fixes BLOCKER install-pilot-not-production-safe (round-1 reconciler FAIL):
pilot now trains into ckpts_pilot/<arm> + reads into stage_a_pilot/ with
pilot_trajectory.json + selection_pilot.json, so the production full run never
resume-skips on pilot artifacts. Adds an embedded p0_5_pilot_gate phase (before
p1_train) implementing the plan §7 step-4 dense-collapse + LoRA-monotonic gate
that HALTs the production launch on failure.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Addresses non-blocking concern v4-artifact-pins-incomplete: _phase0_data_v4
now asserts EXPECTED_SHA256 for the #612 30-panel, eval_60 probes, and #612
villain adapter_config (previously only the two training pools were pinned).
All 5 pins verified live against the Hub. Shas recorded in data_manifest.json.

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

Records the #642-r2 trap: Edit/Write absolute file_path must target the
.claude/worktrees/issue-<N>/ tree; the bare repo-root absolute path is a
separate file on main and silently strands work off-branch.

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

Item 1 of plan v8 §4.2: execute the v5 §7 pre-authorized matched-LR shift.
V4_MATCHED_LR = 5e-6 (was 1e-5); add V4_OLD_MATCHED_LR = 1e-5 for evidence
prose. V4_ARMS = (loraOP_lr5e6, cmftOP_lr5e6, cmftCN_lr5e6); the three 1e-5
slugs retained as role="evidence_only" (lr_name="old_matched"). V4_CONTRASTS
drops delta_lr; delta_rank_matched + delta_data re-pointed to the 5e-6 arms.

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

Item 2 of plan v8 §4.2: help-text only (the --lr flag already exists from v5;
the dispatcher passes --lr 5e-6 for loraOP_lr5e6). Align the docstring example
slug + the matched-LR note to the v8 5e-6 value.

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

Item 3 of plan v8 §4.2. (a) arm-parse guard raises a distinct refuse-to-train
error when --arms names an evidence_only (falsified v5-round-1 1e-5) slug, so a
stale launch command fails loud instead of silently training a refused arm
(§8-bis resume-invalidation guard); (b) _train_v4_lora_arm + _train_v4_cmft_arm
docstrings -> loraOP_lr5e6 / cmftOP_lr5e6,cmftCN_lr5e6 at 5e-6; (c) hardcoded
HF lora_pole_upload path loraOP_lr1e5_ -> loraOP_lr5e6_; (d) --v4 + --arms help
text -> 3 production slugs (loraOP_lr5e6,cmftOP_lr5e6,cmftCN_lr5e6; default all
3); contrasts metadata drops delta_lr. verify-imports OK (59 symbols).

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

Item 4 of plan v8 §4.2: update make_synthetic_v4's per-arm coeff map +
no_bracket LoRA-arm checks to the v8 slugs (loraOP_lr5e6 = coeff(p);
cmftOP_lr5e6 = +RANK_COEFF; cmftCN_lr5e6 = +RANK_COEFF+DATA_COEFF); remove the
LR_COEFF synthetic term + known_delta_lr metadata (the Δ_LR contrast is gone,
§3). Update the H_artifact verdict branch + legend/docstring prose to the 3-arm
decomposition (Δ_rank_matched / Δ_data). Because V4_ARMS + V4_CONTRASTS are
imported from i642_common, the contrast loop + figures follow automatically.
Synthetic round-trip PASSes all 3 modes (bracket/no_bracket/opposite_direction);
syn_check recovers both known deltas within tolerance.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…test (§3 mechanizer)

Item 6 of plan v8 §4.2 (Statistics-lens reconciler fix). Extract the v4 decision
rule into _classify_outcome(delta_rank_ci, delta_data_ci, thresholds) ->
(label, subreason|None), routing the 7 reachable (Δ_rank_matched, Δ_data) cells:
H_survives / H_artifact / opposite_sign_rank / rank_in_band_data_quiet /
rank_wide_data_separates / rank_wide_data_quiet / rank_positive_uncertain. The
caller keeps the pre-lattice skipped-arm + determinacy guards and now persists
the §3 subreason tag in headline.subreason (+ subreason_legend). tests/
test_i642_classify_outcome.py enumerates the 7 cells (exactly one label+subreason
each), asserts 7 distinct outcomes, and sweeps a dense CI grid asserting the
lattice is TOTAL + UNIQUE (no holes) — mechanizing the §3 totality claim so the
v6-era non-exhaustiveness cannot re-recur. 11 tests pass.

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

Stale '4 NEW arms' / '4-arm pools' wording in _phase0_data_v4 surfaced during
the data-gen smoke. The v8 production set is 3 arms at matched LR 5e-6; the
splice + byte-identical-negatives assert is unchanged. No behavior change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…item 3 follow-on)

Stale '(up to) 4 villain arms' wording surfaced during the training-phase carve-
out smoke; the v8 production set is 3 arms. '4 GPUs' (hardware) is unchanged. No
behavior change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…fter #642 r3 recurrence

The repo-root-path trap recurred in round 3 despite the existing note (used
repo-root absolute Edit paths + `cd repo-root && git`). Add a pre-first-commit
`git rev-parse --abbrev-ref HEAD == issue-<N>` guard, the no-`cd`-to-repo-root
git rule, and the cherry-pick-onto-branch recovery (non-destructive on shared
pushed main).

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

Plan v8 §4.3/§4.5/§4.6/§7/§9 exempt cmftOP_lr5e6 from the fresh install-pilot
(it gate-PASSed the v5 pilot at the matched 5e-6 LR — gate-validation reuse).
The inherited p0_5_pilot_gate looped ctx.arms (all 3 production arms) for both
the pilot train and the gate, re-piloting the exempted arm: wasted GPU + a
spurious step-4-collapse HALT risk on an arm the plan said to skip
(concern issue642-v8-pilot-scope BLOCKER, reconciler epm:review-reconcile v3).

Fix (Option A): narrow ctx.arms to V4_PILOT_ARMS (= V4_ARMS minus the new
V4_PILOT_EXEMPT_ARMS constant) for the pilot train/stage-A/gate, adding ctx.arms
to the save/restore tuple so production Phase 1 still trains all 3 arms. The
verdict surfaces cmftOP_lr5e6 under exempted_arms (reused-via-v5-gate-validation),
never silently dropped. Also: v4-aware final sentinel provenance note + the v4
header/reproducibility-card doc-drift fixes.

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

tests/test_i642_pilot_scope.py asserts (1) V4_PILOT_ARMS is exactly the 2 new
arms and partitions V4_ARMS with the single exempt arm cmftOP_lr5e6, and (2)
p0_5_pilot_gate narrows ctx.arms to the 2 new arms for the train/stage-A/gate
callees (captured via monkeypatch), restores all 3 afterwards, and writes a
pilot_gate.json carrying cmftOP_lr5e6 under exempted_arms (never piloted arms).
Catches the issue642-v8-pilot-scope regression at test time, not GPU-launch.

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

Cosmetic doc-drift the v8 retag left behind (review round 3, non-blocking):
- i642_analyze.py:1153 header v5/4-NEW-arms -> v8/3-production-arms-at-5e-6
- i642_lora_train_worker.py:9 module docstring "#642 does NOT train a LoRA arm
  in production" -> now false; the v8 --v4 path DOES train loraOP_lr5e6 (fresh
  on-policy LoRA pole, LR passed via --lr; default LORA_LR for the v3 path).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
superkaiba and others added 20 commits June 16, 2026 20:49
… recurrence

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
[1/3] Add the v9 (second-behavior-rank-replication) constants to i642_common
(V9_ARMS, V9_CONTRASTS, V9_MATCHED_LR/V9_FALLBACK_LR, V9 grids, the v9 HF
namespace, the merged ARM_SPEC_ALL lookup so v9 slugs resolve through v4_arm_lr)
and the substantively-new on-policy refusal elicitation worker. The worker
elicits the villain refusal positives + freshly-elicited same-question helpful
negatives via the #612 elicitation ladder (80% yield floor + equalize-down,
fail-loud below floor — no canned backfill), hard-filters the elicitation
questions disjoint from the refusal_50 eval probes, and records per-row tier +
the villain base refusal rate. Content-hygiene: never prints completion/question
text, only counts/tiers/hashes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
[2/3] Add --v9 to i642_dispatch as a one-variable amendment of --v4: forces
v4=True so every v4-aware downstream phase (stage-A / select / stage-B / gen /
upload) runs unchanged, then overrides the arm registry (2 arms), behavior
(refusal), data path (_phase0_data_v9 runs the fresh elicitation + the v9 asserts:
same-question-contrast, disjointness, train/eval-disjointness, eval-pool
content-hash, across-arm byte-identity), and the install-pilot gate semantics
(p0_5_pilot_gate_v9 FIRES the pre-registered single matched drop 5e-6->2e-6 on a
dense step-4 collapse instead of HALTing; a 2e-6 collapse is kill criterion (a)).
Adds the v9 reproducibility card (per-arm WandB run names + wandb_entity + the
round-4 +0.063 comparison) and threads the chosen matched LR to both poles. CPU
dry-run smoke runs all phases end-to-end exit 0 + [phase=done].

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
[3/3] Add --v9 to i642_analyze: _v9_analyze_behavior computes the single
delta_rank_matched contrast (cmftRefOP - loraRefOP) at matched s*=0.50 over the
#612 29-bystander panel with the crossed cluster bootstrap, classifies via
_classify_outcome_v9 (REPLICATES/PARTIAL/FAILS lattice), attaches the round-4
sycophancy +0.063 comparison + the refusal parity anchor + per-arm install-failure
(kill (a)) handling; make_synthetic_v9 fixture recovers the designed gap
(REPLICATES verified). Add --v9 to i642_figures: the cross-behavior adapter-vs-dense
hero + the exploratory dump (leakage-vs-strength, profile scatter, trajectories,
heatmap, sweep, install-pilot panel) -> figures/issue_642/v9/. New tests mechanize
the v9 lattice totality + the same-question-contrast / disjointness fail-loud guards.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…nce + json circular-ref trap

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The on-policy elicitation ladder over-produces negatives; without a cap the
realized positives:total-negatives ratio drifted to 1:3.75..1:6.75 vs the
planned 1:2.5, breaking the contrastive-negatives dose contract and the
recipe-match to the round-4 anchor. Add _cap_negatives (per-slot budget +
global total cap, deterministic, slot-balanced); re-emit per-slot counts
POST-cap. Regression tests assert len(neg) <= round(neg_ratio*n_pos)+n_slots.

Closes round-1 reconcile B1 (i642_elicit_worker.py:453).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
phase3_select wrote a single no-suffix install_failure.json, but the v9 analyzer
reads per-arm install_failure_<arm>.json — so a v9 production-gate kill was never
detected and the analyzer fell through to full analysis on a killed behavior.
Extract _write_install_failure: v9 writes one file per FAILING arm (mirrors the
phase-0.5 pilot writer); v4 keeps the no-suffix file its reader expects. The
resume-skip check is now v9-aware (any per-arm failure). Tests assert the v9
analyzer short-circuits to verdict=KILLED without _v9_analyze_behavior.

Closes round-1 reconcile B2 (i642_dispatch.py:2836 vs i642_analyze.py:1564).

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

B3: v9 runs force ctx.v4=True but the v9 Reproducibility Card declares adapters
under adapters/issue_642/v9/...; the uploader hardcoded v4/. Parameterize the
dest prefix on ctx.v9 (v9 -> v9/, v4-only -> v4/) so the actual upload matches
the card. Test asserts v9 loraRefOP lands at adapters/issue_642/v9/...; v4 keeps
v4/. (The v9 card's lora_pole_upload prose + adapter_paths dict already say v9.)

Minor 1: rename the v9 analyzer output analysis_v9.json -> analysis.json to
match the plan v10 §6.5 primary_deliverable contract; update i642_figures.py
reader + help to match. (v9 lives under its own refusal_v9/ eval_root — no
collision with the v3 analysis.json.)

Minor 2: rename test_disjointness_fails_when_villain_is_a_negative ->
test_disjointness_fails_on_unexpected_negative_prompt (it trips the
unexpected-negative-prompt branch, not a villain-as-negative check).

Closes round-1 reconcile B3 (i642_dispatch.py:3063) + Claude Minor + Codex Minor.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ariant-reader + cap-asymmetry classes

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…+ writer regression tests (M2)

M1 (round-2 reconcile BLOCKER): the v9 analyzer wrote analysis.json at
`eval_root/<behavior>/analysis.json`, so under the plan §10 command
`--eval-root eval_results/issue_642/refusal_v9` it landed at
`refusal_v9/refusal/analysis.json` — one subdir below the §6.5
primary_deliverable glob `refusal_v9/analysis.json`, which never resolved.
The canonical bare `i642_figures.py --v9` (no --eval-root) also missed it
(figures defaulted to the shared `issue_642/` parent). Fix (Option A):
- i642_analyze.py: the v9 writer drops the `behavior/` subdir — the v9
  eval_root already encodes the behavior. v3/v4 keep their behavior-subdir
  layout (their eval_root is the shared parent). Only the final WRITE moves
  up; fetched verdicts/trajectory still live under eval_root/<behavior>/.
- i642_figures.py: `_figures_v9` reads the registered `<eval-root>/analysis.json`;
  the bare `--v9` command descends the default --eval-root into refusal_v9/ so
  the §10 canonical chain resolves with no override. Explicit --eval-root honored.

M2 (round-2 standing rec): WRITER-side regression tests for the per-arm
install-failure convention — v9 emits one install_failure_<arm>.json per
failing arm and NO no-suffix file (the v9 reader would never see it); v4 keeps
the no-suffix file. Plus M1 contract tests: analysis written at the §6.5 path
(not nested), the bare `--v9` figures command reads the registered path, and an
explicit --eval-root is honored as-is.

Closes round-2 reconcile M1 (i642_analyze.py:1932 / i642_figures.py:548).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…(stage-A trajectory, stage-B verdicts, generations, refusal_v9 analysis)
…er-arm WandB IDs

Two precision corrections to the second-behavior-rank-replication arm
(round 5, refusal):
- §3 training data: split the combined 332 negatives row into the
  precise even 3-way split (166 police_officer / 166 medical_doctor /
  166 no-persona), verified against the actual train_pool.jsonl
  system-prompt counts.
- §6 artifacts index: replaced the generic WandB project URL with
  the authoritative per-arm run IDs from epm:upload-verification v3
  (loraRefOP prod swmowgwy + pilot bcqlug4u; cmftRefOP prod iq54kbwd
  + pilot uch881ph); added HF data-subtree row (812 files) and stage-B
  coverage row (210 refusal_eval_*.json across 7 cells).

check_no_secret_shaped_strings.py: exit 0.
…step

interpretation-critic.md only showed the epm:interp-critique marker BODY
shape under "Output Format" with no task.py post-marker shell command, so
the agent read "Post as <!-- ... -->" as "print the body in return text"
(incident #642 round-5 round-2: verdict printed but never posted, orchestrator
backfilled). Add an explicit "Posting your verdict (REQUIRED last step)"
section with the copy-pasteable post-marker --file command + version-match
note. code-reviewer.md and clean-result-critic.md already carried the command;
add the "printing the body does NOT post it" reinforcement to both.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Aligns §2 Hyperparameter table keys with the clean-result body
Parameters table for verify_task_body.py check 21
(Body Parameters ⊆ methodology doc §2).

Body uses:
  | LoRA (reused, NOT retrained) | ... |
  | Full-FT (reused, NOT retrained) | ... |

Doc §2 now matches verbatim. The 'arm' token was dropped to also
clear the audit_clean_results_body_discipline.py 'experimental_arm'
pattern (incident: round 3 of 9a-bis on #642).
@vercel

vercel Bot commented Jun 18, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
explore-persona-space-dashboard Ready Ready Preview, Comment Jun 18, 2026 8:17pm

Request Review

superkaiba added a commit that referenced this pull request Jun 18, 2026
… + methodology doc

Lands #642's round-5 same-issue follow-up artifacts on main without the
full PR-rebase merge (which conflicted across .claude/agent-memory/
and the methodology doc add/add — the branch is 3833 commits behind main).

Brings onto main:
- eval_results/issue_642/refusal/ (stage-A trajectory, stage-B verdicts × 7 cells, on-policy generations)
- eval_results/issue_642/refusal_v9/analysis.json (primary round-5 analysis)
- figures/issue_642/refusal_r5_cross_behavior.{png,pdf,meta.json} (round-5 cross-behavior figure)
- scripts/issue_642/i642_r5_figure.py + i642_r5_judge.py (round-5 figure + judge scripts)
- docs/methodology/issue_642.md (round-5 EXTEND content + arm-drop §2 keys, commit be8d87c)

Body's **Methodology:** + **Methodology reference:** links are SHA-pinned to be8d87c
(reachable from origin/issue-642 via GitHub's blob URL resolution).

PR #483 stays OPEN; the full rebase is deferred to a follow-up cleanup pass.
superkaiba added a commit that referenced this pull request Jun 23, 2026
Adds a 'read this first' specification section pinning the exact
behaviors, context conditions, training hyperparameters, eval protocol,
and extraction/storage config — each cell sourced to an issue/config/
rule. E1-E11 now reference §S instead of restating ingredients.
Grounded from #480/#612/#521/#404, configs/{training,lora}/turner_em,
marker-leakage/training-recipe rules, persona_pool #483, #617.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
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.

1 participant