Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
542c672
feat(arena): accept difficulty in run_arena_session + config
irregular6612 Jul 4, 2026
9a22eca
feat(arena): ArenaRunRequest.difficulty + 400 on unknown value
irregular6612 Jul 4, 2026
86a08ea
feat(arena-ui): difficulty options + state + launch payload
irregular6612 Jul 4, 2026
20ed4a7
feat(arena-ui): difficulty selector in arena setup
irregular6612 Jul 4, 2026
f5bf785
test(arena): e2e smoke for hard difficulty run
irregular6612 Jul 4, 2026
a622d46
docs(spec): human-play difficulty selection + per-game DB difficulty tag
irregular6612 Jul 5, 2026
ef786f4
docs(plan): human-play difficulty + per-game DB difficulty tag
irregular6612 Jul 5, 2026
ea3061e
docs(plan): next-session KICKOFF prompt (subagent-driven execution)
irregular6612 Jul 5, 2026
2a23a94
feat(persistence): sessions.difficulty column + SQLite round-trip/mig…
irregular6612 Jul 5, 2026
321fa02
feat(persistence): Postgres parity for sessions.difficulty
irregular6612 Jul 5, 2026
f030006
feat(persistence): tag each session with its difficulty
irregular6612 Jul 5, 2026
ea6bc57
fix(api): /api/new_game returns 400 (not 500) on unknown difficulty
irregular6612 Jul 5, 2026
0b81d77
feat(play-ui): campaign-level difficulty state, launch payload, check…
irregular6612 Jul 5, 2026
f8fcf22
feat(play-ui): difficulty selector on the human Play setup card
irregular6612 Jul 5, 2026
58e2741
docs(spec): HARD/EXPERT hidden-rule builder UI expansion design
irregular6612 Jul 8, 2026
e1e164a
docs(plan): HARD/EXPERT hidden-rule builder implementation plan
irregular6612 Jul 8, 2026
59693dc
docs(plan): next-session KICKOFF prompt for HARD/EXPERT rule builder
irregular6612 Jul 8, 2026
646b8a8
test(signal-game): lock frontend↔score_probe rule grammar contract
irregular6612 Jul 8, 2026
9e4bc02
feat(play-ui): difficulty-aware rule-builder state and assembledRule
irregular6612 Jul 8, 2026
590b7b7
feat(play-ui): adaptive HARD/EXPERT inline rule-builder
irregular6612 Jul 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
757 changes: 757 additions & 0 deletions docs/superpowers/plans/2026-07-05-human-play-difficulty-and-db-tag.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# 다음 세션 킥오프 프롬프트 — Human-Play 난이도 + 게임별 DB 난이도 태그 실행

아래 블록을 새 Claude Code 세션에 그대로 붙여넣으면 됩니다. (실행 방식: **subagent-driven**)

---

