From 77f842181805a32cc81189ec9fad8062feabb357 Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Sat, 12 Sep 2026 18:08:39 +0900 Subject: [PATCH] =?UTF-8?q?UX=20=EC=9B=B9=20=EB=B0=B0=ED=8F=AC=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EC=99=80=20=EC=9A=B4=EC=98=81=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EA=B2=BD=EA=B3=84=20=EA=B8=B0=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev_dashboard.html | 2 +- docs/ops/deployment-pipeline.md | 14 ++++- .../evidence/ux-web-deploy-2026-09-12.json | 58 +++++++++++++++++++ docs/ops/ux-audit-2026-09-12.md | 2 +- 4 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 docs/ops/evidence/ux-web-deploy-2026-09-12.json diff --git a/docs/dev_dashboard.html b/docs/dev_dashboard.html index 262545e..76c9951 100644 --- a/docs/dev_dashboard.html +++ b/docs/dev_dashboard.html @@ -302,7 +302,7 @@ project pulse

지금 위치: 개선관리 원본 14개 재점검 — 2026-09-09 읽기 전용 확인에서 완료 13·검토 1(C-001)이다. REQ-009~011의 로컬 재검증은 수용했고, SHA `1306c524` 운영 배포 뒤 H09를 새 live 검증으로 PASS 확인했다. 2026-09-01·09-08 배포는 역사 증거이며, 9/9 배포가 기존 PASS 전체의 새 검증을 뜻하지는 않는다.

실배포 CUA 128: 카탈로그는 생성됐지만 전체 검증은 미완료다. H09(기록 검색·필터 복귀)는 SHA `1306c524`에서 PASS로 재확인했고 T18(감독·연구 drilldown)은 수정 배포 뒤에도 learner 브라우저만 있어 RED를 종결하지 않았다. 관리자와 일반 학습자 로그인에서 학습자의 `/admin`·`/teach`→`/learn` 차단, P4 추천·R09 잠금·R14 워크시트 보존을 확인했다. 순수 teacher·OFF 계정, 교수자 쓰기, 모바일과 독립 관찰자 공개 검증은 남아 있다.

-

2026-09-12 비넷 UX 감사: DONE · 로컬 시각 검수 수용. 역할별 메뉴·모바일 라벨, 학습자 정보 위계와 긴 목록, 상담 시작 버튼 겹침, 교수·관리자 표의 넘침, 설정과 약관 배치를 수정했다. 전체 레이아웃 15 passed, 마지막 관리자 폭 보정 후 2 passed, 회기 8 passed, 접근성 44개(38+6) 통과와 직접 이미지 검수를 수용했다. 상세 판정·반려 기록·실제 API와 fixture 증거 경계는 감사 기록에 있다. 로컬 web 5273·API 8200 기준이며 운영 배포·전체 기능 출시 판정은 포함하지 않는다.

+

2026-09-12 비넷 UX 감사: DONE · 로컬 시각 검수 수용. 역할별 메뉴·모바일 라벨, 학습자 정보 위계와 긴 목록, 상담 시작 버튼 겹침, 교수·관리자 표의 넘침, 설정과 약관 배치를 수정했다. 전체 레이아웃 15 passed, 마지막 관리자 폭 보정 후 2 passed, 회기 8 passed, 접근성 44개(38+6) 통과와 직접 이미지 검수를 수용했다. 상세 판정·반려 기록·실제 API와 fixture 증거 경계는 감사 기록에 있다. 이후 SHA e8b770e4d9023238bf210b412de75dcb98bfc08e는 Forgejo master에 push했고, 17:55:31 KST 배포 시작 뒤 Pages 공개 배포와 NAS web 전용 교체를 18:06 KST까지 완료했다. API·engine·DB는 유지했다. 인증 내부 UI는 401 세션 만료로 미검증이므로 전체 운영 내부 화면 GREEN이나 전체 기능 출시 완료를 뜻하지 않으며 배포 현황을 따른다.

