apps: - bots: '' constants: - datatype: int js_value: null name: PLAYERS_PER_GROUP - datatype: int js_value: 3 name: NUM_ROUNDS - datatype: int js_value: 60 name: WORK_DURATION_SECONDS - datatype: int js_value: 60 name: BREAK_DURATION_SECONDS - datatype: int js_value: 500 name: TRIALS_PER_ROUND - datatype: int js_value: 10 name: WORK_MINUTES - datatype: float js_value: 0.1 name: PAY_PER_STRING - datatype: float js_value: 0.2 name: TAX_RATE - datatype: list_str js_value: - '!' - '@' - '#' - $ - '%' - ^ - '&' - '*' - ( - ) name: SHIFT_CHARS - datatype: int js_value: 10 name: BREAK_MINUTES custom_export: '' doc: '' includable_templates: [] models: Group: fields: [] methods: [] Player: fields: - datatype: StringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: typed_answer - datatype: BooleanField kwargs: blank: null choices: null initial: constant: null expr_type: plain js_value: false label: null widget: null name: is_correct - datatype: StringField kwargs: blank: constant: null expr_type: plain js_value: true choices: null initial: null label: null widget: null name: correct_ans methods: - code: "import random\nSPECIAL_CHARS = ['!', '@', '#', '$', '%', '^', '&', '*', '(']\n\n\nif data.get('type') == 'init':\n if 'correct_ans' not in participant.vars:\n participant.vars['correct_ans'] = ''.join(\n random.choice(SPECIAL_CHARS) for _ in range(5)\n \ )\n\n return {\n player.id_in_group: dict(\n \ new_target=participant.vars['correct_ans'],\n message='',\n \ is_correct=None,\n )\n }\ntyped = data.get('typed_answer', '').strip()\ncorrect_ans = participant.vars.get('correct_ans', '')\n\nif typed == correct_ans:\n new_string = ''.join(random.choice(SPECIAL_CHARS) for _ in range(5))\n participant.vars['correct_ans'] = new_string\n \ return {\n player.id_in_group: dict(\n is_correct=True,\n \ new_target=new_string,\n message='Correct',\n \ )\n }\n\nreturn {\n player.id_in_group: dict(\n \ is_correct=False,\n message='Try again',\n )\n \ }" name: live_strings Subsession: fields: [] methods: [] name: Labour_Decisions_JScursor pages: - app_after_this_page: null before_next_page: null error_message: null form_fields: - typed_answer form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: null is_waitpage: false js_vars: null live_method: null name: Task template: content: " \n\n\n
\n
\n

Typing Task

\n

\n This study includes 30 minutes of task time in three\n 10-minute work blocks, with 10-minute breaks between blocks.\n Type the five characters shown (Shift + digits 1–9) in order, then click Enter.\n \

\n
\n\n
\n Starting…\n —:—\n \
\n\n
\n
\n \

Current string & earnings (this work block)

\n
\n\n
\n

This 10-minute work period

\n
\n Strings completed\n 0\n
\n
\n \ Earnings (pre-tax)\n $0.00\n \
\n
\n Earnings (after-tax)\n $0.00\n
\n \
\n\n
\n

Total (all work blocks)

\n
\n Strings completed\n 0\n
\n \
\n Earnings (pre-tax)\n \ $0.00\n
\n
\n Earnings (after-tax)\n $0.00\n
\n
\n
\n\n \
\n

Enter your response

\n \
\n Earnings for completing one string:\n $0.00 pre-tax ·\n $0.00 after-tax\n
\n\n \ \n \n\n
\n \n
\n\n
\n Break time — task input is paused. Next work block starts when the timer ends.\n
\n\n

\n \ Use Shift + number keys 19 (e.g. Shift+1 = !).\n

\n
\n
\n
\n\n
\n

All work blocks complete

\n \

\n Total strings completed: 0
\n Total pre-tax: $0.00 ·\n Total after-tax: $0.00\n

\n
\n \
\n\n " javascript: '' title: Typing timeout_seconds: null timer_text: null vars_for_template: null - bots: '' constants: - datatype: int js_value: null name: PLAYERS_PER_GROUP - datatype: int js_value: 1 name: NUM_ROUNDS custom_export: '' doc: '' includable_templates: [] models: Group: fields: [] methods: [] Player: fields: [] methods: - code: "import random\nSPECIAL_CHARS = ['!', '@', '#', '$', '%', '^', '&', '*', '(']\n\n# Only proceed with answer checking if 'answer' key exists\nif 'typed_answer' in data:\n typed = data.get('typed_answer', '').strip()\n \ correct_ans = participant.vars.get('correct_ans', '') \n if typed == correct_ans:\n participant.vars['correct_ans'] = ''.join(random.choice(SPECIAL_CHARS) for _ in range(5))\n \nparticipant.vars['correct_ans'] = ''.join(random.choice(SPECIAL_CHARS) for _ in range(5))\n\nresponse = dict(new_target=participant.vars['correct_ans'])\n \ \nreturn {player.id_in_group: response}" name: live_part Subsession: fields: [] methods: [] name: Labour_Decisions_Beta pages: - app_after_this_page: null before_next_page: null error_message: null form_fields: null form_model: player get_form_fields: null get_timeout_seconds: null is_displayed: null is_waitpage: false js_vars: null live_method: live_part name: Typing template: content: "\n
\n\n\n\n\n\n{{ next_button }}" javascript: null title: Typing timeout_seconds: null timer_text: null vars_for_template: null css: '' mturk_settings: null other_settings: DEMO_PAGE_INTRO_HTML: '' LANGUAGE_CODE: en PARTICIPANT_FIELDS: [] REAL_WORLD_CURRENCY_CODE: CAD SESSION_FIELDS: [] USE_POINTS: true rooms: [] session_config_defaults: participation_fee: 0 real_world_currency_per_point: 1 session_configs: - app_sequence: - Labour_Decisions_Beta custom_entries: [] name: Labour_Decisions_Beta num_demo_participants: null shared_out: ''