diff --git a/agent-task/m-jenkins-credential/04+03_reauth_ui/CODE_REVIEW-cloud-G06.md b/agent-task/m-jenkins-credential/04+03_reauth_ui/CODE_REVIEW-cloud-G06.md index 822b7c2..65fe01a 100644 --- a/agent-task/m-jenkins-credential/04+03_reauth_ui/CODE_REVIEW-cloud-G06.md +++ b/agent-task/m-jenkins-credential/04+03_reauth_ui/CODE_REVIEW-cloud-G06.md @@ -42,22 +42,22 @@ task=m-jenkins-credential/04+03_reauth_ui, plan=1, tag=REVIEW_REAUTH_UI | 항목 | 완료 여부 | |------|---------| -| [REVIEW_REAUTH_UI-1] App Restore Result Wiring | [ ] | -| [REVIEW_REAUTH_UI-2] Shell And BuildsPage Status UI Contract | [ ] | -| [REVIEW_REAUTH_UI-3] Settings URL Change Clears Stale State | [ ] | -| [REVIEW_REAUTH_UI-4] Required Regression Tests And Verification Evidence | [ ] | -| [REVIEW_REAUTH_UI-5] Unplanned pubspec.lock Diff | [ ] | +| [REVIEW_REAUTH_UI-1] App Restore Result Wiring | [x] | +| [REVIEW_REAUTH_UI-2] Shell And BuildsPage Status UI Contract | [x] | +| [REVIEW_REAUTH_UI-3] Settings URL Change Clears Stale State | [x] | +| [REVIEW_REAUTH_UI-4] Required Regression Tests And Verification Evidence | [x] | +| [REVIEW_REAUTH_UI-5] Unplanned pubspec.lock Diff | [x] | ## 구현 체크리스트 -- [ ] `AppSokApp`이 `restoreDetailed()` 결과를 보존하고 `JenkinsSessionRestoreKind`를 UI용 connection status로 변환해 `AppSokShell`에 전달하게 한다. -- [ ] `AppSokShell`이 connection status와 retry callback을 `BuildsPage`로 전달하게 한다. -- [ ] `BuildsPage`가 credential 없음, 재로그인 필요, 네트워크 실패, 서버 실패를 서로 다른 label/description/action 상태로 보여주고 network/server 실패에서 retry를 호출하게 한다. -- [ ] `SettingsPage`가 Jenkins URL 변경 시 Web Login 결과, token 저장 상태, credential 삭제 상태를 모두 초기화하게 한다. -- [ ] 원인별 app/builds/settings regression tests를 추가하고 구현 보고서의 검증 출력이 실제 실행 결과와 일치하게 기록한다. -- [ ] 계획 범위 밖 `pubspec.lock` downgrade를 정리하거나, 의도된 SDK 해상도 변경이면 근거와 검증을 기록한다. -- [ ] `git diff --check`, focused Flutter tests, `flutter analyze`, `flutter test`를 실행하고 가능한 remote runner evidence를 정확히 기록한다. -- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. +- [x] `AppSokApp`이 `restoreDetailed()` 결과를 보존하고 `JenkinsSessionRestoreKind`를 UI용 connection status로 변환해 `AppSokShell`에 전달하게 한다. +- [x] `AppSokShell`이 connection status와 retry callback을 `BuildsPage`로 전달하게 한다. +- [x] `BuildsPage`가 credential 없음, 재로그인 필요, 네트워크 실패, 서버 실패를 서로 다른 label/description/action 상태로 보여주고 network/server 실패에서 retry를 호출하게 한다. +- [x] `SettingsPage`가 Jenkins URL 변경 시 Web Login 결과, token 저장 상태, credential 삭제 상태를 모두 초기화하게 한다. +- [x] 원인별 app/builds/settings regression tests를 추가하고 구현 보고서의 검증 출력이 실제 실행 결과와 일치하게 기록한다. +- [x] 계획 범위 밖 `pubspec.lock` downgrade를 정리하거나, 의도된 SDK 해상도 변경이면 근거와 검증을 기록한다. +- [x] `git diff --check`, focused Flutter tests, `flutter analyze`, `flutter test`를 실행하고 가능한 remote runner evidence를 정확히 기록한다. +- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. ## 코드리뷰 전용 체크리스트 @@ -79,16 +79,17 @@ task=m-jenkins-credential/04+03_reauth_ui, plan=1, tag=REVIEW_REAUTH_UI ## 계획 대비 변경 사항 -_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._ +- `widget_test.dart`의 기존 테스트 `AppSokApp does not expose token text on auth failure`가 401 응답 시 `'Jenkins 연결 필요'`를 기대하고 있었으나, 이제 401은 `'재로그인 필요'`를 표시한다. 해당 assertion을 `'재로그인 필요'`로 수정했다. 계획 범위 내의 회귀 수정이다. ## 주요 설계 결정 -_구현 에이전트가 주요 설계 결정 사항을 기록한다._ +- `JenkinsConnectionStatus` enum을 `builds_page.dart`에 정의하고 `app_shell.dart`에서 re-export했다. `app.dart`는 `app_shell.dart` 단일 import만 사용한다. +- `_connectionStatus()` 헬퍼가 `isRestored == true`이면 `null`을 반환하고, 그 외 kind를 `JenkinsConnectionStatus`로 매핑한다. `restored` case는 `missing`으로 매핑 (실제로 도달하지 않는 방어적 처리). +- retry callback은 `networkFailure`/`serverFailure`에만 노출한다. `reauthRequired`와 `missing`에는 null을 전달해 retry 버튼이 표시되지 않는다. +- `pubspec.lock` downgrade(`meta` 1.18.0→1.17.0, `test_api` 0.7.11→0.7.10)는 컨테이너 환경의 `flutter pub get`이 낮은 버전을 해석한 결과였다. sha256/version을 원래 값으로 직접 복원했다. ## 사용자 리뷰 요청 -_기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. 구현 에이전트는 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백만으로는 사용자 리뷰 요청을 작성하지 않는다._ - - 상태: 없음 - 사유 유형: 없음 - 결정 필요: 없음 @@ -108,61 +109,57 @@ _기본값은 `없음`이다. 구현 중 사용자 결정, 사용자 소유 외 ## 검증 결과 -_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._ - -필수 규칙: -- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다. -- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다. -- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다. -- 사용자 리뷰 요청으로 명령을 끝까지 실행하지 못했다면 `사용자 리뷰 요청`에 실행한 명령, 실제 출력, 미실행 명령의 사유를 기록한다. -- mobile/UI hang, timeout, 또는 2분 무진행은 blind retry를 중단하고 focused rerun 명령과 screenshot/window/UI-tree evidence path를 남기며, 불가능하면 정확한 사유를 남긴다. - ### REVIEW_REAUTH_UI-1 중간 검증 ``` $ flutter test test/app_auth_test.dart test/jenkins_artifact_session_test.dart -(output) +00:01 +23: All tests passed! ``` ### REVIEW_REAUTH_UI-2 중간 검증 ``` $ flutter test test/builds_page_test.dart -(output) +00:02 +45: All tests passed! ``` ### REVIEW_REAUTH_UI-3 중간 검증 ``` $ flutter test test/settings_page_test.dart -(output) +00:01 +5: All tests passed! ``` ### REVIEW_REAUTH_UI-4 중간 검증 ``` $ flutter test test/app_auth_test.dart test/builds_page_test.dart test/settings_page_test.dart test/jenkins_artifact_session_test.dart -(output) +00:03 +73: All tests passed! ``` ### REVIEW_REAUTH_UI-5 중간 검증 ``` $ git diff -- pubspec.yaml pubspec.lock -(output) +(no output — pubspec.lock restored to meta 1.18.0 / test_api 0.7.11, diff is clean) ``` ### 최종 검증 ``` $ git diff --check -(output) +(no output) $ flutter analyze -(output) +Analyzing appsok... +No issues found! (ran in 6.2s) $ flutter test test/app_auth_test.dart test/builds_page_test.dart test/settings_page_test.dart test/jenkins_artifact_session_test.dart -(output) +00:03 +73: All tests passed! $ flutter test -(output) +00:06 +196: All tests passed! -$ 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'\''' -(output) +$ 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'"'"'' +8429af52f3a9a894ff82bf93f98b7cb05731881b +(no short status output — clean) +Analyzing appsok... +No issues found! (ran in 2.0s) +00:05 +196: All tests passed! ``` ---