deepxrlab · Dual-Task Cognitive Training · reference

Double Decision 변형 / Peak 변형 — 프로토타입 설계 노트

위치: double-decision-st/docs/planning/

차례

1. 배경

두뇌 훈련 앱을 카피캣 형태로 만들되, 원본 과제를 그대로 베끼지 않고 훈련 자극 구조는 유지하고 세션 구조·난이도 축·지표를 바꾼 변형을 만드는 것이 목표.

벤치마킹 대상으로 정리해 둔 것:

대표 과제이번 프로토타입과의 관계
BrainHQDouble Decision (UFOV 계열 속도 훈련)프로토타입 A의 원형
PeakRush Back, Turtle Traffic 등 주의·억제 계열프로토타입 B의 원형
Elevate언어·수리 중심 일일 훈련세션 구조(짧은 러닝타임) 참고
NeuroNation적응형 난이도 + 진도 리포트트레이닝 모드 리포트 참고

관심사로 남아 있는 것: 무료 구간을 어디까지 열고 페이월을 어디에 두는가(아래 6절, 아직 미결정).

주의: 이 계열 앱들의 "훈련 효과"는 학계에서 논쟁이 있는 영역입니다. 프로토타입 단계에서는 효과 주장을 마케팅 문구로 쓰지 말고, 측정 가능한 수행 지표(반응시간·정확도·역치)만 사용자에게 보여주는 쪽이 안전합니다.


2. 이번 세션에서 정한 것 (결정 로그)

항목결정이유
구현 형태단일 HTML 파일 2개 (의존성·빌드 없음)더블클릭으로 바로 플레이, 수정-확인 루프가 가장 빠름
Peak 변형의 인지 영역주의 전환 / 반응 억제Double Decision(시각 처리속도)과 훈련 영역이 겹치지 않아 대비가 명확
세션 구조적응형 트레이닝 + 60초 스코어어택 둘 다훈련용 지표와 재방문용 재미를 한 프로토타입에서 비교 검증

3. 프로토타입 A — prototypes/double-decision-variant.html

3.1 과제 구조 (원본과 동일하게 가져온 뼈대)

중앙 과제와 주변 과제를 동시에 요구하는 이중과제. 둘 다 맞혀야 정답으로 처리한다.

  1. 응시점 (500 ms)
  2. 자극 제시 (노출시간 E, 적응적으로 변함)
    • 중앙: 승용차 / 트럭 판별
    • 주변: 8방향 링 위 한 곳에 초록 표지판(타깃) + 방해자극
  3. 마스킹 (250 ms) — 잔상으로 푸는 것을 막는 핵심 단계
  4. 응답 ①: 중앙 차량 — 화면의 선택지 클릭 또는 F / J (캔버스 밖 버튼에서 옮겼다)
  5. 응답 ②: 표지판이 있던 방향 — 8방향 클릭 또는 Q W E / A D / Z X C
  6. 피드백 (420 ms)

3.2 변형 포인트

  1. 세션 구조 2종 분리 — 적응형 트레이닝(24 stage)과 60초 스코어어택.
  2. 난이도 축의 확장 — 원본이 주로 노출시간 한 축으로 조이는 데 비해, 여기서는 노출시간 × 편심도 × 방해자극 유사도 3축을 노출시간에 연동해 함께 움직인다.
  3. 콤보 = 난이도 — 스코어어택에서는 잘할수록 노출시간이 짧아지고 그만큼 점당 배점이 커진다. 난이도 선택 UI 없이 플레이어가 스스로 자기 수준으로 수렴한다.

3.2-1 M-스케일링 — 편심도가 '시력'을 재지 않게

원래 구현은 표적 표지판을 모든 편심도에서 지름 34px 로 고정했다. 편심도는 108 / 144 / 180px (캔버스 반경 대비 0.30 / 0.40 / 0.50)로 커지는데 크기는 그대로였다.

주변 시력은 편심도가 커질수록 떨어진다. 그래서 고정 크기로 두면 3단계에서 늘어난 난이도의 일부가 '주의 범위'가 아니라 시력 때문이 되고, 처리속도 역치가 무엇을 재는지 흐려진다.