```text
Human-play 난이도 선택 + 게임별 DB 난이도 태그를 계획대로 구현한다. superpowers:subagent-driven-development 스킬로 Task 단위 실행해줘.

- 계획: docs/superpowers/plans/2026-07-06-human-play-difficulty-and-db-tag.md (Task 0~7)
- 스펙: docs/superpowers/specs/2026-07-05-human-play-difficulty-and-db-tag-design.md
- 작업 위치: 워크트리 .claude/worktrees/signal-game-difficulty-arena (브랜치 worktree-signal-game-difficulty-arena)

확정된 결정 (재논의 불필요):
- Git 통합 = Rebase (main 불변, 워크트리 5커밋+docs를 최신 main 위로 replay)
- human-play 난이도 = 3단계 (Easy/Normal/Hard = 엔진 easy/hard/expert, medium 제외)
- 기존 DB 행 백필 = 'easy' (NOT NULL DEFAULT 'easy')
- 난이도 적용 범위 = 캠페인 단위 (6게임 공통, 각 게임 행에 동일 태그)

진행 방식:
1. Task 0(rebase)은 서브에이전트에 위임하지 말고 오케스트레이터(너)가 직접 실행해.
충돌 해결이 필요하고(4파일: api.py/app.js/index.html/test_api_web_arena.py) 트리 전체에
영향을 주기 때문. 충돌은 전부 additive라 "main 코드 유지 + difficulty 추가분 재적용"이
원칙. api.py의 arena import 블록은 union 한 줄(VALID_DIFFICULTIES) 추가.
완료 게이트: 관련 테스트 그린 + node --check web/app.js. main 브랜치 ref는 절대 안 건드림.
2. Task 1~7은 계획대로 Task마다 새 서브에이전트 dispatch + 사이에 2단계 리뷰(구현/테스트).
계획에 파일 경로·정확한 코드·명령·기대출력이 모두 들어 있으니 그대로 따르게 해.
3. 순서 엄수: 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7. 신규 작업은 반드시 rebase 완료된 tip 위에.
4. SQLite/Postgres 병행 반영 필수 (스키마·마이그레이션·INSERT·SELECT·row-map 양쪽).
Postgres는 SELECT 컬럼과 _row_to_session 언패킹 모두 difficulty를 "끝에 append"해 순서 일치.
5. 각 Task는 TDD (실패 테스트 → 실패 확인 → 최소 구현 → 통과 → 커밋). 커밋 메시지는 계획에 명시됨.

환경 주의:
- 저장소 경로에 공백 있음 — 모든 셸 명령 경로를 따옴표로 감쌀 것.
- iCloud .pth 숨김 이슈: pytest 전에
`find .venv -name "*.pth" -exec chflags nohidden {} \;` 후 `uv run --no-sync` 사용 (메모리 참고).
- 워크트리 venv는 `uv sync --extra dev` 필요 (Task 0 Step 5).
- Task 7의 로컬 스모크는 반드시 임시 DB(WEB_ARENA_DSN=스크래치패드 경로)로 — 141MB 프로덕션
outputs/web_arena/web_arena.db 오염 금지. 프론트는 http://localhost:8080/ (127.0.0.1 아님, CORS).
- 판정 기준: "no NEW failures" (기존 pre-existing 실패는 허용, 메모리 참고).

완료 후: superpowers:finishing-a-development-branch로 main 병합/PR 옵션을 나에게 제시해줘.
```

---

## 맥락 요약 (프롬프트에 포함할 필요 없음)

- **왜 rebase인가:** 분기점 `7dcfa7a`(difficulty 계획 커밋) 이후 main이 29커밋 앞서 나가
더 이상 워크트리의 조상이 아님. main 불변으로 워크트리 5커밋을 최신 main 위로 올리는
가장 깔끔한 방법. 사용자가 rebase 선택.
- **이미 검증된 사실:** main의 `NewGameRequest`에는 이미 `difficulty` 필드가 있고 `new_game`이
`HumanGameSession`으로 전달까지 함 — 단 (1) UI 셀렉터 없음, (2) DB 태그 없음, (3) 검증 없음(500).
이 세 갭이 이번 작업의 핵심. 백엔드 난이도→규칙 반영은 easy=단일속성 / hard=AND결합 /
expert=이력의존으로 이미 동작 확인됨.
- **충돌 파일 상세:** api.py/app.js/index.html/test_api_web_arena.py = main과 함께 수정됨(충돌 위험).
arena.py/test_arena.py = 클린(자동 적용). Phase 1 파일(persistence 3개 + seeding.py)은 main에서
미변경이라 계획의 라인 번호가 정확함.
- **DB 스키마 현황:** sessions 테이블에 difficulty 컬럼 없음. SeasonResult에는 difficulty 필드 존재하나
미영속. season_results.jsonl에는 top-level "difficulty" 키가 있어 seeding에서 그대로 읽음.
- **체크포인트 정합성:** _saveCheckpoint 페이로드에 현재 difficulty가 없어, 캠페인 재개 시 easy로
회귀하는 버그가 있음 → 계획 Task 5에서 v2로 올리며 저장/복원(구버전은 easy 폴백).
- **현재 브랜치 상태:** 워크트리 tip = 564fc32 (docs 스펙+플랜 커밋 완료). 그 아래 difficulty 5커밋.
이번 세션에서 서버(8502/8503/8080)는 모두 종료됨.
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
# 실행 킥오프 프롬프트 — HARD/EXPERT 히든 룰 빌더 확장

> **사용법:** 다음 세션에서 아래 "복사할 프롬프트" 블록을 그대로 붙여넣으세요.
> Subagent-Driven(Task마다 새 subagent + Task 사이 리뷰) 방식으로 실행됩니다.
> **주의:** 이 작업은 이미 `worktree-signal-game-difficulty-arena` 워크트리 안에서
> 진행되고 있습니다. 새 워크트리를 만들지 말고 이 워크트리에서 이어가세요.