2026-08-31 배포 파이프라인 재정립(역사 기록): git 관리·배포는 git.chanpaca.net(Forgejo) 중심으로 이관했고, github.com(origin)은 private 백업/미러로 유지한다. 배포 대상은 NAS Production(docker-compose.nas.yml, vignette-prod)이며 이 PC는 개발용이다. Cloudflare tunnel은 NAS ingress의 현재 경로이므로 대체 ingress 검증 전에는 제거하지 않는다. 문서 deployment-pipeline.md.

최근 확인된 배포 증거(2026-09-01 당시): Forgejo master dce85620를 NAS에서 직접 clone·빌드해 vignette-prod api/engine/web을 교체했고, Cloudflare Pages production도 새 빌드(index-BFKGXJQi.js, 이전 세대 자산 보존)로 배포했다. 사전 dump cab6826b…(11.0MB·TOC 1783)·env 백업·구 이미지 보존으로 롤백 경로를 고정했다. 중복 활성 회기 14쌍 30행은 최신 유지 정책으로 종료(영수증 보존·삭제 0)하고 마이그레이션 20/21/22를 온라인 적용했다. 이 과정에서 mig22의 name[]=text[] 캐스트 결함과 master의 게이트웨이 openai provider 누락 회귀를 발견해 즉시 교정했다(테스트 71 passed). 배포 당시 public health ok·db/engine true, OpenAPI 200, /auth/me 401, dev-login 404, 데이터 집계 전후 동일(app_user 1380/sessions 618/turns 1743)을 확인했다. 증거: nas-prod-deploy-2026-09-01.json. headful 실계정 폐루프도 당시 완료: NAS env의 OAuth secret 오류(invalid_client)를 교정한 뒤 소유자 실계정 로그인→기존 회기 20건 표시(데이터 보존)→새 사례 회기 생성(mig22 실증)→실턴 SSE·AI 응답→종료→리뷰 생성까지 GREEN(sessions 619·turns 1745·case_profile 566). 일일 검증형 DB 백업 sidecar 첫 덤프도 11.2MB로 성공했다. 남은 운영·외부 게이트: C-001 외부 임상 검수, NAS 재부팅 자동복구 smoke, 백업 실패 알림·off-host 복제.

