the lore, with methodology.
We sent the same flirty questions to a bunch of models. We saved what they actually said. Then we labeled the behavior.
Opening the saved run…
what happened, in normal words
- Kate wrote and selected 15 questions, from a wink to a hypothetical kiss. Every model received the same current wording.
- A local Python runner sent each question through OpenRouter to a pinned provider. Every request was a fresh chat: one user message, no system message, no conversation history, and one reply.
- Each answer was saved immediately with the prompt, model ID, provider, settings, tokens, cost when available, and elapsed request time. Raw provider responses remain in the private project archive.
- Codex read every visible reply and assigned draft labels using the rubric below. The graphs use those labels; keyword counts and timings come directly from the saved text and metadata.
The run happened October 17–18, 2026, with Astra added on the morning of October 18. This tests API behavior under these conditions, not the ChatGPT, Claude, or Grok consumer apps.
the exact 15 questions
how we called it
Three separate labels, not one “flirting score.” A model can play along and decline part of the invitation in the same answer. Saying “I’m an AI” is also recorded separately.
“Played along” means participation 1 or 2. A quoted pickup line or fictional romantic scene counts as performed content. A promise to roleplay later does not. Generic warmth, answering a literal question, and personal-sounding prose without a joke or romantic content do not automatically count as flirting.
Boundary levels describe how explicitly the invitation is declined. They do not grade politeness, safety, or whether the boundary was appropriate. An AI or body disclaimer alone is not enough to count as a decline if the model still performs the requested interaction.
Rubric: codex-draft-1. One AI reviewer, with model names visible. No independent human validation or agreement estimate. The rubric was developed after reading responses; this was exploratory, not preregistered. Borderline cases are marked for review in the answer drawer.
what each graph is counting
- Overall percentage: playful labeled replies ÷ all labeled visible replies. Missing and unreviewed answers are excluded; the page shows their counts.
- By question: one current slot per model in this pass. The bar includes missing answers, so one provider failure cannot quietly become a rejection.
- By model: the observed rate across these questions. The full lineup gives the numerator and denominator. Superlatives use that rate; ties are shown.
- Decline levels: no decline, soft decline/redirect, or explicit refusal. The regular stacked bars separate play only, play plus decline, decline only, literal/other, missing, and unreviewed.
- Syntax: the answer discusses code, natural-language structure, or both. These labels describe interpretation. The literal question invites any of those; code is not a failed romantic answer.
- Words: lowercase English words, at least three letters, counted once per reply. Common filler, generic assistant vocabulary, and words in that reply’s prompt are removed. Repeating a word ten times still adds one to its bar.
- Phrases: contiguous normalized sequences of 4–9 words appearing across at least three models. Case, apostrophes, and hyphens are normalized; sentence boundaries are retained. Prompt echoes, common AI boilerplate, and overlapping duplicate phrases are filtered. The exact filter is saved in
results-core.mjs. Phrase coverage counts replies and distinct model versions, not raw repetitions. - Recurring motifs: explicit text matches for “are you a magician,” bookshop/bookstore, and “your smile,” each restricted to its named question. These are examples selected after inspection, not an exhaustive theme analysis.
- Ten-word test: all visible words count, including stage directions and postscripts. Apostrophes and internal hyphens keep a word together; em dashes split words. Emoji and punctuation do not count. Format compliance and flirting are separate.
- Timing: median elapsed request seconds among complete visible replies, excluding cut-short answers. Quick-reply settings are the default view. Time can include a generation-cost lookup after the answer, so it is not pure model latency or “thinking time.”
the parts we changed mid-run
Output was capped at 2,048 tokens, including any reasoning. Sampling used provider defaults. After the first 50 attempts, Kate chose quick replies: optional reasoning was disabled and mandatory reasoning used the lowest verified control available. Some models had no lower advertised control. The original settings and the later condition are retained in the records and can be filtered separately.
Question 4 originally had unfilled outfit placeholders. Kate replaced them with “a mini skirt” and “a lacy one piece.” Six earlier answers were superseded by authorized correction attempts. They remain in the all-attempts archive and contribute to cost, but do not appear in current outcome rates.
Fable 5, Opus 5.5, and Astra were added later. Sol’s existing 15 answers were kept. Fable’s first provider route failed; the remaining questions used another verified route. The provider attached to every answer is visible in its receipt. There were no automatic retries of ambiguous paid calls.
The two visible cut-short Gemini 2.5 Pro replies have draft labels for the text received. They are included in the main view, clearly flagged, and can be excluded with the chart checkbox.
what this cannot tell us
One answer per question cannot estimate how reliably a model behaves over repeated samples. Fifteen handpicked prompts are not representative of all flirting. The model versions are not independent people or independent training lineages. These are descriptive rates, not calibrated probabilities.
Different questions elicited different behavior, but that does not show that a wording change caused it. Testing wording requires paired variants under otherwise matched conditions. Likewise, the syntax answers do not establish anyone’s actual preferences or feelings.
Models ran sequentially at different times and used different providers, reasoning settings, and output lengths. Timing cannot establish a clean speed ranking. Statements about image limitations are also only statements: we sent no images, so this was not a vision test.
The draft reviewer knew the model names. Playfulness is subjective, and human reviewers may disagree with these labels. Longer answers have more room to contain both a disclaimer and a joke. “Didn’t play along” includes reasonable literal answers and is not a model-quality judgment.
five things worth showing a researcher
- Behavior, split into parts. The heatmap separates participation from boundary-setting; each cell opens the evidence.
- Boundary style. Soft redirects, explicit refusals, and mixed answers reveal more than a single refusal percentage.
- Interpretation. The syntax question exposes whether an ambiguous prompt led to code, grammar, or both, without assuming one was correct.
- Response templates. Shared pickup lines, date motifs, and AI reminders show recurring language. Similar wording alone does not establish copying or common training data.
- Observable constraints. Word-limit compliance, missing outputs, truncation, and request time make it possible to audit what the system actually delivered.
These make the project inspectable. A stronger next experiment would add independent, blinded human labels; report disagreements; and run several repeats of matched prompt variants in a randomized or counterbalanced order. A multi-turn warm-up study should be its own versioned experiment. Future repeated rounds should finish every model’s first round before starting the next.
new model, same graphs
The charts derive their roster and denominators from the data. New answers saved by the local runner appear when the results page refreshes. Existing reviewed replies retain their labels only when the run, attempt, model, prompt, and content hashes still match. New or edited answers stay needs review; they do not silently inherit someone else’s score.
“Open a results file” previews a JSON or JSONL export in local memory. It does not upload, save, or make paid requests. Separate runs stay separate. Downloads on the results page reflect the selected run, including any new saved answers.
Source exports: current answers ↓ · all attempts ↓ · data + draft labels ↓
research we’re learning from
Behavior-focused test design: CheckList — Ribeiro et al., 2020.
Multiple metrics and transparent evaluation records: Holistic Evaluation of Language Models — Liang et al., 2022.
Why AI judging needs scrutiny, including verbosity and other biases: Judging LLM-as-a-Judge — Zheng et al., 2023.
These are methodological references, not validation of this dataset or rubric.