---

## 복사할 프롬프트

```
superpowers:subagent-driven-development 스킬로 아래 구현 계획을 Task 단위로 실행해줘.

- Plan: docs/superpowers/plans/2026-07-08-hard-expert-rule-builder.md
- Spec: docs/superpowers/specs/2026-07-08-hard-expert-rule-builder-design.md

작업 위치:
- 이미 worktree-signal-game-difficulty-arena 워크트리 안에서 진행 중인 작업이야.
새 워크트리를 만들지 말고 현재 워크트리(.claude/worktrees/signal-game-difficulty-arena)
에서 그대로 편집/커밋/서버 실행을 해.

방식:
- Task 1부터 순서대로. 각 Task는 fresh subagent에 위임하고, Task 사이에 나에게 리뷰를 받아.
- Task 1(계약 테스트)은 pytest로 검증: `uv run pytest tests/unit/test_signal_game_probe_contract.py -v`.
만약 "No module named 'squid_game'"가 나오면 먼저
`chflags nohidden .venv/lib/python*/site-packages/*.pth` 실행(iCloud .pth 숨김 이슈).
- Task 2·3(프론트, 자동화 테스트 없음)은 계약 테스트 무회귀 + Task 4 E2E로 검증.
- Task 4 E2E는 로컬 서버로: 백엔드
`WEB_ARENA_DSN=sqlite:///$(pwd)/outputs/web_arena_local.db PYTHONPATH=$(pwd)/src uv run --no-sync uvicorn interface.api:app --port 8502`,
정적 프론트 `cd web && python3 -m http.server 8600` → http://localhost:8600/index.html.
Playwright MCP로 HARD("Normal")·EXPERT("Hard")·EASY 각각 룰 빌더 렌더+제출 확인.
- 커밋 메시지 끝에 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> 유지.

Global Constraints(반드시 준수):
- 백엔드(src/squid_game/**, interface/**) 변경 금지. 프론트엔드 + 신규 테스트만.
- 변경 파일은 tests/unit/test_signal_game_probe_contract.py(신규), web/app.js,
web/index.html, web/styles.css 로만 한정. EASY/MEDIUM UI는 무회귀.
- 프론트가 emit하는 룰 문자열은 채점기 문법과 정확히 일치해야 함. app.js assembledRule의
포맷 리터럴은 test_signal_game_probe_contract.py의 FRONTEND_HARD_FORMAT /
FRONTEND_EXPERT_FORMAT와 byte-for-byte 동일하게 유지(Task 2 Step 5 대조).
- 웹 아레나는 engine difficulty로 easy|hard|expert만 보냄(medium 미노출). medium은
방어적으로 EASY 경로로 처리.
- 신규 상태 변수 4개: probeAttr2, probeValue2, probeActionPartial, probeOverride.

Task 1부터 시작해줘.
```

---

## 요약 (사람용 메모)

- **목표**: 웹 아레나 Play 플로우의 히든 룰 추측 UI를 HARD(2속성 논리곱)·EXPERT(+히스토리
override)에서도 정답 룰을 표현할 수 있게 확장. 현재는 EASY 단일 속성 4-칩 빌더에 고정.
- **핵심 사실**: 백엔드 채점기 `score_probe`는 이미 3개 문법(EASY 4슬롯 / HARD 7슬롯 /
EXPERT 10슬롯)을 지원 → **프론트엔드만 확장**하면 됨. 백엔드 무변경.
- **Task 4개**: (1) Python 문법 계약 테스트(프론트 문자열 ↔ score_probe 100점) →
(2) app.js 난이도별 상태·assembledRule 분기 → (3) index.html 적응형 인라인 빌더
(2속성 논리곱 + 읽기전용 attr_1 echo + EXPERT override 칩 행) → (4) localhost E2E.
- **실행 방식**: Subagent-Driven. Task 사이마다 리뷰 게이트.
- **마무리**: Task 4 후 superpowers:finishing-a-development-branch로 main 병합/PR 결정.
- **참고**: 아레나 `num_few_shot=1` 고정으로 HARD가 예시 1개만 노출하는 건 별개 이슈 —
이번 범위 밖.
Loading