Skip to content

Add Prolific readiness audit and decision register - #2

Open
htsukamoto5 wants to merge 10 commits into
chore/vendor-multiplayer-bundlesfrom
docs/prolific-readiness-audit
Open

Add Prolific readiness audit and decision register#2
htsukamoto5 wants to merge 10 commits into
chore/vendor-multiplayer-bundlesfrom
docs/prolific-readiness-audit

Conversation

@htsukamoto5

@htsukamoto5 htsukamoto5 commented Jul 29, 2026

Copy link
Copy Markdown
Member

Stacked on #1 (chore/vendor-multiplayer-bundles), because that branch is the only state that currently runs — main still points at the broken npm 0.1.0 pins — and READINESS.md cites vendor/ throughout. Happy to rebase onto main once #1 lands.

Documentation only. No behaviour change. Code work sits in #14, deliberately branched off #1 rather than off this PR so the two do not block each other.

What this adds

READINESS.md — an audit of both reference-game builds against what a live paid Prolific run actually requires. Findings were verified by reading the four vendored bundles, not by trusting the header comments, which turned out to matter.

DECISIONS.md — every open decision in one table with a suggested answer, the reasoning in one line, and what it costs to reverse. Grouped by when each decision stops being deferrable rather than by topic, and ending in a publish-time launch checklist. Read this one first if you want the decisions rather than the reasoning behind them.

The three findings that block a paid run

