rev.1 · 2026-09-16 재판정 — ux-spec rev.1(UX-E-18~20 · 05/11/12/14/21~27/32/33) · architecture rev.3(ED-16 · ED-17 · ED-06a) · PRD v1.1(FR-206/302/406/501/505/606) · bdd v1.1(54 → 79 시나리오, 재판정 후 R-0 · R-2 · R-5 · R-9 추가로 83) 대조. Critical E-C1~3 닫힘 · Must-Have 12/12 대응 · 재판정 표는 §rev.1 재판정. rev.0 본문은 그대로 두고
Covered?열과 누락 분류만 갱신했다.
Summary
- Evaluation Date: 2026-09-16
- Target(rev.0): architecture rev.1 · ux-spec rev.0 · PRD §4 흐름 1~6 · bdd 54 시나리오 / Target(rev.1 재판정): architecture rev.3 · ux-spec rev.1 · PRD v1.1 · bdd v1.1 79 시나리오 — 전부 디스크 재독
- Total Flows: 6 (PRD §4) + 교차 흐름 1(닫기 · 종료 순서)
- Total Permutations: 127 (Happy: 24 · Error: 25 · Edge: 59 · Permission: 4 · Empty: 7 · Concurrency: 8 · Network: 0 — 이 모듈은 네트워크 호출이 없다; 외부 도구 가용성은 Error/Edge 로 분류)
- Covered by existing BDD(rev.1): 81 커버 · 8 부분 · 35 미커버 · 3 외부 의존/첫 릴리스 밖 (rev.0: 51 · 4 · 69 · 3)
- Missing Coverage(rev.1): Critical 0 열림(3 닫힘 + 외부 의존 2 유지) · Important 열림 10 / 닫힘 19 · Nice-to-have 열림 27 / 닫힘 4 · 신설 E-N32 (rev.0: Critical 3 · Important 29 · Nice-to-have 31)
- 표기:
FP-E{표면}{순번}— 상위docs/flow-permutation-cocode.md의FP-1xx~5xx·N-n과 충돌하지 않도록E접두어와E-C/E-I/E-Nn을 쓴다. 수치 목표는 쓰지 않는다 — 값이 미정인 곳은 PRD §10U-n을 가리킨다. 이 문서의 열거량은 §Permutation Matrix 를 스크립트로 직접 계수한 값이다.
Screen Inventory (ux-spec §3 + 탐색 트리)
| Screen | States | Transitions(주요) |
|---|---|---|
| S-E01 에디터 탭 스트립 + 본문 (+ 탐색 트리 · 흐름 1) | 빈 상태 · 로딩(파일 읽는 중) · 열림(clean) · dirty · 외부 변경 대기(modified/deleted/moved) · 작업 대상 · 열기 실패 | 파일 선택 → 열림 · 편집 → dirty · 저장 → clean · 감시 이벤트 → 대기/교체 · 닫기 → S-E02 |
| S-E02 dirty 처분 다이얼로그 | 단일 · 일괄(워크스페이스 닫기 · 앱 종료) · 제시 중 · 처분 완료 | 저장/폐기/취소 · 모두 저장/모두 폐기/취소 |
| S-E03 검색 패널 | 입력 · 검색 중 · 결과 · 결과 0 · 정규식 오류 · 치환 중 | Enter → 검색 중 → 결과/0 · 중지 · 행 선택 → S-E01 · 모두 바꾸기 |
| S-E04 문제 패널 | 서버 실행 중 · 서버 부재 · 서버 종료 · 진단 0 · 진단 목록 | 서버 상태 전이 · 진단 갱신 · 항목 선택 → S-E01 · 다시 시작 |
| S-E05 세션 탭 바 + 터미널 | 세션 0 · running · exited(code) · PTY 실패 · 전제 미충족 Alert | [+] → running · 종료/중지 → exited · × → 제거 · 실패 → Alert |
| S-E06 실행 구성 목록/실행 | 프로젝트 0 · 목록 · 전제 검사 중 · 전제 미충족 · 실행 중 | 실행 → 검사 → S-E05 세션 · 3.x 대안 · JSON 편집 → 목록 갱신 |
| S-E07 작업 대상 배너 | 없음 · 표시 · 닫힘(세션 내 재표시 없음) | 작업 스냅샷 존재 → 표시 · 닫기 · 작업 종결 → ? |
User Flow Overview
Flow 1: 워크스페이스가 열린 뒤 앱 셸 (AC-01)
- Entry: 워크스페이스 열림(경로는 상위 소관 — D-018 미결)
- Steps: 앱 셸 → 탐색 트리(지연 로드 · 무시 규칙) → 파일 선택 → 탭 열림
- Exit Points: 정상(편집 시작) · 디렉터리/파일 읽기 실패(노드 사유) · 바이너리(U-12)
Flow 2: 편집 · 저장 · 외부 변경 (AC-03 · AC-04)
- Entry: 열린 탭에서 타이핑 · Steps: dirty → 전환 → 저장 → 감시 이벤트 → 배너/교체 → 닫기 처분 · Exit: clean 저장 · 저장 실패(dirty 유지) · 처분 취소
Flow 3: 전역 검색 · 치환 (AC-06)
- Entry:
[검색]탭 · Steps: 입력 → 검색 중 → 결과 → 선택/치환 → 저장 · Exit: 결과 0 · 정규식 오류 · 중지 · 치환 저장 실패
Flow 4: 실행 구성 (AC-08)
- Entry:
Run메뉴 · 팔레트 · 세션 탭 바[+ ▾]· Steps: 전제 검사 → 기동 → origin 세션 → 중지 · Exit: 전제 미충족 Alert(3.x 대안) · 기동 실패 Alert · exited(code)
Flow 5: 터미널 세션 (AC-09)
- Entry:
[+]· Steps: 티켓 → PTY 로그인 셸 → 입력/출력 → 다중 세션 → 종료 · Exit: PTY 실패 Alert · exited 유지 · 닫기
Flow 6: 실행 중 작업 대상 파일의 사람 편집 (AC-10 · AC-22)
- Entry: 작업 스냅샷이 있는 파일 열기 · Steps: 배너 → 편집 · 저장(비차단 · 스냅샷 없음) → 작업 재편집(체인 불연속) → 롤백 충돌 · Exit: D-013 확정 전에는 상위 현행 규칙(사람 편집 소멸 가능)
Flow 7(교차): 워크스페이스 닫기 · 앱 종료
- Entry:
File › 워크스페이스 닫기· 창 닫기 · Steps: dirty 일괄 처분 → 검색 취소 → 언어 서버 종료 → 세션 처분 → 종료 · Exit: 취소 · 일부 저장 실패(규칙 없음 — E-C2) · running 프로세스 처분(규칙 없음 — E-C1)
Permutation Matrix
Covered? 열은
docs/bdd-fullstack-code-editor.md의 시나리오 제목을 인용한다.부분은 전제나 결과의 일부만 확인되는 경우다.외부는 상위 파이프라인 결정(D-013 · D-018)에 달린 것,May는 첫 릴리스 밖.
S-E01 에디터 탭 스트립 · 본문 · 탐색 트리
| ID | Category | Scenario | Precondition | Action | Expected Result | Covered? |
|---|---|---|---|---|---|---|
| FP-E101 | Happy Path | 파일 선택 → 버퍼 열림 · 탭 생성 | 트리 표시, 파일 clean | 파일 클릭 | 탭 생성 · 내용 표시 · DocumentBufferRegistry 등록(ED-03) |
부분 — [AC-01] 앱 셸의 세 슬롯에 실제 뷰가 그려진다(뷰 존재만) → E-N1 |
| FP-E102 | Empty State | 열린 파일 0 | — | 앱 셸 그림 | EmptyState.compact + [파일 열기…](ux-spec §8 ⓔ) |
커버 — [AC-01] 열린 파일이 없으면 editorStack 은 빈 상태 화면을 그린다 |
| FP-E103 | Happy Path | 디렉터리 지연 로드 | 접힌 디렉터리 | 펼침 | 직접 자식만 읽힘 | 커버 — [AC-01] 디렉터리를 펼치면 그 시점에 자식만 읽는다 |
| FP-E104 | Edge Case | git 저장소의 무시 항목 숨김 | .gitignore build/ |
루트 펼침 | build 미표시(ED-05) |
커버 — [AC-01] git 이 무시하는 항목은 트리에 표시되지 않는다 |
| FP-E105 | Edge Case | 비-git + .gitignore 없음 |
— | 펼침 | 제외 0 | 커버 — [AC-01] git 저장소가 아니고 .gitignore 파일도 없으면 제외 항목이 없다 |
| FP-E106 | Edge Case | 비-git + 루트 .gitignore |
파일 규칙 | 펼침 | 규칙 적용(Dart matcher, U-14) | 커버 — [AC-01] git 저장소가 아니어도 루트 .gitignore 파일 규칙은 적용된다 |
| FP-E107 | Error State | git 저장소인데 git 실행 파일이 없음 |
.git 존재, git 부재 |
펼침 | 규칙 없음 — 판정 정본(git)이 없을 때 파일 규칙으로 후퇴하는지 | 커버 — [AC-01] git 저장소인데 git 실행 파일이 없으면 파일 규칙으로 후퇴하고 판정 불가가 표시된다(ED-06a · FR-302, rev.1 E-I1 닫힘) |
| FP-E108 | Permission | 디렉터리 읽기 권한 없음 | secret/ |
펼침 | 노드 사유 + 트리 계속 | 커버 — [AC-01] 읽기 권한이 없는 디렉터리를 펼치면 사유가 표시되고 트리는 계속 동작한다 |
| FP-E109 | Permission | 파일 읽기 권한 없음 | 파일 0400 아닌 0000 | 파일 클릭 | 규칙 없음 — 탭이 열리는지, 사유 표시 위치 | 커버 — [AC-01] 읽기 권한이 없는 파일을 열면 탭은 열리되 본문에 사유가 표시되고 편집할 수 없다(UX-E-04, rev.1 E-I2 닫힘) |
| FP-E110 | Error State | 바이너리 · 비 UTF-8 파일 열기 | — | 파일 클릭 | U-12(Design) 미정 | 미커버 → E-I3 (U-12) |
| FP-E111 | Edge Case | 파일 이름 공백 · 유니코드 NFC/NFD · 대소문자 폴딩 볼륨 — path_key 정규화(상위 DD-08a) |
A.dart 와 a.dart 가 같은 path_key 인 볼륨 |
둘 다 열기 | 버퍼 1개(불변식 1) — 어느 이름으로 표시하는지 규칙 없음 | 부분 — 규칙 확정(UX-E-08 표시 이름 = 처음 연 이름) · 시나리오는 [불변식] 같은 path_key 의 버퍼는 최대 하나다 뿐 → E-I4 시나리오 열림(권고 R-6) |
| FP-E112 | Happy Path | 타이핑 → dirty 점 표시 | clean | 편집 | 탭 ● · dirty true |
부분 — dirty 는 전제로만 등장 → E-N2 |
| FP-E113 | Happy Path | 탭 전환 시 보존 | dirty | 전환 후 복귀 | content 해시 동일 · undo 동작 | 커버 — [AC-03] 탭을 전환해도 dirty 버퍼의 내용과 실행 취소 이력이 보존된다 |
| FP-E114 | Edge Case | 활성 탭 재클릭은 디스크를 다시 읽지 않는다(ux-spec §4.1) | dirty | 활성 탭 재클릭 | 내용 유지 | 미커버 → E-I5 — 규칙은 ux-spec §4.1 에 있음 · 시나리오 없음(권고 R-7) |
| FP-E115 | Edge Case | 활성 탭을 닫은 뒤 활성 탭 결정 | 탭 3개 | 가운데(활성) 닫기 | 규칙 없음(왼쪽? 직전 활성?) | 커버 — [AC-03] 활성 탭을 닫으면 직전에 활성이었던 탭이 활성이 된다(UX-E-05, rev.1 E-I6 닫힘; "직전 활성 없음 → 왼쪽 이웃" 분기는 미커버 — 권고 R-10) |
| FP-E116 | Happy Path | 저장 성공 | dirty | 저장 | 디스크 = 버퍼 · disk_hash 갱신 | 커버 — [AC-04] 저장하면 디스크에 기록되고 disk_hash 가 갱신된다 |
| FP-E117 | Permission | 저장 실패(읽기 전용) | 쓰기 불가 | 저장 | 사유 표시 · dirty 유지 | 커버 — [AC-04][AC-23] 저장 실패는 사유와 함께 표시되고 버퍼는 dirty 로 남는다 |
| FP-E118 | Concurrency | 저장 진행 중 재저장 요청 | 저장 중 | 저장 연타 | 규칙 없음(직렬화 · 무시) | 미커버 → E-N3 |
| FP-E119 | Happy Path | 외부 변경 + clean → 다시 읽기 | clean | 감시 이벤트 | content 교체 | 커버 — [AC-04] 외부 변경이 clean 버퍼에 감지되면 디스크 내용으로 다시 읽는다 |
| FP-E120 | Error State | 외부 변경 + dirty → 배너 선택 | dirty | 감시 이벤트 | [다시 읽기] [내 편집 유지](UX-E-04) |
커버 — [AC-04] 외부 변경이 dirty 버퍼에 감지되면 덮어쓰지 않고 선택을 제시한다 |
| FP-E121 | Error State | 열린 파일 삭제 | clean/dirty | 삭제 감지 | 보존 + external_change_pending, 다시 읽기 없음 |
커버 — [AC-04] 열린 파일이 삭제되면 버퍼는 보존되고 다시 읽기 선택은 없다 |
| FP-E122 | Error State | 열린 파일 이름변경 | dirty | 이름변경 감지 | dirty 유지 + 표시 | 커버 — [AC-04] 열린 파일의 이름이 바뀌면 버퍼는 dirty 로 남는다 |
| FP-E123 | Edge Case | 배너 [다시 읽기] 선택 후 undo 이력 |
외부 변경 대기 | 다시 읽기 | 이력을 비우는지 잇는지 규칙 없음 | 미커버 → E-N4 |
| FP-E124 | Concurrency | 저장 진행 중 외부 변경 도착 — 자체 저장 억제는 해시 대조(ED-08) | 저장 중 | 타인의 변경 이벤트 | 자체 저장 이벤트는 무시 · 타인 변경은 배너 | 미커버 → E-I7 — 규칙 ED-14(해시 대조) 확정 · 시나리오 없음(권고 R-8) |
| FP-E125 | Edge Case | 작업 대상 파일 열기 | 실행 중 작업 스냅샷 존재 | 열기 | 배너(S-E07) | 커버 — [AC-10] 작업 대상 파일을 열면 표시되고 저장은 차단되지 않는다 |
| FP-E126 | Edge Case | 같은 버퍼를 두 탭에서(분할) | — | 분할 | 첫 릴리스 밖(AC-19 May) | May |
| FP-E127 | Edge Case | 탭 다수 오버플로 | 탭 많음 | 열기 계속 | FadeScroll/OverflowMarquee(ux-spec §4.1) — 상한 없음 |
미커버 → E-N5 |
| FP-E128 | Edge Case | 삭제 대기 중 파일이 다시 생성됨 | 삭제 대기 | 파일 재등장 감지 | 규칙 없음(대기 해제? 외부 변경으로 취급?) | 미커버 → E-N6 |
| FP-E129 | Edge Case | 파일 열기 로딩 상태(큰 파일) | — | 열기 | 로딩 표시 여부 규칙 없음(값 없음 — NFR-01 은 열린 뒤 조작만) | 미커버 → E-N7 — 규칙 확정(UX-E-04 읽는 중 = Loading) · 시나리오 없음 |
S-E02 dirty 처분 다이얼로그
| ID | Category | Scenario | Precondition | Action | Expected Result | Covered? |
|---|---|---|---|---|---|---|
| FP-E201 | Edge Case | 단일: 세 선택 제시 · 선택 전 버퍼 유지 | dirty 탭 | 닫기 | 저장 · 폐기 · 취소 | 커버 — [AC-03] dirty 탭을 닫으면 세 선택이 제시되고 선택 전에는 버퍼가 남는다 |
| FP-E202 | Happy Path | 단일 → [저장] → 성공 |
제시 중 | 저장 | 탭 닫힘 · registry.release |
커버 — Outline [AC-03] dirty 탭 닫기의 세 선택은 각각 정해진 결과를 낳는다(저장 행, rev.1) |
| FP-E203 | Error State | 단일 → [저장] → 실패 |
쓰기 불가 | 저장 | 탭 · 버퍼 유지 + 사유(AC-23) | 미커버 → E-I8 열림 — Outline 에 저장 실패 행이 없다(필수 R-0) |
| FP-E204 | Edge Case | 단일 → [폐기] |
제시 중 | 폐기 | 버퍼 해제(불변식 2 의 처분 완료) | 커버 — 위 Outline 폐기 행(rev.1) |
| FP-E205 | Edge Case | 단일 → [취소] / Esc |
제시 중 | 취소 | 탭 · 버퍼 · dirty 유지 | 커버 — 위 Outline 취소 행(rev.1, E-N8 닫힘) |
| FP-E206 | Edge Case | K4 — [폐기] 는 Enter 기본 활성화 아님 |
제시 중 | Enter | 폐기되지 않음 | 커버 — [AC-03] dirty 탭을 닫으면…(And 절) |
| FP-E207 | Edge Case | 일괄: dirty 목록 제시 · 선택 전 유지 | dirty 2+ | 앱 종료 | 목록 + 세 선택 | 커버 — [AC-03] 앱 종료 시 dirty 버퍼 전체 목록을 한 번에 처분한다 |
| FP-E208 | Happy Path | 일괄 → [모두 저장] 전부 성공 |
제시 중 | 모두 저장 | 종료 진행 | 미커버 → E-I9 — 모두 저장 전부 성공 → 진행 시나리오 없음(권고 R-2) |
| FP-E209 | Error State | 일괄 → [모두 저장] 일부 실패 |
한 파일 쓰기 불가 | 모두 저장 | 규칙 없음 — 종료를 진행하면 실패한 dirty 버퍼가 처분 없이 사라진다(불변식 2 위반) | 커버 — [AC-03][AC-04] 일괄 저장 중 한 파일이 실패하면 닫기는 진행되지 않고 실패 목록이 남는다(UX-E-19 · ED-16 · FR-206, rev.1 E-C2 닫힘) |
| FP-E210 | Edge Case | 일괄 → [모두 폐기] |
제시 중 | 모두 폐기 | 종료 진행 · 버퍼 전부 해제 | 부분 — [AC-03][AC-09] 워크스페이스 닫기 시 실행 중 세션이 나열되고 계속을 고른 경우에만 전부 종료된다("모두 폐기하고 계속" 경로, dirty 0 전제 — dirty 버퍼 폐기 자체는 미확인) → E-I9 |
| FP-E211 | Edge Case | 일괄 → [취소] |
제시 중 | 취소 | 종료 취소 · 상태 유지 | 커버 — 위 E-C1 시나리오의 "취소" 단계(세션 유지, rev.1 E-N9 닫힘) |
| FP-E212 | Empty State | dirty 0 인 상태의 워크스페이스 닫기 · 앱 종료 | clean | 닫기 | 다이얼로그 없이 진행 | 미커버 → E-N10 — 규칙 확정(ux-spec §4.2 "둘 다 없으면 다이얼로그 없이 진행") · 시나리오 없음 |
| FP-E213 | Edge Case | 워크스페이스 닫기 vs 앱 종료 — 같은 다이얼로그, 다른 후속(Flow 7) | — | 각각 | 후속 순서 규칙 없음 | 부분 — 규칙 확정(UX-E-26 · ED-16 6단계) · 순서 자체의 시나리오 없음 → E-I29(권고 R-9) |
S-E03 검색 패널
| ID | Category | Scenario | Precondition | Action | Expected Result | Covered? |
|---|---|---|---|---|---|---|
| FP-E301 | Happy Path | 문자열 검색 | 일치 2파일 | Enter | 파일 · 행 결과 | 커버 — [AC-06] 문자열 검색 결과가 파일 · 행 단위로 표시된다 |
| FP-E302 | Happy Path | 정규식 검색 | [.*] on |
Enter | 일치 행 | 커버 — [AC-06] 정규식 검색이 동작한다 |
| FP-E303 | Error State | 정규식 문법 오류 | endpoint( |
Enter | 미실행 + 인라인 오류 | 커버 — [AC-06] 정규식 문법 오류는 검색을 실행하지 않고 오류를 표시한다 |
| FP-E304 | Empty State | 빈 검색어(또는 공백만) Enter | 입력 비움 | Enter | 규칙 없음(미실행? 전체 목록?) | 커버 — [AC-06] 빈 검색어는 검색을 실행하지 않는다(UX-E-11, rev.1 E-I10 닫힘) |
| FP-E305 | Empty State | 결과 0 | 불일치 검색어 | Enter | EmptyState.compact(ux-spec §8 ⓖ) |
커버 — [AC-06] 일치가 없으면 빈 상태와 검색어 지우기 동작이 표시된다(rev.1 E-I11 닫힘) |
| FP-E306 | Edge Case | 대소문자 토글 on/off(UX-E-06) | [Aa] |
Enter | 민감/무시 결과 차이 | 미커버 → E-N11 |
| FP-E307 | Edge Case | 한글 조합 중 Enter — I2(조합 중 트리거 금지) | 조합 중 | Enter | 조합 확정만, 검색 미실행 | 미커버(상위 cocode/AC-16 · UX-D-18 I2 소관) → E-N12 |
| FP-E308 | Edge Case | 매우 긴 검색어 · 대량 결과 | — | Enter | 상한 없음(원칙) — CocodeVirtualList 로 표시 |
미커버 → E-N13 |
| FP-E309 | Happy Path | 결과 선택 → 에디터 이동 | 결과 표시 | 행 선택 | 탭 열림 · 커서 이동 · 포커스는 패널(K2) | 커버 — [AC-06] 결과를 선택하면 그 위치가 에디터에 열린다(포커스 잔류는 미확인) |
| FP-E310 | Error State | 결과 선택 시 파일이 그 사이 삭제됨 | 결과 stale | 행 선택 | UX-E-12 «삭제됨» + Alert.destructive, 탭을 열지 않는다 |
커버(#338) — Feature 3 «그 사이 사라진 파일의 결과 행은 …» + 위젯 테스트 3건 |
| FP-E311 | Edge Case | git 무시 파일 제외 | .gitignore |
Enter | build/ 미포함 |
커버 — [AC-06] git 이 무시하는 파일은 검색되지 않는다 |
| FP-E312 | Concurrency | 검색 중 [중지] |
스트리밍 중 | 중지 | 취소 토큰(ED §4.4) · 부분 결과 유지 여부 규칙 없음 | 커버 — [AC-06] 검색을 중지하면 그때까지의 부분 결과가 유지된다(rev.1 E-I13 닫힘) |
| FP-E313 | Concurrency | 검색 중 파일 변경 → stale 위치 | 스트리밍 중 | 파일 편집 | 결과 행의 위치 어긋남 처리 규칙 없음 | 미커버 → E-N14 |
| FP-E314 | Happy Path | 치환 → 사람 편집 · 스냅샷 없음 | 결과 표시 | 모두 바꾸기 + 저장 | 디스크 반영 · EditSnapshot 수 불변 | 커버 — [AC-06][C-03] 치환은 사람 편집으로 적용되고 EditSnapshot 을 만들지 않는다 |
| FP-E315 | Edge Case | 치환 대상이 dirty 버퍼(디스크 ≠ 버퍼) | dirty | 모두 바꾸기 | 버퍼 내용 기준 적용(UX-E-14) — 결과 목록은 어느 파일을 열지만 정한다 | 커버(#339) — Feature 3 «dirty 버퍼의 치환은 버퍼 내용 기준이다» + 단위 테스트 4건 |
| FP-E316 | Error State | 치환 저장 중 일부 파일 실패 | 한 파일 쓰기 불가 | 모두 바꾸기 | 부분 적용 상태 표시 규칙 없음 | 커버 — [AC-06][AC-23] 치환 저장이 일부 파일에서 실패하면 실패 목록이 표시되고 성공분은 유지된다(UX-E-14, rev.1 E-I15 닫힘) |
| FP-E317 | Edge Case | 정규식 치환의 캡처 그룹($1) 지원 여부 |
[.*] on |
모두 바꾸기 | 규칙 없음 | 미커버 → E-N15 |
| FP-E318 | Edge Case | 바이너리 파일 검색 포함 여부 | 바이너리 존재 | Enter | U-12 | 미커버 → E-I3 (U-12) |
S-E04 문제 패널
| ID | Category | Scenario | Precondition | Action | Expected Result | Covered? |
|---|---|---|---|---|---|---|
| FP-E401 | Happy Path | 시맨틱 토큰 색상 | 서버 실행 중 | 편집 | 역할 색상 | 커버 — [AC-07] Dart 파일을 편집하면 언어 서버의 시맨틱 토큰이 색상에 반영된다 |
| FP-E402 | Happy Path | 진단 목록 + 거터 | 서버 실행 중 | 오류 입력 | 목록 · 거터 | 커버 — [AC-07] 진단이 문제 목록과 거터에 표시된다 |
| FP-E403 | Edge Case | 진단은 ④ 입력 아님 | — | ④ 실행 | 미사용 | 커버 — [AC-07][상위 C5] 진단은 자가 검증 ④ 의 입력이 아니다 |
| FP-E404 | Error State | 서버 부재 | dart 없음 |
열기 · 편집 | 상태 표시 · 편집 계속 | 커버 — [AC-07][AC-23] 언어 서버 실행 파일이 없으면 상태가 표시되고 편집은 계속된다 |
| FP-E405 | Error State | 서버 비정상 종료 | 실행 중 | 종료 | 코드 표시 · 편집 계속 | 커버 — [AC-07][AC-23] 언어 서버가 종료되면 종료 코드가 표시되고 편집은 계속된다 |
| FP-E406 | Happy Path | [다시 시작] → 재기동 성공 |
종료됨 | 다시 시작 | 실행 중 · 진단 재수신 | 커버 — [AC-07] 언어 서버 다시 시작이 성공하면 상태가 실행 중으로 바뀌고 진단은 새 서버의 것으로 교체된다(FR-406 v1.1, rev.1 E-I16 닫힘) |
| FP-E407 | Error State | [다시 시작] → 실패(부재 · 즉시 종료) |
종료됨 | 다시 시작 | 부재/종료 상태 + 사유 | 커버 — [AC-07][AC-23] 언어 서버 다시 시작이 실패하면 사유가 같은 자리에 표시되고 편집은 계속된다(rev.1 E-I16 닫힘) |
| FP-E408 | Empty State | 진단 0 | 실행 중 | — | EmptyState.compact(ux-spec §8 ⓗ) · 배지 없음 |
커버 — [AC-07] 진단이 없으면 문제 패널은 빈 상태를 그리고 동작은 제시하지 않는다(UX-E-17, rev.1 E-I17 닫힘) |
| FP-E409 | Happy Path | 진단 항목 선택 → 에디터 이동 | 목록 | 선택 | 파일 · 행 이동 | 미커버 → E-N16 |
| FP-E410 | Edge Case | 닫힌 파일 · 열지 않은 파일에 대한 진단(워크스페이스 범위 publishDiagnostics) |
서버 실행 중 | 다른 파일 오류 | 표시 여부 · 파일 닫을 때 제거 여부 규칙 없음 | 미커버 → E-I18 — 규칙 확정(UX-E-22 열림 여부 무관 전부 표시 · 서버 빈 목록으로만 제거) · 시나리오 없음(권고 R-5) |
| FP-E411 | Concurrency | 서버 재시작 중 도착한 진단 | 재시작 중 | 진단 도착 | 폐기/유지 규칙 없음 | 커버 — 위 재시작 성공 시나리오 "목록은 새 서버가 보낸 진단으로 교체된다"(UX-E-22, rev.1 E-N17 닫힘) |
| FP-E412 | Edge Case | 탭 배지 = 오류 + 경고(정보 제외, UX-E-08) | 진단 혼합 | — | 배지 수 | 미커버 → E-N18 |
| FP-E413 | Happy Path | 비-Dart 4종 구문 강조 | — | 열기 | 언어별 강조 | 커버 — [AC-07][C-02] Dart 이외 파일에는 파일 이름 또는 확장자에 대응하는 구문 강조가 적용된다(Outline 4행) |
| FP-E414 | Edge Case | 비-Dart 서버 미요구 | SQL 서버 없음 | 열기 | 상태 줄 무표시 | 커버 — [AC-07][C-02] Dart 이외 파일에는 언어 서버 연결이 요구되지 않는다 |
| FP-E415 | Edge Case | Dockerfile 파일 이름 매핑 |
— | 열기 | Dockerfile 강조 | 커버 — 위 Outline backend/Dockerfile 행 |
| FP-E416 | Edge Case | 대량 진단(가상 목록) | 파일 다수 오류 | — | CocodeVirtualList 스크롤 |
미커버 → E-N19 |
S-E05 세션 탭 바 + 터미널
| ID | Category | Scenario | Precondition | Action | Expected Result | Covered? |
|---|---|---|---|---|---|---|
| FP-E501 | Happy Path | 새 터미널 = 런처 티켓 + PTY | — | [+] |
pty · 화이트리스트 환경 |
커버 — [AC-09][C-05] 새 터미널은 단일 런처를 거쳐 PTY 로 기동된다 |
| FP-E502 | Edge Case | 로그인 셸 PATH 복원 | 프로필 존재 | which flutter |
경로 표시 | 커버 — [AC-09] 명령 셸은 로그인 셸로 기동되어 프로필의 PATH 를 갖는다 |
| FP-E503 | Happy Path | resize 전달 | running | 크기 변경 | rows · cols 반영 | 커버 — [AC-09] 뷰 크기 변경이 프로세스에 전달된다 |
| FP-E504 | Happy Path | 키 입력 전달 | 프로그램 실행 | r |
stdin 수신 | 커버 — [AC-09] 키 입력이 실행 중인 프로세스에 그대로 전달된다 |
| FP-E505 | Happy Path | 세션 둘 이상 · 개별 종료 | T1 | [+] · T1 종료 |
T1 exited · T2 running | 커버 — [AC-09] 세션을 둘 이상 열고 각각 개별로 종료한다 |
| FP-E506 | Edge Case | exited 출력 유지 | exited | 닫지 않음 | 출력 유지 | 커버 — [AC-09] 종료된 세션의 출력은 닫기 전까지 남는다 |
| FP-E507 | Error State | scrollback 상한 초과 | 상한 L(U-2) | 대량 출력 | 오래된 줄 폐기 | 커버 — [AC-09] scrollback 이 상한을 넘으면 오래된 줄부터 버려진다 |
| FP-E508 | Edge Case | IME 분리 판정 | running | 프로브 | 상위 cocode/AC-16 기록 | 커버 — [AC-09][C-04] 한글 IME 판정은 상위 cocode/AC-16 재생 워크플로가 담당한다 |
| FP-E509 | Error State | PTY 생성 실패 | 장치 불가 | [+] |
Alert 사유 | 커버 — [AC-09][AC-23] PTY 생성에 실패하면 세션 자리에 사유가 표시된다 |
| FP-E510 | Empty State | 세션 0 | — | 터미널 탭 열기 | EmptyState.compact + [새 터미널](ux-spec §8 ⓕ) |
커버 — [AC-09] 세션이 없으면 빈 상태와 새 터미널 동작이 표시된다(rev.1 E-I19 닫힘) |
| FP-E511 | Edge Case | running 세션 탭의 × |
running | × | 규칙 없음 — 확인 없이 kill 이면 파괴적 동작의 무확인 실행(K4 취지) | 커버 — [AC-09] 실행 중 세션의 탭 닫기는 비활성이고 명시적 종료를 거쳐야 닫힌다(UX-E-20 · FR-606, rev.1 E-C3 닫힘) |
| FP-E512 | Edge Case | exited 세션 [닫기] → 탭 제거 |
exited | 닫기 | 제거 · 출력 소멸 | 커버 — 위 E-C3 시나리오 후단 "세션 탭과 출력이 사라진다"(rev.1 E-N20 닫힘) |
| FP-E513 | Concurrency | 출력 버스트 중 종료 | 대량 출력 중 | 종료 | 잔여 출력 · 종료 코드 표시 순서 규칙 없음 | 미커버 → E-N21 |
| FP-E514 | Edge Case | Windows 셸 선택 | Windows | [+] |
U-13 | 미커버 → E-N32(신설) — 규칙 확정(ED-11 pwsh → powershell → %COMSPEC%, U-13 닫힘) · 시나리오 없음 |
| FP-E515 | Edge Case | 세션 다수 탭 오버플로 | 세션 많음 | [+] 반복 |
상한 없음 · 오버플로 표시 | 미커버 → E-N22 |
| FP-E516 | Error State | 앱 종료 시 running 세션(사용자 셸 · 실행 구성 프로세스) | running | 앱 종료 | 규칙 없음 — 고아 프로세스 방치 또는 무확인 강제 종료 | 부분 — 규칙 확정(UX-E-18 · ED-16 ①로 라우팅, 강제 종료 경로 없음 · FR-206) · 시나리오는 워크스페이스 닫기 변형뿐 → E-C1 닫힘, 앱 종료 · 창 닫기 변형은 권고 R-1 |
| FP-E517 | Edge Case | 실행 구성 세션 [다시 실행](UX-E-09) |
exited | 다시 실행 | 새 세션인지 같은 탭 재사용인지 규칙 없음 | 커버 — [AC-08] 종료된 실행 구성 세션의 다시 실행은 같은 탭에서 새 세션을 만든다(UX-E-23, rev.1 E-I20 닫힘) |
| FP-E518 | Error State | 셸이 즉시 종료(잘못된 $SHELL · 프로필 오류) |
— | [+] |
exited(code) 로 남는지 Alert 인지 규칙 없음 | 커버 — [AC-09][AC-23] 셸이 기동 직후 종료되면 세션은 종료 코드와 함께 exited 로 남는다(UX-E-21, rev.1 E-I21 닫힘) |
| FP-E519 | Error State | 워크스페이스 닫기 시 running 세션 | running | 닫기 | E-C1 과 같은 규칙 필요 | 커버 — [AC-03][AC-09] 워크스페이스 닫기 시 실행 중 세션이 나열되고 계속을 고른 경우에만 전부 종료된다(UX-E-18 · ED-16 · FR-206, rev.1 E-C1 닫힘) |
S-E06 실행 구성
| ID | Category | Scenario | Precondition | Action | Expected Result | Covered? |
|---|---|---|---|---|---|---|
| FP-E601 | Edge Case | 설치 직후 템플릿 3종 + custom | 구성 0 | 목록 열기 | 비어 있지 않은 4건 | 커버 — [AC-08] 설치 직후 기본 템플릿 3종이 비어 있지 않은 채 제공된다 |
| FP-E602 | Edge Case | 단일 프로젝트 워크스페이스 | Flutter 앱 1 | 목록 열기 | flutterRun 1건 | 커버 — [AC-08] 단일 프로젝트 워크스페이스에서도 flutterRun 템플릿이 제공된다 |
| FP-E603 | Empty State | 프로젝트 디렉터리 0 | pubspec 없음 | 목록 열기 | EmptyState.compact(ux-spec §8 ⓘ) |
커버 — [AC-08] 프로젝트 디렉터리가 없으면 빈 상태와 JSON 열기 동작이 표시된다(rev.1 E-I22 닫힘) |
| FP-E604 | Edge Case | 같은 종류 디렉터리 여럿(서버 5) | 서버 5 | 목록 열기 | 디렉터리마다 템플릿(FR-503) | 미커버 → E-N23 |
| FP-E605 | Happy Path | 실행 → origin 세션 | 전제 충족 | 실행 | humanTerminal 기동 · origin 표시 · 출력 | 커버 — [AC-08] 실행 구성을 실행하면 단일 런처가 기동하고 origin 세션에 출력이 표시된다 |
| FP-E606 | Happy Path | [중지] 한 번 |
running | 중지 | exited(code) | 커버 — [AC-08] 세션의 중지 한 번으로 프로세스가 종료된다 |
| FP-E607 | Error State | 전제 미충족(실행 파일 부재) | serverpod 없음 | 실행 | 세션 없음 · 사유 | 커버 — [AC-08] 실행 전제가 미충족이면 세션을 만들지 않고 사유를 표시한다 |
| FP-E608 | Error State | 3.x → 대안 안내 | 3.x | 실행 | 사유 + 3.x 템플릿 안내(UX-E-14) | 커버 — [AC-08] serverpod CLI 가 3.x 면 사유와 함께 3.x 대체 템플릿을 안내한다 |
| FP-E609 | Error State | 기동 실패(권한) | 실행 불가 | 실행 | 세션에 오류 · exited | 커버 — [AC-08][AC-23] 기동 실패는 세션에 오류로 표시된다 |
| FP-E610 | Edge Case | flutterRun 디바이스 미지정 → 선택 요구(PRD §2.5) | <device> 비움 |
실행 | 디바이스 선택 UI 흐름 규칙 없음(선택 후 재실행? 취소?) | 커버 — [AC-08] flutterRun 이 디바이스 미지정이면 디바이스 목록에서 선택한 뒤 실행된다 + [AC-08] 디바이스 선택을 취소하면 실행되지 않는다(UX-E-32 · FR-505, rev.1 E-I23 닫힘) |
| FP-E611 | Error State | working_dir 소실(저장 뒤 디렉터리 삭제) | 구성 존재 | 실행 | 불변식 (1) 런타임 위반 — 거부 + 사유 규칙 없음 | 커버 — [AC-08] working_dir 이 사라진 구성은 실행이 거부되고 사유가 표시된다(UX-E-33 · FR-505, rev.1 E-I24 닫힘) |
| FP-E612 | Error State | run_configurations.json 손상 |
파싱 실패 | 목록 열기 | 규칙 없음(무시? 오류 표시? 재생성?) | 커버 — [AC-08][AC-23] 실행 구성 파일이 손상되면 목록은 비고 오류가 표시되며 파일은 재생성되지 않는다(ED-17 · UX-E-33 · FR-501, rev.1 E-I25 닫힘) |
| FP-E613 | Concurrency | 같은 구성을 두 번 실행 | running | 실행 | 두 세션인지 거부인지 규칙 없음 | 커버 — [AC-08] 같은 구성을 두 번 실행하면 두 번째 세션 이름에 순번이 붙는다(UX-E-24, rev.1 E-I26 닫힘) |
| FP-E614 | Edge Case | 중지 후 미종료 → SIGKILL 대기 | SIGTERM 무시 | 중지 | 대기 값 미정(architecture §10-1) | 미커버 → E-N24 — 계약은 확정(ED-15 terminate({grace})) · grace 값은 여전히 미정(ux-spec §10 · architecture §10) |
| FP-E615 | Edge Case | JSON 편집 저장 → 목록 갱신(UX-E-15) | 파일 열림 | 저장 | 목록 다시 읽기 | 미커버 → E-N25 |
| FP-E616 | Edge Case | 진입점 3개 동등(UX-E-13) | — | 메뉴/팔레트/탭바 | 같은 결과 | 미커버 → E-N26 |
| FP-E617 | Edge Case | pubspec.yaml 변경 → 판정 캐시 무효화 |
캐시 | pubspec 편집 | 목록 갱신(ED §4.5) | 미커버 → E-N27 |
S-E07 작업 대상 배너 · 상위 의존
| ID | Category | Scenario | Precondition | Action | Expected Result | Covered? |
|---|---|---|---|---|---|---|
| FP-E701 | Happy Path | 작업 대상 → 배너 · 저장 비차단 | 스냅샷 S1 | 편집 · 저장 | 배너 · 저장 성공 | 커버 — [AC-10] 작업 대상 파일을 열면 표시되고 저장은 차단되지 않는다 |
| FP-E702 | Edge Case | 사람 저장 → 스냅샷 없음 · 리스 없음 | 스냅샷 N | 저장 | N 불변 | 커버 — [AC-10][AC-13] 사람 저장은 EditSnapshot 을 만들지 않는다 |
| FP-E703 | Error State | 체인 불연속 → 충돌 | S1 → 사람 → S2 | 롤백 | 자동 적용 없음 · 충돌 | 커버(판정 보류 U-9) — [AC-22] 사람 편집 뒤 작업이 다시 편집하면 체인 불연속이 생기고 롤백은 충돌로 제시된다 |
| FP-E704 | Edge Case | 연속 체인 → 충돌 없음 | S2.base = S1.result | 롤백 | 기존 규칙 | 커버(판정 보류 U-9) — [AC-22] 사람 편집이 없으면 체인은 연속이고 롤백은 기존 규칙대로 동작한다 |
| FP-E705 | Edge Case | 작업 대상 아님 → 배너 없음 | 스냅샷 없음 | 열기 | 배너 없음 | 미커버 → E-N28 |
| FP-E706 | Edge Case | 파일이 열린 채 작업이 종결(완료 · 실패 · 롤백됨) | 배너 표시 중 | 상태 전이 | 배너 제거/갱신 규칙 없음 | 커버 — [AC-10] 작업이 종결되면 배너가 제거된다(UX-E-27, rev.1 E-I27 닫힘) |
| FP-E707 | Edge Case | 배너 닫기 → 세션 내 재표시 없음(UX-E-11) | 표시 중 | 닫기 · 재열기 | 재표시 없음 | 미커버 → E-N29 |
| FP-E708 | Concurrency | 두 작업이 같은 파일(상위 AC-12 로 순차) | 작업 A 스냅샷, B 대기 | 열기 | 배너에 어느 작업(들)을 표시하는지 규칙 없음 | 커버 — [AC-10] 두 작업이 같은 파일을 편집하면 표시에 둘 다 나열된다(UX-E-25, rev.1 E-I28 닫힘) |
| FP-E709 | Edge Case | D-013 미확정 상태의 롤백 | 상위 현행 규칙 | 롤백 | 사람 편집 소멸 가능(PRD §4 흐름 6) | 외부 — E-C4(상위 결정) |
| FP-E710 | Edge Case | D-018 미확정 → 기존 폴더 열기 불가 | — | 흐름 1 진입 | 새로 생성한 워크스페이스에서만 동작 | 외부 — E-C5(상위 결정) |
교차(Flow 7) — 닫기 · 종료 · 포커스
| ID | Category | Scenario | Precondition | Action | Expected Result | Covered? |
|---|---|---|---|---|---|---|
| FP-E801 | Edge Case | 워크스페이스 닫기 순서 — dirty 처분 → 검색 취소 → 언어 서버 종료 → 세션 처분 | 전부 활성 | 닫기 | 순서 · 각 단계 취소 시 되돌림 규칙 없음 | 부분 — 규칙 확정(UX-E-26 · ED-16 6단계 · 취소는 ①뿐) · E-C1 시나리오가 취소 지점과 결과(고아 0)만 확인 → E-I29(권고 R-9) |
| FP-E802 | Error State | 언어 서버 running 중 워크스페이스 닫기 | 서버 실행 | 닫기 | 프로세스 종료 보장 규칙 없음(고아) | 커버 — 위 E-C1 시나리오 "앱이 소유한 자식 프로세스는 남아 있지 않다"(ED-16 ③ 언어 서버 무조건 종료, rev.1 E-C1 닫힘) |
| FP-E803 | Edge Case | K2 포커스 순환에 [검색] · 세션 탭 바 포함 |
— | 순환 키 | 좌 → 중 → 우 → 하단 | 미커버 → E-N30 |
| FP-E804 | Edge Case | K1 — 새 1급 동작 전부 팔레트 등재 | — | 팔레트 | CocodePaletteCoverage 통과 |
미커버(가드 테스트로 대체) → E-N31 |
| FP-E805 | Permission | git 저장소이지만 .git 읽기 권한 없음 |
— | 펼침 | git 판정 실패 시 후퇴 규칙 없음(E-I1 과 동근원) | 부분 — 규칙 확정(ED-06a .git 읽기 불가 포함) · 시나리오는 git 실행 파일 부재 변형만 → E-I1 잔여 분기(권고 R-10) |
Missing Coverage (Gaps) — rev.1 재판정 반영
판정 기준: 닫힘 = 규칙이 ux-spec/architecture/PRD 에 확정되고 bdd v1.1 에 대응 시나리오가 있다. 규칙만 = 규칙은 확정, 시나리오 없음. 열림 = 규칙 없음. 시나리오 제목은
docs/bdd-fullstack-code-editor.mdv1.1 문면 그대로.
Critical
| ID | 규칙 | 시나리오 | 판정 |
|---|---|---|---|
| E-C1 | UX-E-18 · ED-16(6단계 · 고아 0 · 창 닫기 → ① 라우팅) · FR-206 | [AC-03][AC-09] 워크스페이스 닫기 시 실행 중 세션이 나열되고 계속을 고른 경우에만 전부 종료된다 |
닫힘 — 앱 종료 · 창 닫기 변형 시나리오는 없음(권고 R-1) |
| E-C2 | UX-E-19 · ED-16 · FR-206 | [AC-03][AC-04] 일괄 저장 중 한 파일이 실패하면 닫기는 진행되지 않고 실패 목록이 남는다 |
닫힘 |
| E-C3 | UX-E-20 · FR-606 | [AC-09] 실행 중 세션의 탭 닫기는 비활성이고 명시적 종료를 거쳐야 닫힌다 |
닫힘 |
| E-C4 · E-C5 | 상위 D-013 · D-018 | — | 열림(외부 의존 — 변동 없음, 이 문서가 닫을 수 없다) |
Important — 29건: 닫힘 19 · 규칙만/부분 9 · 열림(규칙) 1
| ID | 규칙 | 시나리오 | 판정 |
|---|---|---|---|
| E-I1 | ED-06a · FR-302 | [AC-01] git 저장소인데 git 실행 파일이 없으면 파일 규칙으로 후퇴하고 판정 불가가 표시된다 |
닫힘(.git 읽기 불가 변형은 권고 R-10) |
| E-I2 | UX-E-04 | [AC-01] 읽기 권한이 없는 파일을 열면 탭은 열리되 본문에 사유가 표시되고 편집할 수 없다 |
닫힘 |
| E-I3 | U-12 미정 | 없음 | 열림(규칙) — Breakdown 이관 |
| E-I4 | UX-E-08 | 없음 | 규칙만(권고 R-6) |
| E-I5 | ux-spec §4.1(재클릭 무재읽기) | 없음 | 규칙만(권고 R-7) |
| E-I6 | UX-E-05 | [AC-03] 활성 탭을 닫으면 직전에 활성이었던 탭이 활성이 된다 |
닫힘(왼쪽 이웃 분기는 권고 R-10) |
| E-I7 | ED-14 | 없음 | 규칙만(권고 R-8) |
| E-I8 | FR-206 · AC-23 | Outline [AC-03] dirty 탭 닫기의 세 선택은 각각 정해진 결과를 낳는다 — 저장 성공 · 폐기 · 취소 |
부분 — 저장 실패 행 없음(필수 R-0) |
| E-I9 | UX-E-18/19 | E-C1 시나리오("모두 폐기하고 계속", dirty 0) | 부분 — 모두 저장 전부 성공 → 진행 없음(권고 R-2) |
| E-I10 | UX-E-11 | [AC-06] 빈 검색어는 검색을 실행하지 않는다 |
닫힘 |
| E-I11 | ux-spec §8 ⓖ · UX-D-31 | [AC-06] 일치가 없으면 빈 상태와 검색어 지우기 동작이 표시된다 |
닫힘 |
| E-I12 | UX-E-12 | Feature 3 «그 사이 사라진 파일의 결과 행은 «삭제됨» 으로 표시되고 열리지 않는다» | 해소(#338) — R-3 권고를 시나리오로 승격 |
| E-I13 | architecture §4.4 | [AC-06] 검색을 중지하면 그때까지의 부분 결과가 유지된다 |
닫힘 |
| E-I14 | UX-E-14 | Feature 3 «dirty 버퍼의 치환은 버퍼 내용 기준이다» | 해소(#339) — R-4 권고를 시나리오로 승격 |
| E-I15 | UX-E-14 | [AC-06][AC-23] 치환 저장이 일부 파일에서 실패하면 실패 목록이 표시되고 성공분은 유지된다 |
닫힘 |
| E-I16 | FR-406 v1.1 · ED-10 | [AC-07] 언어 서버 다시 시작이 성공하면 상태가 실행 중으로 바뀌고 진단은 새 서버의 것으로 교체된다 · [AC-07][AC-23] 언어 서버 다시 시작이 실패하면 사유가 같은 자리에 표시되고 편집은 계속된다 |
닫힘 |
| E-I17 | UX-E-17 | [AC-07] 진단이 없으면 문제 패널은 빈 상태를 그리고 동작은 제시하지 않는다 |
닫힘 |
| E-I18 | UX-E-22 | 없음(재시작 교체만 위 시나리오) | 규칙만(권고 R-5) |
| E-I19 | ux-spec §8 ⓕ | [AC-09] 세션이 없으면 빈 상태와 새 터미널 동작이 표시된다 |
닫힘 |
| E-I20 | UX-E-23 | [AC-08] 종료된 실행 구성 세션의 다시 실행은 같은 탭에서 새 세션을 만든다 |
닫힘 |
| E-I21 | UX-E-21 | [AC-09][AC-23] 셸이 기동 직후 종료되면 세션은 종료 코드와 함께 exited 로 남는다 |
닫힘 |
| E-I22 | ux-spec §8 ⓘ | [AC-08] 프로젝트 디렉터리가 없으면 빈 상태와 JSON 열기 동작이 표시된다 |
닫힘 |
| E-I23 | UX-E-32 · FR-505 | [AC-08] flutterRun 이 디바이스 미지정이면 디바이스 목록에서 선택한 뒤 실행된다 · [AC-08] 디바이스 선택을 취소하면 실행되지 않는다 |
닫힘 |
| E-I24 | UX-E-33 · FR-505 | [AC-08] working_dir 이 사라진 구성은 실행이 거부되고 사유가 표시된다 |
닫힘 |
| E-I25 | ED-17 · UX-E-33 · FR-501 | [AC-08][AC-23] 실행 구성 파일이 손상되면 목록은 비고 오류가 표시되며 파일은 재생성되지 않는다 |
닫힘 |
| E-I26 | UX-E-24 | [AC-08] 같은 구성을 두 번 실행하면 두 번째 세션 이름에 순번이 붙는다 |
닫힘 |
| E-I27 | UX-E-27 | [AC-10] 작업이 종결되면 배너가 제거된다 |
닫힘 |
| E-I28 | UX-E-25 | [AC-10] 두 작업이 같은 파일을 편집하면 표시에 둘 다 나열된다 |
닫힘 |
| E-I29 | UX-E-26 · ED-16 | E-C1 시나리오(취소 지점 · 고아 0 결과만) | 규칙만(권고 R-9) |
Nice-to-have — 변동분만
- 닫힘 4: E-N8(Outline 취소 행) · E-N9(E-C1 시나리오의 취소 단계) · E-N17(UX-E-22 + 재시작 성공 시나리오) · E-N20(E-C3 시나리오 후단).
- 규칙만 확정(시나리오 없음): E-N7(UX-E-04
Loading) · E-N10(둘 다 없으면 다이얼로그 없이 진행) · E-N28/E-N29(UX-E-28) · E-N32(신설) Windows 셸 순서 ED-11(U-13 닫힘, FP-E514). - 값 미정 유지: E-N24
terminategrace 값(ux-spec §10 · architecture §10). - 나머지 E-N1~6 · 11~16 · 18~19 · 21~23 · 25~27 · 30~31 은 변동 없음(rev.0 목록 그대로).
BDD Scenario Recommendations — rev.1 대응표
Must Have 1~12 (rev.0 요구 → bdd v1.1 대응)
| # | rev.0 요구 | FP / GAP | 대응 시나리오(bdd v1.1) | 판정 |
|---|---|---|---|---|
| 1 | 일괄 저장 일부 실패 → 종료 취소 | FP-E209 / E-C2 | [AC-03][AC-04] 일괄 저장 중 한 파일이 실패하면 닫기는 진행되지 않고 실패 목록이 남는다 |
대응 |
| 2 | 종료 시 running 세션 처분 · 고아 0 | FP-E516 · E519 · E802 / E-C1 | [AC-03][AC-09] 워크스페이스 닫기 시 실행 중 세션이 나열되고 계속을 고른 경우에만 전부 종료된다 |
대응(앱 종료 변형 권고 R-1) |
| 3 | running 세션 탭 닫기 무확인 kill 금지 | FP-E511 / E-C3 | [AC-09] 실행 중 세션의 탭 닫기는 비활성이고 명시적 종료를 거쳐야 닫힌다 |
대응 |
| 4 | 단일 처분 저장 · 폐기 · 취소 결과 | FP-E202~E204 / E-I8 | Outline [AC-03] dirty 탭 닫기의 세 선택은 각각 정해진 결과를 낳는다 |
부분 — 저장 실패 행(FP-E203) 없음 → 필수 R-0 |
| 5 | 파일 읽기 권한 없음 | FP-E109 / E-I2 | [AC-01] 읽기 권한이 없는 파일을 열면 탭은 열리되 본문에 사유가 표시되고 편집할 수 없다 |
대응 |
| 6 | 결과 0 빈 상태 · 빈 검색어 | FP-E305 · E304 / E-I11 · E-I10 | [AC-06] 일치가 없으면 빈 상태와 검색어 지우기 동작이 표시된다 · [AC-06] 빈 검색어는 검색을 실행하지 않는다 |
대응 |
| 7 | 언어 서버 다시 시작 성공 · 실패 | FP-E406 · E407 / E-I16 | [AC-07] 언어 서버 다시 시작이 성공하면 상태가 실행 중으로 바뀌고 진단은 새 서버의 것으로 교체된다 · [AC-07][AC-23] 언어 서버 다시 시작이 실패하면 사유가 같은 자리에 표시되고 편집은 계속된다 |
대응 |
| 8 | JSON 손상 · working_dir 소실 | FP-E611 · E612 / E-I24 · E-I25 | [AC-08] working_dir 이 사라진 구성은 실행이 거부되고 사유가 표시된다 · [AC-08][AC-23] 실행 구성 파일이 손상되면 목록은 비고 오류가 표시되며 파일은 재생성되지 않는다 |
대응 |
| 9 | flutterRun 디바이스 선택 | FP-E610 / E-I23 | [AC-08] flutterRun 이 디바이스 미지정이면 디바이스 목록에서 선택한 뒤 실행된다 · [AC-08] 디바이스 선택을 취소하면 실행되지 않는다 |
대응 |
| 10 | git 실행 파일 부재 후퇴 | FP-E107 / E-I1 | [AC-01] git 저장소인데 git 실행 파일이 없으면 파일 규칙으로 후퇴하고 판정 불가가 표시된다 |
대응 |
| 11 | 빈 상태 3종(세션 0 · 진단 0 · 프로젝트 0) | FP-E510 · E408 · E603 / E-I19 · E-I17 · E-I22 | [AC-09] 세션이 없으면 빈 상태와 새 터미널 동작이 표시된다 · [AC-07] 진단이 없으면 문제 패널은 빈 상태를 그리고 동작은 제시하지 않는다 · [AC-08] 프로젝트 디렉터리가 없으면 빈 상태와 JSON 열기 동작이 표시된다 |
대응 |
| 12 | 작업 종결 시 배너 갱신 | FP-E706 / E-I27 | [AC-10] 작업이 종결되면 배너가 제거된다 |
대응 |
Should Have 1~8
| # | rev.0 요구 | FP | 대응 시나리오(bdd v1.1) | 판정 |
|---|---|---|---|---|
| 1 | 활성 탭 재클릭 무재읽기 | FP-E114 | 없음 | 권고 R-7 |
| 2 | 저장 중 외부 변경 — 해시 대조 | FP-E124 | 없음 | 권고 R-8 |
| 3 | 검색 중지 · 부분 결과 유지 | FP-E312 | [AC-06] 검색을 중지하면 그때까지의 부분 결과가 유지된다 |
대응 |
| 4 | dirty 버퍼 치환 = 버퍼 기준 | FP-E315 | Feature 3 «dirty 버퍼의 치환은 버퍼 내용 기준이다»(#339) | 반영 |
| 5 | 동종 디렉터리마다 템플릿 1건 | FP-E604 | 없음 | 권고 R-11 |
| 6 | pubspec 변경 후 목록 갱신 | FP-E617 | 없음 | 권고 R-11 |
| 7 | 배너 없음 · 닫은 뒤 재표시 없음 | FP-E705 · E707 | 없음 | 권고 R-11 |
| 8 | 배지 = 오류 + 경고 | FP-E412 | 없음 | 권고 R-11 |
"규칙 확정 없이 시나리오를 쓰지 말 것" 6건의 현황
E-I6 → UX-E-05 · E-I18 → UX-E-22 · E-I20 → UX-E-23 · E-I26 → UX-E-24 · E-I28 → UX-E-25 · E-I29 → UX-E-26/ED-16 — 6건 전부 규칙 확정. 시나리오는 E-I6 · I20 · I26 · I28 작성됨, E-I18 · I29 는 미작성(권고 R-5 · R-9). 유보 조건은 해제됐다.
rev.1 추가 요구 시나리오
| ID | 구분 | 대상 | 한 줄 사유 |
|---|---|---|---|
| R-0 | 필수 | FP-E203 / E-I8 — 단일 처분 [저장] 이 실패하면 탭 · 버퍼가 유지되고 사유가 표시된다 |
다이얼로그 발 저장 실패 뒤 탭이 닫히면 처분 없는 소멸(Seed 불변식 2) — E-C2 의 단일 변형만 빠져 있다 |
| R-1 | 권고 | FP-E516 / E-C1 — 앱 종료 · OS 창 닫기 변형 | ED-16 "강제 종료 경로 없음" 은 창 닫기 이벤트가 ①로 라우팅될 때만 성립하는데 시나리오는 워크스페이스 닫기뿐 |
| R-2 | 권고 | FP-E208 / E-I9 — 모두 저장 전부 성공 → 진행 | 부분 실패만 확인되고 성공 경로의 진행이 미확인 |
| R-3 | 권고 | FP-E310 / E-I12 — 결과 행 파일 소실 «삭제됨» + 열기 시 Alert | 반영(#338) — Feature 3 에 시나리오 추가. 규칙이 이미 확정돼 있었고 픽스처 step(파일 생성 · 외부 삭제)이 있어, 시나리오 없이 두면 판정이 위젯 테스트에만 남는다 |
| R-4 | 권고 | FP-E315 / E-I14 — dirty 버퍼 치환은 버퍼 내용 기준 | 반영(#339) — Feature 3 에 시나리오 추가. 규칙은 단위 테스트가 판정하지만 「셸이 디스크를 다시 읽지 않는다」는 배선은 단위 테스트가 볼 수 없다 |
| R-5 | 권고 | FP-E410 / E-I18 — 닫힌 파일 진단 유지 · 서버 빈 목록으로만 제거 | 규칙 UX-E-22 확정, 재시작 교체만 시나리오화 |
| R-6 | 권고 | FP-E111 / E-I4 — path_key 충돌 시 표시 이름 = 처음 연 이름 | 규칙 UX-E-08 확정, 시나리오 없음 |
| R-7 | 권고 | FP-E114 / E-I5 — 활성 탭 재클릭 무재읽기 | flutter_ide 회귀 교훈(§6-b5) 인데 판정 시나리오 없음 |
| R-8 | 권고 | FP-E124 / E-I7 — 저장 중 자체 저장 이벤트 무시 · 타인 변경은 배너 | ED-14 해시 대조의 유일한 관찰 지점 |
| R-9 | 권고 | FP-E801 / E-I29 — 닫기 6단계 순서 | 관찰 결과(고아 0)는 E-C1 시나리오가 확인하므로 권고 |
| R-10 | 권고 | E-I6 "직전 활성 없음 → 왼쪽 이웃" · E-I1 .git 읽기 불가 |
확정된 규칙의 두 번째 분기가 Examples 에 없음 |
| R-11 | 권고 | Should-Have 5~8(FP-E604 · E617 · E705/E707 · E412) | 규칙(FR-503 · ED §4.5 · UX-E-28 · UX-E-15) 확정, 시나리오 없음 |
Recommended Next Steps
- R-0(필수) 을 bdd v1.2 에 추가한다 — Outline 에 "저장(실패)" 행 하나면 된다. Solutioning Gate 전.
- Breakdown 이관: 열린 Important E-I3(규칙 · U-12) + 시나리오만 남은 E-I4 · I5 · I7 · I8(부분) · I9 · I12 · I14 · I18 · I29 — Story 인수 조건에 R-2~R-9 를 붙인다.
- 외부 의존 E-C4 · E-C5 는
planning-inputs§1.1 오너 재확인 항목 그대로 유지. - 권고 R-1 · R-10 · R-11 은 해당 Story 의 인수 조건 작성 시 흡수한다.
Generated by cc-spec flow-permutation · 2026-09-16 · rev.0 대상 architecture rev.1 · ux-spec rev.0 · bdd 54 / rev.1 재판정 대상 architecture rev.3 · ux-spec rev.1 · PRD v1.1 · bdd v1.1 79