Repository navigation
revert: 조각2·3(블록 카탈로그·시뮬레이션 결과 화면) 되돌림 — 팀원 파트 침범 - #39
Conversation
There was a problem hiding this comment.
리뷰 결과
변경된 22개 파일을 검토했으며, 수정이 필요한 문제 3개를 발견했습니다.
| 심각도 | 개수 |
|---|---|
| Critical | 0 |
| High | 1 |
| Medium | 2 |
| Low | 0 |
주요 내용
- HIGH · SECURITY — 구버전 `moveForward` 요청이 이동 거리 0으로 승인됩니다
- MEDIUM · BEHAVIOR — 블록 카테고리 버튼이 더 이상 팔레트를 전환하지 않습니다
- MEDIUM · DATA_INTEGRITY — 기존 사용자의 저장된 프로젝트가 초기 프로그램으로 대체됩니다
파일·PR 단위 검토
MEDIUM · DATA_INTEGRITY
PR 전체 · 기존 사용자의 저장된 프로젝트가 초기 프로그램으로 대체됩니다
같은 localStorage 키에 이전 버전이 저장한 초안에는 이번에 제거된 moveForward, 회전, 동작 블록이 포함될 수 있습니다. 좁아진 BLOCK_KINDS는 그 초안 전체를 무효로 판정하고, ExperienceView는 별도 마이그레이션이나 안내 없이 INITIAL_PROGRAM으로 시작합니다.
지원 종료 블록을 변환·제거하는 명시적 마이그레이션을 제공하거나, 최소한 원본을 보존하면서 사용자에게 복구 방법을 안내해야 합니다.
발생 조건: PR 배포 전에 제거된 블록 종류 중 하나를 포함한 프로젝트가 `poppy.experience.draft`에 저장되어 있는 경우
영향: 재방문 또는 새로고침 시 사용자가 작성한 전체 블록 프로그램이 화면에서 사라지고 초기 예제로 보입니다. 이후 편집하면 기존 저장값도 덮어쓸 수 있습니다.
근거: `BLOCK_KINDS`가 여섯 종류로 축소되어 `isBlockNode`가 기존 노드를 거부합니다. `ExperienceView.initialProgram`은 검증 실패 시 저장된 `blocks`를 사용하지 않고 `INITIAL_PROGRAM`을 선택합니다.
수정 방향: 초안에 스키마 버전을 추가하고 구버전 블록을 현재 모델로 변환하는 마이그레이션을 수행하십시오. 변환할 수 없는 경우에도 자동 초기화 대신 원본 초안을 보존하고 사용자 확인을 받으십시오.
검토한 head: aabe1de58706
| function totalDistance(nodes: SerializedBlockNode[]): number { | ||
| return sumOverBlockTree(nodes, { | ||
| valueOf: (node) => (node.kind === 'move' || node.kind === 'moveForward' ? node.distanceM : 0), | ||
| valueOf: (node) => (node.kind === 'move' ? node.distanceM : 0), |
There was a problem hiding this comment.
🔴 HIGH · SECURITY
구버전 `moveForward` 요청이 이동 거리 0으로 승인됩니다
네트워크 요청은 런타임 스키마 검증 없이 타입 단언만 거치므로, 이전 클라이언트나 직접 작성한 요청은 여전히 moveForward를 보낼 수 있습니다. 이 변경은 해당 블록의 거리와 값 검증을 모두 제거했으며 default 분기는 유효한 값으로 처리합니다. 따라서 distanceM이 안전 구역을 크게 초과해도 시뮬레이션과 실행 요청이 통과할 수 있습니다.
알 수 없는 블록 종류를 거부하거나, 배포 호환 기간에는 기존 moveForward의 범위 및 거리 계산을 유지해야 합니다.
| type="button" | ||
| aria-pressed={category.label === selectedCategory} | ||
| onClick={() => setSelectedCategory(category.label)} | ||
| aria-pressed={category.label === SELECTED_CATEGORY} |
There was a problem hiding this comment.
🟠 MEDIUM · BEHAVIOR
블록 카테고리 버튼이 더 이상 팔레트를 전환하지 않습니다
aria-pressed가 상수와 비교되고 모든 버튼에서 클릭 핸들러가 제거되어, 시작, 이동, 동작 버튼을 눌러도 항상 흐름 팔레트만 표시됩니다. 특히 종료 블록을 삭제하면 다시 꺼낼 방법이 없어 시뮬레이션을 영구히 잠그며, 사용자는 작업을 초기화해야만 복구할 수 있습니다.
카테고리 상태와 onClick 및 각 목록을 복원해야 합니다. 카테고리를 의도적으로 제공하지 않는다면 활성 버튼으로 렌더링하지 말고, 최소한 필수 end 블록의 복구 경로는 유지해야 합니다.
inryeok-bot 2건 반영 (되돌린 조각2·3 관련 1건은 지금 상황에 안 맞아 보류):
1. HIGH·SECURITY — isValueValid 의 default 가 무조건 true 라, 되돌리며
사라진(혹은 조작된) moveForward 같은 알 수 없는 kind 가 거리·값 검증
없이 통과했다. totalDistance 는 'move' 만 합산해 안전 구역 계산에서도
빠지므로, 값이 아무리 커도 안전 구역 위반을 놓칠 수 있었다.
→ start·greet·end(파라미터 없는 블록)만 명시적으로 true, 그 외
알 수 없는 kind 는 default: false 로 명시적으로 거부한다.
2. MEDIUM·BEHAVIOR — 카테고리 전환을 되돌리며 팔레트에서 종료를 다시
꺼낼 방법이 사라졌다. 종료는 조각1(쓰레기통)로 지울 수 있는데, 되돌린
뒤에는 지우면 영구히 복구 불가 상태가 된다(시뮬레이션이 계속 막힘).
→ 카테고리 전환 없이, 흐름 목록 안에 종료를 조건부로 끼워 넣는다 —
이미 있으면(스택이든 자유 블록이든) 그림만 보여주고, 없으면 꺼낼 수
있다(hasBlockKind). 팀원 파트(카테고리 전환 자체)는 건드리지 않음.
보류: MEDIUM·DATA_INTEGRITY(구버전 저장 초안 무효화) — 이 프로젝트는
아직 배포 전이라 영향받는 실사용자 데이터가 없고, "스키마 안 맞는 초안은
초기화" 자체가 이 코드베이스의 기존 설계다. 마이그레이션 인프라를 새로
만들 실익이 없어 보류.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
배경
Figma "뽀삐" 디자인 슬라이드 담당이 Slide 1
4는 나, Slide 57은 팀원(정하승)으로 나뉘어 있었다. #34(블록 카탈로그, Slide 5 기준)·#36(시뮬레이션 결과 화면, Slide 6·7 기준)은 그 사실을 모르고 진행한 것으로, 실제로는 팀원 파트(이슈 #28·#29·#30, 팀원이 이미 PR #31로 #28 작업 중)를 침범한 구현이었다.Slide 2(블록 삭제, #32)만 내 파트(Slide 1~4)라 그대로 두고, #34·#36 은 되돌린다.
변경
git revert -m 1로 PR #38(#34·#36 을 main에 반영한 병합 커밋)을 되돌린다. 결과 트리는 #33(블록 삭제) 머지 직후 상태와 완전히 동일함을 확인함(git diff결과 없음).검증
/experience/simulation라우트 제거 확인(빌드 라우트 목록에서 사라짐)후속 조치
🤖 Generated with Claude Code