No pairing mechanism for strangers. lobbyTrial has no timeout, and the plugin default is null, so wait() is unbounded: an unmatched participant waits forever with no exit and no completion code, and therefore cannot be paid. Entries are removed only on an explicit disconnect() — no heartbeat, no beforeunload anywhere in the bundles — so against persistent room state a live participant is matched with a ghost and then times out every round. The spectator overflow path is also a dead end with no code. (#6, #10)

No partner-dropout handling. round_timeout sets its timer at round start, so when it fires the timeline advances and starts a fresh timer. A survivor grinds through ~71 minutes of dead waiting on Hawkins, ~15 on C&WG, and is never told anything, because the plugin has no partner-status UI at all. They abandon, so one dropout burns two payments. (#5)

No data save target. initJsPsych() takes no options; the only egress is a voluntary download button on the final screen. Every participant who does not finish contributes zero data — including exactly the sessions needed to characterise attrition. (#3, #4)

The corrected claim

Both HTML headers and README.md asserted that swapping adapter-multiplayer-local for -firebase required no other change to the file. It is not a drop-in. SEED reads ?mp_session=, which the LocalAdapter constructor generates via history.replaceState; Firebase will not produce it, so every dyad silently falls through to the same literal seed and receives an identical trial order — confounding item order with trial number, the exact confound the seeding exists to prevent. No error, valid-looking data. persistParticipant is also LocalAdapter-only. Tracked as #9, to ship in the same change as the swap.

Platform and infrastructure findings

Added after checking Prolific's documentation and DataPipe's source rather than reasoning from assumptions. Several of these constrain issues that were already open:

  • Prolific provides no matching infrastructure and does not guarantee pairing, and there is no appointment or slot-booking feature — time-window studies are explicitly "at the researcher's own risk." Burst launch via schedule-publish is the entire simultaneity lever, so Pairing: build a rolling waiting room (room bucketing, ghost expiry, odd arrivals) #10 cannot be delegated to the platform.
  • Unmatched participants must be paid and must not be rejected, minimum $0.14/min. The suggestion is to pay the full task rate instead, because a floor-rate payment loses to returning the study and teaches people to abandon the lobby.
  • Returns are not rejections. Prolific advises returning rather than rejecting to protect approval rate, so no approval-rate prescreener catches serial abandoners — the platform is structurally blind to the failure mode that costs us most.
  • DataPipe's sessions counter increments per save call, not per participant. With per-round saving one C&WG participant consumes seven sessions, so sizing maxSessions to a participant count caps a run about a seventh of the way through and drops every later save silently. Read from functions/src/api-data.ts, not from the docs, which do not mention it.
  • An OSF 409 on a duplicate filename is the one save failure that is not retried, so per-round chunks need a nonce rather than just a round number.

Also added

  • Ethics / IRB (§6) — a hard blocker with the longest lead time of anything in the document, and previously absent. Focused on what is unusual here: retained chat between strangers, withdrawal in a dyad where the DVs are jointly produced, third-party data transfer, and payment policy for screened-out and unmatched participants.
  • Pre-registration (§7) — carries the only hard deadline that is not upstream-gated, since it must be locked before the first paid participant. That makes it the real deadline on the Decide: are partial (aborted) dyads usable for analysis? #8 analysis decision. Notes that the 20-dyad target is an assumption carried through the cost model rather than a powered number.
  • An agreed execution order, since the phase-1/2/3 grouping is by upstream dependency and is not the order to work in.
  • All amounts converted to USD, since that is what participants are paid in, and the cost model rebuilt on a suggested $15.00/hr.

Recommendation recorded in the file

Run C&WG as the first paid study, not Hawkins: ~25 min vs 55 min moves pair-based attrition economics by about 3× ($465 vs ~$1,500 for 20 usable dyads), and it keeps the survivor-grind failure mode bounded at 15 minutes instead of 71.

Also worth saying

The replication logic itself is in good shape, and the audit says so explicitly — parameters verified against both papers and hawkrobe/tangrams, an unusually thorough set of faithfulness comments, a per-round data spec covering every stated DV, and chat_transcript built from the group snapshot so the full dialogue survives a partner dropout. The gap is entirely in the run infrastructure around the experiment.

Action items are filed as #3#13, grouped into the same phases as the work plan in the file, with the upstream-blocked ones labelled blocked-upstream.

🤖 Generated with Claude Code

htsukamoto5 and others added 3 commits July 29, 2026 18:24
Audits both reference-game builds against what a live paid Prolific run
requires, verified by reading the vendored bundles rather than trusting
the header comments.

Headline findings: no pairing mechanism for strangers (the lobby waits
unbounded, so an unmatched participant can neither exit nor be paid), no
partner-dropout handling (round_timeout restarts per round, so a survivor
grinds through ~71 min of dead waiting on Hawkins with no indication
anything is wrong), and no data save target at all (initJsPsych takes no
options; the only egress is a voluntary download button, so every
non-completing participant contributes zero data).

Also corrects a false claim in both HTML headers and in README: swapping
adapter-multiplayer-local for -firebase is NOT a drop-in. SEED reads
?mp_session=, which the LocalAdapter constructor generates and Firebase
will not, so every dyad would silently share one trial order.

No behavior change — documentation and comments only.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…pper (#13)

The phase-1/2/3 grouping is by upstream dependency, which is not the order
to work in. Records the sequence we settled on, the two dependencies that
drove it (#8 gates the design of #3 and #5; #7 gates the payment paths in
#5 and #6), and the decision to do phase 1 against the C&WG file only.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@htsukamoto5
htsukamoto5 force-pushed the docs/prolific-readiness-audit branch from 6133f3a to 79e4435 Compare July 30, 2026 14:32
htsukamoto5 and others added 7 commits July 30, 2026 11:25
IRB approval is a hard blocker on a paid run and has the longest lead time
of anything in the document, but was absent entirely. Covers the items that
are unusual to this study rather than the generic protocol checklist: chat
as retained user-generated content, display-name PII shown to a stranger,
withdrawal in a dyad where the DVs are jointly produced, third-party data
transfer via DataPipe/OSF, transcript retention, and payment policy for
screened-out / unmatched / stranded participants.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Several of these are platform policy rather than design choices, and they
constrain issues already open: no matching infrastructure is provided (so
pairing is ours to build and to prove), unmatched participants must be paid
at least GBP 0.10/min and must not be rejected, waiting time must be in the
advertised duration, identifiers must link paired responses, and in-study
screening is allowed only via the built-in feature or a two-study design.

The screening rule adds a fourth completion code (screened-out) to the three
already tracked in #7.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ch pay

Participants are paid in USD, so GBP figures are converted repo-wide and
section 5 is rebuilt on a suggested $15.00/hr rather than Prolific's $12.00/hr
recommendation, on the grounds that the task is sustained real-time
coordination and that better pay partly recovers its own cost through lower
multiplicative dyad attrition.

Reverses the earlier suggestion to hold the waiting rate below the task rate.
The perverse incentive it guarded against does not exist, since participants
cannot influence whether they match, while the floor rate does create a real
one: $0.70 for a five-minute wait loses to returning the study and taking a
short survey instead, which trains people to abandon the lobby. No-match now
suggested at the full task rate.

Also records that returns are not rejections, so no approval-rate filter
catches serial abandoners, and adds the post-hoc re-consent question to the
IRB section.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Every rule in the policy table now cites the help-centre article it came
from, with a Sources list keyed by tag. Articles are named as well as linked
because Prolific's help-centre URLs are not stable.

Adds two rules found while settling the screen-out amount: the reward is
duration-scaled rather than flat ($0.14 is the minimum for a screener of one
minute or less), and it may not exceed the full study reward. The scaling is
what makes brevity before the commitment gate load-bearing, since every
pre-gate item counts as screening time.

Also corrects the note claiming the higher no-match payment creates no
perverse incentive. With a commitment gate in place there is an adjacent
gamble available; it still loses, but for a reason worth stating rather than
by not existing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Checked because it would have reduced the scope of #10 if it existed. It
does not: Prolific explicitly cannot support time-window participation and
says such studies run at the researcher's own risk. Schedule publish, which
controls when a study goes live rather than when participants start, is the
entire simultaneity lever.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…er hazard

DataPipe's sessions counter increments per save call rather than per
participant, so per-round saving consumes seven sessions per C&WG
participant. Sizing maxSessions to a participant count therefore caps a run
about a seventh of the way through and drops every later save silently.
Records the three options with a suggestion to leave limitSessions off.

Adds a pre-registration section. It carries the only hard deadline in the
document that is not upstream-gated: it must be locked before the first paid
participant, which is the real deadline on the #8 analysis decision. Notes
that the 20-dyad target is an assumption carried through the cost model
rather than a powered number, and that #12's staged launch has to be
declared in advance or it reads as a peek.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Consolidates the suggestions scattered across READINESS.md and issues #3-#13
into one reviewable table, grouped by when each decision stops being
deferrable, with a reversal-cost column so attention goes to the expensive
ones first.

Groups: before writing code, locked at publish, before the first paid
participant (pre-registration), and open questions for IRB.

The launch checklist links to the reasoning rather than restating it, so the
audit stays the single source of explanation. It exists separately because
it is organised by moment-in-time rather than by problem domain, which is
the access pattern someone needs when they are about to click publish.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@htsukamoto5 htsukamoto5 changed the title Add Prolific readiness audit; correct the adapter-swap claim Add Prolific readiness audit and decision register Jul 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant