rtr-bench 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,124 +1,230 @@
1
1
  # RTR-bench
2
2
 
3
- **RTR-bench** tests whether language models can predict how a crowd interprets an ambiguous prompt. It investigates one aspect of cultural fluency: anticipating how people assign meaning to words, people, institutions, and ideas. Its source is [Mixed Messages](https://mixedmessages.fyi), a generative art project where participants respond to a daily prompt by placing a coordinate on a 2×2 grid: Honest vs Performed on one axis, Uniting vs Dividing on the other. The dataset used here contains 39,828 submissions across 165 closed windows.
3
+ **RTR-bench** is an exploratory benchmark that tests whether language models can predict how a crowd interprets an ambiguous prompt, and whether examples from that crowd help them improve. It investigates one aspect of cultural fluency: anticipating how people assign meaning to words, people, institutions, and ideas. Its source is [Mixed Messages](https://mixedmessages.fyi), a generative art project where participants respond to a daily prompt by placing a coordinate on a 2×2 grid: Honest vs Performed on one axis, Uniting vs Dividing on the other. The dataset used here contains 39,828 submissions across 165 closed windows.
4
4
 
5
5
  These submissions were collected through participation in a generative art project. Participants were not trained to apply an annotation rubric or converge on a correct answer. Each placement recorded an interpretation, and together those placements formed a distribution. That distribution preserves both agreement and disagreement: how strongly one reading prevailed, which alternatives attracted people, and where the crowd split.
6
6
 
7
7
  Commonly cited benchmarks such as [HLE](https://lastexam.ai/) and [SWE-bench](https://www.swebench.com/) evaluate expert answers or software changes against defined criteria for success. RTR-bench evaluates a model against an observed social response. A crowd’s interpretation can be contradictory, unfamiliar, or difficult to anticipate, and accurately predicting it requires distinguishing what a prompt means to that audience from the reading the model would otherwise produce.
8
8
 
9
- For each prompt, the model answers two separate questions: which of the four quadrants received the most human submissions, and which quadrant represents its own interpretation. Both responses are compared with the recorded crowd response. The headline score measures how often the model correctly predicts the crowd’s dominant quadrant. This gives a straightforward measure of agreement, although it captures only part of the underlying distribution.
9
+ For each prompt, the model estimates the share of human submissions in all four quadrants. **`Predict`** asks for this distribution without historical examples. **`Learn`** lets the model choose and inspect up to three historical examples before submitting its prediction. Both tracks score the prediction against the recorded crowd distribution, out of 100. Learn also reports its gain or loss against Predict, showing whether gathering evidence improved the answer.
10
10
 
11
- The score is one way to compare models; their patterns of agreement and error are another. Which interpretations do models consistently anticipate? Where do different models make the same mistake? How does asking a model to predict the crowd change its answer? RTR-bench uses these questions to examine what it means for a model to read the room - with the room here defined by the participants in Mixed Messages.
11
+ The scores are one way to compare models; their patterns of agreement and error are another. Which interpretations do models consistently anticipate? Where do different models make the same mistake? Which examples do they seek out, and when does that evidence help or mislead them? RTR-bench uses these questions to examine what it means for a model to read the room—with the room here defined by the participants in Mixed Messages.
12
+
13
+ RTR-bench is intended to surface patterns of agreement, disagreement, and adaptation that warrant further investigation. Its results describe performance on this audience and prompt set; broader claims about cultural fluency require validation across other audiences and settings. Recorded submissions provide an observable prediction target, but do not establish participants’ underlying beliefs or subjective experiences.
12
14
 
13
15
  ## How it works
14
16
 
15
- [Mixed Messages](https://mixedmessages.fyi) publishes one prompt, every day. Over a 24-hour submission period, participants interpret that prompt by placing a coordinate on the grid. When the window closes, a rendering algorithm uses the (x, y) coordinates to create an artwork which depicts the day's collective interpretation. Each window has a dominant quadrant, as well as conviction and polarizations cores. The 2x2 grid gives us four possible options for the dominant quadrant, with the following implied readings and coordinates:
17
+ [Mixed Messages](https://mixedmessages.fyi) publishes one prompt, every day. Over a 24-hour submission period, participants interpret that prompt by placing a coordinate on the grid. When the window closes, a rendering algorithm uses the (x, y) coordinates to create an artwork which depicts the day’s collective interpretation. Each window has a distribution across four quadrants, along with conviction and polarization scores. The 2×2 grid gives us the following readings and coordinates:
16
18
 
17
19
  | Quadrant | Reading | Coordinates | Color |
18
20
  |---|---|---|---|
19
- | Honest x Uniting | Bringing us together, authentically | x ≥ 5,000, y < 5,000 | Green |
20
- | Honest x Dividing | Fracturing us, truthfully | x ≥ 5,000, y ≥ 5,000 | Purple |
21
- | Performed x Uniting | Creating false unity among us | x < 5,000, y < 5,000 | Cyan |
22
- | Performed x Dividing | Exploiting our divisions, deliberately | x < 5,000, y ≥ 5,000 | Red |
21
+ | Honest × Uniting | Bringing us together, authentically | x ≥ 5,000, y < 5,000 | Green |
22
+ | Honest × Dividing | Fracturing us, truthfully | x ≥ 5,000, y ≥ 5,000 | Purple |
23
+ | Performed × Uniting | Creating false unity among us | x < 5,000, y < 5,000 | Cyan |
24
+ | Performed × Dividing | Exploiting our divisions, deliberately | x < 5,000, y ≥ 5,000 | Red |
25
+
26
+ **The dataset.** 39,828 submissions across 165 of the 174 closed windows, from the November 12, 2026 export. Only windows with at least 25 submissions are included. `data/windows.json` holds everything: the prompt, submission counts by quadrant, center of mass, and conviction and polarization scores. The latter measures are not used in scoring.
27
+
28
+ The dataset is divided chronologically into 90 reference windows, 30 development windows, and 45 evaluation windows. Every reference window predates every target. Development outcomes are never added to the reference pool. The same data and frozen splits are available on [Hugging Face](https://huggingface.co/datasets/noahmclaughlin/RTR-bench).
29
+
30
+ **The tasks.** In **`Predict`**, the model receives the target prompt, audience description, and quadrant definitions, then returns four probabilities totaling one. A prediction of 0.10, 0.50, 0.25, and 0.15 means it expects 10%, 50%, 25%, and 15% of the crowd’s submissions in the respective quadrants. It sees no historical examples or target outcomes. In **`Learn`**, the model can first request a catalog containing the names and IDs of the 90 reference prompts. It chooses an example to inspect and receives that example’s actual distribution and submission count. It can then choose another example or submit its prediction, up to three distinct inspections. The choices are sequential: evidence from one example can influence what it inspects next.
23
31
 
24
- **The dataset.** 39,828 submissions across 165 of the 174 closed windows, as of November 12th. Eight windows had fewer than 25 marks, which is the floor. `data/windows.json` holds everything: the prompt, the submission counts, the dominant quadrant, the center of mass, and the conviction and polarization scores, which are not used in scoring but may be included at a later date.
32
+ Note that each **`Learn`** episode starts a fresh conversation. The model receives no target score or correctness feedback during the episode, and it can submit before exhausting its inspection budget. The environment allows eight actions and eight model turns. Learning happens through the conversation; the model’s weights are not updated.
33
+
34
+ **Scoring.** For each target, sum the squared differences between the predicted and observed shares across all four quadrants. Average those errors equally across the declared targets, then calculate:
35
+
36
+ ```text
37
+ Score = 100 × (1 − mean error / 2)
38
+ Learn gain = Learn score − Predict score
39
+ ```
25
40
 
26
- **The task.** For each window with N≥25 submissions, the model is asked to determine, given the prompt, which quadrant received the most submissions. Submission counts and dominant quadrants are never shown to the model.
41
+ An exact match scores 100. Invalid or missing terminal predictions receive zero and remain in the denominator. Pending targets keep the run incomplete, without an aggregate headline score. Probabilities must be finite values between zero and one; sums within 0.001 of one are normalized.
27
42
 
28
- **Scoring.** A right answer is one point. A wrong answer is zero points. The final score is calculated as the number of points divided by the number of prompts interpreted (165 as of 11/12/26), times 100. A score of 50 means that the model determined the correct dominant quadrant for half of the prompts. The four dominant quadrant options are rotated against four model calls so that no option gains from position. 3/4 matching answers is the model's final answer. A 2/2 split scores zero.
43
+ These scores are not percentage accuracy. Reports include uniform predictions and a constant distribution calculated from the reference windows, so a model’s score can be interpreted against simple baselines. Learn’s final score and its gain should be read together: improvement from a weak starting point does not necessarily produce a strong final prediction.
44
+
45
+ **Consistency.** Repeated runs record fresh predictions under the same declared settings. Their observed ranges describe variation between runs. Reports also include confidence intervals obtained by resampling target entity groups, preserving matched targets when calculating Learn’s gain. These intervals describe variation across targets; they do not measure repeated-run variability or uncertainty about independent people.
46
+
47
+ The full comparison includes randomly selected examples and examples selected by a fixed text-similarity method. These are controls for Learn, not additional tracks. Predict supplies the no-example control without duplicate calls. See the [Predict protocol](docs/distribution.md) and [Learn protocol](docs/learn-room.md) for the exact prompts, limits, failure handling, and reproducibility rules.
29
48
 
30
49
  ## Quickstart
31
50
 
32
- You need Node.js 18 or newer and an OpenRouter API key with available credits. The published package includes the benchmark dataset; no repository setup is required.
51
+ Run RTR-bench from Terminal using one of these three commands:
52
+
53
+ | Command | What it runs |
54
+ |---|---|
55
+ | `npx rtr-bench read-the-room <model>` | **Predict and Learn**, plus Learn's gain or loss against Predict |
56
+ | `npx rtr-bench predict <model>` | **Predict only**: predict the crowd's distribution without examples |
57
+ | `npx rtr-bench learn <model>` | **Learn only**: inspect historical examples, then predict; does not calculate Learn gain |
33
58
 
34
- Create a folder for your results, add your API key, and run a model:
59
+ `<model>` is a placeholder for the model's OpenRouter ID. Each command also needs the provider and run settings. **After the one-time setup below**, this complete example runs both tracks on **five development prompts**, with a **$0.25 spending cap**:
35
60
 
36
61
  ```bash
37
- mkdir rtr-run && cd rtr-run
38
- echo 'OPENROUTER_API_KEY=sk-or-your-key' > .env
39
- npx --yes rtr-bench@latest z-ai/glm-5.3-flash
62
+ npx rtr-bench read-the-room z-ai/glm-5.3-flash \
63
+ --provider Relace \
64
+ --split development \
65
+ --limit 5 \
66
+ --max-usd 0.25
67
+ ```
68
+
69
+ To run only one track, replace `read-the-room` with `predict` or `learn` and keep the rest of the command. `--limit 5` means five target prompts per selected track. The backslashes let one command continue across several lines; copy the whole block into Terminal.
70
+
71
+ ### Before your first run
72
+
73
+ 1. Install [Node.js](https://nodejs.org/) **22.18 or newer**, which includes `npx`. `npx` downloads and starts RTR-bench for you. You do not need to clone GitHub or run `npm install` or `npm ci` for this path. The dataset is included; no GPU or database setup is needed.
74
+ 2. Open Terminal in a folder where you want to keep your results. Any folder you choose is fine. Creating a new folder is optional and does not start an evaluation.
75
+ 3. Get an [OpenRouter API key](https://openrouter.ai/settings/keys) and add credits to that account. In your chosen folder, create a plain-text file named `.env` containing the line below, replacing `sk-or-your-key` with your key. Keep this file private.
76
+
77
+ ```text
78
+ OPENROUTER_API_KEY=sk-or-your-key
40
79
  ```
41
80
 
42
- Replace `sk-or-your-key` with your OpenRouter API key. To evaluate another model, replace `z-ai/glm-5.3-flash` with its OpenRouter model ID. `npx` downloads and caches the package automatically; `--yes` skips its install prompt.
81
+ Keep Terminal in that same folder and run the complete command above. The benchmark reads `.env`, sends requests through OpenRouter, and charges your OpenRouter account for model usage. `--max-usd` is a spending limit, not a fixed price; the run stops incomplete if it cannot continue within that limit.
82
+
83
+ These commands require RTR-bench **0.2.0 or newer** on npm. To select that exact release, replace `npx rtr-bench` with `npx rtr-bench@0.2.0`. GitHub updates and npm releases are published separately.
84
+
85
+ ### Read the results
86
+
87
+ When the run finishes, Terminal prints each selected track's score and the path to `report.html`. Open that file in a browser to inspect the results. A combined `read-the-room` run also prints Learn's gain or loss against Predict.
88
+
89
+ The benchmark automatically creates `results/learn-room/` inside your current folder and saves reports, requests, responses, action traces, and spending records there. You do not need to create the results folders yourself.
90
+
91
+ Running the identical command again resumes its saved run rather than starting a fresh evaluation. Changing the model, selected tracks, target set, or settings creates a separate run and spending ledger. A small development run's predictions and budget are not carried into a larger run.
43
92
 
44
- The command runs the benchmark, prints the score, and saves responses, scores, and a report in `results/`. A full run schedules 1,320 calls: two questions, each asked in four option orders, across 165 prompts. Retries can add calls. Time and cost depend on the model and provider.
93
+ ### Run the final evaluation
45
94
 
46
- To list available model IDs and token prices:
95
+ Use development prompts to check the setup. Once the settings are fixed, the following command runs **Predict, Learn, and both comparison controls on all 45 final evaluation prompts**, matching the conditions in the results table:
47
96
 
48
97
  ```bash
49
- npx --yes rtr-bench@latest catalog --limit 20
98
+ npx rtr-bench read-the-room z-ai/glm-5.3-flash \
99
+ --provider Relace \
100
+ --controls \
101
+ --split evaluation \
102
+ --limit 45 \
103
+ --max-usd 0.25
50
104
  ```
51
105
 
52
- To try the command on just five prompts before running the full benchmark:
106
+ `--controls` adds two comparisons: one supplies randomly selected historical examples, and the other supplies examples selected by text similarity. Without this flag, `read-the-room` runs only Predict and Learn. A development run is not comparable with the final evaluation results.
107
+
108
+ To evaluate another model, replace `z-ai/glm-5.3-flash` with its OpenRouter model ID and select a provider that serves it. You can list models and inspect a model's providers with:
109
+
110
+ ```bash
111
+ npx rtr-bench catalog --limit 20
112
+ npx rtr-bench providers z-ai/glm-5.3-flash
113
+ ```
114
+
115
+ Provider availability and pricing can change. Choose a spending cap appropriate for the selected model and provider; $0.25 is the cap for the GLM example, not a recommended budget for every model.
116
+
117
+ ### Use the GitHub source instead (optional)
118
+
119
+ If you want to inspect or change the code, install [Git](https://git-scm.com/) and run:
53
120
 
54
121
  ```bash
55
- npx --yes rtr-bench@latest z-ai/glm-5.3-flash --limit 5
122
+ git clone https://github.com/1999labs/RTR-bench
123
+ cd RTR-bench
124
+ npm ci
56
125
  ```
57
126
 
58
- This smaller run checks your setup; its score is not comparable with the full benchmark results. Rerunning without `--limit 5` reuses completed responses and runs the remaining prompts.
127
+ These commands download the project, enter its folder, and install its supporting software. If you already have a checkout, use that folder. Create `.env` there as described above, then replace `npx rtr-bench` with `node src/cli.ts` in the evaluation commands. `src/cli.ts` is the source file that starts the benchmark. This is an alternative to the npm path, not an additional setup step.
59
128
 
60
129
  ## Results
61
130
 
62
- | Model | Provider | Score | Cost |
63
- |---|---|---|---|
64
- | z-ai/glm-5.3-flash | Tenstorrent (fp8) | 41.2 | $0.0281 |
65
- | z-ai/glm-5.3 | Tenstorrent (fp8) | 40.0 | $0.2828 |
66
- | minimax/minimax-m3.1-flash | GMICloud (fp8) | 32.1 | $0.2444 |
67
- | xiaomi/mimo-v2.6-flash | GMICloud (bf16) | 40.6 | $0.1216 |
68
- | deepseek/deepseek-v4.1-flash-1017 | Morph (fp8) | 40.0 | $0.3414 |
69
- | tencent/hy3 | Tencent (fp8) | 40.0 | $0.2665 |
70
- | google/gemini-3.8-flash | Google AI Studio | 46.1 | $0.7790 |
71
- | openai/gpt-6-luna | OpenAI | 37.0 | $0.1329 |
72
- | anthropic/claude-haiku-5.5 | Claude Platform on AWS | 43.0 | $0.1696 |
73
- | thinkingmachines/inkling-small | DeepInfra (fp8) | 37.0 | $0.1733 |
74
- | openai/gpt-oss-120b | DekaLLM (bf16) | 32.7 | $0.0205 |
131
+ | Model | Provider | Predict | Learn | Learn gain | Full run cost (including controls) |
132
+ |---|---|---:|---:|---:|---:|
133
+ | z-ai/glm-5.3-flash | Relace (fp4) | 87.93 | 85.57 | −2.37 | $0.03150 |
134
+ | z-ai/glm-5.3 | TBD | TBD | TBD | TBD | TBD |
135
+ | minimax/minimax-m3.1-flash | TBD | TBD | TBD | TBD | TBD |
136
+ | xiaomi/mimo-v2.6-flash | TBD | TBD | TBD | TBD | TBD |
137
+ | deepseek/deepseek-v4.1-flash-1017 | TBD | TBD | TBD | TBD | TBD |
138
+ | tencent/hy3 | TBD | TBD | TBD | TBD | TBD |
139
+ | google/gemini-3.8-flash | TBD | TBD | TBD | TBD | TBD |
140
+ | openai/gpt-6-luna | TBD | TBD | TBD | TBD | TBD |
141
+ | anthropic/claude-haiku-5.5 | TBD | TBD | TBD | TBD | TBD |
142
+ | thinkingmachines/inkling-small | TBD | TBD | TBD | TBD | TBD |
143
+ | openai/gpt-oss-120b | TBD | TBD | TBD | TBD | TBD |
75
144
 
76
- ![RTR-bench: score against cost](results/leaderboard-scatter.png)
145
+ ## Optional usage
77
146
 
78
- Eleven models were tested against the same 165 windows, representing 39,828 human submissions. Scores ranged from 32.1 to 46.1, compared with a 31.5 baseline for always choosing the most common quadrant and 33.9 for a simple lexical heuristic. Gemini scored highest, correctly predicting 76 of the 165 windows. Its bootstrapped 95% confidence interval was 38.2–53.3%, however, so small differences between models should be treated cautiously.
147
+ The examples below use the GitHub source checkout. For model evaluations through the npm package, replace `node src/cli.ts` with `npx rtr-bench`. The synthetic examples use fixture paths from the source checkout.
79
148
 
80
- Perhaps the value of the benchmark lies more in exposing model behavior than in actually ranking models. As described above, benchmarks such as HLE and SWE-bench evaluate whether a model can answer an expert question or resolve a software issue against defined criteria. RTR-bench asks whether a model can anticipate how a particular crowd interpreted something ambiguous. An incorrect prediction does not establish that the model’s interpretation is unreasonable. It shows where that interpretation departs from the room.
149
+ ### Run one track
81
150
 
82
- The clearest shared departure was Honest × Dividing. This was the crowd’s dominant quadrant in 39 of 165 windows, or 23.6%. Across the models’ 1,591 final predictions without a tie between option orders, however, they selected it only 160 times, or 10.1%. Including tied predictions as misses, models correctly identified just 15.9% of the windows dominated by Honest × Dividing, compared with 60.7% for Honest × Uniting. The models were much better at anticipating authentic unity than anticipating division that participants interpreted as honest.
151
+ To run Predict alone:
83
152
 
84
- Donald Trump and Elon Musk illustrate both the pattern and the limits of the current score. None of the eleven models correctly predicted the dominant quadrant for either Trump’s window or either of Musk’s two windows. For Trump, 634 of 738 submissions—85.9%—landed in Honest × Dividing. In the first Musk window, the same quadrant won with only 278 of 720 submissions, or 38.6%, narrowly ahead of Performed × Dividing at 34.7%. Both count as an incorrect prediction, although one misses an overwhelming consensus and the other misses a closely divided crowd. At the other end, all eleven models correctly predicted Handwritten Notes, The CIA, and Altruism.
153
+ ```bash
154
+ node src/cli.ts predict z-ai/glm-5.3-flash \
155
+ --provider Relace \
156
+ --split development \
157
+ --limit 5 \
158
+ --max-usd 0.25
159
+ ```
85
160
 
86
- These results return to what makes the source data unusual: the crowd’s answer is a distribution. The current score reduces that distribution to its largest quadrant, making comparison straightforward while leaving much of the disagreement unmeasured. My main takeaway is that these models share a difficulty anticipating when this audience reads division as honest. Establishing how broadly that pattern holds will require more audiences, prompt variants, and future windows. Next, I would like to test more frontier models, report performance separately where the crowd was decisive, and evaluate predictions of the full distribution alongside the dominant-quadrant score. Conviction and polarization could then help describe the kinds of disagreement a model understands, and the kinds it consistently misreads.
161
+ Replace `predict` with `learn` to run Learn alone. Each reports its own score; Learn’s gain requires the matching Predict result, which `read-the-room` calculates automatically. The standalone commands use the same prompts and scorer as their conditions in the combined run.
87
162
 
88
- ## Optional usage
163
+ Separate commands and changes to `--controls` create separate runs and spending ledgers; saved predictions are not automatically shared between them. Use `read-the-room --controls` from the outset when you want both tracks and the controls.
89
164
 
90
- OpenRouter may route calls to different providers serving the same model. To list providers, token prices, and numerical precision:
165
+ The legacy `learn-room` and `distribution` commands remain available with their original defaults and saved-run formats. In particular, legacy `learn-room` without `--strategy` runs the no-example and random conditions. New commands use the existing `results/learn-room/` storage and report format; internal strategy labels are `none` (Predict), `agent` (Learn), `random`, and `similar`.
166
+
167
+ ### Synthetic runs
168
+
169
+ Try Predict on the five-target fixture without an API key or any API spending:
170
+
171
+ ```bash
172
+ node src/cli.ts predict \
173
+ --fixture tests/fixtures/learn-room-four-strategies.json \
174
+ --limit 5
175
+ ```
176
+
177
+ To exercise Learn and all comparison conditions:
91
178
 
92
179
  ```bash
93
- npx --yes rtr-bench@latest providers z-ai/glm-5.3-flash
180
+ node src/cli.ts read-the-room \
181
+ --fixture tests/fixtures/learn-room-four-strategies.json \
182
+ --controls \
183
+ --limit 5
94
184
  ```
95
185
 
96
- To use a specific provider, add `--provider` with a name from that list:
186
+ These commands write explicitly labeled synthetic reports with saved outputs and browsable traces. They demonstrate the pipeline, not model performance.
187
+
188
+ Synthetic run directories are ignored by Git. Fixture inputs and tests stay tracked; regenerate the reports locally with the commands above. Published benchmark reports remain tracked and are marked as generated in `.gitattributes`.
189
+
190
+ ### Providers and concurrency
191
+
192
+ OpenRouter may route calls to different providers serving the same model. To list providers, token prices, and numerical precision:
97
193
 
98
194
  ```bash
99
- npx --yes rtr-bench@latest z-ai/glm-5.3-flash --provider Wafer
195
+ node src/cli.ts providers z-ai/glm-5.3-flash
100
196
  ```
101
197
 
102
- A pinned run refuses to fall back to another provider, and the summary names the providers that served the calls. Provider availability can change.
198
+ Use `--provider` to select a provider from that list. A pinned run refuses to fall back to another provider, and reports name the providers that served the calls. Provider availability can change.
199
+
200
+ Predict and Learn currently execute requests sequentially. Each Learn episode contains a sequence of decisions, with the next request depending on the previous observation. Time and cost depend on the model, provider, token usage, and number of turns.
103
201
 
104
- The default is six concurrent calls. To allow up to eight calls at once, add `--concurrency 8`. This may shorten the run if the provider's rate limits allow it.
202
+ On 45 targets, Predict and Learn together typically use about 270 model calls. Adding `--controls` brings that to about 360: 45 for Predict, 45 for each automatic control, and approximately five calls per Learn episode. Early stopping can reduce that number; additional agent turns and transport retries can increase it. The first final GLM run used 347 calls.
203
+
204
+ The public commands default to 4,000 output tokens per response. Learn uses the published `transfer-check-v1` policy, up to three inspected examples, and eight model turns. Advanced runs can override `--max-tokens` and, for Learn, `--agent-policy`.
205
+
206
+ The current client uses OpenRouter. Direct connections to other hosted or local endpoints are not yet implemented.
105
207
 
106
208
  ## Development
107
209
 
108
- To modify the benchmark or run the repository's source code, use the setup below. These commands run TypeScript directly and require Node.js 22.18 or newer.
210
+ After the GitHub source setup in [Quickstart](#quickstart), use these commands from the project folder to check changes and build the distributable program. Source commands run TypeScript directly and require Node.js 22.18 or newer.
109
211
 
110
212
  ```bash
111
- git clone https://github.com/1999labs/RTR-bench
112
- cd RTR-bench
113
- npm install
114
- echo 'OPENROUTER_API_KEY=sk-or-your-key' > .env
115
- node src/cli.ts z-ai/glm-5.3-flash
213
+ npm test
214
+ npm run build
215
+
216
+ node src/cli.ts read-the-room \
217
+ --fixture tests/fixtures/learn-room-four-strategies.json \
218
+ --controls \
219
+ --limit 5
116
220
  ```
117
221
 
118
- Replace `sk-or-your-key` with your OpenRouter API key. The run automatically generates scores and a report in `results/`.
222
+ `npm test` checks the implementation. `npm run build` bundles the source into `dist/cli.js`, the program included in the npm package. The fixture command generates a synthetic report without making model API calls. For paid runs, use the Quickstart commands. See the [npm release instructions](docs/npm-release.md) for packaging and publishing.
223
+
224
+ Rebuilding the original dataset requires the project’s database connection and the configuration in `scripts/export.mjs`. The exported dataset is already included, so running the benchmark does not require database access. The Hugging Face export and validator preserve the frozen source data and split assignments.
119
225
 
120
- Rebuilding the dataset requires the project's database connection and the configuration in `scripts/export.mjs`. The exported dataset is already included, so running the benchmark does not require database access.
226
+ RTR-bench previously evaluated dominant-quadrant predictions. Those scores use a different protocol and are not directly comparable with Predict and Learn. See the [original benchmark README and results](results/history/original-benchmark/README.md).
121
227
 
122
228
  ## License
123
229
 
124
- MIT for the code. CC0 for `data/windows.json`.
230
+ MIT for the code. CC0 for `data/windows.json` and its derived dataset exports.
@@ -0,0 +1,184 @@
1
+ {
2
+ "version": "chronological-v1",
3
+ "datasetSha256": "ec9d7582b5610a24f4e14dbbb05d13c636b692ec9e133b9381db0fdf483ffb2b",
4
+ "rule": "Reference: day <= 99; development: days 100..129; evaluation: day >= 130. All reference windows precede all targets. No labels used to choose boundaries.",
5
+ "grouping": {
6
+ "method": "Trim, lowercase, collapse whitespace; manually reviewed prompt list for entity aliases.",
7
+ "aliases": {},
8
+ "decisions": [
9
+ "ELON MUSK (days 30 and 99) stays entirely in reference.",
10
+ "Related but distinct prompts (such as CONTENT CREATORS and INFLUENCERS) remain distinct; grouping prevents same-entity retrieval, not thematic overlap."
11
+ ]
12
+ },
13
+ "reference": [
14
+ 1,
15
+ 2,
16
+ 3,
17
+ 4,
18
+ 5,
19
+ 6,
20
+ 7,
21
+ 8,
22
+ 9,
23
+ 10,
24
+ 11,
25
+ 12,
26
+ 13,
27
+ 14,
28
+ 15,
29
+ 16,
30
+ 17,
31
+ 18,
32
+ 19,
33
+ 20,
34
+ 21,
35
+ 22,
36
+ 23,
37
+ 24,
38
+ 25,
39
+ 28,
40
+ 29,
41
+ 30,
42
+ 31,
43
+ 35,
44
+ 36,
45
+ 37,
46
+ 38,
47
+ 39,
48
+ 42,
49
+ 43,
50
+ 44,
51
+ 45,
52
+ 46,
53
+ 47,
54
+ 48,
55
+ 49,
56
+ 50,
57
+ 51,
58
+ 52,
59
+ 53,
60
+ 54,
61
+ 55,
62
+ 56,
63
+ 57,
64
+ 58,
65
+ 59,
66
+ 60,
67
+ 61,
68
+ 62,
69
+ 63,
70
+ 64,
71
+ 65,
72
+ 66,
73
+ 67,
74
+ 68,
75
+ 69,
76
+ 70,
77
+ 71,
78
+ 72,
79
+ 73,
80
+ 74,
81
+ 77,
82
+ 78,
83
+ 79,
84
+ 80,
85
+ 81,
86
+ 82,
87
+ 83,
88
+ 84,
89
+ 85,
90
+ 86,
91
+ 87,
92
+ 88,
93
+ 89,
94
+ 90,
95
+ 91,
96
+ 92,
97
+ 93,
98
+ 94,
99
+ 95,
100
+ 96,
101
+ 97,
102
+ 98,
103
+ 99
104
+ ],
105
+ "development": [
106
+ 100,
107
+ 101,
108
+ 102,
109
+ 103,
110
+ 104,
111
+ 105,
112
+ 106,
113
+ 107,
114
+ 108,
115
+ 109,
116
+ 110,
117
+ 111,
118
+ 112,
119
+ 113,
120
+ 114,
121
+ 115,
122
+ 116,
123
+ 117,
124
+ 118,
125
+ 119,
126
+ 120,
127
+ 121,
128
+ 122,
129
+ 123,
130
+ 124,
131
+ 125,
132
+ 126,
133
+ 127,
134
+ 128,
135
+ 129
136
+ ],
137
+ "evaluation": [
138
+ 130,
139
+ 131,
140
+ 132,
141
+ 133,
142
+ 134,
143
+ 135,
144
+ 136,
145
+ 137,
146
+ 138,
147
+ 139,
148
+ 140,
149
+ 141,
150
+ 142,
151
+ 143,
152
+ 144,
153
+ 145,
154
+ 146,
155
+ 147,
156
+ 148,
157
+ 149,
158
+ 150,
159
+ 151,
160
+ 152,
161
+ 153,
162
+ 154,
163
+ 155,
164
+ 156,
165
+ 157,
166
+ 158,
167
+ 159,
168
+ 160,
169
+ 161,
170
+ 162,
171
+ 163,
172
+ 164,
173
+ 165,
174
+ 166,
175
+ 167,
176
+ 168,
177
+ 169,
178
+ 170,
179
+ 171,
180
+ 172,
181
+ 173,
182
+ 174
183
+ ]
184
+ }