NAS 엔진 릴레이 실제 시작 성공과 15:05 게이트 재검증 결과 기록
- 릴레이 실제 1회 시작 passed(4종 SHA pin, ready 실생 통과, PID 65328) 후 LAN 한정 9100 방화벽 규칙 추가(Private 프로필 누락이 transport error 원인)로 NAS origin health 3/3 ok·engine true, auth 401, OpenAPI 126 실측 — 8-12 이후 첫 회복 - 직렬 게이트 재실행 31/14/12did-not-run 실패를 정직 기록: 스윕 91건 협폭 레이아웃 결함 보고(아침 연쇄 중단으로 미실행이던 테스트) + 스택·데이터 드리프트 의심 실패군, 교사 재평가 2건 미실행 — pending 유지, 원인 조사 이관 - 대시보드 211차 노트, TODO NAS 항목 갱신, SSOT 체커 59 PASS
This commit is contained in:
parent
ab4bdfb8a2
commit
6a42063d49
4 changed files with 96 additions and 66 deletions
15
docs/TODO.md
15
docs/TODO.md
|
|
@ -90,14 +90,13 @@
|
|||
generation readiness와 실패 cleanup을 강제하도록 보강했고 contract 8/8을 통과했다. detached-clean
|
||||
`f08e03de…f191`·tree `00275133…0abd` exact `-CheckOnly`도 launcher/Python/env SHA 결속,
|
||||
`mutation=false`, listener `0→0`, runtime state 0으로 PASS했다. 실제 9100 시작은 소유자 승인 전 미실행이다.
|
||||
- [ ] **NAS preview engine relay current 복구** — 2026-08-18 소유자 승인으로 1단계를 닫았다: detached-clean
|
||||
`4771b97c…c880`·tree `286723de…c1fa`에서 launcher/Python SHA(8-12 핀과 동일) + NAS 실행 컨테이너의
|
||||
`ENGINE_GATEWAY_SHARED_SECRET`을 결속한 env SHA로 `-CheckOnly`가 통과했다(mutation=false, LAN
|
||||
`192.168.0.223:9100`, NAS 무접촉, 영수증 `D:\workspace\nas-relay-state\receipt-checkonly-20260818.json`).
|
||||
남은 것: 엔진 구독 한도 리셋(15:00 KST) 뒤 15:05 자동화가 같은 핀으로 LAN listener를 1회 시작하고 NAS
|
||||
health 3/3·db/engine true, auth 401, OpenAPI 126·assets, actual-origin turn→review를 재검증한다. 실패 시 이번
|
||||
실행 소유 PID/listener만 정리하고 자동 재시도하지 않는다. 2026-08-12 15:24 KST local health는 3회
|
||||
타임아웃이므로 재검증 통과 전까지 현재 NAS를 GREEN으로 표기하지 않는다.
|
||||
- [ ] **NAS preview engine relay current 복구** — 2026-08-18 15:05 자동화로 시작 단계를 닫았다: `-CheckOnly`
|
||||
통과(4종 SHA pin) 뒤 실제 1회 시작이 **passed**(영수증 `receipt-actual-20260818.json`, ready 실생 통과)했고,
|
||||
NAS→릴레이를 막던 방화벽(Python311 규칙 Public 한정 vs 이더넷 Private)을 LAN 서브넷 한정 9100 허용 규칙으로
|
||||
풀어 NAS origin health 3/3 연속 `status=ok·db=true·engine=true`, auth 401, OpenAPI 126을 실측했다(2026-08-12
|
||||
이후 처음). 남은 것: actual-origin 실제 회기 turn→review smoke 통과 전까지 current GREEN 표기는 보류하며,
|
||||
릴레이는 노트북 의존이라 NAS 로컬 agy 엔진 이전(소유자 제안)이 근본 해법 후보다. 증거:
|
||||
`docs/ops/evidence/nas-relay-recovery-2026-08-18.json`.
|
||||
- [ ] **stable-source task 재등록 + 재부팅 후 watchdog smoke** — 사용자 승인 clean commit의 detached release root에
|
||||
watchdog·로그온 boot task를 함께 재등록하고 action의 commit/tree/script SHA pin, 5분 watchdog
|
||||
`LastTaskResult=0`, 로그온 boot, 실제 Windows 재부팅 후 엔진/API/터널 자동 복구 + public `/turn`을 실측한다.
|
||||
|
|
|
|||
|
|
@ -689,6 +689,7 @@
|
|||
<p class="dg-note">208차 공개 Web 후보 고정(2026-08-12): detached-clean <code>00f851a6…c229</code>·tree <code>9f78cd16…9486</code>에서 generated API type LF 계약, <code>npm ci --ignore-scripts</code>, API type contract, typecheck와 2회 byte-identical production build를 통과했다. 새 primary CSS <code>index-Dzmt2kJS.css</code> SHA <code>da5e8535…fb9a</code>, JS <code>index-BUoTLplD.js</code> SHA <code>08654d08…3c05</code>를 고정했고, 상단 44px·로그인 무가로넘침·학생 자기주도 홈→회기→복기→재연습 focused E2E는 desktop/mobile <b>12/12</b>다. actual 공개와 최근 Pages 5개 origin의 lazy asset 133개를 더해 최종 732파일로 만들고 현행 공개 CSS/JS SHA를 exact 보존했다. actual 공개는 health ok·db/engine true·OpenAPI 126·auth 401·local voice exact, console/boot/overflow/[NAME] literal 0이지만 구 Web 상단 6개 조작면은 44px 미만이다. NAS 로그인은 200·auth 401·OpenAPI 126이지만 health timeout·9100 listener 0·모바일 overflow 10px다. 공개/NAS/API/DB/task/마이크 mutation은 0이며, Pages 승격·NAS relay·G7 physical proof를 서로 다른 승인 게이트로 유지한다. 증거는 <code>docs/ops/evidence/public-web-preflight-2026-08-12.json</code>이다.</p>
|
||||
<p class="dg-note">209차 적용·배포(2026-08-18): 공개 엔진 06:30~10:05 3.5시간 장애의 게이트웨이 결함(readiness 실패를 성공과 동일 1800초 캐시 + 고효율 콜드 프로브 20초 오판)을 실패 전용 TTL 30초 분리·타임아웃 45초로 수정해 detached-clean <code>4771b97c…c880</code>로 재승격했다(회귀 4건, backend 986 passed). 유스케이스 TDD로 <code>uc-*.spec.ts</code> 16테마 <b>239 시나리오</b>를 RED 우선 작성하고(수집 1109 tests/61 files) 지원 티켓 작성 UI·관리자 해결 노트·포커스 링·라벨/헤딩/대비/44px/오버플로 제품 결함을 닫았다. fixture 병렬 게이트 <b>1040 passed</b>(데스크톱 밀도 충돌 1건 해소 후 focused <b>68/68</b>), 직렬 게이트 52/5/4의 5실패는 삼각화해 <code>widthsFor</code> 솎아내기 실기기 폭 탈락 테스트 결함 교정·낡은 dev API(:8000) 재기동으로 kb·voice 해소, 교사 재평가 2건은 엔진 구독 한도(resets 3pm)로 skip 후 15:05 자동화로 재검증을 이관했다. 소유자 승인 아래 Cloudflare Pages production <code>4edc02d3</code>(clean <code>cf899b7f…7c96</code>, 빌드×2 결정성 599파일)를 배포 — 7개 origin에서 143자산 보존(최종 742파일), 커스텀 도메인은 새 엔트리 <code>index-BWxBaCPM.js</code>/<code>index-BUfQc2Rm.css</code> 서빙, 직전 엔트리 자산 200 보존을 확인했다(증거 <code>public-web-deploy-2026-08-18.json</code>). NAS 엔진 릴레이는 같은 승인으로 <code>start-nas-preview-engine.ps1 -CheckOnly</code>가 4종 SHA pin+LAN <code>192.168.0.223:9100</code> 바인딩으로 통과했고(mutation=false, NAS 컨테이너/DB 무접촉), 실제 1회 시작+NAS health 3회·auth 401·OpenAPI 126 재검증은 엔진 한도 리셋 뒤 동일 자동화가 수행한다(증거 <code>nas-relay-recovery-2026-08-18.json</code>).</p>
|
||||
<p class="dg-note">210차 적용·승격(2026-08-18 오후): 관리자 AI 운영에서 agy_cli 카탈로그가 빈 것은 이중 결함이었다 — ① agy CLI가 <code>agy models</code>를 <code>id<TAB>라벨</code> 형식으로 바꾼 것을 파서가 못 읽었고(<code>5afd92f8</code>), ② 승격 체인의 psutil 환경 이식에서 <code>SystemRoot</code>가 유실돼 Go 계열 CLI가 인증서 풀 해석에 실패해 빈 목록을 조용히 반환했다(<code>6369f294</code> — <code>_cli_subprocess_env</code> 필수 변수 백필 + 런처 Machine 스코프 병합). 공개 런타임을 <code>6369f294</code>로 승격하고 워치독(<code>install-public-runtime-task.ps1</code>)과 부트(<code>register-boot-task.ps1</code>) 태스크를 모두 새 루트에 재핀했다 — 부트만 갱신하면 구 루트 워치독이 5분마다 되살려 경합한다. 검증: engine_gateway <b>65 passed</b>·app <b>924 passed</b>, 공개 게이트웨이 capabilities <b>14모델</b>, 실생 턴 <code>gemini-3.6-flash-high</code> 응답·토큰/비용 계약 통과. 증거는 <code>docs/ops/evidence/agy-provider-recovery-2026-08-18.json</code>이다.</p>
|
||||
<p class="dg-note">211차 복구·재검증(2026-08-18 15:05 자동화): 엔진 구독 한도 리셋 직후 NAS 엔진 릴레이 실제 1회 시작이 4종 SHA pin 그대로 <b>passed</b>(영수증 receipt-actual-20260818.json, PID 65328, ready 실생 통과). NAS→릴레이 TCP가 막혀 있던 것은 Python311 인바운드 허용 규칙이 Public 프로필뿐인데 이더넷이 Private이라서였고, LAN 서브넷 한정 9100 허용 규칙 추가(소유자 UAC 승인) 뒤 NAS origin health <b>3/3 연속 status=ok·db·engine true</b>, auth 401, OpenAPI 126을 실측 — 2026-08-12 이후 처음이다. current GREEN 표기는 actual-origin 실제 회기 turn→review smoke가 남아 보류. 같은 자동화의 직렬 게이트 재실행은 <b>31 passed/14 failed/12 did-not-run</b>로 실패: 파서 수정 후 첫 실행된 breakpoint 실측 스윕이 settings/learner 협폭 결함 91건을 보고했고(아침 실행에선 연쇄 중단으로 미실행), session-mvp·persistence·voice 실패군은 아침 동일 웹 코드 통과에 근거해 스택·데이터 드리프트가 의심된다 — 원인 조사로 이관, 가짜 증거 금지로 게이트 pending 유지. 증거는 <code>docs/ops/evidence/nas-relay-recovery-2026-08-18.json</code>·<code>usecase-tdd-2026-08-18.json</code>이다.</p>
|
||||
<div class="dg-principles" aria-label="디자인 생성 가드레일">
|
||||
<div><b>래스터만 사용</b><span>이미지 생성 도구 산출물은 PNG 기반 시안이다. SVG·벡터·와이어프레임·로고 시트로 해석하지 않는다.</span></div>
|
||||
<div><b>기능 우선</b><span>메인 라우트의 실제 액션과 정보 구조를 먼저 반영한다. 장식은 기능을 가리지 않는 수준에서만 쓴다.</span></div>
|
||||
|
|
|
|||
|
|
@ -1,14 +1,14 @@
|
|||
{
|
||||
"schema": "vignette.nas-relay-recovery.v1",
|
||||
"captured_at": "2026-08-18T12:05:00+09:00",
|
||||
"owner_approval": "2026-08-18 소유자 지시로 남은 작업 3순위로 'NAS 엔진 릴레이 복구(start-nas-preview-engine.ps1 -CheckOnly → 실제 1회 시작 → NAS health/auth/OpenAPI 재검증)'를 명시해 마무리를 지시함. LAN 노출(192.168.0.223:9100)은 중단 세션에서 명시 승인 완료.",
|
||||
"captured_at": "2026-08-18T15:48:00+09:00",
|
||||
"owner_approval": "2026-08-18 소유자 지시로 남은 작업 3순위로 'NAS 엔진 릴레이 복구(start-nas-preview-engine.ps1 -CheckOnly → 실제 1회 시작 → NAS health/auth/OpenAPI 재검증)'를 명시해 마무리를 지시함. LAN 노출(192.168.0.223:9100)은 중단 세션에서 명시 승인 완료. 방화벽 규칙 추가(관리자 승격)는 실행 시점 소유자 UAC 승인.",
|
||||
"checkonly": {
|
||||
"status": "preflight_passed",
|
||||
"mutation": false,
|
||||
"receipt_path": "D:\\workspace\\nas-relay-state\\receipt-checkonly-20260818.json",
|
||||
"binding": {
|
||||
"source_commit": "4771b97c3a9a4c52349f8a6a55a08a3ce0a5c880",
|
||||
"source_tree": "286723de877ed950c36656d5578fdf2d57c861fa",
|
||||
"source_tree": "286723de877ed950c36656d5598fdf2d57c861fa",
|
||||
"launcher_sha256": "492d8b5c4ba21d1463c9a937ac2949f0a6d3725f6f37786f14dd5aac419fb27c",
|
||||
"python_sha256": "5f7b89a612c9b8af1d6456cdfcd1dbe5ca630849e79aebced9bee9a6694952ec",
|
||||
"env_sha256": "312afcb50c11be16d90fa6ad79c0b416f9d65c4877c06aeafd436260f18c18ec",
|
||||
|
|
@ -16,8 +16,7 @@
|
|||
"port": 9100,
|
||||
"consumer_engine_url": "http://192.168.0.223:9100",
|
||||
"secret_value_emitted": false
|
||||
},
|
||||
"note": "launcher·python SHA-256는 2026-08-12 CheckOnly 핀(492d8b5c…/5f7b89a6…)과 동일하다. env는 NAS preview API 실행 컨테이너(vignette-preview-20260807, releases/4d15d055…)의 ENGINE_GATEWAY_SHARED_SECRET(64자)을 로컬 D:\\workspace\\nas-relay-state\\nas-preview-engine.env 으로 값 노출 없이 반출해 결속했다. NAS 컨테이너·DB·설정은 건드리지 않았다(listener 9100: 0→0)."
|
||||
}
|
||||
},
|
||||
"nas_consumer_contract_observed": {
|
||||
"engine_url": "http://192.168.0.223:9100",
|
||||
|
|
@ -25,9 +24,29 @@
|
|||
"source": "docker inspect vignette-preview-20260807 api 컨테이너 환경(2026-08-18 실측)"
|
||||
},
|
||||
"actual_start": {
|
||||
"status": "pending_until_engine_limit_reset",
|
||||
"reason": "엔진 구독 세션 한도(resets 3pm KST) 동안 ready?force=true 1회 실생이 실패하면 fail-closed로 리스너를 정리하므로, 실제 시작을 리셋 후로 이관했다.",
|
||||
"automation": "15:05 KST 자동화(직렬 게이트 재검증 직후)가 동일 핀으로 actual 1회 시작 + NAS health 3회/auth 401/OpenAPI 126 재검증을 수행하고 이 파일을 갱신한다.",
|
||||
"receipt_path": "D:\\workspace\\nas-relay-state\\receipt-actual-20260818.json"
|
||||
}
|
||||
"status": "passed",
|
||||
"started_at": "2026-08-18T06:25:35Z (15:25:35 KST)",
|
||||
"receipt_path": "D:\\workspace\\nas-relay-state\\receipt-actual-20260818.json",
|
||||
"pid": 65328,
|
||||
"checks": {
|
||||
"source_detached_clean": true,
|
||||
"port_previously_unused": true,
|
||||
"listener_owner_matches": true,
|
||||
"liveness_ok": true,
|
||||
"generation_ready": true
|
||||
},
|
||||
"notes": "엔진 구독 한도(15:00 KST) 리셋 직후 15:05 자동화가 실행했다. ready?force=true 실생 1회 통과."
|
||||
},
|
||||
"firewall_fix": {
|
||||
"problem": "NAS→릴레이 TCP 연결 타임아웃(transport error). 릴레이의 Python311 인바운드 허용 규칙이 Public 프로필뿐이었고 이더넷 네트워크는 Private.",
|
||||
"fix": "인바운드 TCP 9100 허용 규칙 추가 — LocalAddress 192.168.0.223, RemoteAddress 192.168.0.0/24, Profile Private(소유자 UAC 승인). 규칙명 'Vignette NAS preview engine relay (9100 LAN)'."
|
||||
},
|
||||
"verification": {
|
||||
"local_relay_health": "http://192.168.0.223:9100/health → {ok:true, engine:claude_cli}",
|
||||
"nas_origin_health_3_consecutive": "http://100.116.83.60:8088/api/health → status=ok, db=true, engine=true, engine_detail=OK (3/3)",
|
||||
"auth_me_status": 401,
|
||||
"openapi_paths": 126,
|
||||
"nas_to_relay_probe_from_nas": "SSH YunChan@100.116.83.60 → curl 192.168.0.223:9100/health → ok:true"
|
||||
},
|
||||
"remaining_for_full_current_green": "201차 계약의 actual-origin 실제 회기 turn→review smoke는 아직 실행 전 — health/auth/OpenAPI 회복만으로 current GREEN 표기하지 않는다."
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,51 +1,62 @@
|
|||
{
|
||||
"schema": "vignette.usecase-tdd-campaign.v1",
|
||||
"captured_at": "2026-08-18T11:05:00+09:00",
|
||||
"goal": "사용자 유스케이스 200개 이상을 RED 우선 TDD로 작성하고 실패를 제품 수정 또는 근거 있는 테스트 교정으로 닫는다",
|
||||
"method": "route-fixture 전용(모든 /api/** catch-all 404 선등록, mocked auth, 실제 AI 엔진 턴 생성 0). 테마별 병렬 작성 후 chromium-desktop(1440x900)/chromium-mobile(Pixel 5) 동시 수집.",
|
||||
"themes": [
|
||||
"uc-auth-onboarding(15)", "uc-learner-home-dashboard(16)", "uc-learner-practice-history(14)",
|
||||
"uc-session-prestart(14)", "uc-session-conversation(14)", "uc-session-timer(14)",
|
||||
"uc-session-coach-voice(14)", "uc-session-review-core(15)", "uc-review-alliance-pulse(14)",
|
||||
"uc-review-rupture-repair(15)", "uc-practice-g4-g5(14)", "uc-settings-consent(15)",
|
||||
"uc-teacher-console(14)", "uc-admin-console(14)", "uc-error-resilience-shell(15)",
|
||||
"uc-a11y-mobile(22)"
|
||||
],
|
||||
"scenario_total": 239,
|
||||
"collected_inventory": "1109 tests / 61 files (npx playwright test --list, 2026-08-18)",
|
||||
"red_findings_fixed_in_product": [
|
||||
{
|
||||
"area": "settings/support-ticket",
|
||||
"finding": "서버 계약 POST /users/support-tickets가 있는데 웹 어디에도 티켓 작성 진입점이 없었다",
|
||||
"fix": "설정 지원 요청 섹션에 새 요청 작성 폼(제목/내용/전송)과 접수 확인 상태 추가 (Settings.tsx, api.ts, settings.css)"
|
||||
},
|
||||
{
|
||||
"area": "admin/ticket-resolution-note",
|
||||
"finding": "AdminTicketPatch.resolution_note 계약과 학습자 화면의 해결 메모 표시가 있는데 관리자가 노트를 남길 입력 수단이 없었다",
|
||||
"fix": "관리자 티켓 액션에 해결 노트 textarea를 추가하고 해결 시 trim 후 전송 (Admin.tsx, admin-console.css)"
|
||||
},
|
||||
{
|
||||
"area": "a11y/focus-visibility",
|
||||
"finding": "글래스 인셋 box-shadow가 전역 :focus-visible 링을 덮어 로그인·교수자 홈에서 키보드 포커스가 보이지 않았다",
|
||||
"fix": "outline 채널로 3px focus ring 추가 (ui.css, shell.css — WCAG 2.4.7)"
|
||||
},
|
||||
{
|
||||
"area": "a11y/labels-headings-contrast",
|
||||
"finding": "설정 계정 입력 라벨 미연결, 설정/리뷰 h1 헤딩 구조 결함, 설정 저장 CTA 대비 미달, 리뷰 44px 미달·설정 모바일 가로 오버플로",
|
||||
"fix": "라벨 연결·헤딩 레벨 정정·대비 토큰 보정·터치 타깃/오버플로 CSS 수정 (Settings.tsx, SessionReview.tsx, settings.css, session-review.css, session.css)"
|
||||
}
|
||||
],
|
||||
"test_side_corrections": "기존 스펙 5파일(full-sweep-admin-ai, full-sweep-auth, full-sweep-session-review, full-sweep-shell, readiness, teacher)의 실패는 제품 회귀가 아니라 계약 확장(/admin/usage 필드 추가 등)·StrictMode 이중 mount·hit-test 계약을 반영하지 못한 테스트 드리프트로 판별해 교정했다. 어설션 약화 없음.",
|
||||
"verification": {
|
||||
"web_typecheck": "tsc -b PASS",
|
||||
"backend_pytest": "986 passed (engine_gateway 62 포함)",
|
||||
"a11y_theme_rerun": "uc-a11y-mobile 44/44 (desktop 22 + mobile 22)",
|
||||
"full_parallel_gate": "docs/HANDOFF.md 2026-08-18 절이 최종 수치를 소유한다",
|
||||
"serial_single_run_gate_followup": {
|
||||
"initial_run": "2026-08-18 11:10-11:22 KST npm run e2e:single-run: 52 passed / 5 failed / 4 skipped (12.1m)",
|
||||
"triage_and_rerun": "① breakpoint-sweep '실기기 대표 폭 누락'은 widthsFor 솎아내기가 DEVICE_WIDTHS 를 boundary 중복이라고 제외 후 상한 솎기로 탈락시키는 테스트 결함(제품 아님) — keep 시드를 전체 DEVICE_WIDTHS 로 교정하고 3연폭 예외 조건을 솎아내기 발생 여부 기준으로 고침 → focused 1 passed. ② kb-source-packs 500은 게이트웨이 수정 커밋(4771b97c) 이전에 기동한 낡은 dev API(:8000) 프로세스가 원인 — 재기동 후 focused 1 passed. ③ voice-success 2 tests 재실행 2 passed(일시적 환경). ④ session-persistence 교사 재평가 2건은 엔진 실생 턴 필요 — Claude 구독 세션 한도('resets 3pm Asia/Seoul')로 엔진 가용 게이트가 skip 처리.",
|
||||
"pending": "session-persistence 교사 재평가 2건(@single-run) — 엔진 구독 한도 리셋(2026-08-18 15:00 KST) 후 e2e:single-run 재검증으로 닫는다. 초기 실패 당시 엔진 502 본문: You've hit your session limit · resets 3pm (Asia/Seoul)."
|
||||
}
|
||||
"schema": "vignette.usecase-tdd-campaign.v1",
|
||||
"captured_at": "2026-08-18T11:05:00+09:00",
|
||||
"goal": "사용자 유스케이스 200개 이상을 RED 우선 TDD로 작성하고 실패를 제품 수정 또는 근거 있는 테스트 교정으로 닫는다",
|
||||
"method": "route-fixture 전용(모든 /api/** catch-all 404 선등록, mocked auth, 실제 AI 엔진 턴 생성 0). 테마별 병렬 작성 후 chromium-desktop(1440x900)/chromium-mobile(Pixel 5) 동시 수집.",
|
||||
"themes": [
|
||||
"uc-auth-onboarding(15)",
|
||||
"uc-learner-home-dashboard(16)",
|
||||
"uc-learner-practice-history(14)",
|
||||
"uc-session-prestart(14)",
|
||||
"uc-session-conversation(14)",
|
||||
"uc-session-timer(14)",
|
||||
"uc-session-coach-voice(14)",
|
||||
"uc-session-review-core(15)",
|
||||
"uc-review-alliance-pulse(14)",
|
||||
"uc-review-rupture-repair(15)",
|
||||
"uc-practice-g4-g5(14)",
|
||||
"uc-settings-consent(15)",
|
||||
"uc-teacher-console(14)",
|
||||
"uc-admin-console(14)",
|
||||
"uc-error-resilience-shell(15)",
|
||||
"uc-a11y-mobile(22)"
|
||||
],
|
||||
"scenario_total": 239,
|
||||
"collected_inventory": "1109 tests / 61 files (npx playwright test --list, 2026-08-18)",
|
||||
"red_findings_fixed_in_product": [
|
||||
{
|
||||
"area": "settings/support-ticket",
|
||||
"finding": "서버 계약 POST /users/support-tickets가 있는데 웹 어디에도 티켓 작성 진입점이 없었다",
|
||||
"fix": "설정 지원 요청 섹션에 새 요청 작성 폼(제목/내용/전송)과 접수 확인 상태 추가 (Settings.tsx, api.ts, settings.css)"
|
||||
},
|
||||
"boundaries": "route fixture 검증이므로 실제 로그인/API/DB 증거가 아니다. 실 DB-backed 증거는 기존 @single-run·closed-loop 스펙이 소유한다."
|
||||
{
|
||||
"area": "admin/ticket-resolution-note",
|
||||
"finding": "AdminTicketPatch.resolution_note 계약과 학습자 화면의 해결 메모 표시가 있는데 관리자가 노트를 남길 입력 수단이 없었다",
|
||||
"fix": "관리자 티켓 액션에 해결 노트 textarea를 추가하고 해결 시 trim 후 전송 (Admin.tsx, admin-console.css)"
|
||||
},
|
||||
{
|
||||
"area": "a11y/focus-visibility",
|
||||
"finding": "글래스 인셋 box-shadow가 전역 :focus-visible 링을 덮어 로그인·교수자 홈에서 키보드 포커스가 보이지 않았다",
|
||||
"fix": "outline 채널로 3px focus ring 추가 (ui.css, shell.css — WCAG 2.4.7)"
|
||||
},
|
||||
{
|
||||
"area": "a11y/labels-headings-contrast",
|
||||
"finding": "설정 계정 입력 라벨 미연결, 설정/리뷰 h1 헤딩 구조 결함, 설정 저장 CTA 대비 미달, 리뷰 44px 미달·설정 모바일 가로 오버플로",
|
||||
"fix": "라벨 연결·헤딩 레벨 정정·대비 토큰 보정·터치 타깃/오버플로 CSS 수정 (Settings.tsx, SessionReview.tsx, settings.css, session-review.css, session.css)"
|
||||
}
|
||||
],
|
||||
"test_side_corrections": "기존 스펙 5파일(full-sweep-admin-ai, full-sweep-auth, full-sweep-session-review, full-sweep-shell, readiness, teacher)의 실패는 제품 회귀가 아니라 계약 확장(/admin/usage 필드 추가 등)·StrictMode 이중 mount·hit-test 계약을 반영하지 못한 테스트 드리프트로 판별해 교정했다. 어설션 약화 없음.",
|
||||
"verification": {
|
||||
"web_typecheck": "tsc -b PASS",
|
||||
"backend_pytest": "986 passed (engine_gateway 62 포함)",
|
||||
"a11y_theme_rerun": "uc-a11y-mobile 44/44 (desktop 22 + mobile 22)",
|
||||
"full_parallel_gate": "docs/HANDOFF.md 2026-08-18 절이 최종 수치를 소유한다",
|
||||
"serial_single_run_gate_followup": {
|
||||
"initial_run": "2026-08-18 11:10-11:22 KST npm run e2e:single-run: 52 passed / 5 failed / 4 skipped (12.1m)",
|
||||
"triage_and_rerun": "① breakpoint-sweep '실기기 대표 폭 누락'은 widthsFor 솎아내기가 DEVICE_WIDTHS 를 boundary 중복이라고 제외 후 상한 솎기로 탈락시키는 테스트 결함(제품 아님) — keep 시드를 전체 DEVICE_WIDTHS 로 교정하고 3연폭 예외 조건을 솎아내기 발생 여부 기준으로 고침 → focused 1 passed. ② kb-source-packs 500은 게이트웨이 수정 커밋(4771b97c) 이전에 기동한 낡은 dev API(:8000) 프로세스가 원인 — 재기동 후 focused 1 passed. ③ voice-success 2 tests 재실행 2 passed(일시적 환경). ④ session-persistence 교사 재평가 2건은 엔진 실생 턴 필요 — Claude 구독 세션 한도('resets 3pm Asia/Seoul')로 엔진 가용 게이트가 skip 처리.",
|
||||
"pending": "직렬 게이트 14실패 해소 전까지 종결 아님 — (1) 스윕이 보고한 settings/learner 협폭 레이아웃 결함 91건 제품 수정, (2) 스택·데이터 드리프트 의존 실패군 원인 규명, (3) 교사 재평가 2건 재실행이 남아 있다(가짜 증거 금지 원칙으로 이 파일의 pending은 유지).",
|
||||
"rerun_2026_08_18_15:05": "엔진 한도 리셋 직후 재실행: 31 passed / 14 failed / 4 skipped / 12 did-not-run(직렬 연쇄 중단). 교사 재평가 2건은 파일 내 선행 실패로 실행하지 못했다. 삼각화: (a) breakpoint-sweep 3종은 파서 수정 후 처음 실행된 실측 스윕이 settings/learner 320px 등에서 레이아웃 결함 91건을 보고 — 아침 실행에서는 파서 테스트 실패로 스윕이 연쇄 중단돼 실행되지 않았던 것. (b) session-mvp strict-mode 위반('코칭' 버튼 3개), session-persistence·layout-visual-gate '동맹 기준 포인터 선택' 타임아웃, voice 2종 실패는 아침 11:10 동일 웹 코드(cf899b7f)에서 통과했으므로 웹 커밋이 아닌 스택·데이터 드리프트(9099 게이트웨이 6369f294 교체, dev DB 누적 데이터)가 의심되며 원인 조사 진행 중. 게이트 엔진 경로 자체는 정상(클로드 일회/세션 턴 실측 응답)."
|
||||
}
|
||||
},
|
||||
"boundaries": "route fixture 검증이므로 실제 로그인/API/DB 증거가 아니다. 실 DB-backed 증거는 기존 @single-run·closed-loop 스펙이 소유한다."
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue