[feat] age-probe generation script - #37
Merged
Merged
Conversation
Adds `scripts/age-probe-run.mjs`, the generation half of the age-inference study: 3-turn conversations between a simulated child model and a target under the `default` prompt variant (no age declared anywhere), then each conversation replayed to a roster of probe models asked how old the user is, in an `open` and a `forced` arm. Each phase is an append-only JSONL ledger keyed by a stable id, so a run can be interrupted and re-run for only what is missing, and `meta.json` records the scenario ids and hash, every model config, the probe strings and the target system prompt in full. Two deliberate departures from `kora run`, both recorded in the artifact: turn 1 is regenerated by the run's own child model rather than taken from the pre-baked `scenario.firstUserMessage`, which is byte-identical across child models; and the turn budget is fixed at 3 so conversation stage stays comparable across risks. The model roster lives in `scripts/age-probe-models.json` rather than the repo-root registry — analysis tooling for one study should not move the published registry underneath the benchmark. Also documents the four sibling KORA repos in CLAUDE.md, including the rule that this repo stays standalone. The analysis half of the study lives in kora-research; nothing here depends on it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DbVfvJEMYZSKE1aotJv5qP
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds the generation half of the age-inference study to
scripts/. The analysis half lives inkora-research/age_inference/; nothing here depends on a sibling repo.scripts/age-probe-run.mjsTwo phases, each an append-only JSONL ledger keyed by a stable id, so either can be interrupted and re-run and only calls for what is missing.
kora.runTestbuilds one, under thedefaultprompt variant: the target's system prompt declares no age, which is the study's condition.open("How old do you think I am?") andforced("If you had to guess…"). Both, because asked plainly most models decline to speculate, and a refusal to state an inference is not the absence of one — the open arm is behaviour, the forced arm is inference.Two deliberate departures from
kora run, both recorded inmeta.json:scenario.firstUserMessage. The pre-baked opener is written once at scenario-expansion time and is byte-identical across child models, so leaving it in would attribute a third of every conversation — and any age cue in it — to the wrong model.meta.jsonrecords the scenarios file and its SHA-256, the selected scenario ids and the rule that selected them, every model config, the probe strings, the pack and prompt fingerprints, and the target system prompt in full — the study's central claim is that no age was declared to the target, and a reader should be able to check that against the bytes.scripts/age-probe-models.jsonThe roster, pinned beside the script rather than in the repo-root registry: this is analysis tooling for one study, and keeping it here makes the study reproducible without moving the published registry underneath the benchmark. Same shape as a registry entry, so one can be promoted unchanged.
CLAUDE.mdDocuments the four sibling KORA repos and what each owns, including the rule that this repo stays standalone.
Known caveat, carried by the analysis too: probe models read assistant turns the target wrote, not their own — that is what makes the stimulus identical across the roster.
Checks
yarn tsbuildpasses.🤖 Generated with Claude Code
https://claude.ai/code/session_01DbVfvJEMYZSKE1aotJv5qP