diff --git a/docs/ops/deployment-pipeline.md b/docs/ops/deployment-pipeline.md index 0d52cbf..b2a73dd 100644 --- a/docs/ops/deployment-pipeline.md +++ b/docs/ops/deployment-pipeline.md @@ -1,7 +1,7 @@ # 배포 파이프라인 (Deployment Pipeline) -> 작성: 2026-08-31 · 2026-09-09 현행화 · 문서 소유: docs/ops -> 상태: **2026-09-09 NAS Production & Cloudflare Pages 실배포 완료 (SHA `1306c524`)**. API·engine 동시 기동 중 공백 관찰이 있어 무중단 배포 증거는 아니다. +> 작성: 2026-08-31 · 2026-09-12 현행화 · 문서 소유: docs/ops +> 상태: **2026-09-12 UX SHA `e8b770e4d9023238bf210b412de75dcb98bfc08e`의 Cloudflare Pages와 NAS web 전용 배포는 완료**했다. 운영 인증 세션이 401로 만료돼 내부 UI 검증은 마지막 열린 게이트이며, 이를 전체 운영 검증 완료로 선언하지 않는다. ## 목표 아키텍처 (소유자 지시) @@ -134,6 +134,16 @@ docker compose -f docker-compose.nas.yml --env-file private/env.nas up -d --no-d - 배포 후 관리자가 `/admin/ai` 제공자 연결 패널에서 claude·codex·agy·openrouter 토큰을 연결하면 실행 중인 engine 컨테이너에 즉시 push 적용된다(재배포 불필요). - 이후 수정(`e3a9fc71`, `cb4d4557`): 앱 DB 계정엔 스키마 CREATE 권한이 없어 런타임 DDL이 권한 거부로 실패 → 소유자로 테이블 선생성(DDL은 `05_runtime_auth.sql`에 정식 반영) + `to_regclass` 존재 검사 선행(r2), OAuth 로그인 버튼(claude·openrouter PKCE 코드 교환) 추가(r3). 교체는 각각 api만 `--no-deps`로 수행, engine은 코드 변경이 없어 유지했다. +## 5.4 UX 웹 배포와 NAS web 전용 교체 (2026-09-12 배포 시작 17:55:31 KST · NAS 교체/로컬 HTTP 확인 18:06 KST, SHA `e8b770e4d9023238bf210b412de75dcb98bfc08e`) + +- Forgejo `master` push는 완료했다. Pages preview `https://1b115047.vignette-b1q.pages.dev` 배포도 완료했다. +- 공개 `https://vignette.chanpaca.net`은 HTTP 200이고 `/assets/index-BA_Q0J7Y.js`가 새 번들과 일치한다. 이전 세대 자산 175개를 보존했다. +- 공개 로그인 390px·1440px 원본을 직접 시각 검수해 수용했다. 각 확인에서 overflow, page error, failed request는 0건이었고 공개 health는 `db: true`, `engine: true`다. +- NAS는 **web만** `vignette-nas-web:e8b770e4` (`sha256:487e745aa08c113de4994d7d4770737539b1bc49494f5cbb802e6dc0f8c535f9`)로 교체했고 로컬 HTTP 확인은 exit 0이다. `.devlogs/deploy-20260912-nas-before.txt`와 `nas-after.txt` 첫 3줄 대조에서 API·engine·DB 컨테이너 ID와 이미지는 동일했다. +- DB dump `backups/pre-deploy-e8b770e4-20260912.dump`(11,783,464 bytes)는 `pg_restore --list`를 통과했고 `private/env.nas.before-deploy-e8b770e4`를 보존했다. 공개 health도 다시 `status: ok`, `db: true`, `engine: true`를 확인했다. +- 공개 Pages의 현재 JS/CSS asset 의존 그래프는 로컬 `dist`와 비교해 52/52 HTTP 200이며 SHA-256이 일치한다. NAS web은 `/api` 빌드의 `index-Ccefqm_F.js`·`index-B1latakI.css`를 쓰며, 이는 `nginx -t`와 로컬 HTTP exit 0으로 별도 검증했다. +- 따라서 Pages와 NAS web 전용 배포 반영은 완료했다. 다만 운영 인증 세션 만료로 내부 UI는 401이라 검증하지 못했으므로, 이 절은 전체 운영 내부 화면 GREEN이나 전체 기능 출시 완료를 의미하지 않는다. 구조화 증거: [`ux-web-deploy-2026-09-12.json`](./evidence/ux-web-deploy-2026-09-12.json). + ## 6. 남은 구성 작업 (TODO) - [ ] Forgejo master 기준 NAS 자동배포 후크(수동 절차는 §5, §5.1로 실증 완료) diff --git a/docs/ops/evidence/ux-web-deploy-2026-09-12.json b/docs/ops/evidence/ux-web-deploy-2026-09-12.json new file mode 100644 index 0000000..a356565 --- /dev/null +++ b/docs/ops/evidence/ux-web-deploy-2026-09-12.json @@ -0,0 +1,58 @@ +{ + "schema": "vignette.ux_web_deploy_evidence.v1", + "deploymentStartedAt": "2026-09-12T17:55:31+09:00", + "recordedAt": "2026-09-12T18:06:00+09:00", + "source": { + "sha": "e8b770e4d9023238bf210b412de75dcb98bfc08e", + "forgejoMasterPush": "completed" + }, + "cloudflarePages": { + "status": "completed", + "previewUrl": "https://1b115047.vignette-b1q.pages.dev", + "publicUrl": "https://vignette.chanpaca.net", + "publicHttpStatus": 200, + "entryAsset": "/assets/index-BA_Q0J7Y.js", + "entryAssetMatchesNewBundle": true, + "preservedPreviousAssets": 175 + }, + "publicVerification": { + "loginViewports": [390, 1440], + "visualReview": "accepted", + "overflowCount": 0, + "pageErrorCount": 0, + "requestFailedCount": 0, + "health": { + "db": true, + "engine": true + } + }, + "nas": { + "status": "web-replaced-and-local-http-verified", + "scope": "web-only", + "webImage": "vignette-nas-web:e8b770e4", + "webImageSha256": "487e745aa08c113de4994d7d4770737539b1bc49494f5cbb802e6dc0f8c535f9", + "api": "retained", + "engine": "retained", + "database": "retained", + "apiEngineDatabaseBeforeAfterMatch": true, + "containerReplacementVerified": true, + "localHttpExitCode": 0, + "databaseBackup": { + "path": "backups/pre-deploy-e8b770e4-20260912.dump", + "bytes": 11783464, + "pgRestoreListPassed": true + }, + "environmentBackup": "private/env.nas.before-deploy-e8b770e4" + }, + "assetDependencyGraph": { + "scope": "public-pages-vs-local-dist", + "checked": 52, + "http200": 52, + "sha256MatchesLocalBuild": true + }, + "authenticatedInternalUi": { + "verified": false, + "reason": "operational authentication session expired; received 401" + }, + "conclusion": "Cloudflare Pages and NAS web-only deployment are complete. Authenticated internal UI verification remains open, so this is not a full operational or feature-release completion claim." +} diff --git a/docs/ops/ux-audit-2026-09-12.md b/docs/ops/ux-audit-2026-09-12.md index 5da1158..5e7c531 100644 --- a/docs/ops/ux-audit-2026-09-12.md +++ b/docs/ops/ux-audit-2026-09-12.md @@ -30,4 +30,4 @@ 카드가 겹친 첫 목록 수정, 반투명 메뉴, 시작 버튼 가림, 초기 로딩 화면을 완료 화면으로 찍던 캡처는 반려했다. 캡처 도구의 stale owner ID와 native 스크롤 끝점 오차도 수정했다. 빈 회기 fixture는 정확한 API 빈 상태 계약으로 보강했으며 실제 API 증거와 구분한다. `practice-real-api-final`의 후속 전체 화면 캡처는 로딩 중이어서 무효로 보존했다. 해당 배치의 수용 근거는 안정된 긴 목록 fixture 원본과 동작 검사다. -로컬 AI 게이트웨이는 비가용이고 제공자 조회 API는 500을 반환한다. 이번 감사는 이 상태를 숨기지 않고 실패·재시도 화면을 검수했다. 운영 서버 정상성, 실제 모델 생성·음성 연결, 전체 기능 출시 판정과 배포는 이 디자인 감사의 완료 범위에 포함하지 않는다. 소스 변경은 커밋·push·배포하지 않았다. \ No newline at end of file +로컬 AI 게이트웨이는 비가용이고 제공자 조회 API는 500을 반환한다. 이번 감사는 이 상태를 숨기지 않고 실패·재시도 화면을 검수했다. 운영 서버 정상성, 실제 모델 생성·음성 연결과 전체 기능 출시 판정은 이 디자인 감사의 완료 범위에 포함하지 않는다. 감사 수용 뒤 UX 소스 SHA `e8b770e4d9023238bf210b412de75dcb98bfc08e`를 Forgejo `master`에 push했고, 배포는 2026-09-12 17:55:31 KST에 시작했다. Pages 공개 배포와 NAS web 전용 교체는 18:06 KST까지 완료됐으며 API·engine·DB는 유지했다. 운영 인증 세션이 401로 만료돼 내부 UI는 검증하지 못했으므로 전체 운영 내부 화면 GREEN이나 전체 기능 출시 완료를 선언하지 않는다. 현행 배포 상태와 구조화 증거는 [`deployment-pipeline.md`](./deployment-pipeline.md) 및 [`ux-web-deploy-2026-09-12.json`](./evidence/ux-web-deploy-2026-09-12.json)을 따른다.