NAS current GREEN 달성과 심야 연쇄 복구 증거
- 대청소 사건·Docker 사망·WinNAT 포트 예약·DHCP IP 회수 연쇄 복구 기록
- 릴레이 bf5f7352 재핀(r3) + 192.168.0.224 계약 이전(방화벽·NAS .env 재구성)
- NAS agy_cli 전환으로 health 3/3 engine true + actual-origin turn→review smoke 통과
— 201차 current GREEN 조건 전부 충족, TODO 항목 종결
- 직렬 게이트 잔여: 동맹 포인터 타임아웃 결정 재현(3/3)·스윕 협폭 결함과 함께 조사 이관 기록
- 대시보드 213차 노트, 수집량 1111 갱신(체커 요구), SSOT 59 PASS
This commit is contained in:
parent
70d7cb34a3
commit
0a00ff245a
6 changed files with 100 additions and 61 deletions
|
|
@ -687,10 +687,11 @@
|
|||
<p class="dg-note">206차 검증(2026-08-12): LF 계약 commit <code>f380cc46…</code>·tree <code>a6865ba9…</code>를 새 detached-clean worktree에 checkout해 tracked shell CRLF 0, <code>99_app_role.sh</code> CR 0, local desktop-linux/npipe·보호 포트 재사용 0 preflight를 확인했다. 단일 periodic full run은 500.0초에 <b>GREEN</b>이었다. receipt <code>periodic-learner-e2e-20260812-164929.json</code>·SHA-256 <code>14124ff6…ab67</code>에서 실제 동일 학습자 회기 생성·SSE·review ready·G4/G5 <code>0→1→1</code>, 별도 returned-practice desktop/mobile <b>4/4</b>, route mock 0을 확인했다. public·NAS·active DB 접촉은 0이고 container·volume·network·2726-2729 listener·engine PID·temp 잔여도 0이다. current source의 주기 회기 gate는 GREEN으로 복귀했으며, 공개 톱바 44px와 NAS 로그인 폭 보정은 별도 승인 배포 전까지 source-only다.</p>
|
||||
<p class="dg-note">207차 UX·실회기 검증(2026-08-12): actual 공개 desktop 상단바의 브랜드·공간 전환·테마·로그아웃이 28~34px인 것을 다시 확인해, 모바일에만 있던 44px 계약을 모든 viewport로 승격했다. source는 브랜드 최소높이, 공간 링크 최소높이, 테마·로그아웃 44×44px을 유지하며 1280/1024/390/320 역할 최악 조건 <b>2/2</b>, 자기주도·G1~G7 route-fixture <b>82/82</b>, type/API contract·production build를 통과했다. clean <code>b02bee26…</code>·tree <code>8f677bba…</code>의 single periodic full run도 487.3초에 <b>GREEN</b>이었다. receipt <code>periodic-learner-e2e-20260812-171547.json</code>·SHA-256 <code>8c11a136…af8e3</code>에서 same-learner SSE·review ready·G4/G5 <code>0→1→1</code>, returned desktop/mobile <b>4/4</b>, 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은 유지된다.</p>
|
||||
<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">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 우선 작성하고(수집 1111 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>
|
||||
<p class="dg-note">212차 핫픽스(2026-08-18 오후): 공개 <code>POST /sessions/{id}/end</code> 503(소유자 실사용 보고)의 원인은 회기 종료의 pinned_fact upsert가 <b>learner 역할 연결</b>로 실행된 것이었다. <code>app.pinned_fact</code> RLS는 learner에 INSERT(소유 케이스)만 허용하고 SELECT/UPDATE는 AI 컨텍스트·admin/instructor 전용이라 <code>SELECT … FOR UPDATE + INSERT … ON CONFLICT DO UPDATE</code> 조합이 충돌 후보 가시성에서 <code>InsufficientPrivilegeError</code>로 실패하고 fallback 차단이 503으로 노출됐다. 공개 DB 롤백 재현으로 단순 INSERT는 통과·ON CONFLICT 조합은 거부·<code>ai_view=evaluator</code> 컨텍스트는 전체 upsert 통과를 실증했고(<code>bf5f7352</code>), pinned_fact 저장만 같은 learner uid의 AI evaluator 뷰 연결로 분리했다. 검증: 관련 62 passed·app <b>924 passed</b>, 공개 8001 승격 후 health ok. 엔진이 건강해 deep 평가가 처음 팩트를 반환한 순간 발화한 잠복 결함으로, 아침 degraded 구간엔 팩트가 비어 이 경로가 실행되지 않았다.</p>
|
||||
<p class="dg-note">213차 복구·전환(2026-08-18 심야): 대청소 사건(node_modules·구 런타임 워크트리·Temp 소실)과 Docker Desktop 사망·whisper 9882 WinNAT 포트 예약·DHCP LAN IP 회수(223→224)가 연쇄 발생했다. 릴레이를 현행 루트 <code>bf5f7352</code>에 같은 4종 핀으로 재기동(r3 영수증)하고 <code>192.168.0.224:9100</code>으로 바인딩(방화벽 규칙 재발행), NAS는 실행 컨테이너 env 전량을 <code>.env(0600)</code>로 재구성해 ENGINE_URL 224 적용 후 api만 재생성했다. 클로드 예산 한도(Reached maximum budget $0.5)가 재발해 NAS ENGINE_MODE를 <code>agy_cli</code>(gemini)로 전환 — 공개는 소유자가 이미 관리자 UI로 agy 전환 완료. 결과: NAS origin health <b>3/3 status=ok·db·engine true</b>, auth 401, OpenAPI 126, <b>actual-origin 실회기 turn→review smoke 통과</b>(agy 턴 2개→종료 200→리뷰 200) — 2026-08-12 이후 처음으로 201차 current GREEN 조건을 모두 충족했다. 회기 종료 503 핫픽스(<code>bf5f7352</code>)도 소유자 실세션 종료 성공으로 운영 검증. 권고: 공유기 DHCP 예약(호스트 MAC), Docker VM 클럭 동기화(호스트 대비 ~4일 선행 — DB 타임스탬프 오염), NAS 로컬 agy 이전. 증거는 <code>docs/ops/evidence/nas-relay-recovery-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>
|
||||
|
|
@ -1101,7 +1102,7 @@
|
|||
<tbody>
|
||||
<tr><td>Web typecheck</td><td><code>npm run typecheck</code></td><td>Passed</td></tr>
|
||||
<tr><td>Design SSOT / auth visual</td><td><code>npm run check:design-ssot</code> / <code>npx playwright test e2e/auth-visual.spec.ts --project=chromium-single-run --reporter=line</code> / <code>npx playwright test e2e/layout-visual-gate.spec.ts --project=chromium-single-run --reporter=line</code></td><td>SSOT checker passed; login/onboarding light-dark desktop-mobile 1 passed; 14 core screens × 7 widths visual gate 14 passed.</td></tr>
|
||||
<tr><td>Full Playwright E2E baseline</td><td><code>npm run e2e:parallel</code> / <code>npm run e2e:single-run</code> / <code>npm run e2e:list</code></td><td>2026-08-18 현재 수집은 <b>1109 tests / 61 files</b>다(유스케이스 16테마 <code>uc-*.spec.ts</code> 239 시나리오 추가). 이 숫자는 수집량이며 현 작업트리 전체 GREEN과 동일하지 않다. G8 clean-head release gate는 candidate 112/112와 실제 NAS-origin 112/112를 통과했다. 이전 단일 120/120과 2026-07-15의 fixture desktop/mobile 166/166 + DB/engine/provider 직렬 49/49 = 215/215는 범위가 다른 역사 기준선으로 보존한다.</td></tr>
|
||||
<tr><td>Full Playwright E2E baseline</td><td><code>npm run e2e:parallel</code> / <code>npm run e2e:single-run</code> / <code>npm run e2e:list</code></td><td>2026-08-18 현재 수집은 <b>1111 tests / 61 files</b>다(유스케이스 16테마 <code>uc-*.spec.ts</code> 239 시나리오 추가). 이 숫자는 수집량이며 현 작업트리 전체 GREEN과 동일하지 않다. G8 clean-head release gate는 candidate 112/112와 실제 NAS-origin 112/112를 통과했다. 이전 단일 120/120과 2026-07-15의 fixture desktop/mobile 166/166 + DB/engine/provider 직렬 49/49 = 215/215는 범위가 다른 역사 기준선으로 보존한다.</td></tr>
|
||||
<tr><td>Refactor governance P1~P8</td><td><code>ruff check app</code> / <code>pytest -q app</code> / <code>pytest -q engine_gateway</code> / <code>npm run typecheck</code> / <code>npm run check:api-types</code> / <code>npm run check:design-ssot</code> / <code>npm run check:dead-code</code> / <code>npm run check:duplication</code> / <code>npm run build</code> / <code>npm audit --audit-level=high</code> / full Playwright</td><td>Backend 400 passed, gateway 29 passed, web gates/build/audit passed, vulnerabilities 0, production duplication 1 clone/15 lines/0.03%, Playwright 215/215 passed. 상세 근거는 <code>ops/refactor-governance-2026-07-15.md</code>.</td></tr>
|
||||
<tr><td>API typegen SSOT</td><td><code>npm run check:api-types</code></td><td>Passed; FastAPI OpenAPI → <code>src/lib/api.gen.ts</code> stale check</td></tr>
|
||||
<tr><td>Outcome & Alliance OS G0</td><td><code>py -3.11 -X utf8 -m pytest -p no:cacheprovider apps/api/app/test_measurement_contract.py apps/api/app/test_runtime_schema_ssot.py -q</code> / <code>scripts/check-measurement-ledger.sql</code> / measurement·API contract checks / web typecheck / DB-backed <code>session-persistence</code> focused E2E 3종</td><td>G0 contract/schema 11 passed, 기존 backend 100 passed, auth 39 passed. Python→JSON Schema→TypeScript→PostgreSQL enum·필수필드 계약이 일치하고 8개 deterministic benchmark가 검증됐다. Live PostgreSQL에서 learner/client/evaluator 가시 행 1/1/2, 교차 누수 0, append-only guard 2를 확인했다. 학습자 턴→교수자 대시보드, 워크시트 검수, 종료 deep 평가→durable 리뷰 E2E는 각각 1 passed. G0/AOS-001~004 완료.</td></tr>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue