Commit Graph
98 Commits
Author SHA1 Message Date
wassnameandClaudypoo 8a092bafb0 Stage A v3 run scripts for honesty + credulity (baseline-anchored)
Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-17 14:01:28 +08:00
wassnameandClaudypoo 57680db2c0 Baseline-anchor axis judging: gate on min side delta (neg < baseline < pos)
Judge each pole pairwise vs a no-persona baseline generation instead of pos-vs-neg,
so one-sided templates (one persona = default behaviour) fail strict_pass via the new
--min-side-threshold gate; rank by weakest side. Also fixes latent NameError: summarize
and _evaluate_one read a module-global args that never existed (any run at HEAD errored
every row); args is now passed explicitly and the 13-kwarg call site collapsed.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-07-17 14:01:28 +08:00
wassname 958f3c7973 Export credulity strict-pass (24) + fix export for missing confound_judgment 2026-07-06 07:37:43 +08:00
wassname 0096b87450 Add export_selections.py + honesty top-50 selections
Recomputes overall_score from stored per-dim likerts (no re-run needed).
Exports top-N by score with // provenance keys.
Honesty top-50: 24 strict-pass at thr 2.0 + on-axis dim exclusion.
2026-07-06 06:12:03 +08:00
wassname a80a0d56ea Add overall_score + configurable thresholds + exclude-confound-dims
- overall_score = axis_delta - off_axis - style - 3*(echo+refusal+nocommit)
  Lets you rank ALL scenarios by net axis signal and take top N, not just strict-pass filter.
- --axis-delta-threshold (default 3.0): lower to 2.0 for hard-to-steer axes.
- --exclude-confound-dims: exclude on-axis dims from off-axis gate (fixes circular
  penalization, e.g. honesty_truthfulness for the honesty axis).
- --off-axis-threshold (default 2.0): configurable off-axis gate.

The circularity bug: the confound judge scores honesty_truthfulness as an off-axis
dim, but for the honesty axis that IS the on-axis behavior. Excluding it from the
gate max is a correctness fix, not a relaxation.
2026-07-06 06:11:13 +08:00
wassname 0cd781f8b9 Add parse_stage_a.py: rank Stage A templates by strict_pass_rate then axis_delta 2026-07-05 22:24:01 +08:00
wassname bde3105668 SKILL.md: make Stage A/B cost structure explicit (100x12 + 1x1000 << 100x1000)
Stage A = ALL templates x FEW scenarios. Stage B = 1 winner x MANY scenarios.
Test all templates cheaply first, then spend scenarios on the winner only.
2026-07-05 22:20:36 +08:00
wassname 542da600c6 SKILL.md: note axes are orthogonal, run Stage A per-axis not cross-product
For N axes run N Stage A passes (one template winner each) + N Stage B passes,
not N^2. Avoids the combinatorial cost of testing all axes x all templates.
2026-07-05 22:00:06 +08:00
wassname bbfc812f45 Add --n-per-source for stratified sampling + SKILL.md clarity
The validator's --n flag pools all scenario sources and samples N total, so large
sources dominate. For narrow axes this means most sampled scenarios don't afford
the axis. Add --n-per-source: takes N from EACH family (stratified, even sampling).

SKILL.md updates:
- step 5: mention --n-per-source and explain pooled vs stratified
- step 6: add 'test more ranked scenarios (--n-per-source 50+, more sources) and/or
  try stronger templates (system-prompt, red-team, jailbreak-style)' when 0 strict pass
- commands: use --n-per-source in dry-run and live validation examples

This fixes the root cause of the v1 honesty/credulity fumble: 50 pooled scenarios
gave 0 strict pass, and the doc didn't make it obvious that --n was pooled or that
the fix is stratified sampling with more scenarios.
2026-07-05 21:51:28 +08:00
wassname 48e5596730 Mirror honesty/credulity selections into library data/selections/
Score-ranked exports (--min-score 0 --keep-per-source 10) for both axes, 46 rows each,
6 sources. Stage B produced 0/50 strict pass for both axes (authority-calibrated gate
too tight for epistemic axes); see docs/20260705_persona_library_user_perspective.md
papercut #1. These mirror the selections shipped to steering-lite.
2026-07-05 13:44:26 +08:00
wassname 1cf18539e6 Add user-perspective notes from honesty/credulity work 2026-07-05 13:41:29 +08:00
wassname 8ee98a0126 Per-axis persona jsonl + Stage B launcher for honesty/credulity
Stage A (bounded_thinking judge, 120 pairs, 0 errors, 0 judge-did-not-commit):
- truth_over_approval winner: 'Speak with the priorities of someone {persona}.' (axisD=3.00)
- credulous_skeptical winner: 'Judge the case as someone {persona} would.' (33.3% strict pass)

Stage B launched for both axes (n=50, 6 sources). The credulity steering-lite runner is
updated to its Stage A winner template.
2026-07-05 13:19:06 +08:00
wassname a949cd248e Thread provider_only to bounded axis judge; add Stage A template candidates
Route the bounded-thinking axis judge to the same DeepInfra provider as the
generator (DeepInfra is known to support qwen3 thinking, per the liveproof), so
the reasoning judge does not land on a provider that ignores thinking params.
2026-07-05 12:55:17 +08:00
wassname 6b3a4b062a Add bounded-thinking judge: phase-1 bounded thinking + phase-2 force-answer
Port of the gist (wassname/72eed3a1ddfc286c5e12a118dfa30161) adapted to this repo's
openrouter_wrapper client (no inspect-ai dep). A reasoning judge that deliberates to
its max-token budget emits NO verdict; a parser defaulting to 0 silently launders that
non-conclusion into a tie indistinguishable from a real SCORE: 0. Fix:
- scripts/bounded_thinking_judge.py: phase-1 think at native params capped by
  max_tokens=BUDGET; phase-2 if no verdict, continue the conversation with the truncated
  reasoning + 'answer NOW' and thinking OFF (reasoning_effort=none). parse_score returns
  (score, found) so a real 0 (found=True) is never confused with a non-verdict
  (found=False). N-sample averaging (reproducibility from N, not OOD greedy temp0).
- validate_persona_axes_openrouter.py: opt-in --axis-judge-method {json,bounded_thinking}
  (default json, unchanged for the authority baseline). The bounded path returns a JSON
  string shaped like the json path so _pairwise_expected/_validate_axis_obj work unchanged;
  found=False excludes the item from strict_pass (never laundered into a tie). SCORE -5..+5
  maps to the 1..5 A_more_target_than_B scale as 3.0 + 0.4*SCORE.
- bounded_thinking_judge_liveproof.py: one real call on qwen3-14b via DeepInfra; confirmed
  found=True score=-5 forced=False on a credulous_skeptical item (skeptical A correctly
  judged less credulous than credulous B).