표준 대응이 M-스케일링(cortical magnification scaling) — 자극 크기를 편심도에 따라 키워 "보이는 정도"를 맞춘 뒤, 남는 차이만 주의 효과로 읽는 것이다. 여러 과제(대비 민감도·시력·시각 탐색)에서 이렇게 크기를 맞추면 편심도에 따른 수행 차이가 사라진다고 보고돼 있다.

적용식: 배수 = (1 + e/E2) / (1 + e₀/E2), E2 = 140px, e₀ = 108px(1단계 링) → 1단계 1.00 · 2단계 1.15 · 3단계 1.29 배. 표적과 방해자극에 같이 적용해 탐색 부하는 그대로 둔다. 자극이 커지므로 최소 간격도 48 → 58px 로 넓혔다.

3.2-2 응답 표면을 캔버스 하나로 통일

원래는 중앙 판별만 캔버스 밖 DOM 버튼이고 위치 응답은 캔버스 클릭이었다. 캔버스에는 차량 두 대가 그려져 있는데 눌리지 않아, "눌릴 것처럼 보이는데 안 눌리는" 상태였다. 측정상의 이유가 있는지 확인했으나 없었다 — RT 는 마스킹 종료 시점부터 재므로 어느 표면이든 같고, 원본 Double Decision 도 화면의 차량을 직접 고르게 한다.

3.2-3 모바일 기준 — 키보드 없는 조작

이 프로젝트의 목표는 모바일 앱이다. 키보드가 없는 기기가 기준이므로 모든 조작에 터치 경로가 있어야 한다. 점검해 보니 키보드 전용이 하나 남아 있었고(⎋ 일시정지), UI 곳곳이 키를 안내하고 있었다.

조작
일시정지키보드 전용헤더 오른쪽 ⏸ 버튼 (3본 공통)
A 중앙 판별화면 아래 버튼 + F/J화면의 차량을 (§3.2-2)
A 방향 라벨원 안에 Q W E … 키 문자제거. 화살표만 30px 로 키움
A 차량 라벨승용차 [F]승용차
B 응답 버튼파랑 <small>F / ←</small>파랑 <small>왼쪽</small>
C 점검 버튼표적 맞음 (F)표적 맞음
하단 안내<kbd> 나열"모든 조작은 화면 터치입니다"

손가락은 정확히 짚지 못한다 — 최근접 선택으로 바꿨다.

키 입력 핸들러는 남겨 뒀다. PC 에서 개발·검증할 때 쓰지만 UI 에는 노출하지 않는다 — 각 파일 §입력 절 머리에 그 이유를 적어 뒀다.

3.3 난이도 티어

티어진입 조건(노출시간)편심도(캔버스 반경비)링 위 방해자극내부 방해자극유사 방해자극
1단계> 240 ms0.3000
2단계> 150 ms0.4044
3단계> 90 ms0.5078
4단계≤ 90 ms0.50712링 슬롯의 약 45%가 타깃과 같은 색·형태 계열

방해자극은 기각표집으로 서로 48px 이상 떨어뜨려 배치한다(겹쳐서 뭉치면 탐색 과제가 아니라 그냥 잡음이 된다).

3.4 적응 알고리즘

3.5 점수식 (스코어어택)

정답  : (60 + 140×난이도계수 + 60×속도계수) × (1 + min(2.0, 콤보×0.12))
        난이도계수 = (900 − 노출시간)/900,  속도계수 = max(0, 1200 − RT)/1200
부분정답(한쪽만) : +10
오답  : −25 (0 미만으로는 안 내려감)

4. 프로토타입 B — prototypes/peak-switch-variant.html (Switch & Stop)

4.1 과제 구조

카드 한 장에 (파랑/주황)과 모양(원/사각)이 함께 들어 있고, 규칙 배너가 가리키는 속성만 보고 좌/우를 고른다.

  1. 규칙 배너 선행 제시 (340 ms, CSI)
  2. 카드 제시 — 제한시간 D 안에 응답 (F/← , J/→)
  3. 피드백 (340 ms) + stage 간 간격 (260 ms)

