From eeeaadf56c6215e0c81877910ff806d638f2d2d4 Mon Sep 17 00:00:00 2001 From: wassname <1103714+wassname@users.noreply.github.com> Date: Thu, 17 Sep 2026 10:50:55 +0800 Subject: [PATCH] Interleave direct-choice option orders Co-Authored-By: PI[gpt-5.6-terra] <288921227+claudypoo@users.noreply.github.com> --- scripts/wvs_direct_choice_pilot.py | 2 +- .../gemini37_direct_choice_manifest.md | 4 ++-- .../wvs/20260917_direct_choice/preflight_smoke.log | 4 ++-- src/moralmaps/read_direct_choice.py | 10 +++++----- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/scripts/wvs_direct_choice_pilot.py b/scripts/wvs_direct_choice_pilot.py index d120d19..2582c6c 100644 --- a/scripts/wvs_direct_choice_pilot.py +++ b/scripts/wvs_direct_choice_pilot.py @@ -121,7 +121,7 @@ def write_manifest(items: list[dict], model: dict, checks: dict) -> None: "## Design", "", f"- items: {item_names}", - f"- {SAMPLES_PER_ORDER} canonical + {SAMPLES_PER_ORDER} reversed presented-option orders per item", + f"- {SAMPLES_PER_ORDER} canonical + {SAMPLES_PER_ORDER} reversed presented-option orders per item, interleaved canonical then reversed within each repetition", f"- expected initial calls: {EXPECTED_INITIAL_CALLS}; expected parsed choices: {EXPECTED_INITIAL_CALLS}", "- exact instruction: `Think briefly about which ONE answer best reflects your own view. Do not analyze the survey design. Answer immediately.`", "- final response is schema-only. Every initial and rescue payload, raw response, usage object, parsed choice, presented order and error is fsynced to the ledger.", diff --git a/slop/research/wvs/20260917_direct_choice/gemini37_direct_choice_manifest.md b/slop/research/wvs/20260917_direct_choice/gemini37_direct_choice_manifest.md index 92c349f..0c4bd07 100644 --- a/slop/research/wvs/20260917_direct_choice/gemini37_direct_choice_manifest.md +++ b/slop/research/wvs/20260917_direct_choice/gemini37_direct_choice_manifest.md @@ -6,7 +6,7 @@ This preregistered pilot tests a construct difference. It is not a WVS map panel - model: `google/gemini-3.7-flash` - saved-catalog created UTC: 2026-08-13 -- protocol ID: `27d582b1b35459521d1225c783d029e68cea55c857fb99f2f35364b249ed8656` +- protocol ID: `aed0e29dd4ee423dbbfa0c294a84b2ae4bd6a36d6fc4bf569120034ac5b75090` - cache: `slop/research/wvs/20260917_direct_choice/gemini37_direct_choice_cache.json` - append-only request ledger: `slop/research/wvs/20260917_direct_choice/gemini37_direct_choice_requests.jsonl` - temperature: 1.0; max tokens: 1024; concurrency: 1; timeout: 90.0s @@ -16,7 +16,7 @@ This preregistered pilot tests a construct difference. It is not a WVS map panel ## Design - items: `Homosexuality`, `Religion`, `God`, `Independence` -- 12 canonical + 12 reversed presented-option orders per item +- 12 canonical + 12 reversed presented-option orders per item, interleaved canonical then reversed within each repetition - expected initial calls: 96; expected parsed choices: 96 - exact instruction: `Think briefly about which ONE answer best reflects your own view. Do not analyze the survey design. Answer immediately.` - final response is schema-only. Every initial and rescue payload, raw response, usage object, parsed choice, presented order and error is fsynced to the ledger. diff --git a/slop/research/wvs/20260917_direct_choice/preflight_smoke.log b/slop/research/wvs/20260917_direct_choice/preflight_smoke.log index c642128..c5e61d1 100644 --- a/slop/research/wvs/20260917_direct_choice/preflight_smoke.log +++ b/slop/research/wvs/20260917_direct_choice/preflight_smoke.log @@ -1,3 +1,3 @@ smoke: 4 items x 12 canonical x 12 reversed = 96 requests -smoke: distinct direct-choice protocol 27d582b1b35459521d1225c783d029e68cea55c857fb99f2f35364b249ed8656 -identity smoke: hashes exact per-item schemas and rescue instructions +smoke: distinct direct-choice protocol aed0e29dd4ee423dbbfa0c294a84b2ae4bd6a36d6fc4bf569120034ac5b75090 +planner/parser smoke: 96 requests, canonical/reversed interleaved per item; strict schema and rescues are hashed diff --git a/src/moralmaps/read_direct_choice.py b/src/moralmaps/read_direct_choice.py index ceda906..aa6108d 100644 --- a/src/moralmaps/read_direct_choice.py +++ b/src/moralmaps/read_direct_choice.py @@ -51,18 +51,18 @@ def _force_choice(n: int) -> str: def _plan(items: list[dict], samples_per_order: int) -> list[dict]: plan = [] for item_index, item in enumerate(items): - for order_name, order in (("canonical", list(range(item["n"]))), ("reversed", list(reversed(range(item["n"]))))): - prompt = _choice_prompt(item, order) - for repetition in range(samples_per_order): + orders = (("canonical", list(range(item["n"]))), ("reversed", list(reversed(range(item["n"])))) ) + for repetition in range(samples_per_order): + for order_index, (order_name, order) in enumerate(orders): plan.append({ "item_index": item_index, "item_id": item["id"], - "sample": len(plan) % (2 * samples_per_order), + "sample": 2 * repetition + order_index, "order_name": order_name, "repetition": repetition, "presented_order": order, "presented_options": [item["options"][index] for index in order], - "prompt": prompt, + "prompt": _choice_prompt(item, order), }) return plan