Add Prolific readiness audit and decision register - #2
Open
htsukamoto5 wants to merge 10 commits into
Open
Conversation
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
force-pushed
the
docs/prolific-readiness-audit
branch
from
July 30, 2026 14:32
6133f3a to
79e4435
Compare
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>
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.
Stacked on #1 (
chore/vendor-multiplayer-bundles), because that branch is the only state that currently runs —mainstill points at the broken npm0.1.0pins — andREADINESS.mdcitesvendor/throughout. Happy to rebase ontomainonce #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.
lobbyTrialhas notimeout, and the plugin default isnull, sowait()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 explicitdisconnect()— no heartbeat, nobeforeunloadanywhere in the bundles — so against persistent room state a live participant is matched with a ghost and then times out every round. Thespectatoroverflow path is also a dead end with no code. (#6, #10)No partner-dropout handling.
round_timeoutsets 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.mdasserted that swappingadapter-multiplayer-localfor-firebaserequired no other change to the file. It is not a drop-in.SEEDreads?mp_session=, which the LocalAdapter constructor generates viahistory.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.persistParticipantis 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:
sessionscounter increments per save call, not per participant. With per-round saving one C&WG participant consumes seven sessions, so sizingmaxSessionsto a participant count caps a run about a seventh of the way through and drops every later save silently. Read fromfunctions/src/api-data.ts, not from the docs, which do not mention it.Also added
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, andchat_transcriptbuilt 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