diff --git a/docs/dev_dashboard.html b/docs/dev_dashboard.html index eee946a..002df86 100644 --- a/docs/dev_dashboard.html +++ b/docs/dev_dashboard.html @@ -636,6 +636,7 @@
181차 적용(2026-08-07): G8의 마지막 게이트인 실제 receipt-bound image rollback을 격리 NAS에서 실행해 DONE으로 승격했다. 먼저 성립 불가능한 Gate6 계약을 정정했다. 감사 대상 current API 이미지 자체가 com.docker.compose.project=vignette-preview-20260807·service=api image label을 갖고 있어 "helper의 compose label 0개"는 감사되지 않은 다른 이미지를 쓰지 않는 한 성립하지 않는다. 그래서 계약을 key 부재가 아니라 소속으로 바꿔 scripts/launch-nas-preview-g8-helpers.py에 고정했다. image 상속 label을 baseline으로 읽고, container의 모든 compose label이 baseline과 같거나 선언된 격리 override인지 검사하며, 최종 project는 vignette-g8-helper-*·service는 g8-rollback-*이어야 하고, docker run argv에 target project/service label을 주입하면 fake-runner 테스트가 먼저 깨진다(37/37). 실행은 executor 127.0.0.1:18149(host network·read-only rootfs·cap-drop ALL·no-new-privileges·uid1028/gid100·group101)와 별도 lifecycle의 control-plane API 127.0.0.1:8018로 구성했다. 계획했던 Windows SSH 터널은 NAS sshd가 administratively prohibited로 direct-tcpip를 거부해 사용할 수 없었고, sshd 설정을 바꾸는 대신 같은 격리 계약의 NAS-side probe 컨테이너에서 실행해 control-plane(8018)·preview(8088) origin 분리를 그대로 유지했다. 결과는 rollback-old receipt nas-g8-723eeef2…, restore-current receipt nas-g8-2738846c…로 실제 이미지가 52e0/6fdb→79ec/c530→52e0/6fdb로 왕복했고, release gate·approval 2회 멱등, DB audit.ci_lifecycle_event rollback/executed 2건과 receipt id 결속, silent auto-promotion 0, HMAC journal 6-record 체인 검증, health 3/3·OpenAPI 126·auth 401·Web 200, helper 0·listener 0 복귀와 비밀 env 파기를 확인했다. down·volume rm·prune은 실행하지 않았고 공개 런타임은 건드리지 않았다. G7은 Deepgram live·인증 WSS·명시 동의 물리 마이크 50분·독립 라벨 human pack이 남아 외부 GATE로 유지한다.
182차 적용(2026-08-08): 회기 전 자기점검(pre alliance gate) 화면을 데스크톱·모바일 전 폭에서 다시 짰다. 계측이 먼저였다. gate 상태에서 카드가 align-self:stretch + grid-template-rows: auto minmax(0,1fr) auto auto인데 base flex의 align-items:center가 살아 있어 3축 블록이 1fr 행 한가운데 떠 있었다. 1920×1080 기준 카드의 66.5%가 빈 공간이고 축 위·아래로 각각 277px의 죽은 여백이 생겼다. 척도 라벨은 0.54rem+nowrap+ellipsis라 901~1279px에서 최대 12개가 "전허 아…"로 잘렸고, ≤620px에서는 display:none으로 15개 전부 사라져 숫자 1~5만 남았다. 320×568에서는 @media (max-width:420px) and (max-height:620px)의 collapsed 전용 40px 고정 행이 gate에도 걸려 카드가 40px로 눌리고 헤더와 축이 겹쳐 화면이 사실상 깨져 있었다. 수정은 네 가지다. (1) gate 카드는 행 높이만큼 늘리지 않고 align-self:center+max-height:100%+내부 스크롤로 화면 중앙에 서게 했다. (2) 3열 격자를 버리고 축마다 질문 한 줄 + 전폭 5칸 척도 세로 스택으로 바꿔 어느 폭에서도 라벨을 자르거나 숨기지 않는다(word-break:keep-all+overflow-wrap:normal로 어절 경계만 줄바꿈). (3) 정보가 없던 3 AXES 모노 배지를 제출 버튼이 왜 잠겨 있는지 답하는 0/3 축 선택함 진행 표시(aria-live)로 교체했다. (4) 40px 행 규칙에 :not(.sx-alliance-gated)를 걸어 collapsed mid 전용으로 되돌렸다. 선택 상태 글자색도 반투명 --surface에서 --text-on-accent로 고쳤다(라이트 4.85:1 · 다크 6.36:1, AA). 15개 뷰포트 재계측 결과 빈 공간 비율 0.665→0.127(1920), 라벨 잘림 12→0, 숨김 15→0, 최소 탭 타깃 38×38→46×60, 문서 가로 오버플로 전 구간 0이고, 320×568에서는 카드 내부 스크롤로 제출까지 도달해 실제 잠금·발화 입력 활성까지 확인했다. 인라인 mid 카드는 ≥1080px에서만 3열로 눕혀 축어록을 밀지 않게 두었고 높이는 오히려 약 55px 줄었다. 무회귀: typecheck 통과, session-layout 8/8, alliance-pulse 8/8, pre/mid 잠금 E2E 2/2, layout-visual-gate 22/23(실패 1건 settings는 변경 전 baseline에서도 동일 실패로 확인된 기존 회귀). session-mvp 음성 4건 실패도 baseline 동일이라 이 변경과 무관하다.
183차 적용(2026-08-08): 182차 뒤 소유자 스크린샷에서 시간 만료 상태의 게이트 화면이 여전히 깨져 있어 네 개의 별개 결함을 계측으로 특정하고 닫았다. (1) .sx-timebar는 세션이 다크 stage 팔레트를 강제하던 시절의 잔재로, 배경이 어디에도 정의된 적 없는 --bg-panel의 하드코딩 다크 폴백으로 칠해지는데 글자만 테마 토큰을 따라가 라이트에서 제목 1.13:1·설명 1.76:1이었다. 의미색 토큰(--warn-*/--crit-*)으로 되돌려 13.88:1·6.94:1(다크 13.86·9.30)로 올렸다. (2) 같은 이유로 .sx-end-dialog__panel이 어두운 gradient 위 어두운 글자라 제목 2.68:1·본문 1.14:1로 사실상 보이지 않았다. 불투명 --bg-app 표면으로 바꿔 15.79:1·5.19:1(다크 15.18·6.52)이 됐다. (3) 보태니컬 장식 위로 본문을 올리는 .sx-page--active > *{position:relative}가 같은 특이도(0,1,0)로 뒤에 있어 종료 모달의 position:fixed를 덮어썼다. 오버레이가 화면을 덮는 대신 그리드 한 칸(1532×32px)으로 눌려 들어갔다. :not(.sx-end-dialog)로 제외해 fixed 1600×900 뷰포트 전체를 회복했다. (4) 게이트 행 정의 .sx-page--active.sx-alliance-gated(0,2,0)가 :has() 두 개짜리 규칙(0,3,0)보다 특이도가 낮아 시간 만료 바가 뜨는 순간 밀려났다. 숨긴 축어록·컨트롤바의 빈 트랙이 남아 화면 절반이 비었다(80px 59px 628px 0px 116px 5행). 게이트 규칙에도 같은 :has()를 붙여 3행(80px 59px 693px)으로 정정했다. 무회귀: typecheck 통과, session-layout+alliance-pulse+layout-visual-gate 31/31(182차에서 실패했던 settings도 통과), 시간만료 종료 다이얼로그 E2E 2/2, pre/mid 잠금 E2E 2/2, full-sweep-session+self-directed-learning-loop 30 pass. 남은 음성 4건(voice skip·Space mic)은 변경분 stash 후 baseline에서도 동일 실패라 이 변경과 무관한 기존 회귀다.
184차 적용(2026-08-08): 182·183차 변경이 로컬 워크트리에만 있어 소유자가 보던 공개 사이트에는 반영될 수 없던 상태를 배포로 닫았다. 소유자 스크린샷의 3 AXES는 이미 소스에서 사라진 문자열이었고, 접속 주소가 https://vignette.chanpaca.net이라 커밋 전 변경이 보일 수 없는 것이 원인이었다. 커밋 f0c2240f로 고정한 뒤 npm run build(Session 청크 Session-DnhnKvTy.js·Session-Xn1JLv-d.css), scripts\preserve-pages-assets.ps1로 직전 5개 production 배포의 지연 로드 자산 104개를 보존하고(진행 중 세션의 lazy chunk 404 방지), wrangler pages deploy dist --project-name vignette --branch main --commit-hash f0c2240f로 배포했다(deployment a12c195c, 신규 업로드 37 / 기존 666). 커스텀 도메인 검증은 index-BTkJUPLZ.js 200, Session JS/CSS 모두 올바른 MIME 200이며 신규 마커(축 선택함·is-gate·:not(.sx-end-dialog)) 각 1건, 구버전 마커(3 AXES·--bg-panel·척도 text-overflow) 전부 0건이다. 첫 조회에서 edge가 이전 index를 준 건 배포 직후 타이밍이었고 재조회에서 신규 index로 확정됐다. 공개 API·런타임은 건드리지 않았다.