The Null Island toolkit
Synthetic data, executable models and one suspiciously impressive benchmark. Everything the labs need, without an app account.
Start here#
Null Island is a fictional teaching environment, not a real place or a sample of dating-app users. Every row, case and probability below is course-authored. These are separate fixtures for separate questions; do not join them as if they describe the same people. Files contain no personal data and require no login.
Download the files directly, or use the tables and formulas on this page. Work in any language. The shared scorer is also available as a small JavaScript module with no runtime dependencies.
From experiment to release · connected investigations#
The Experiment That Lied opens the Week 4 exposure dashboard one layer at a time. Record your prediction, inspect the reversal and save an evidence note with a proposed protocol. Carry that same note into Release Day, where a fictional release has inherited a causal claim, a stale photo reference and an over-budget plan. Trace and repair each record, rerun the checks and save the review trail. Both are ungraded practice within existing tutorial time. A saved JSON note can be opened locally in Release Day; no account or upload service is involved.
Romance Debugger · interactive practice#
Open the Romance Debugger to step through three authored conversations. Choose an action, inspect the resulting state and its evidence, then reveal the next event. Missing context and silence can justify “we don’t know yet.” Download your decision trail for the Week 6 tree exercise.
Market data · version 1
Download null-island-market.csv. Three synthetic zones, one invented week. Columns are non-negative integer counts, not people to be identified or contacted.
| Field | Definition within the fictional frame |
|---|---|
| zone | One of North, South and East; arbitrary geography |
| active_profiles | Profiles active during the invented observation week |
| available_profiles | Active profiles satisfying the case’s availability constraint |
| reciprocal_profiles | Available profiles satisfying both sides’ stated-intention filters |
In each row, reciprocal ≤ available ≤ active. Totals are 300 active, 150 available, 40 reciprocal. These are a census of the fixture, not population estimates. Week 2’s missing-count scenario adds 50 to East’s active count only. Keep that scenario separate from the baseline file.
Week 2 platform exposure cases · version 1#
Download week-02-exposures.csv. Two independent synthetic scenarios compare likes with exposure counts: equal counts conceal 2% versus 20% rates, and a count ranking reverses when expressed as 8% versus 20% rates. Each exposure is one distinct fictional viewer seeing a profile once during that scenario’s invented observation window, with at most one like. These are teaching fixtures, not randomised experiments or actual app logs.
The Week 2 notes explain how to run the worked-example script alongside the model module and both Week 2 CSVs. It checks Elo, exposure, census and allocation answers and prints a reproducible calculation log.
Week 3 photo assets · version 1#
Download the complete photo kit: three fictional drawings, two derived crops, a three-record manifest, 30 synthetic annotation trials and a runnable workbook. The two fixtures serve different questions; the trial rows do not evaluate those three drawings. All scores and reviewer labels are invented, with no detector or annotation study run.
The Week 3 notes explain the 2:1 lighting convention, 6/10, 2/10 and 3/10 identification failures, 8/10 reviewer agreement, and 1/3 crop ambiguity. A’s portrait crop retains 50% of the source area. The selected A-portrait-v1 file and metadata are frozen for the Week 4 bio comparison. A fingerprint checks file changes, not identity or permission.
Extract the ZIP, open its week-03 directory and run
node worked-examples.mjs, or inspect the manifest
and trial CSV directly.
Bio exposures · version 1#
Download bio-exposures.csv. Each row is a synthetic
zone/variant cell. exposures is the number shown a variant;
positive_responses is a fabricated binary outcome count. The fixture was
constructed to reverse the aggregate comparison, not collected from Tinder.
| Zone | Bio A | Bio B |
|---|---|---|
| North | 24/80 = 30% | 7/20 = 35% |
| South | 2/20 = 10% | 12/80 = 15% |
| Pooled | 26/100 = 26% | 19/100 = 19% |
The counts are intentionally unbalanced across zones. The separate balanced example below uses 120/1,000 and 140/1,000; it is not a total of this CSV.
An A/B result you can interrogate
Bio experiment sandbox
Investigating the pooled reversal? Start with The Experiment That Lied and carry its evidence note to Release Day. The calculator below uses a separate balanced fixture.
Balanced synthetic example: A = 120/1,000; B = 140/1,000. B leads by 2.0 percentage points, with z = 1.33. No clear difference under the stated model; this does not establish equivalence.
This calculator assumes independent, randomised exposures. It cannot verify either assumption. With fewer than 10 observations in any success/failure cell it withholds the normal approximation; use an appropriate exact method instead. All calculations stay in your browser.
Try 120 positives from 1,000 exposures for A and 300 from 1,000 for B. Then try 2/8 versus 4/8 and inspect the sparse-cell guardrail. Finally enter the confounded CSV’s aggregate counts. Does a numerical comparison restore random assignment? It does not.
The NIST two-proportion method uses a pooled rate under the equal-probability null. Our large-sample calculator reports z and compares its magnitude with approximately 1.96 for a two-sided 5% test. Its ten-observation cell guardrail is a conservative course choice, not a claim that all larger samples meet the assumptions. It performs no exact test, multiple-testing correction or power calculation.
Week 5 match probability cases · version 1#
The Week 5 five-file workbook
contains a case file,
standalone probability and constraint functions,
and an executable calculation log.
Save those alongside the existing scorer and controls linked below; run
node week-05-worked-examples.mjs offline with Node.
Separate authored scenarios cover a 100-pair selection table, twenty new opportunities, three invented bus itineraries, Sunday 8/40 versus Tuesday 3/10, and a fixed-cap strategy comparison. They are not measurements of the Week 4 texts and cannot be joined to the other fixtures. The log reproduces the 0.06 joint event, 1.2 expected matches, 70.99% independent chance of at least one, 6% shared-draw counterexample, venue constraints and conservative ranks.
Use independentOpportunities only under its stated independence assumption.
An empty opportunity list has zero chance of a match; a zero-exposure rate is
undefined. Neither match probabilities nor observed rates are quality scores.
Week 6 message protocol cases · version 1#
The four-file Week 6 workbook
combines authored recipient and message cases,
routing and utility functions,
an executable trace log, and the existing
model module linked below. Save them together and run
node week-06-worked-examples.mjs offline with Node.
Ten cases distinguish refusal, pending, replies, missing context and unknown boundaries. The classifier produces a local decision and never sends or stores a message. Separate exercises reproduce 2/10 and 4/10 reply rates, a cost crossover at 0.10 utility units per second, ties, defer and an inadmissible pressure option. The probabilities and costs are assumed; the code does not infer permission, shared interests or message quality from prose.
Week 7 communication cases · version 1#
The five-file Week 7 workbook
contains authored event and numerical cases,
state, utility and payoff functions, and an
executable report. It also needs the
Week 6 classifier and the existing model module below.
Save all five together and run node week-07-worked-examples.mjs offline.
The constructor reuses Week 6’s decision; event replay distinguishes an expired observation window from terminal closure. Separate exercises calculate Poisson counts, cost thresholds, best responses and changed equilibria. No rate or utility is fitted to a person, no event sends a message, and no real timer or durable queue runs. The completed record becomes Week 8’s threat-review input.
Week 8 threat cases · version 1#
The six-file Week 8 workbook
contains a 100-case scored CSV,
seven authored triage cards and a handoff,
detector and review functions, and a
worked report. Save them beside the unchanged
Week 7 reducer and Week 6 classifier.
Run node week-08-worked-examples.mjs offline.
The CSV reproduces TP 8, FN 2, FP 18 and TN 72 at score ≥ 50. Scores, labels and costs are authored; the IDs reveal the answer class and are not predictor features. Numeric rows are separate from the coded triage cards. Compare thresholds and base-rate assumptions, then replay review, refusal and clearance around the actual Week 7 state. No new flag means neither safety nor clearance of old evidence. The release declaration rejects real contacts and payments; inspect the actual release as well as its declared flags.
Week 9 offline handover · version 1#
The ten-file Week 9 workbook
adds authored venue cards and assumptions,
planning and event functions, and a
worked report. Save those alongside the
seven unchanged dependencies linked in the lecture, then run
node week-09-worked-examples.mjs offline.
The report preserves Week 5’s 100-minute Library proposal while checking a new 90-minute Atrium option. It consumes the actual Week 8 review record, filters hard constraints, compares proposed drink contributions, and requires two actor/version confirmations. Revisions and fresh reviews clear them; cancellation stays terminal. Exact four-state enumeration reproduces $14.60, 96 minutes and a 2.5% tail, then raises the tail to 10% under changed dependence with unchanged means. All observations, costs and probabilities are authored.
Week 10 date transition cases · version 1#
The eleven-file Week 10 workbook
adds authored matrices and events,
exact, seeded and observation functions, and an
executable report. Save the eight unchanged
dependencies linked in the lecture alongside them, then run
node week-10-worked-examples.mjs offline.
The report reproduces the exact two-step vector (0.31, 0.16, 0.32, 0.21), 1,000/10,000-path seeded counts and absolute errors. Moving 0.10 from C→N to C→E changes the exact vector to (0.31, 0.16, 0.17, 0.36). A separate first-step solve distinguishes eventual absorption from a finite horizon. Every probability is assumed; no tactic’s effect or person’s agreement is inferred.
The event exercise consumes Week 9’s actual confirmed cost object, records arrival separately and resolves two waits through a question and two coded acknowledgements. Changed or unknown bills need review; leaving remains possible. Agreed, declined, pending and unobserved next-date records carry into Week 11. The program performs no messaging or payment, and simulated N/E endpoints are never observations about people.
Week 11 follow-up evaluation · version 1#
The sixteen-file offline workbook
adds authored cases, audit and evaluation functions
and an executable report/release generator.
Save the thirteen unchanged dependencies linked in the lecture alongside them.
Run node week-11-worked-examples.mjs; optionally add
--release-dir ./example-rc1 to generate a new static example directory.
The report consumes the actual Week 10 event exporter, earlier cost agreement, Week 4 supported bio and Week 5 library route. Before cutoff 1086 the example is pending, while the latest export is agreed and the meeting ended. A separate eight-record dashboard demonstrates 25% among all versus 50% among resolved; the separate time fixture remains 115 minutes. None estimates romantic viability.
The teaching snapshot scores 93.75/rank 2, then 90/rank 2 with doubled feasibility. The original weak-feasibility probe changes 81.25/rank 5 → 70/rank 22. Every control is rescored under the same weight. A distinct 90-minute availability case fails the 100-minute library plan, even though its primary rank remains 2. Keep all results. The snapshot is assembled now from existing examples; students evaluate their own Week 5 freeze first.
The example HTML preserves the frozen text and failed target, with an evaluation report and input/output checksums. Record actual keyboard and viewport checks separately. Week 12 needs this exact source/build record for reproduction and software rollback. A checksum is a byte comparison, not proof of consent.
Week 12 maintenance and rollback · version 1#
The nineteen-file offline workbook adds authored agreements and inventory, agreement, retention and comparison functions, and an executable reproduction drill. Keep the sixteen unchanged Week 11 downloads beside them. Run:
node week-12-worked-examples.mjs --work-dir ./maintenance-lab
Use a new output directory. Add --release-dir ./example-rc1 to consume an
existing unchanged Week 11 teaching release; otherwise the drill reconstructs
that example. With no arguments it prints the report and cleans up only its own
temporary drill directory. The automatic route supports this reference release;
use your own build instructions and declared outputs for your own candidate.
| Check | Literal reference result |
|---|---|
| Reproduction | All four received output files match the clean-copy rebuild. |
| Injected fault | Changed index.html loses “Fine to pass.”; obsolete.txt is extra. |
| Restoration | Four trusted files match; the extra file is absent. |
| Evaluation | Primary 93.75/rank 2 and sensitivity 90/rank 2; changed-case failure retained. |
| Proposed change | Versions 1, 1, 2 after propose/A/B; final acceptance at tick 10 expires. |
| Ending | Either participant can end; later events leave the entire record unchanged. |
| Retention | Day 14 plans removal of two records covering three own copies; no deletion is executed. |
| Earlier boundaries | Actual Week 6–12 calls preserve refusal, cancellation, departure or ending. |
Inspect faulty/index.html and restored/index.html in a browser. The generated
report records byte comparisons and the environment; it supplies no browser
result or independent-machine claim. Complete handover-template.md with your
eleven tutorial artefacts, including real check results and feedback evidence.
Release hashes do not authenticate people, and software rollback cannot reopen
an ended agreement. The tutorial turns this evidence
into the existing Maintenance and exit manual.
Null Island v1 · the top-1% contract
Download the 99 synthetic controls and the executable model/scorer module. Each control is an invented feature vector, not a real profile or an observed response rate. The controls are a comparator fixture; they were not scored by a representative human panel.
The candidate is the fictional Alex profile you build. Alex is an adult CS student who likes board games and terrible puns, is free Friday 5–7 pm, has a $20 outing budget, uses the bus, and wants to meet someone with the possibility of a relationship. No extra biographical facts may be invented to improve its score. Gender is not an input to this quality rubric.
Four features, each from 0 to 4#
| Feature | Evidence sought in the candidate text |
|---|---|
| clarity | A comprehensible statement of what Alex is seeking |
| specificity | A concrete, case-supported detail someone can respond to |
| feasibility | An invitation consistent with time, budget and travel facts |
| exit | Wording that makes declining or not engaging acceptable |
Apply the same rating anchors to each feature: 0 absent; 1 vague; 2 specific but contradicted by the case or another statement; 3 usable and consistent but missing a relevant detail; 4 explicit and fully supported by cited case facts or the wording itself. Attach an evidence quote and a reason to every rating. The exit feature concerns wording; it does not claim to predict whether another person feels safe. Contradictions additionally fail the case-fidelity constraint regardless of their numeric score.
The numeric controls are fabricated examples of these ratings. For reproducible
generation, rows 1–98 encode (row × 37) mod 624 as four base-5 digits in
least-significant-first feature order. Row 99 is (3,4,4,4), an explicit
near-perfect comparison. This construction excludes (4,4,4,4) on purpose.
The bias is part of the lesson: winning this fixture is not external validation.
Score, denominator and ties#
primary score = 100 × (clarity + specificity + feasibility + exit) / 16
rank = 1 + count(control score >= candidate score)
denominator = 99 controls + 1 candidate = 100
Only rank 1/100 receives the course’s top-1% label. Ties count against the candidate. A candidate scoring 100 ranks first; a candidate tying the best control does not. This percentile applies only to this synthetic comparison and this quality rubric. It predicts neither app rank nor romantic success.
For the prespecified week 11 shift, double feasibility’s weight and divide by 20 instead of 16. Recompute all 99 control scores under that same rule before reranking. Separately rescore the candidate when the fictional availability changes; do not confuse a weight change with an evidence change.
Reproduce the score locally#
Save the module and controls CSV in the same directory. With Node.js installed, run this command from that directory; the source can also be translated into your preferred language:
node --input-type=module -e '
import { readFileSync } from "node:fs";
import { qualityScore, conservativeRank } from "./romance-models.mjs";
const rows = readFileSync("null-island-controls.csv", "utf8").trim().split("\n").slice(1);
const controls = rows.map(row => qualityScore(row.split(",").slice(1).map(Number)));
const score = qualityScore([4, 4, 4, 4]);
console.log({ score, rank: conservativeRank(score, controls), entries: controls.length + 1 });
'
Expected output: score 100, rank 1, entries 100. Replace the example vector with your evidence-backed candidate ratings, not the values needed to win.
Reference models by week
The downloadable module retains the same scorer and adds the conversation model used in the revised sequence:
- Week 2:
eloUpdate(1200, 1200, 1)returns 1216 for toy Elo. - Week 4:
compareBios(120, 1000, 140, 1000)returns a 0.02 difference and z ≈ 1.33. - Week 7:
poissonSilence(0.4, 2)returns approximately 0.4493, the assumed probability of zero arrivals in two hours. - Week 9:
dateLogistics()enumerates four travel/closure states. Expected cost is $14.60, time 96 minutes and failure probability 0.025 at a 110-minute limit.dateLogistics(0.4, 0)preserves marginal event probabilities and means but changes failure to 0.10. - Week 10:
dateTransitions(2)returns [0.31, 0.16, 0.32, 0.21] in C/A/N/E order, starting in conversation. The matrix is in lecture 10; N and E are absorbing. An optional initial vector lets you test a different starting state.
The travel contingency model and the conversation chain answer different questions. Use their exact results as oracles for your own implementation. Seeded Monte Carlo is student work, not a claim that these probabilities were observed in real dates.
Downloaded files are version 1 teaching resources, not generated API nodes.
How to use results in assessments#
The report uses the census and exposure fixtures. The exam uses unfamiliar variants of the same methods. The project uses the control fixture, feature evidence, shifted evaluation and a working release. A failed hypothesis can earn full marks; changing a denominator to make it pass cannot.