diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 822f8b2..8fbbd76 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -70,6 +70,13 @@ G8 배포 source 기준선은 branch `master`, HEAD `61a41d1f08239b5f9e99cfae42a 컨테이너의 `ENGINE_GATEWAY_SHARED_SECRET`을 값 노출 없이 로컬로 반출해 결속했다. 실제 1회 시작은 엔진 한도 리셋(15:00 KST) 뒤 15:05 자동화가 같은 핀으로 수행하고 NAS health 3회·auth 401·OpenAPI 126을 재검증한다. 증거: `docs/ops/evidence/nas-relay-recovery-2026-08-18.json`. +- **agy 공급자 복구(2026-08-18 오후)**: 관리자 AI 운영에서 agy 전환이 막힌 이중 결함을 고쳤다 — + ① `agy models`가 `id라벨` 형식으로 바뀐 것을 파서가 못 읽음(5afd92f8), ② 승격 체인의 psutil + 환경 이식에서 SystemRoot 유실로 Go 계열 CLI가 빈 목록을 반환(6369f294 — `_cli_subprocess_env` + 백필 + 런처 Machine 스코프 병합). 공개 런타임을 `6369f294`로 승격하고 워치독·부트 태스크를 모두 + 새 루트에 재핀했다(**워치독은 `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`. ### 이 문서가 인계된 정확한 중단점 diff --git a/docs/dev_dashboard.html b/docs/dev_dashboard.html index 750b7d2..c1720fa 100644 --- a/docs/dev_dashboard.html +++ b/docs/dev_dashboard.html @@ -688,6 +688,7 @@

207차 UX·실회기 검증(2026-08-12): actual 공개 desktop 상단바의 브랜드·공간 전환·테마·로그아웃이 28~34px인 것을 다시 확인해, 모바일에만 있던 44px 계약을 모든 viewport로 승격했다. source는 브랜드 최소높이, 공간 링크 최소높이, 테마·로그아웃 44×44px을 유지하며 1280/1024/390/320 역할 최악 조건 2/2, 자기주도·G1~G7 route-fixture 82/82, type/API contract·production build를 통과했다. clean b02bee26…·tree 8f677bba…의 single periodic full run도 487.3초에 GREEN이었다. receipt periodic-learner-e2e-20260812-171547.json·SHA-256 8c11a136…af8e3에서 same-learner SSE·review ready·G4/G5 0→1→1, returned desktop/mobile 4/4, route mock 0, public·NAS·active DB 접촉 0과 container·volume·network·3853-3856 listener·engine PID·temp 잔여 0을 확인했다. 이 상단바와 NAS 로그인 폭 보정은 별도 승인 배포 전까지 source-only이고, current NAS health timeout·9100 listener 0은 유지된다.

208차 공개 Web 후보 고정(2026-08-12): detached-clean 00f851a6…c229·tree 9f78cd16…9486에서 generated API type LF 계약, npm ci --ignore-scripts, API type contract, typecheck와 2회 byte-identical production build를 통과했다. 새 primary CSS index-Dzmt2kJS.css SHA da5e8535…fb9a, JS index-BUoTLplD.js SHA 08654d08…3c05를 고정했고, 상단 44px·로그인 무가로넘침·학생 자기주도 홈→회기→복기→재연습 focused E2E는 desktop/mobile 12/12다. 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를 서로 다른 승인 게이트로 유지한다. 증거는 docs/ops/evidence/public-web-preflight-2026-08-12.json이다.

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이다.

래스터만 사용이미지 생성 도구 산출물은 PNG 기반 시안이다. SVG·벡터·와이어프레임·로고 시트로 해석하지 않는다.
기능 우선메인 라우트의 실제 액션과 정보 구조를 먼저 반영한다. 장식은 기능을 가리지 않는 수준에서만 쓴다.
diff --git a/docs/ops/evidence/agy-provider-recovery-2026-08-18.json b/docs/ops/evidence/agy-provider-recovery-2026-08-18.json new file mode 100644 index 0000000..2b8b1d7 --- /dev/null +++ b/docs/ops/evidence/agy-provider-recovery-2026-08-18.json @@ -0,0 +1,21 @@ +{ + "schema": "vignette.agy-provider-recovery.v1", + "captured_at": "2026-08-18T13:55:00+09:00", + "symptom": "관리자 AI 운영 화면에서 agy_cli 카탈로그가 'Agy가 선택 가능한 모델을 반환하지 않았습니다'로 비어 있어 Claude 한도 회피용 공급자 전환이 불가했다.", + "root_causes": [ + "agy CLI가 2026-08부터 'agy models' 출력을 'model_id라벨' 형태로 변경 — _discover_agy_cli가 공백 포함 줄을 전부 버려 카탈로그가 비었다. 수정: 탭 파싱 + CLI 라벨 우선(commit 5afd92f8).", + "공개 런타임 승격 체인의 psutil 환경 이식에서 SystemRoot 유실 — Go 계열 CLI(agy)가 인증서 풀/홈 해석에 실패해 빈 목록을 조용히 반환. 수정: _cli_subprocess_env() 백필 + Set-CompleteProcessEnvironment Machine 스코프 병합(commit 6369f294)." + ], + "promotion": { + "runtime_root": "D:\\workspace\\vignette-public-runtime-6369f294", + "commit": "6369f29439fab3c3998d44f8ee78d01b7a63eb66", + "tree": "237d74f0fdc9bd808b537d4669efe96d8d90ad26", + "watchdog_task": "VignettePublicRuntimeWatchdog 재등록(5분+로그온, SHA 핀) — register-boot-task.ps1이 부트 태스크만 갱신하고 워치독은 install-public-runtime-task.ps1 소관임을 확인, 승격 절차에 둘 다 포함시켰다." + }, + "verification": { + "gateway_capabilities": "GET /v1/capabilities?provider=agy_cli → available=true, 14모델, default gemini-3.6-flash-high", + "live_turn": "POST /v1/generate(provider=agy_cli, model=gemini-3.6-flash-high) → text '2', tokens_in 28423 / tokens_out 158 / cost_usd 0.0438195", + "tests": "engine_gateway 65 passed, app 924 passed, PS 5.1 parser OK", + "public_health_at_capture": "status=degraded·engine=false(Claude 구독 한도, 15:00 KST 리셋) — 소유자가 관리자 AI 운영에서 agy_cli로 전환 저장하면 생성 경로는 즉시 agy로 복구된다." + } +}