완료일: 2026-09-12
T6의 실제 SQLite·PostgreSQL Alembic runtime과 Lab UI 위에 다섯 lesson의 상태 기반 validator를 연결한다. 동일한 공통 base에서 Alice, Bob, Integration workspace를 복제하고, 두 actor의 revision 파일을 합쳐 실제 multiple-head 오류와 merge 해결을 재현한다. T8의 IndexedDB checkpoint, 새로고침 복구, ZIP archive는 포함하지 않는다.
init, 수동 revision, upgrade/downgrade, autogenerate 검토, Alice/Bob branch와 merge의 다섯 lesson을 같은 가이드 UI로 제공한다.- lesson 단계는 실제 Alembic 환경 파일, ScriptDirectory DAG, Inspector schema,
alembic_version, 명령 전후 snapshot 전이와 구조화된 argv로 판정한다. migration 파일 본문의 특정 문자열을 성공 조건으로 사용하지 않는다. - init, 미적용 revision, upgrade/downgrade, autogenerate 생성·파일 검토·DB 적용과 multiple-head 오류 관찰 이력을 workspace별로 기록한다.
- 자유 실습과 가이드 모드가 같은
AlembicRuntimeClient.runCommand()를 사용한다. 가이드는 명령 입력을 돕지만 결과를 대신 실행하거나 합성하지 않는다. - 협업 실습 시작 조건은 단일 workspace, 저장된 편집 상태, 하나의 file head와 동일한 DB current다. 네 runtime 한도를 채우는 다른 workspace가 있으면 내보내기·삭제 동선을 안내한다.
- SQLite는 Alembic 파일과 실제 database 파일을 clone seed로 복제한다. PostgreSQL은 파일과 실제 PGlite 데이터 디렉터리 dump를 복제하며, 각 clone은 독립 Pyodide/PGlite Worker를 사용한다.
- Alice와 Bob이 공통 base에서 각자 만든 revision 파일만 Integration workspace에 복사한다. Integration의 실제 graph가 multiple heads가 된 뒤
upgrade head원본 오류, merge revision의 복수 부모, merge head의 실제 DB current까지 안내하고 판정한다. - 같은 revision 파일 경로 충돌은 자동 덮어쓰기 없이 중단한다. 실제 DDL 충돌과 같은 revision ID 문제도 Alembic/runtime 오류를 그대로 표시한다.
- 협업 실습 초기화는 연결된 네 runtime을 함께 종료하고 새 단일 workspace로 돌아간다.
- 협업 그룹 삭제는 연결된 네 runtime, 실제 DB와 체크포인트를 함께 제거하고 대체 workspace를 만들지 않는다.
- lesson 정의·validator·가이드:
src/lessons/lessons.ts,src/lessons/LessonGuide.tsx - UI와 스타일:
src/App.tsx,src/styles.css - workspace 조율:
src/lab/store.ts - clone protocol과 client:
src/runtime/protocol.ts,src/runtime/alembic-runtime-client.ts - 실제 DB 복제:
src/runtime/python/alembic_runtime.py,src/runtime/pglite.worker.ts - 검증:
src/lessons/lessons.test.ts,src/lab/store.test.ts,src/runtime/protocol.test.ts,src/App.test.tsx,tests/e2e/lessons-collaboration.spec.ts - 문서:
README.md,docs/SPEC.md,docs/TASKS.md,docs/T7.md
프로젝트 루트에서 mise exec -- 환경으로 실행했다.
pnpm lint: 통과pnpm typecheck: 통과pnpm test: 8개 파일, 36개 테스트 통과- T7 대상 E2E: Chromium·Firefox·WebKit에서 SQLite/PostgreSQL 6개 시나리오 통과
pnpm test:e2e --workers=1: 기존 T1~T6 회귀를 포함해 57개 테스트 전체 통과 (5.0분)pnpm build: production build와 25 MiB 정적 파일 게이트 통과. 28개 파일 중 최대 9.62 MiB
E2E는 각 DB 모드에서 다섯 lesson을 순서대로 완료한 뒤 공통 base 복제, Alice/Bob 독립 revision, Integration 파일 합치기, 실제 Multiple head revisions 오류, merge revision 생성, merge head upgrade와 최종 alembic_version 일치를 확인한다.
- lesson 이력과 clone seed는 현재 탭 메모리에만 존재한다. 새로고침, Worker crash 후 복원과 학습 진행도 영속화는 T8 범위다.
- 협업 실습은 Base, Alice, Bob, Integration 네 runtime을 동시에 유지하므로 단일 workspace보다 메모리를 더 사용한다.
- “PR 파일 합치기”는 실제 Git 작업이 아니라 revision 파일 집합을 Integration Alembic script directory에 합치는 교육용 동작이다.
- PGlite는 T8 전까지
memory://instance를 사용한다. T7 clone은dumpDataDir()/loadDataDir로 그 시점의 실제 DB만 복제한다.
- CodeMirror host와 editor/scroller의 높이 경계를 명시해 긴 Python 파일을 편집 패널 안에서 세로로 스크롤할 수 있게 수정했다.
- autogenerate lesson에
DeclarativeBase,Mapped,mapped_column, constraint naming convention을 사용하는 실무형 SQLAlchemy 2.xUser모델 전체 예제를 추가했다. models.py교체, 저장, autogenerate, 생성 migration 검토, upgrade 순서를 구체적으로 안내한다. 예제 자체를 SQLite와 PostgreSQL의 실제 autogenerate E2E에 사용한다.- 관련 UI E2E 15개가 Chromium·Firefox·WebKit에서 통과해 편집기 내부 스크롤과 두 DB의 실제 예제 migration을 확인했다.
- 자유 실습에서도 발견할 수 있도록
alembic init이 만드는models.py에 같은 User 모델의 주석 예제를 포함했다. 기본 metadata는 비워 두어 수동 revision 실습은 기존처럼 시작할 수 있다. - 가이드 명령 버튼과 화면 아래 터미널 사이의 긴 이동, 명령 입력 후 별도 실행이 필요하다는 피드백 부족은 후속 UX 태스크로 분리했다.
초기 T7 Commit 메시지: feat: 실제 DB 상태로 판정하는 Alembic lesson과 Alice/Bob 협업 실습 구현
사용성 보완 Commit 메시지: fix: 편집기 스크롤을 복구하고 자유 실습용 User 모델 예제 추가
- init의
models.py를 실행 가능한 기본 User 모델로 바꾸고email한 줄만 주석 처리했다. - 02에서 Alembic의 수동 revision이 빈 파일인 이유와
users(id, name)생성·제거 예제를 안내한다. - 03 validator는 실제 users 테이블 생성·제거와 최종 head 재적용을 판정한다.
- 04는 기존 users에 email을 추가하는 autogenerate만 완료로 인정하며, 전체 모델 복사 대신 한 줄 편집을 안내한다.
- 가이드 닫기와 01~05 압축 탭을 고정하고 lesson 내용만 독립 스크롤한다.