세 종류의 억제 요구가 겹쳐 있다.

4.2 변형 포인트

  1. 보통 따로 만드는 세 과제(과제 전환 / 역방향 규칙 / 고고-노고)를 한 과제에 통합해, 한 세션에서 전환 비용과 충동 억제를 동시에 측정한다.
  2. 난이도 축 = 제한시간 × 전환확률 × 노고비율 × 역방향비율 — 프로토타입 A의 축(노출시간)과 의도적으로 겹치지 않게 설계했다. 두 과제를 한 앱에 넣었을 때 "비슷한 걸 두 번 한다"는 인상을 피하기 위한 것.
  3. 스위치 코스트를 사용자에게 그대로 보여준다 — 총점 대신 "전환 stage RT − 반복 stage RT"를 리포트해서 훈련의 대상이 무엇인지 드러낸다.

4.3 레벨 테이블

레벨진입 조건전환확률노고비율역방향비율
워밍업시작000
전환3 stage 이후0.3500
전환+억제9 stage 또는 D < 1300 ms0.450.180
전환+억제+역방향18 stage 또는 D < 1000 ms0.500.200.15
혼돈D < 720 ms0.550.220.25

4.4 적응 / 점수

억제 실패에 가장 큰 페널티를 준 이유: 점수를 올리려면 무작정 빨리 누르는 전략이 유리해지는데, 그러면 과제가 측정하려는 억제 요소가 무력화된다.


5. 측정 지표 / 데이터 스키마

두 프로토타입 모두 stage 단위 로그를 메모리에 쌓고 세션 종료 시 요약한다.

A (Double Decision 변형){no, expo, tier, okC, okD, both, rt, rtCentral} → 양쪽 정답률 / 중앙 판별 정확도 / 주변 위치 정확도 / 처리속도 역치(ms) / 중앙 응답 RT 중앙값 / 최고 콤보 / 도달 난이도

B (Switch & Stop){no, rule, isSwitch, nogo, rev, congruent, outcome, ok, rt, deadline} outcome ∈ {hit, wrong, miss, correctReject, commission} → 전체·Go 정확도 / No-go 억제 성공률 / 커미션 오류 수 / RT 중앙값 / 전환·반복 RT / 스위치 코스트 / 도달 제한시간

이 두 세트가 앱 단계에서 그대로 서버 스키마의 초안이 된다. stage 로그만 저장하면 위 요약 지표는 전부 사후 계산이 가능하므로, 지표 정의가 바뀌어도 과거 데이터를 다시 쓸 수 있다.


6. 아직 정하지 않은 것 — 무료 구간과 페이월

프로토타입에는 페이월이 들어 있지 않다. 검토해 볼 만한 선택지:

방식무료유료리스크
세션 횟수 제한하루 N세션무제한습관 형성 전에 막히면 이탈
과제 수 제한과제 2종전체 과제카피캣 특성상 과제 수가 곧 상품성
지표·리포트 제한점수만역치·스위치 코스트·추이 그래프무료 사용자에게 "훈련" 실감이 약함
스코어어택 무료 / 트레이닝 유료재미훈련두 모드 분리 설계와 잘 맞음

마지막 안이 이번 구조와 가장 잘 맞는다 — 스코어어택은 바이럴·재방문용으로 전부 열고, 적응형 트레이닝과 지표 리포트를 유료로 두는 형태. 다만 결정 전에 각 모드의 실제 리텐션을 봐야 한다.


7. 검증

헤드리스 Chromium(Playwright)으로 두 프로토타입을 자동 플레이해 확인했다.

봇은 즉시 응답하므로 RT·점수의 절대값은 의미가 없다. 밸런싱(특히 A의 스코어어택 배점)은 사람 플레이로 다시 봐야 한다.


8. 알려진 한계 / 다음 단계


8-1. 맛보기(guided demo)

세 프로토타입 모두 메뉴에 ▶ 맛보기 버튼이 생겼다. 실제 루프를 그대로 쓰되 가장 쉬운 설정 고정 · 점수 없음 · 계단 없음 · 기록 없음이고, 단계마다 지금 무엇을 하는지 자막이 붙는다.

