<!-- task=m-jenkins-credential/04+03_reauth_ui plan=2 tag=REVIEW_REVIEW_REAUTH_UI -->

# Plan - REVIEW_REVIEW_REAUTH_UI

## 이 파일을 읽는 구현 에이전트에게

이 파일은 `code_review_cloud_G06_1.log`의 FAIL 판정을 해결하는 후속 구현 계획이다. 구현 중 사용자만 결정할 수 있는 범위 변경, 사용자 소유 외부 환경, secret, 서비스 준비가 막히면 active `CODE_REVIEW-*-G??.md`의 `사용자 리뷰 요청` 섹션에 근거를 기록하고 멈춘다. 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. archive, `complete.log`, task-directory 이동은 code-review 전용이다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/usable-mvp/milestones/jenkins-credential.md`
- Task ids:
  - `reauth`: token 폐기, 권한 없음, Jenkins URL 변경, 네트워크 실패를 구분해 재로그인 또는 재시도 흐름으로 안내한다.
- Completion mode: check-on-pass

## 배경

2차 리뷰에서 app/shell/builds/settings의 원인별 reauth UI 구현 자체는 계획을 대체로 반영한 것으로 확인했다. 하지만 `restoreDetailed()` 전환 후 기존 fake session test가 전체 suite 실행 순서에 기대고 있으며, required `flutter test`가 `pubspec.lock`을 다시 rewrite해 검증 후 working tree가 dirty가 되는 문제가 남았다.

## 범위 결정 근거

- 포함: `test/widget_test.dart` fake session/test 격리 복구, `pubspec.lock`의 stable resolution 정렬, focused/full 검증 출력 갱신.
- 제외: reauth UI 문구/레이아웃 재설계, Jenkins Web Login bridge 변경, Jenkins API parsing 변경.
- `Roadmap Targets`는 기존 plan과 동일하게 유지한다. 이 follow-up은 `reauth` 완료 검증을 막는 테스트/lockfile 문제만 닫는다.

## 구현 체크리스트

- [ ] `_FakeJenkinsArtifactSession` 또는 해당 widget test setup을 `AppSokApp`의 `restoreDetailed()` 호출 계약과 맞춰 단독 실행해도 통과하게 한다.
- [ ] required Flutter verification을 실행한 뒤에도 `pubspec.yaml`/`pubspec.lock` diff가 남지 않도록 lockfile 또는 검증 환경 기준을 정리한다.
- [ ] `flutter test test/widget_test.dart --name "AppSokApp wires staged apk into adb installer"`와 `git diff -- pubspec.yaml pubspec.lock`를 중간 검증으로 실행하고 실제 출력을 기록한다.
- [ ] `git diff --check`, `flutter analyze`, focused Flutter tests, `flutter test`를 실행하고 검증 후 `git status --short`까지 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REVIEW_REAUTH_UI-1] Widget Test Isolation After restoreDetailed

#### 문제

`test/widget_test.dart:40`의 `_FakeJenkinsArtifactSession`은 `restore()`만 override한다. 현재 `AppSokApp`은 `restoreDetailed()`를 호출하므로 `test/widget_test.dart:1043`의 fake session test가 fake 계약이 아니라 이전 테스트가 남긴 `FlutterSecureStorage` 상태에 의존한다.

#### 해결 방법

- `_FakeJenkinsArtifactSession`이 `restoreDetailed()`를 override해 `JenkinsSessionRestoreResult(kind: JenkinsSessionRestoreKind.restored)`를 반환하게 한다.
- 또는 해당 테스트가 스스로 필요한 storage/session 상태를 준비하게 한다. 다만 fake session의 의도가 더 명확하므로 fake override를 우선한다.
- 단독 test 실행에서 `android-app`과 `build-row-7`이 정상 렌더링되는지 확인한다.

#### 수정 파일 및 체크리스트

- [ ] `test/widget_test.dart`: fake session이 `restoreDetailed()` 기반 AppSokApp startup 계약을 만족하게 수정.
- [ ] 관련 import/override가 analyzer와 맞는지 확인.

#### 중간 검증

```bash
flutter test test/widget_test.dart --name "AppSokApp wires staged apk into adb installer"
```

### [REVIEW_REVIEW_REAUTH_UI-2] Stable pubspec.lock After Verification

#### 문제

2차 리뷰 중 required `flutter test` 실행이 `pubspec.lock`을 다시 수정했다. 구현 보고서의 `git diff -- pubspec.yaml pubspec.lock` clean 주장은 검증 명령 이후 상태와 일치하지 않는다.

#### 해결 방법

- 현재 프로젝트 검증에 쓰는 Flutter SDK가 해석하는 lockfile 결과를 추적 파일에 반영하거나, remote runner 기준 lockfile을 유지해야 한다면 local verification에서 lockfile rewrite가 발생하지 않도록 SDK/명령/환경 차이를 해소한다.
- 어느 쪽이든 `flutter test` 실행 이후 `git diff -- pubspec.yaml pubspec.lock`와 `git status --short`가 의도한 상태임을 기록한다.

#### 수정 파일 및 체크리스트

- [ ] `pubspec.lock`: required verification 후 dirty diff가 남지 않는 상태로 정리.
- [ ] `CODE_REVIEW-cloud-G06.md`: lockfile 판단 근거와 실제 command output 기록.

#### 중간 검증

```bash
flutter test
git diff -- pubspec.yaml pubspec.lock
git status --short
```

## 최종 검증

```bash
git diff --check
flutter analyze
flutter test test/widget_test.dart --name "AppSokApp wires staged apk into adb installer"
flutter test test/app_auth_test.dart test/builds_page_test.dart test/settings_page_test.dart test/jenkins_artifact_session_test.dart
flutter test
git diff -- pubspec.yaml pubspec.lock
git status --short
```

remote runner를 재실행할 수 있으면 아래도 실행하고, 같은 변경이 반영된 checkout인지 `git rev-parse HEAD`와 `git status --short` 출력으로 함께 증명한다.

```bash
ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'zsh -lc '\''cd "$HOME/docker/services/code-server/data/volume/workspace/appsok" && git rev-parse HEAD && git status --short && flutter analyze && flutter test'\'''
```