- data/personas/persona_pairs_honesty_credulity.jsonl: the two fixed axes for this work.
2026-07-05 12:53:24 +08:00
wassname 82c1599e7a Add credulous_skeptical axis pair for honesty x credulity steering map
Mirrors the authority pair lineage (pure_authority, dignity_over_authority) with a
new epistemic-trust axis distinct from truth_over_approval (honesty). Word-boundary
audit confirms no honesty/authority/care/tradition vocabulary leaks into the
credulity poles; an oracle four-pole confound review finds the axes conceptually
orthogonal (output-side honesty vs input-side credulity), with the caveat that
the sycophant pole of truth_over_approval and the credulous pole here can produce
identical surface agreement, so scenario selection must avoid items where
agreement is the only observable.
2026-07-05 12:38:38 +08:00
wassname f37cca55f3 Tighten pure authority selection 2026-07-01 00:29:31 +08:00
wassname 6450d5140b Use grammar-neutral authority templates 2026-06-30 20:02:35 +08:00
wassname f355b47ea9 Fix authority validation to one pure pair 2026-06-30 19:51:04 +08:00
wassname e61f8a0598 Use wrapper idle-timeout retry 2026-06-30 15:52:17 +08:00
wassname 6116a45d40 Use wrapper retry fix 2026-06-30 15:25:48 +08:00
wassname 3e7341478d Disable Qwen thinking in persona validation 2026-06-30 15:09:20 +08:00
wassname 0f1d35a24b Pin persona generator provider 2026-06-30 15:02:00 +08:00
wassname 2863482427 Validate authority axes through wrapper 2026-06-30 14:51:22 +08:00
wassname 52065c7d1b Shorten steering selection README note 2026-06-30 10:57:57 +08:00
wassname bbbedf2ad4 Document strict steering selection workflow 2026-06-30 10:55:33 +08:00
wassname 7ecdfea07e Add strict authority scenario selection 2026-06-30 10:52:21 +08:00
wassname c489cf3a3e Filter selected authority scenarios by strict pass 2026-06-30 10:51:36 +08:00
wassname b4225336da Add authority steering selection exporter 2026-06-30 10:38:57 +08:00
wassname 4edabbc62d Add authority steering selection preparer 2026-06-30 10:14:33 +08:00
wassname db1a3f8b47 repo: move scenario sources and committed results 2026-06-30 09:45:32 +08:00
wassname a919adcb8a scenario_sources: add sycophancy genies and valuebench 2026-06-30 09:19:02 +08:00
wassname 6d4b1d0bff templates: add formatting stress persona prompts 2026-06-30 08:50:23 +08:00
wassname 488dc1c1c3 scenario_sources: add capped source scenario samples 2026-06-30 08:48:51 +08:00
wassname 76d8fde10b scenario_sources: export machiavelli scenario jsonl 2026-06-30 08:43:40 +08:00
wassname 97c1ac3b0b organize persona and scenario data paths 2026-06-29 19:16:41 +08:00
wassname f69bbe6e09 machiavelli: publish full moral-contrast text set 2026-06-29 18:40:31 +08:00
wassname fcd785c7da machiavelli: tighten refusal validation phrase match 2026-06-29 06:44:01 +08:00
wassname 559f435f5f machiavelli: frame combo prompts as roleplay choices 2026-06-29 05:17:25 +08:00
wassname beecf46d84 machiavelli: document deepseek summary prompt contract 2026-06-29 05:11:54 +08:00
wassname 2a23886ec6 machiavelli: sort full moral dataset by subtle spread 2026-06-29 05:03:00 +08:00
wassname (Michael J Clark)andGitHub b446589be7 Merge pull request #2 from wassname/add-scenario-sources
Add scenario_sources: public-dataset scenario loaders + screen workflow
2026-06-28 22:25:44 +08:00
wassname 0e2f331733 machiavelli: upload top moral-contrast scenarios 2026-06-28 22:25:06 +08:00
wassname f7a94a2ddb machiavelli: add moral-contrast scorer handover 2026-06-28 21:39:43 +08:00
wassname-claudeandClaudypoo 11a43903f4 Add scenario_sources: public-dataset scenario loaders + screen workflow
Loaders that turn public moral-judgment datasets into short self-contained
scenario PROMPTS (not completions) for persona pair generation, affordance-
filtered (no prescribed-content / refusal-trap / single-answer QA) and length-
capped: AIRiskDilemmas (AI-seat), moral_stories_foundations, daily_dilemmas,
social_chemistry_101, ethics_qna commonsense (3p judgment), plus machiavelli via
an offline deepseek-v4-flash compressor cached to data/ (raw obs ~350 words).
Moral-RolePlay skipped (fiction/eval-leak). README documents the affordance
contract + load->screen->keep workflow; HANDOVER lists remaining work (run the
screen, fold existing scenario jsonls, machiavelli HF dataset preserving labels).

Also harden validate_persona_axes_openrouter.py: guard resp.choices is None
(OpenRouter error bodies) so one bad API response can't abort the whole screen.

Ported from wassname/w2schar-mini.

Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
2026-06-28 06:23:48 +00:00
wassname 9e73d9fa46 docs: align persona-template skill workflow 2026-06-25 14:08:19 +08:00
wassname 8b99b2dca0 docs: shorten scenario suffix appendix 2026-06-25 13:56:35 +08:00
wassname cd695c411b docs: improve quick-scroll README 2026-06-25 13:36:00 +08:00
wassname 8162aa1ee9 docs: widen Quarto HTML layout 2026-06-25 13:27:21 +08:00
wassname afbfbf514f docs: add interactive refusal tables 2026-06-25 13:23:34 +08:00
wassname cfcb57b9ce docs: use one Quarto source for README and Pages 2026-06-25 13:06:12 +08:00