deepxrlab · Dual-Task Cognitive Training · reference
위치: double-decision-st/docs/planning/
차례
두뇌 훈련 앱을 카피캣 형태로 만들되, 원본 과제를 그대로 베끼지 않고 훈련 자극 구조는 유지하고 세션 구조·난이도 축·지표를 바꾼 변형을 만드는 것이 목표.
벤치마킹 대상으로 정리해 둔 것:
| 앱 | 대표 과제 | 이번 프로토타입과의 관계 |
|---|---|---|
| BrainHQ | Double Decision (UFOV 계열 속도 훈련) | 프로토타입 A의 원형 |
| Peak | Rush Back, Turtle Traffic 등 주의·억제 계열 | 프로토타입 B의 원형 |
| Elevate | 언어·수리 중심 일일 훈련 | 세션 구조(짧은 러닝타임) 참고 |
| NeuroNation | 적응형 난이도 + 진도 리포트 | 트레이닝 모드 리포트 참고 |
관심사로 남아 있는 것: 무료 구간을 어디까지 열고 페이월을 어디에 두는가(아래 6절, 아직 미결정).
주의: 이 계열 앱들의 "훈련 효과"는 학계에서 논쟁이 있는 영역입니다. 프로토타입 단계에서는 효과 주장을 마케팅 문구로 쓰지 말고, 측정 가능한 수행 지표(반응시간·정확도·역치)만 사용자에게 보여주는 쪽이 안전합니다.
| 항목 | 결정 | 이유 |
|---|---|---|
| 구현 형태 | 단일 HTML 파일 2개 (의존성·빌드 없음) | 더블클릭으로 바로 플레이, 수정-확인 루프가 가장 빠름 |
| Peak 변형의 인지 영역 | 주의 전환 / 반응 억제 | Double Decision(시각 처리속도)과 훈련 영역이 겹치지 않아 대비가 명확 |
| 세션 구조 | 적응형 트레이닝 + 60초 스코어어택 둘 다 | 훈련용 지표와 재방문용 재미를 한 프로토타입에서 비교 검증 |
prototypes/double-decision-variant.html중앙 과제와 주변 과제를 동시에 요구하는 이중과제. 둘 다 맞혀야 정답으로 처리한다.
노출시간 × 편심도 × 방해자극 유사도 3축을 노출시간에 연동해 함께 움직인다.
원래 구현은 표적 표지판을 모든 편심도에서 지름 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 로 넓혔다.
P.MSCALE = false — 옛 동작(고정 크기)으로 돌아간다
원래는 중앙 판별만 캔버스 밖 DOM 버튼이고 위치 응답은 캔버스 클릭이었다. 캔버스에는 차량 두 대가 그려져 있는데 눌리지 않아, "눌릴 것처럼 보이는데 안 눌리는" 상태였다. 측정상의 이유가 있는지 확인했으나 없었다 — RT 는 마스킹 종료 시점부터 재므로 어느 표면이든 같고, 원본 Double Decision 도 화면의 차량을 직접 고르게 한다.
centralBox() 가 그리기와 히트 테스트에 같은 값을 쓴다). 선택지처럼 보이도록 테두리·배경도 넣었다
이 프로젝트의 목표는 모바일 앱이다. 키보드가 없는 기기가 기준이므로 모든 조작에 터치 경로가 있어야 한다. 점검해 보니 키보드 전용이 하나 남아 있었고(⎋ 일시정지), UI 곳곳이 키를 안내하고 있었다.
| 조작 | 전 | 후 |
|---|---|---|
| 일시정지 | ⎋ 키보드 전용 | 헤더 오른쪽 ⏸ 버튼 (3본 공통) |
| A 중앙 판별 | 화면 아래 버튼 + F/J | 화면의 차량을 탭 (§3.2-2) |
| A 방향 라벨 | 원 안에 Q W E … 키 문자 | 제거. 화살표만 30px 로 키움 |
| A 차량 라벨 | 승용차 [F] | 승용차 |
| B 응답 버튼 | 파랑 <small>F / ←</small> | 파랑 <small>왼쪽</small> |
| C 점검 버튼 | 표적 맞음 (F) | 표적 맞음 |
| 하단 안내 | <kbd> 나열 | "모든 조작은 화면 터치입니다" |
손가락은 정확히 짚지 못한다 — 최근접 선택으로 바꿨다.
LOC_BTN_R × 1.5 밖이면 무시). 390px 폭 화면에서 버튼 자체는 ≈40 CSS px 지만 유효 타겟은 ≈60 CSS px 이 된다
DOT_R+9 고정 반경 → 가장 가까운 원(DOT_R × 2.4 밖이면 무시). 원 사이 최소 간격이 DOT_R × 2.1 이라 고정 반경으로는 넓힐 수 없었다 — 최근접이면 겹칠 걱정이 없다
키 입력 핸들러는 남겨 뒀다. PC 에서 개발·검증할 때 쓰지만 UI 에는 노출하지 않는다 — 각 파일 §입력 절 머리에 그 이유를 적어 뒀다.
| 티어 | 진입 조건(노출시간) | 편심도(캔버스 반경비) | 링 위 방해자극 | 내부 방해자극 | 유사 방해자극 |
|---|---|---|---|---|---|
| 1단계 | > 240 ms | 0.30 | 0 | 0 | — |
| 2단계 | > 150 ms | 0.40 | 4 | 4 | — |
| 3단계 | > 90 ms | 0.50 | 7 | 8 | — |
| 4단계 | ≤ 90 ms | 0.50 | 7 | 12 | 링 슬롯의 약 45%가 타깃과 같은 색·형태 계열 |
방해자극은 기각표집으로 서로 48px 이상 떨어뜨려 배치한다(겹쳐서 뭉치면 탐색 과제가 아니라 그냥 잡음이 된다).
E × 0.82, 1회 오답 → E × 1.32
정답 : (60 + 140×난이도계수 + 60×속도계수) × (1 + min(2.0, 콤보×0.12))
난이도계수 = (900 − 노출시간)/900, 속도계수 = max(0, 1200 − RT)/1200
부분정답(한쪽만) : +10
오답 : −25 (0 미만으로는 안 내려감)
prototypes/peak-switch-variant.html (Switch & Stop)카드 한 장에 색(파랑/주황)과 모양(원/사각)이 함께 들어 있고, 규칙 배너가 가리키는 속성만 보고 좌/우를 고른다.
세 종류의 억제 요구가 겹쳐 있다.
역이 붙으면 정답의 반대쪽을 눌러야 한다.
제한시간 × 전환확률 × 노고비율 × 역방향비율 — 프로토타입 A의 축(노출시간)과 의도적으로 겹치지 않게 설계했다. 두 과제를 한 앱에 넣었을 때 "비슷한 걸 두 번 한다"는 인상을 피하기 위한 것.
| 레벨 | 진입 조건 | 전환확률 | 노고비율 | 역방향비율 |
|---|---|---|---|---|
| 워밍업 | 시작 | 0 | 0 | 0 |
| 전환 | 3 stage 이후 | 0.35 | 0 | 0 |
| 전환+억제 | 9 stage 또는 D < 1300 ms | 0.45 | 0.18 | 0 |
| 전환+억제+역방향 | 18 stage 또는 D < 1000 ms | 0.50 | 0.20 | 0.15 |
| 혼돈 | D < 720 ms | 0.55 | 0.22 | 0.25 |
×0.88, 오답 → ×1.22, 범위 420 ~ 2600 ms, 시작 1600 ms
정답 (50 + 90×속도 + 전환보너스 25 + 역방향보너스 25) × 콤보배수, 노고 성공 +80, 노고 실패 −60(가장 큰 감점), 오답/시간초과 −20
억제 실패에 가장 큰 페널티를 준 이유: 점수를 올리려면 무작정 빨리 누르는 전략이 유리해지는데, 그러면 과제가 측정하려는 억제 요소가 무력화된다.
두 프로토타입 모두 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 로그만 저장하면 위 요약 지표는 전부 사후 계산이 가능하므로, 지표 정의가 바뀌어도 과거 데이터를 다시 쓸 수 있다.
프로토타입에는 페이월이 들어 있지 않다. 검토해 볼 만한 선택지:
| 방식 | 무료 | 유료 | 리스크 |
|---|---|---|---|
| 세션 횟수 제한 | 하루 N세션 | 무제한 | 습관 형성 전에 막히면 이탈 |
| 과제 수 제한 | 과제 2종 | 전체 과제 | 카피캣 특성상 과제 수가 곧 상품성 |
| 지표·리포트 제한 | 점수만 | 역치·스위치 코스트·추이 그래프 | 무료 사용자에게 "훈련" 실감이 약함 |
| 스코어어택 무료 / 트레이닝 유료 | 재미 | 훈련 | 두 모드 분리 설계와 잘 맞음 |
마지막 안이 이번 구조와 가장 잘 맞는다 — 스코어어택은 바이럴·재방문용으로 전부 열고, 적응형 트레이닝과 지표 리포트를 유료로 두는 형태. 다만 결정 전에 각 모드의 실제 리텐션을 봐야 한다.
헤드리스 Chromium(Playwright)으로 두 프로토타입을 자동 플레이해 확인했다.
봇은 즉시 응답하므로 RT·점수의 절대값은 의미가 없다. 밸런싱(특히 A의 스코어어택 배점)은 사람 플레이로 다시 봐야 한다.
requestAnimationFrame 기준이라 화면 주사율에 묶임(60Hz에서 최소 약 17 ms). 정밀 측정용이 아니라 훈련용이라 실용상 문제는 없지만, 지표를 비교할 때는 기기 차이를 감안해야 함
세 프로토타입 모두 메뉴에 ▶ 맛보기 버튼이 생겼다. 실제 루프를 그대로 쓰되 가장 쉬운 설정 고정 · 점수 없음 · 계단 없음 · 기록 없음이고, 단계마다 지금 무엇을 하는지 자막이 붙는다.
첫 stage 는 시범이다 — 입력을 막고 정답을 대신 골라 보여준다(S.demoShow). 나머지 stage 는 직접 한다.
| stage | 고정값 | 보여주는 것 | |
|---|---|---|---|
| A | 3 (시범 1 + 직접 2) | 노출시간 600ms (티어 0) | 시범에서 정답 차량을 테두리로, 정답 방향을 노랑으로 짚어 준다 |
| B | 4 (시범 1 + 직접 3) | 제한시간 2600ms · 규칙 배너 1500ms | 정해진 순서 — 색 규칙 → 모양 전환 → 역방향 → 노고(no-go). 시범에서 정답 버튼에 테두리 |
| C | 3 (시범 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초면 끝난다. 로직 하네스가 맛보기가 로그·점수·난이도를 건드리지 않는지와 시범 중 입력이 실제로 막히는지를 단언으로 검사한다.
prototypes/index.html3본을 한 페이지에서 골라 실행한다. 본체는 손대지 않았다 — 런처는 껍데기이고 프로토타입은 그대로 독립 HTML 이다.
| 결정 | 왜 |
|---|---|
| iframe 으로 띄운다(본체 통합 ❌) | 3본을 한 파일로 합치면 파라미터·상태기계가 뒤섞이고, 하네스가 파일 단위로 도는 구조(DEFAULT_FILES)도 깨진다. 껍데기로 두면 본체는 지금 그대로 쓰인다 |
해시 라우팅(#a/#b/#c) | 모바일 기준이라 기기의 뒤로 가기로 목록에 돌아와야 한다. 해시면 그게 공짜로 된다 |
| iframe 을 매번 새로 만든다 | ⚠️ iframe.src 를 바꿔 쓰면 그 이동이 최상위 히스토리에 쌓여 뒤로 가기가 목록이 아니라 직전 프로토타입으로 간다. 실제로 그렇게 새어 나가는 것을 확인하고 고쳤다 |
← 목록 은 조건부 | 카드로 들어왔을 때만 history.back(). 딥링크(#a)로 바로 들어오면 이전 항목이 다른 사이트라 그리로 나가 버린다 |
새 탭 ↗ 을 항상 둔다 | file:// 에서 브라우저가 로컬 파일의 iframe 삽입을 막는 경우의 탈출구. 4초 안에 load 가 오지 않으면 안내로 대체한다 |
로컬 HTTP(python -m http.server)로 띄워 확인했다 — 브라우저 확장이 file:// 을 거부해 그쪽은 미검증이다.
← 목록 → 기기 뒤로 가기: 전부 정상. iframe 은 나갈 때 제거되어 실행이 멈춘다
#app{max-width:min(860px,68vh)} 라 창이 납작하면 폭까지 같이 줄어 HUD 가 2줄로 접힌다. 세로가 짧은 창은 원래 대상이 아니다(모바일 세로 기준)
| 파일 | 내용 |
|---|---|
../../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 = {...} 와 티어/레벨 테이블에서 조정한다.