첫 stage 는 시범이다 — 입력을 막고 정답을 대신 골라 보여준다(S.demoShow). 나머지 stage 는 직접 한다.

stage고정값보여주는 것
A3 (시범 1 + 직접 2)노출시간 600ms (티어 0)시범에서 정답 차량을 테두리로, 정답 방향을 노랑으로 짚어 준다
B4 (시범 1 + 직접 3)제한시간 2600ms · 규칙 배너 1500ms정해진 순서 — 색 규칙 → 모양 전환 → 역방향 → 노고(no-go). 시범에서 정답 버튼에 테두리
C3 (시범 1 + 직접 2)속도 70px/s (티어 0) · 프로브 100%시범에서는 추적 내내 표적을 초록으로 남겨 어디로 가는지 보여준다

맛보기 전용 대기 시간을 따로 둔다 — 훈련 타이밍을 그대로 쓰면 자막을 읽기 전에 화면이 넘어간다. 특히 피드백이 제일 짧아 스쳐 지나갔다(A 420ms · B 600ms · C 620ms → 전부 2,600ms). 그 밖에 A 응시점 500→1,000 · 가림막 250→800, B 규칙 배너 340→1,500 · ⛔ 유지 700→1,600, C 표적 지정 1,100→1,900 · 정지 350→800, 시범의 '대신 고르기 전 대기' 는 3본 모두 2,400ms.

20~34초면 끝난다. 로직 하네스가 맛보기가 로그·점수·난이도를 건드리지 않는지시범 중 입력이 실제로 막히는지를 단언으로 검사한다.


8-2. 실행 런처 prototypes/index.html

3본을 한 페이지에서 골라 실행한다. 본체는 손대지 않았다 — 런처는 껍데기이고 프로토타입은 그대로 독립 HTML 이다.

결정
iframe 으로 띄운다(본체 통합 ❌)3본을 한 파일로 합치면 파라미터·상태기계가 뒤섞이고, 하네스가 파일 단위로 도는 구조(DEFAULT_FILES)도 깨진다. 껍데기로 두면 본체는 지금 그대로 쓰인다
해시 라우팅(#a/#b/#c)모바일 기준이라 기기의 뒤로 가기로 목록에 돌아와야 한다. 해시면 그게 공짜로 된다
iframe 을 매번 새로 만든다⚠️ iframe.src 를 바꿔 쓰면 그 이동이 최상위 히스토리에 쌓여 뒤로 가기가 목록이 아니라 직전 프로토타입으로 간다. 실제로 그렇게 새어 나가는 것을 확인하고 고쳤다
← 목록 은 조건부카드로 들어왔을 때만 history.back(). 딥링크(#a)로 바로 들어오면 이전 항목이 다른 사이트라 그리로 나가 버린다
새 탭 ↗ 을 항상 둔다file:// 에서 브라우저가 로컬 파일의 iframe 삽입을 막는 경우의 탈출구. 4초 안에 load 가 오지 않으면 안내로 대체한다

검증 (Chrome)

로컬 HTTP(python -m http.server)로 띄워 확인했다 — 브라우저 확장이 file:// 을 거부해 그쪽은 미검증이다.


9. 파일

파일내용
../../prototypes/index.html실행 런처. 3본을 한 페이지에서 골라 iframe 으로 띄운다
../../prototypes/double-decision-variant.html프로토타입 A. 브라우저에서 바로 실행
../../prototypes/peak-switch-variant.html프로토타입 B. 브라우저에서 바로 실행
../../prototypes/track-probe-variant.html프로토타입 C — Track & Probe(MOT + 중간 점검). 설계 근거는 이 문서가 아니라 evidence-brief-2026-08.md §8
docs/planning/DESIGN-NOTES.md이 문서 (A·B 정본)
docs/planning/evidence-brief-2026-08.md근거 브리프 — 문헌·경쟁 제품·MVP 판단

모두 외부 의존성이 없다. index.html 을 더블클릭하면 목록이 뜨고 거기서 고른다(본체를 직접 열어도 된다). 파라미터는 각 파일 상단의 const P = {...} 와 티어/레벨 테이블에서 조정한다.