From 8a34dd2afca4cbd9029989546104df3b6bb09426 Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Tue, 18 Aug 2026 18:54:32 +0900 Subject: [PATCH] =?UTF-8?q?=ED=9A=8C=EA=B8=B0=20=EC=A2=85=EB=A3=8C=20503?= =?UTF-8?q?=20=ED=95=AB=ED=94=BD=EC=8A=A4=20=EC=A6=9D=EA=B1=B0=C2=B7?= =?UTF-8?q?=ED=95=B8=EB=93=9C=EC=98=A4=ED=94=84=C2=B7=EB=8C=80=EC=8B=9C?= =?UTF-8?q?=EB=B3=B4=EB=93=9C=20=EB=8F=99=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 대시보드 212차 노트(공개 DB 롤백 재현: learner 거부·AI evaluator 뷰 통과), HANDOFF 핫픽스 항목 추가, SSOT 체커 59 PASS --- docs/HANDOFF.md | 5 +++++ docs/dev_dashboard.html | 1 + 2 files changed, 6 insertions(+) diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 8fbbd76..2249ecc 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -77,6 +77,11 @@ G8 배포 source 기준선은 branch `master`, HEAD `61a41d1f08239b5f9e99cfae42a 새 루트에 재핀했다(**워치독은 `install-public-runtime-task.ps1`, 부트는 `register-boot-task.ps1` — 승격 시 둘 다 실행해야 구 루트 되살림 경합이 없다**). 검증: capabilities 14모델 + 실생 턴 `gemini-3.6-flash-high` 응답·비용 계약 통과. 증거: `docs/ops/evidence/agy-provider-recovery-2026-08-18.json`. +- **회기 종료 503 핫픽스(bf5f7352)**: `end_session`의 pinned_fact upsert가 learner 역할 연결로 실행돼 + RLS에 거부되던 잠복 결함 — pinned_fact의 SELECT/UPDATE 정책은 AI 뷰·admin 전용이다. 같은 learner + uid로 `acquire(ai_view="evaluator")`를 열어 저장을 분리했고, 공개 DB 롤백 재현(learner 거부·AI 뷰 + 통과)으로 실증했다. 엔진 건강 시 deep 평가가 팩트를 반환하는 순간부터 발화하므로, degraded 구간 + E2E가 이 경로를 덮지 못한 이유도 같다. ### 이 문서가 인계된 정확한 중단점 diff --git a/docs/dev_dashboard.html b/docs/dev_dashboard.html index aa795f1..bf72720 100644 --- a/docs/dev_dashboard.html +++ b/docs/dev_dashboard.html @@ -690,6 +690,7 @@

209차 적용·배포(2026-08-18): 공개 엔진 06:30~10:05 3.5시간 장애의 게이트웨이 결함(readiness 실패를 성공과 동일 1800초 캐시 + 고효율 콜드 프로브 20초 오판)을 실패 전용 TTL 30초 분리·타임아웃 45초로 수정해 detached-clean 4771b97c…c880로 재승격했다(회귀 4건, backend 986 passed). 유스케이스 TDD로 uc-*.spec.ts 16테마 239 시나리오를 RED 우선 작성하고(수집 1109 tests/61 files) 지원 티켓 작성 UI·관리자 해결 노트·포커스 링·라벨/헤딩/대비/44px/오버플로 제품 결함을 닫았다. fixture 병렬 게이트 1040 passed(데스크톱 밀도 충돌 1건 해소 후 focused 68/68), 직렬 게이트 52/5/4의 5실패는 삼각화해 widthsFor 솎아내기 실기기 폭 탈락 테스트 결함 교정·낡은 dev API(:8000) 재기동으로 kb·voice 해소, 교사 재평가 2건은 엔진 구독 한도(resets 3pm)로 skip 후 15:05 자동화로 재검증을 이관했다. 소유자 승인 아래 Cloudflare Pages production 4edc02d3(clean cf899b7f…7c96, 빌드×2 결정성 599파일)를 배포 — 7개 origin에서 143자산 보존(최종 742파일), 커스텀 도메인은 새 엔트리 index-BWxBaCPM.js/index-BUfQc2Rm.css 서빙, 직전 엔트리 자산 200 보존을 확인했다(증거 public-web-deploy-2026-08-18.json). NAS 엔진 릴레이는 같은 승인으로 start-nas-preview-engine.ps1 -CheckOnly가 4종 SHA pin+LAN 192.168.0.223:9100 바인딩으로 통과했고(mutation=false, NAS 컨테이너/DB 무접촉), 실제 1회 시작+NAS health 3회·auth 401·OpenAPI 126 재검증은 엔진 한도 리셋 뒤 동일 자동화가 수행한다(증거 nas-relay-recovery-2026-08-18.json).

210차 적용·승격(2026-08-18 오후): 관리자 AI 운영에서 agy_cli 카탈로그가 빈 것은 이중 결함이었다 — ① agy CLI가 agy modelsid<TAB>라벨 형식으로 바꾼 것을 파서가 못 읽었고(5afd92f8), ② 승격 체인의 psutil 환경 이식에서 SystemRoot가 유실돼 Go 계열 CLI가 인증서 풀 해석에 실패해 빈 목록을 조용히 반환했다(6369f294_cli_subprocess_env 필수 변수 백필 + 런처 Machine 스코프 병합). 공개 런타임을 6369f294로 승격하고 워치독(install-public-runtime-task.ps1)과 부트(register-boot-task.ps1) 태스크를 모두 새 루트에 재핀했다 — 부트만 갱신하면 구 루트 워치독이 5분마다 되살려 경합한다. 검증: engine_gateway 65 passed·app 924 passed, 공개 게이트웨이 capabilities 14모델, 실생 턴 gemini-3.6-flash-high 응답·토큰/비용 계약 통과. 증거는 docs/ops/evidence/agy-provider-recovery-2026-08-18.json이다.

211차 복구·재검증(2026-08-18 15:05 자동화): 엔진 구독 한도 리셋 직후 NAS 엔진 릴레이 실제 1회 시작이 4종 SHA pin 그대로 passed(영수증 receipt-actual-20260818.json, PID 65328, ready 실생 통과). NAS→릴레이 TCP가 막혀 있던 것은 Python311 인바운드 허용 규칙이 Public 프로필뿐인데 이더넷이 Private이라서였고, LAN 서브넷 한정 9100 허용 규칙 추가(소유자 UAC 승인) 뒤 NAS origin health 3/3 연속 status=ok·db·engine true, auth 401, OpenAPI 126을 실측 — 2026-08-12 이후 처음이다. current GREEN 표기는 actual-origin 실제 회기 turn→review smoke가 남아 보류. 같은 자동화의 직렬 게이트 재실행은 31 passed/14 failed/12 did-not-run로 실패: 파서 수정 후 첫 실행된 breakpoint 실측 스윕이 settings/learner 협폭 결함 91건을 보고했고(아침 실행에선 연쇄 중단으로 미실행), session-mvp·persistence·voice 실패군은 아침 동일 웹 코드 통과에 근거해 스택·데이터 드리프트가 의심된다 — 원인 조사로 이관, 가짜 증거 금지로 게이트 pending 유지. 증거는 docs/ops/evidence/nas-relay-recovery-2026-08-18.json·usecase-tdd-2026-08-18.json이다.

+

212차 핫픽스(2026-08-18 오후): 공개 POST /sessions/{id}/end 503(소유자 실사용 보고)의 원인은 회기 종료의 pinned_fact upsert가 learner 역할 연결로 실행된 것이었다. app.pinned_fact RLS는 learner에 INSERT(소유 케이스)만 허용하고 SELECT/UPDATE는 AI 컨텍스트·admin/instructor 전용이라 SELECT … FOR UPDATE + INSERT … ON CONFLICT DO UPDATE 조합이 충돌 후보 가시성에서 InsufficientPrivilegeError로 실패하고 fallback 차단이 503으로 노출됐다. 공개 DB 롤백 재현으로 단순 INSERT는 통과·ON CONFLICT 조합은 거부·ai_view=evaluator 컨텍스트는 전체 upsert 통과를 실증했고(bf5f7352), pinned_fact 저장만 같은 learner uid의 AI evaluator 뷰 연결로 분리했다. 검증: 관련 62 passed·app 924 passed, 공개 8001 승격 후 health ok. 엔진이 건강해 deep 평가가 처음 팩트를 반환한 순간 발화한 잠복 결함으로, 아침 degraded 구간엔 팩트가 비어 이 경로가 실행되지 않았다.

래스터만 사용이미지 생성 도구 산출물은 PNG 기반 시안이다. SVG·벡터·와이어프레임·로고 시트로 해석하지 않는다.
기능 우선메인 라우트의 실제 액션과 정보 구조를 먼저 반영한다. 장식은 기능을 가리지 않는 수준에서만 쓴다.