diff --git a/docs/HANDOFF.md b/docs/HANDOFF.md index 1838ba9..822f8b2 100644 --- a/docs/HANDOFF.md +++ b/docs/HANDOFF.md @@ -59,6 +59,17 @@ G8 배포 source 기준선은 branch `master`, HEAD `61a41d1f08239b5f9e99cfae42a kb-source-packs 500은 수정 커밋 이전에 기동한 낡은 dev API(:8000) 프로세스가 원인(재기동 후 passed), voice-success·session-persistence 실패는 Claude 구독 세션 한도(resets 3pm)로 엔진 502가 난 환경 결함. 교사 재평가 2건은 엔진 가용 게이트가 skip 처리하며 **15:00 KST 리셋 후 재검증이 열려 있다**. +- **공개 Web Cloudflare Pages 배포**: 소유자 지시로 detached-clean `cf899b7f…7c96` 후보 + (`D:\workspace\vignette-public-web-cf899b7f`)를 빌드×2 결정성(599파일 sha256 전일치) 확인 뒤 + production `4edc02d3`로 배포했다. 7개 origin(커스텀 도메인+직전 6세대)에서 143자산을 보존해 + 최종 742파일, 커스텀 도메인은 새 엔트리 `index-BWxBaCPM.js`/`index-BUfQc2Rm.css`를 서빙하고 + 직전 엔트리 자산도 200으로 살아 있다. 증거: `docs/ops/evidence/public-web-deploy-2026-08-18.json`. +- **NAS 엔진 릴레이 복구(1단계 종료)**: `start-nas-preview-engine.ps1 -CheckOnly` 프리플라이트가 + 4종 SHA pin + LAN `192.168.0.223:9100` 바인딩으로 통과했다(mutation=false, + 영수증 `D:\workspace\nas-relay-state\receipt-checkonly-20260818.json`). env는 NAS preview API 실행 + 컨테이너의 `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`. ### 이 문서가 인계된 정확한 중단점 diff --git a/docs/dev_dashboard.html b/docs/dev_dashboard.html index 02db097..750b7d2 100644 --- a/docs/dev_dashboard.html +++ b/docs/dev_dashboard.html @@ -687,6 +687,7 @@

206차 검증(2026-08-12): LF 계약 commit f380cc46…·tree a6865ba9…를 새 detached-clean worktree에 checkout해 tracked shell CRLF 0, 99_app_role.sh CR 0, local desktop-linux/npipe·보호 포트 재사용 0 preflight를 확인했다. 단일 periodic full run은 500.0초에 GREEN이었다. receipt periodic-learner-e2e-20260812-164929.json·SHA-256 14124ff6…ab67에서 실제 동일 학습자 회기 생성·SSE·review ready·G4/G5 0→1→1, 별도 returned-practice desktop/mobile 4/4, 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다.

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).

래스터만 사용이미지 생성 도구 산출물은 PNG 기반 시안이다. SVG·벡터·와이어프레임·로고 시트로 해석하지 않는다.
기능 우선메인 라우트의 실제 액션과 정보 구조를 먼저 반영한다. 장식은 기능을 가리지 않는 수준에서만 쓴다.
diff --git a/docs/ops/evidence/nas-relay-recovery-2026-08-18.json b/docs/ops/evidence/nas-relay-recovery-2026-08-18.json new file mode 100644 index 0000000..ff8ab69 --- /dev/null +++ b/docs/ops/evidence/nas-relay-recovery-2026-08-18.json @@ -0,0 +1,33 @@ +{ + "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)은 중단 세션에서 명시 승인 완료.", + "checkonly": { + "status": "preflight_passed", + "mutation": false, + "receipt_path": "D:\\workspace\\nas-relay-state\\receipt-checkonly-20260818.json", + "binding": { + "source_commit": "4771b97c3a9a4c52349f8a6a55a08a3ce0a5c880", + "source_tree": "286723de877ed950c36656d5578fdf2d57c861fa", + "launcher_sha256": "492d8b5c4ba21d1463c9a937ac2949f0a6d3725f6f37786f14dd5aac419fb27c", + "python_sha256": "5f7b89a612c9b8af1d6456cdfcd1dbe5ca630849e79aebced9bee9a6694952ec", + "env_sha256": "312afcb50c11be16d90fa6ad79c0b416f9d65c4877c06aeafd436260f18c18ec", + "listen_address": "192.168.0.223", + "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", + "engine_mode": "claude_cli", + "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" + } +} diff --git a/docs/ops/evidence/public-web-deploy-2026-08-18.json b/docs/ops/evidence/public-web-deploy-2026-08-18.json new file mode 100644 index 0000000..a146924 --- /dev/null +++ b/docs/ops/evidence/public-web-deploy-2026-08-18.json @@ -0,0 +1,52 @@ +{ + "schema": "vignette.public-web-deploy.v1", + "captured_at": "2026-08-18T11:55:47+09:00", + "status": "deployed_and_verified", + "owner_approval": "2026-08-18 소유자 지시로 남은 작업 2순위로 '공개 Web Cloudflare Pages 배포(프리플라이트 → wrangler pages deploy → custom domain 검증)'를 명시해 마무리를 지시함 — public-web-preflight-2026-08-12.json approval_boundaries.public_pages_deploy 요건 충족", + "source": { + "branch": "master", + "commit": "cf899b7f1594e3ec522817be7ece7af3c8e17c96", + "tree": "c69908bf76552ad3dfd247a1c4a01507ab6cccb4", + "candidate_root": "D:\\workspace\\vignette-public-web-cf899b7f", + "tracked_clean": true + }, + "candidate_gates": { + "npm_ci_ignore_scripts": "passed", + "typecheck": "passed (tsc -b)", + "production_build_runs": 2, + "production_build_deterministic": true (599/599 파일 sha256 전일치), + "file_count_before_asset_preservation": 599 + }, + "deployment": { + "project": "vignette", + "branch": "main", + "commit_hash": "cf899b7f1594e3ec522817be7ece7af3c8e17c96", + "deployment_url": "https://4edc02d3.vignette-b1q.pages.dev", + "uploaded_new": 35, + "reused_already_uploaded": 707, + "final_file_count": 742 + }, + "asset_preservation": { + "origins_checked": 7, + "origins": [ + "https://vignette.chanpaca.net", + "https://5a525329.vignette-b1q.pages.dev", + "https://e1c73735.vignette-b1q.pages.dev", + "https://bbebb2d3.vignette-b1q.pages.dev", + "https://44edecc8.vignette-b1q.pages.dev", + "https://0ffdc694.vignette-b1q.pages.dev", + "https://7bd59055.vignette-b1q.pages.dev" + ], + "assets_added": 143, + "previous_entry_preserved_check": { + "url": "https://vignette.chanpaca.net/assets/index-BrpoQ5nP.js", + "http_status": 200 + } + }, + "verification": { + "custom_domain": "https://vignette.chanpaca.net — 200, 새 엔트리 assets/index-BWxBaCPM.js + assets/index-BUfQc2Rm.css 반영", + "immutable_preview": "https://4edc02d3.vignette-b1q.pages.dev — 200", + "api_origin_map": "vignette.chanpaca.net → https://api-vignette.chanpaca.net (변경 없음, 빌드 무관 런타임 매핑)", + "public_api_health_at_deploy": "status=degraded·db=true·engine=false — Claude 구독 세션 한도(resets 3pm KST). 워치독+실패 TTL 30초 수정으로 리셋 후 자동 복구 예상. 정적 배포 자체와 무관" + } +}