운영 배포 결과와 기동 확인 절차 보완

This commit is contained in:
Yun Chan 2026-09-09 15:00:00 +09:00
parent 1306c524c1
commit 6831a79ffb
8 changed files with 41 additions and 23 deletions

View file

@ -8,11 +8,13 @@
2026-09-09 최신 [개선관리 워크북](https://docs.google.com/spreadsheets/d/1MNRDfXoIQJbLzIcSRdHnQHREWELbKqV4/edit?pli=1&gid=1294900115#gid=1294900115)을 읽기 전용으로 재점검했다. 다운로드 원본 SHA-256 `f64bbc859354e8bfdd62bb3393cffd841ca3a0d865983967a149aea7cf569773`의 14개 항목은 완료 13·검토 1(C-001)이며 REQ-008~011도 원본 완료다. [항목별 구현 매핑](./ops/spreadsheet-implementation-audit-2026-09-09.md)은 원본 완료 표기, 현재 로컬 검증, 배포 상태를 분리한다. 원본 워크북은 수정하지 않았다. 2026-09-09 최신 [개선관리 워크북](https://docs.google.com/spreadsheets/d/1MNRDfXoIQJbLzIcSRdHnQHREWELbKqV4/edit?pli=1&gid=1294900115#gid=1294900115)을 읽기 전용으로 재점검했다. 다운로드 원본 SHA-256 `f64bbc859354e8bfdd62bb3393cffd841ca3a0d865983967a149aea7cf569773`의 14개 항목은 완료 13·검토 1(C-001)이며 REQ-008~011도 원본 완료다. [항목별 구현 매핑](./ops/spreadsheet-implementation-audit-2026-09-09.md)은 원본 완료 표기, 현재 로컬 검증, 배포 상태를 분리한다. 원본 워크북은 수정하지 않았다.
REQ-010의 추가 결함은 0턴/client-only 회기가 대시보드의 첫 완료·반복·경험 배지 집계에 포함되는 것이었다. 기존 완료 집계와 같은 counselor/learner 발화 조건으로 정렬했고, 계약 RED 4건 뒤 GREEN 4건, 지정 API 20건과 API 전체 1108 passed / 1 skipped / 1 warning을 통과했다. `uc-session-conversation``calibration-transfer` route fixture browser 재검증도 44 passed / 0 failed / 0 skipped로 수용했다. 이 browser 증거는 local fixture 기반이며 이번 변경은 build 미실행·새 public live 검증 미실행·미배포다. REQ-010의 추가 결함은 0턴/client-only 회기가 대시보드의 첫 완료·반복·경험 배지 집계에 포함되는 것이었다. 기존 완료 집계와 같은 counselor/learner 발화 조건으로 정렬했고, 계약 RED 4건 뒤 GREEN 4건, 지정 API 20건과 API 전체 1108 passed / 1 skipped / 1 warning을 통과했다. `uc-session-conversation``calibration-transfer` route fixture browser 재검증도 44 passed / 0 failed / 0 skipped로 수용했다. 이 문단의 증거는 워크북 감사 단계의 local fixture 기록이며 당시 build·새 public live 검증·배포 미실행을 뜻한다.
2026-09-08 Forgejo master `a0311c59`(배포 문서 포함 `d9bb5b36`)의 NAS/Cloudflare Pages 배포, 사전 DB 덤프·컨테이너 교체·당시 public health/auth/web 폐루프와 API 1104 passed 기록은 [배포 파이프라인](./ops/deployment-pipeline.md)과 [1차 배포 증거](./ops/evidence/nas-prod-deploy-2026-09-01.json)에 보존한다. 이는 오늘의 새 live 검증이나 현재 작업트리 배포 상태가 아니다. 2026-09-08 Forgejo master `a0311c59`(배포 문서 포함 `d9bb5b36`)의 NAS/Cloudflare Pages 배포, 사전 DB 덤프·컨테이너 교체·당시 public health/auth/web 폐루프와 API 1104 passed 기록은 [배포 파이프라인](./ops/deployment-pipeline.md)과 [1차 배포 증거](./ops/evidence/nas-prod-deploy-2026-09-01.json)에 보존한다. 이는 오늘의 새 live 검증이나 현재 작업트리 배포 상태가 아니다.
실배포 CUA 128 시나리오는 카탈로그 생성만 끝났고 전체 검증은 끝나지 않았다. H09 기록 검색·필터 복귀와 T18 감독·연구 drilldown은 배포에서 RED다. H09는 local 16 passed, T18은 API 12 passed·local 교수자 15 passed로 수정 검증했지만 배포 재검증이 필요하다. 관리자와 일반 학습자 로그인에서 학습자의 `/admin`·`/teach``/learn` 차단과 P4 추천 일치를 확인했다. 순수 teacher, 독립 관찰자 공개 검증, OFF 계정, 교수자 쓰기와 모바일 실행은 남아 있다. 상세는 [실배포 CUA 보고](./qa/production-computer-use-report-2026-09-09.md)를 따른다. 2026-09-09 SHA `1306c524`은 Forgejo에 동기화해 NAS API·engine 이미지 `c02036e8c814…`, web 이미지 `74f334f52d78…`, Pages preview `04f97f32`/`index-CEq_FjVS`로 배포했다. API·engine 동시 기동 중 사용자가 다운을 보고했으나 rollback 없이 같은 버전에서 healthy, 공개 `/health`의 db/engine true, `/auth/me` 401, 웹 200, P4 학습자 회기 1회 6턴과 DB 전체 집계 전후 동일을 확인했다. 이는 운영 실배포 완료 기록이며 무중단 증거는 아니다. GitHub 미러 push는 auto-review 거절로 실행하지 않아 Forgejo 동기화만 완료했다.
실배포 CUA 128 시나리오는 카탈로그 생성만 끝났고 전체 검증은 끝나지 않았다. H09 기록 검색·필터 복귀는 SHA `1306c524` 실제 배포에서 PASS로 재확인했지만, T18 감독·연구 drilldown은 수정 배포 뒤에도 learner 브라우저만 있어 기존 RED를 종결하지 않았다. 관리자와 일반 학습자 로그인에서 학습자의 `/admin`·`/teach``/learn` 차단과 P4 추천, R09 잠금과 R14 워크시트 보존을 확인했다. 순수 teacher, 독립 관찰자 공개 검증, OFF 계정, 교수자 쓰기와 모바일 실행은 남아 있다. 상세는 [실배포 CUA 보고](./qa/production-computer-use-report-2026-09-09.md)를 따른다.
## 남은 실행 항목 ## 남은 실행 항목

View file

@ -109,7 +109,7 @@
| [`ops/evidence/avatar-image-resilience-recovery-2026-08-29.json`](./ops/evidence/avatar-image-resilience-recovery-2026-08-29.json) | 공개 아바타 404 원인·시점 복구·인증 브라우저 DOM과 공통 이미지 fallback 후보의 privacy-safe 증거 | | [`ops/evidence/avatar-image-resilience-recovery-2026-08-29.json`](./ops/evidence/avatar-image-resilience-recovery-2026-08-29.json) | 공개 아바타 404 원인·시점 복구·인증 브라우저 DOM과 공통 이미지 fallback 후보의 privacy-safe 증거 |
| [`ops/evidence/req008-reboot-preflight-2026-08-29.json`](./ops/evidence/req008-reboot-preflight-2026-08-29.json) | REQ-008 실제 재부팅 전 read-only task/runtime 사전점검 스냅샷 — 현재 public outage와 실제 reboot smoke가 이를 대체·완료하지 않음 | | [`ops/evidence/req008-reboot-preflight-2026-08-29.json`](./ops/evidence/req008-reboot-preflight-2026-08-29.json) | REQ-008 실제 재부팅 전 read-only task/runtime 사전점검 스냅샷 — 현재 public outage와 실제 reboot smoke가 이를 대체·완료하지 않음 |
| [`ops/spreadsheet-implementation-audit-2026-09-09.md`](./ops/spreadsheet-implementation-audit-2026-09-09.md) | 최신 개선관리 원본 14개 항목의 완료 13·검토 1(C-001)과 로컬 재검증·미배포 경계 | | [`ops/spreadsheet-implementation-audit-2026-09-09.md`](./ops/spreadsheet-implementation-audit-2026-09-09.md) | 최신 개선관리 원본 14개 항목의 완료 13·검토 1(C-001)과 로컬 재검증·미배포 경계 |
| [`qa/production-computer-use-report-2026-09-09.md`](./qa/production-computer-use-report-2026-09-09.md) | 실제 배포 CUA 128 카탈로그·ledger, H09/T18 local 수정과 배포 재검증 경계 | | [`qa/production-computer-use-report-2026-09-09.md`](./qa/production-computer-use-report-2026-09-09.md) | 실제 배포 CUA 128 카탈로그·ledger, SHA `1306c524` H09 PASS와 T18 역할 재검증 경계 |
| [`ops/evidence/professor-summary-gap-deploy-2026-08-29.json`](./ops/evidence/professor-summary-gap-deploy-2026-08-29.json) | 교수자 검토 큐·요약 카드 12px 분리의 RED→GREEN·7폭/전체 시각 게이트·clean Pages 배포·실서비스 DOM 증거 | | [`ops/evidence/professor-summary-gap-deploy-2026-08-29.json`](./ops/evidence/professor-summary-gap-deploy-2026-08-29.json) | 교수자 검토 큐·요약 카드 12px 분리의 RED→GREEN·7폭/전체 시각 게이트·clean Pages 배포·실서비스 DOM 증거 |
| [`ops/public-db-recovery-rehearsal-2026-08-07.md`](./ops/public-db-recovery-rehearsal-2026-08-07.md) | 공개 DB 데이터 교체 사고의 RLS/volume 포렌식, 이중 dump, 격리 복구·최신 migration/API 리허설과 승인형 cutover/rollback 게이트 | | [`ops/public-db-recovery-rehearsal-2026-08-07.md`](./ops/public-db-recovery-rehearsal-2026-08-07.md) | 공개 DB 데이터 교체 사고의 RLS/volume 포렌식, 이중 dump, 격리 복구·최신 migration/API 리허설과 승인형 cutover/rollback 게이트 |
| [`ops/server-migration-runbook-draft.md`](./ops/server-migration-runbook-draft.md) | 서버 이관 런북 초안(자택→학교 정보처) — 이식성 이슈·DB dump/restore·엔진 모드 전환·검증 (초안) | | [`ops/server-migration-runbook-draft.md`](./ops/server-migration-runbook-draft.md) | 서버 이관 런북 초안(자택→학교 정보처) — 이식성 이슈·DB dump/restore·엔진 모드 전환·검증 (초안) |

View file

@ -52,7 +52,7 @@
| MIGRATION-001 | idempotent DB migration runner 도입 여부를 결정한다. | init SQL과 runner의 역할 경계, 인프라 영향, 소유자 승인을 확정한다. | | MIGRATION-001 | idempotent DB migration runner 도입 여부를 결정한다. | init SQL과 runner의 역할 경계, 인프라 영향, 소유자 승인을 확정한다. |
| OPS-001 | 운영 티켓 자동 분류·처리 후속을 설계한다. | 관리자 승인 뒤 이슈/PR/작업 스레드를 생성하는 범위와 audit 경계를 확정한다. | | OPS-001 | 운영 티켓 자동 분류·처리 후속을 설계한다. | 관리자 승인 뒤 이슈/PR/작업 스레드를 생성하는 범위와 audit 경계를 확정한다. |
| E2E-001 | 전 기능 E2E 후속을 분류한다. | 이번 focused 범위에서 locator 18건을 교정하고 keyboard 1건을 해결했다. `npm run e2e` 전 기능 묶음에서 focused 범위 밖 케이스를 실행하고 실패별 재현·원인·수정 명령을 분류한다. 과거 sweep 실패를 오늘 재현 결함으로 단정하지 않으며, 실API/DB·장치 검증은 fixture 결과와 분리한다. | | E2E-001 | 전 기능 E2E 후속을 분류한다. | 이번 focused 범위에서 locator 18건을 교정하고 keyboard 1건을 해결했다. `npm run e2e` 전 기능 묶음에서 focused 범위 밖 케이스를 실행하고 실패별 재현·원인·수정 명령을 분류한다. 과거 sweep 실패를 오늘 재현 결함으로 단정하지 않으며, 실API/DB·장치 검증은 fixture 결과와 분리한다. |
| CUA-128 | 실제 배포 Computer Use 128 시나리오를 역할·승인 경계 안에서 재개한다. | 카탈로그 생성은 완료했으나 실배포 전체 검증은 미완료다. 일반 학습자 로그인·교차 역할 차단·P4 추천과 허용된 관리자 P16 1개·학습자 P4 1개 회기 종료를 확인했지만 H09·T18은 배포 재검증이 열려 있다. 순수 teacher·OFF 계정, 교수자 쓰기, 모바일과 독립 관찰자 공개 검증이 남아 있다. [실행 보고](./qa/production-computer-use-report-2026-09-09.md)를 따른다. | | CUA-128 | 실제 배포 Computer Use 128 시나리오를 역할·승인 경계 안에서 재개한다. | 카탈로그 생성은 완료했으나 실배포 전체 검증은 미완료다. SHA `1306c524`에서 H09와 일반 학습자 로그인·교차 역할 차단·P4 추천·R09 잠금·R14 워크시트 보존을 재확인했지만, T18은 learner 브라우저만 있어 기존 RED를 종결하지 않았다. 순수 teacher·OFF 계정, 교수자 쓰기, 모바일과 독립 관찰자 공개 검증이 남아 있다. [실행 보고](./qa/production-computer-use-report-2026-09-09.md)를 따른다. |
## 임상 콘텐츠 후속 ## 임상 콘텐츠 후속
@ -71,6 +71,7 @@
| 원본 14개 항목 | 원본 완료 13 · 검토 1 | 2026-09-09 최신 원본에서 REQ-001~011과 C-002·C-003은 완료, C-001은 검토다. 과거 완료 9·검토 2는 당시 11개 항목 수집본의 역사 기록이다. | | 원본 14개 항목 | 원본 완료 13 · 검토 1 | 2026-09-09 최신 원본에서 REQ-001~011과 C-002·C-003은 완료, C-001은 검토다. 과거 완료 9·검토 2는 당시 11개 항목 수집본의 역사 기록이다. |
| NAS A 경로 | 2026-09-01 당시 완료 | NAS `vignette-prod` 배포, migration 20/21/22, OAuth 실계정 새 사례→턴→리뷰 E2E, 첫 일일 backup sidecar 실행. | | NAS A 경로 | 2026-09-01 당시 완료 | NAS `vignette-prod` 배포, migration 20/21/22, OAuth 실계정 새 사례→턴→리뷰 E2E, 첫 일일 backup sidecar 실행. |
| NAS 2차 실배포 & Cloudflare Pages | 2026-09-08 당시 배포 기록 | Forgejo/GitHub master `a0311c59`/`d9bb5b36`의 당시 NAS API·Web 컨테이너 교체, 사전 DB 덤프(12MB), Cloudflare Pages 174개 에셋과 당시 health/auth/web 폐루프·TDD 1104 passed 기록을 보존한다. 이는 2026-09-09의 새 live 검증이나 현재 작업트리 배포 상태 주장이 아니다. [배포 파이프라인](./ops/deployment-pipeline.md) 참조. | | NAS 2차 실배포 & Cloudflare Pages | 2026-09-08 당시 배포 기록 | Forgejo/GitHub master `a0311c59`/`d9bb5b36`의 당시 NAS API·Web 컨테이너 교체, 사전 DB 덤프(12MB), Cloudflare Pages 174개 에셋과 당시 health/auth/web 폐루프·TDD 1104 passed 기록을 보존한다. 이는 2026-09-09의 새 live 검증이나 현재 작업트리 배포 상태 주장이 아니다. [배포 파이프라인](./ops/deployment-pipeline.md) 참조. |
| NAS 3차 실배포 | 2026-09-09 운영 배포 기록 | Forgejo `1306c524`의 NAS API·engine·web과 Pages preview를 배포했다. 동시 API·engine 기동의 공백 관찰 뒤 같은 버전에서 healthy, public health db/engine true, auth 401, web 200, P4 6턴과 DB 전체 집계 동일을 확인했다. 무중단 증거가 아니며 GitHub 미러 push는 실행하지 않았다. |
| G0~G6·G8 내부 구현 | 완료 증거 보존 | G7 외부 종료와 G8 실DB/public 사람 게이트는 계속 열린다. | | G0~G6·G8 내부 구현 | 완료 증거 보존 | G7 외부 종료와 G8 실DB/public 사람 게이트는 계속 열린다. |
| B3·B3-신규 소유자 결정 | 결정 및 기존 구현 완료 | 원문은 [정리 전 백로그 원문](./archive/project-cleanup-2026-09-07/backlog-2026-06-26-before-cleanup.md), 남은 후속만 위에 둔다. | | B3·B3-신규 소유자 결정 | 결정 및 기존 구현 완료 | 원문은 [정리 전 백로그 원문](./archive/project-cleanup-2026-09-07/backlog-2026-06-26-before-cleanup.md), 남은 후속만 위에 둔다. |
| 과거 Windows Compose 패키징 gate | SUPERSEDED | 9/1 NAS docker-compose 배포로 현 production 전환 항목에서 제거했다. 새 secret 주입 과제를 만들지 않는다. | | 과거 Windows Compose 패키징 gate | SUPERSEDED | 9/1 NAS docker-compose 배포로 현 production 전환 항목에서 제거했다. 새 secret 주입 과제를 만들지 않는다. |

View file

@ -300,8 +300,8 @@
<section class="pulse"> <section class="pulse">
<div class="pulse-main"> <div class="pulse-main">
<span class="eyebrow">project pulse</span> <span class="eyebrow">project pulse</span>
<h1>지금 위치: <em>개선관리 원본 14개 재점검</em> — 2026-09-09 읽기 전용 확인에서 완료 13·검토 1(C-001)이다. REQ-009~011의 로컬 재검증은 수용했고, REQ-010 추가 수정은 미배포다. 2026-09-01·09-08 배포는 당시 증거이며 오늘의 새 live 검증이 아니다.</h1> <h1>지금 위치: <em>개선관리 원본 14개 재점검</em> — 2026-09-09 읽기 전용 확인에서 완료 13·검토 1(C-001)이다. REQ-009~011의 로컬 재검증은 수용했고, SHA `1306c524` 운영 배포 뒤 H09를 새 live 검증으로 PASS 확인했다. 2026-09-01·09-08 배포는 역사 증거이며, 9/9 배포가 기존 PASS 전체의 새 검증을 뜻하지는 않는다.</h1>
<p class="pulse-state"><b>실배포 CUA 128:</b> 카탈로그는 생성됐지만 전체 검증은 미완료다. 실제 배포에서는 H09(기록 검색·필터 복귀)와 T18(감독·연구 drilldown)이 RED로 남아 있다. 두 항목은 각각 local 16 passed와 API 12 passed·local 교수자 15 passed로 수정 검증했으나, 배포 재검증이 열려 있다. 관리자와 일반 학습자 로그인에서 학습자의 `/admin`·`/teach`→`/learn` 차단, P4 추천 일치와 허용된 관리자 P16 1개·학습자 P4 1개 회기 종료를 확인했다. 순수 teacher·OFF 계정, 교수자 쓰기, 모바일과 독립 관찰자 공개 검증은 남아 있다.</p> <p class="pulse-state"><b>실배포 CUA 128:</b> 카탈로그는 생성됐지만 전체 검증은 미완료다. H09(기록 검색·필터 복귀)는 SHA `1306c524`에서 PASS로 재확인했고 T18(감독·연구 drilldown)은 수정 배포 뒤에도 learner 브라우저만 있어 RED를 종결하지 않았다. 관리자와 일반 학습자 로그인에서 학습자의 `/admin`·`/teach`→`/learn` 차단, P4 추천·R09 잠금·R14 워크시트 보존을 확인했다. 순수 teacher·OFF 계정, 교수자 쓰기, 모바일과 독립 관찰자 공개 검증은 남아 있다.</p>
<p class="pulse-state"><b>2026-08-31 배포 파이프라인 재정립(역사 기록):</b> git 관리·배포는 <code>git.chanpaca.net</code>(Forgejo) 중심으로 이관했고, <code>github.com</code>(origin)은 private 백업/미러로 유지한다. 배포 대상은 NAS Production(<code>docker-compose.nas.yml</code>, <code>vignette-prod</code>)이며 이 PC는 개발용이다. Cloudflare tunnel은 NAS ingress의 현재 경로이므로 대체 ingress 검증 전에는 제거하지 않는다. 문서 <a href="./ops/deployment-pipeline.md">deployment-pipeline.md</a>.</p> <p class="pulse-state"><b>2026-08-31 배포 파이프라인 재정립(역사 기록):</b> git 관리·배포는 <code>git.chanpaca.net</code>(Forgejo) 중심으로 이관했고, <code>github.com</code>(origin)은 private 백업/미러로 유지한다. 배포 대상은 NAS Production(<code>docker-compose.nas.yml</code>, <code>vignette-prod</code>)이며 이 PC는 개발용이다. Cloudflare tunnel은 NAS ingress의 현재 경로이므로 대체 ingress 검증 전에는 제거하지 않는다. 문서 <a href="./ops/deployment-pipeline.md">deployment-pipeline.md</a>.</p>
<p class="pulse-state"><b>최근 확인된 배포 증거(2026-09-01 당시):</b> Forgejo master <code>dce85620</code>를 NAS에서 직접 clone·빌드해 <code>vignette-prod</code> api/engine/web을 교체했고, Cloudflare Pages production도 새 빌드(<code>index-BFKGXJQi.js</code>, 이전 세대 자산 보존)로 배포했다. 사전 dump <code>cab6826b…</code>(11.0MB·TOC 1783)·env 백업·구 이미지 보존으로 롤백 경로를 고정했다. 중복 활성 회기 14쌍 30행은 최신 유지 정책으로 종료(영수증 보존·삭제 0)하고 마이그레이션 20/21/22를 온라인 적용했다. 이 과정에서 mig22의 <code>name[]=text[]</code> 캐스트 결함과 master의 게이트웨이 openai provider 누락 회귀를 발견해 즉시 교정했다(테스트 71 passed). 배포 당시 public health <code>ok·db/engine true</code>, OpenAPI 200, <code>/auth/me</code> 401, dev-login 404, 데이터 집계 전후 동일(app_user 1380/sessions 618/turns 1743)을 확인했다. 증거: <a href="./ops/evidence/nas-prod-deploy-2026-09-01.json">nas-prod-deploy-2026-09-01.json</a>. <b>headful 실계정 폐루프도 당시 완료:</b> NAS env의 OAuth secret 오류(<code>invalid_client</code>)를 교정한 뒤 소유자 실계정 로그인→기존 회기 20건 표시(데이터 보존)→새 사례 회기 생성(mig22 실증)→실턴 SSE·AI 응답→종료→리뷰 생성까지 GREEN(sessions 619·turns 1745·case_profile 566). 일일 검증형 DB 백업 sidecar 첫 덤프도 11.2MB로 성공했다. <b>남은 운영·외부 게이트:</b> C-001 외부 임상 검수, NAS 재부팅 자동복구 smoke, 백업 실패 알림·off-host 복제.</p> <p class="pulse-state"><b>최근 확인된 배포 증거(2026-09-01 당시):</b> Forgejo master <code>dce85620</code>를 NAS에서 직접 clone·빌드해 <code>vignette-prod</code> api/engine/web을 교체했고, Cloudflare Pages production도 새 빌드(<code>index-BFKGXJQi.js</code>, 이전 세대 자산 보존)로 배포했다. 사전 dump <code>cab6826b…</code>(11.0MB·TOC 1783)·env 백업·구 이미지 보존으로 롤백 경로를 고정했다. 중복 활성 회기 14쌍 30행은 최신 유지 정책으로 종료(영수증 보존·삭제 0)하고 마이그레이션 20/21/22를 온라인 적용했다. 이 과정에서 mig22의 <code>name[]=text[]</code> 캐스트 결함과 master의 게이트웨이 openai provider 누락 회귀를 발견해 즉시 교정했다(테스트 71 passed). 배포 당시 public health <code>ok·db/engine true</code>, OpenAPI 200, <code>/auth/me</code> 401, dev-login 404, 데이터 집계 전후 동일(app_user 1380/sessions 618/turns 1743)을 확인했다. 증거: <a href="./ops/evidence/nas-prod-deploy-2026-09-01.json">nas-prod-deploy-2026-09-01.json</a>. <b>headful 실계정 폐루프도 당시 완료:</b> NAS env의 OAuth secret 오류(<code>invalid_client</code>)를 교정한 뒤 소유자 실계정 로그인→기존 회기 20건 표시(데이터 보존)→새 사례 회기 생성(mig22 실증)→실턴 SSE·AI 응답→종료→리뷰 생성까지 GREEN(sessions 619·turns 1745·case_profile 566). 일일 검증형 DB 백업 sidecar 첫 덤프도 11.2MB로 성공했다. <b>남은 운영·외부 게이트:</b> C-001 외부 임상 검수, NAS 재부팅 자동복구 smoke, 백업 실패 알림·off-host 복제.</p>
<details class="pulse-details"> <details class="pulse-details">

View file

@ -88,7 +88,7 @@ py -3.11 -m pytest engine_gateway/ --collect-only -q
2026-09-09 최신 원본 워크북(다운로드 SHA-256 `f64bbc859354e8bfdd62bb3393cffd841ca3a0d865983967a149aea7cf569773`)은 14개 항목 중 완료 13·검토 1(C-001)이며 REQ-008~011도 완료다. `py -3.11 -m pytest app/ -q`는 1108 passed/기존 skip 1/1 warning, `uc-session-conversation`·`calibration-transfer` route fixture browser는 44 passed/0 failed/0 skipped다. 이는 local proof이며 REQ-010 추가 수정은 미배포다. 이 워크북 감사 단계에서는 build·새 public live 검증을 수행하지 않았다. 상세 매핑은 [`spreadsheet-implementation-audit-2026-09-09.md`](../ops/spreadsheet-implementation-audit-2026-09-09.md)를 따른다. 2026-09-09 최신 원본 워크북(다운로드 SHA-256 `f64bbc859354e8bfdd62bb3393cffd841ca3a0d865983967a149aea7cf569773`)은 14개 항목 중 완료 13·검토 1(C-001)이며 REQ-008~011도 완료다. `py -3.11 -m pytest app/ -q`는 1108 passed/기존 skip 1/1 warning, `uc-session-conversation`·`calibration-transfer` route fixture browser는 44 passed/0 failed/0 skipped다. 이는 local proof이며 REQ-010 추가 수정은 미배포다. 이 워크북 감사 단계에서는 build·새 public live 검증을 수행하지 않았다. 상세 매핑은 [`spreadsheet-implementation-audit-2026-09-09.md`](../ops/spreadsheet-implementation-audit-2026-09-09.md)를 따른다.
실배포 CUA 128은 전체 완료가 아니다. H09의 `/learn/history` 검색·필터 복귀는 `uc-learner-practice-history` local 16 passed, T18의 감독·연구 canonical/legacy drilldown은 API 12 passed와 `uc-teacher-console` local 15 passed로 수정 검증했다. 두 RED는 배포 재검증 전까지 열린 상태이며 실제 배포 관찰은 [CUA 보고](../qa/production-computer-use-report-2026-09-09.md)와 ledger를 따른다. 실배포 CUA 128은 전체 완료가 아니다. H09의 `/learn/history` 검색·필터 복귀는 `uc-learner-practice-history` local 16 passed 뒤 SHA `1306c524` 실제 배포에서 PASS로 재확인했다. T18의 감독·연구 canonical/legacy drilldown은 API 12 passed와 `uc-teacher-console` local 15 passed로 수정·배포했지만, learner 브라우저만 있어 교수 링크 재검증 전까지 RED로 남는다. 기존 PASS 전체를 새 빌드에서 재검증한 것은 아니며 실제 배포 관찰은 [CUA 보고](../qa/production-computer-use-report-2026-09-09.md)와 ledger를 따른다.
아래는 2026-09-07 전체 API 1090 passed/1 skipped/1 warning·gateway 71 passed/1 warning와 별도로 해당 계약을 좁혀 실행한 확정 증거다. 같은 묶음의 테스트가 여러 요구사항 아래는 2026-09-07 전체 API 1090 passed/1 skipped/1 warning·gateway 71 passed/1 warning와 별도로 해당 계약을 좁혀 실행한 확정 증거다. 같은 묶음의 테스트가 여러 요구사항
경계를 함께 검증할 수 있으므로 숫자를 요구사항별 전체 합계로 더하지 않는다. 경계를 함께 검증할 수 있으므로 숫자를 요구사항별 전체 합계로 더하지 않는다.

View file

@ -64,7 +64,7 @@ npx playwright test e2e/uc-session-conversation.spec.ts --grep '스트림 도중
| MIGRATION-001 | idempotent DB migration runner | init SQL과 runner의 역할 경계·인프라 영향·소유자 승인 | | MIGRATION-001 | idempotent DB migration runner | init SQL과 runner의 역할 경계·인프라 영향·소유자 승인 |
| OPS-001 | 운영 티켓 자동 분류 | 관리자 승인·audit 경계를 갖춘 구현 패킷 | | OPS-001 | 운영 티켓 자동 분류 | 관리자 승인·audit 경계를 갖춘 구현 패킷 |
| E2E-001 | 전 기능 E2E 후속 분류 | focused 범위의 locator 18건 교정·keyboard 1건 해결 뒤 `npm run e2e`에서 범위 밖 케이스를 실행하고, 실패별 재현·원인·수정 명령을 분류한다. 과거 sweep 실패를 오늘 결함으로 단정하지 않으며 실API/DB·장치 검증은 fixture 결과와 분리한다. | | E2E-001 | 전 기능 E2E 후속 분류 | focused 범위의 locator 18건 교정·keyboard 1건 해결 뒤 `npm run e2e`에서 범위 밖 케이스를 실행하고, 실패별 재현·원인·수정 명령을 분류한다. 과거 sweep 실패를 오늘 결함으로 단정하지 않으며 실API/DB·장치 검증은 fixture 결과와 분리한다. |
| CUA-128 | 실제 배포 Computer Use 재검증 | 128 시나리오 카탈로그 생성은 완료했지만 전체 실배포 검증은 미완료다. 일반 학습자 로그인·교차 역할 차단·P4 추천과 허용된 관리자 P16 1개·학습자 P4 1개 회기 종료를 확인했으나 H09·T18은 local 수정 증거 뒤 배포 재검증이 열려 있다. 순수 teacher·OFF 계정, 교수자 쓰기, 모바일과 독립 관찰자 공개 검증이 남아 있다. | | CUA-128 | 실제 배포 Computer Use 재검증 | 128 시나리오 카탈로그 생성은 완료했지만 전체 실배포 검증은 미완료다. SHA `1306c524`에서 H09와 일반 학습자 로그인·교차 역할 차단·P4 추천·R09 잠금·R14 워크시트 보존을 재확인했지만, T18은 learner 브라우저만 있어 기존 RED를 종결하지 않았다. 순수 teacher·OFF 계정, 교수자 쓰기, 모바일과 독립 관찰자 공개 검증이 남아 있다. |
## 완료 기록 경계 ## 완료 기록 경계

View file

@ -1,7 +1,7 @@
# 배포 파이프라인 (Deployment Pipeline) # 배포 파이프라인 (Deployment Pipeline)
> 작성: 2026-08-31 · 2026-09-08 현행화 · 문서 소유: docs/ops > 작성: 2026-08-31 · 2026-09-09 현행화 · 문서 소유: docs/ops
> 상태: **2026-09-08 NAS Production & Cloudflare Pages 실배포 완료 (SHA `a0311c59`)**. > 상태: **2026-09-09 NAS Production & Cloudflare Pages 실배포 완료 (SHA `1306c524`)**. API·engine 동시 기동 중 공백 관찰이 있어 무중단 배포 증거는 아니다.
## 목표 아키텍처 (소유자 지시) ## 목표 아키텍처 (소유자 지시)
@ -44,7 +44,7 @@ Cloudflare tunnel은 소유자 지시에 따라 제거 대상이다. 다만 현
[NAS] git 컨테이너로 해당 SHA clone·검증 [NAS] git 컨테이너로 해당 SHA clone·검증
[NAS] API/Web build → online migration → docker compose 재생성 [NAS] 변경 범위·필요 migration 호환성 검토 → 이미지 빌드 → 필요한 서비스별 교체·readiness
vignette-prod (api/web/engine/db/proxy) readiness·데이터 보존 검증 vignette-prod (api/web/engine/db/proxy) readiness·데이터 보존 검증
@ -59,7 +59,8 @@ NAS 호스트에는 git이 없으므로 git 컨테이너로 Forgejo에서 clone
- `apps/api`: 관련 test suite (전체 1104 passed / 1 skipped) - `apps/api`: 관련 test suite (전체 1104 passed / 1 skipped)
- SSOT checker `scripts/check-dev-dashboard-ssot.py` - SSOT checker `scripts/check-dev-dashboard-ssot.py`
- Forgejo master == 로컬 master (배포 무결성) - Forgejo master == 로컬 master (배포 무결성)
- NAS: `docker compose ps` healthy, `/api/health` ok·db/engine true - NAS: 후보 변경 파일 범위로 engine 영향부터 판정한다. engine 코드·공통 requirements·`apps/api/Dockerfile`가 바뀌지 않았다면 API와 같은 이미지 참조를 쓰더라도 engine을 재생성하지 않는다.
- NAS: `docker compose ps` healthy, 공개 `/health``db: true`·`engine: true`, 실제 인증 UI 확인 전에는 완료를 선언하지 않는다. 컨테이너 `Started`는 완료 증거가 아니다.
## 5. 실증된 배포 절차 (2026-09-01 1차 실배포 완료, SHA `dce85620`) ## 5. 실증된 배포 절차 (2026-09-01 1차 실배포 완료, SHA `dce85620`)
@ -77,12 +78,20 @@ docker run --rm -v $PWD:/work alpine/git clone --depth 1 --branch master \
# 2) 이미지 빌드 (API 컨텍스트는 저장소 루트) # 2) 이미지 빌드 (API 컨텍스트는 저장소 루트)
cd src-<sha> && docker build -f apps/api/Dockerfile -t vignette-nas-api:<sha> . cd src-<sha> && docker build -f apps/api/Dockerfile -t vignette-nas-api:<sha> .
docker build --build-arg VITE_API_BASE=/api -t vignette-nas-web:<sha> apps/web docker build --build-arg VITE_API_BASE=/api -t vignette-nas-web:<sha> apps/web
# 3) 새 마이그레이션은 psql로 온라인 적용(initdb 스크립트는 재실행되지 않음), # 3) migration이 필요하면 호환성을 먼저 검토하고 적절한 시점의 별도 게이트에서 적용한다.
# 구 API가 의존하는 제약을 바꾸는 마이그레이션은 stop api 후 적용 # initdb 스크립트는 재실행되지 않으며, 구 API가 의존하는 제약 변경은 stop api 뒤 적용할 수 있다.
# 4) private/env.nas의 VIGNETTE_NAS_API_IMAGE/WEB_IMAGE를 새 이미지 ID로 교체 # 4) 후보 변경 범위로 교체 대상을 판정한다.
# engine 코드·requirements·apps/api/Dockerfile 변경이 없으면 engine은 유지한다.
# API만 바뀌면 API만, web만 바뀌면 web만 --no-deps로 재생성한다.
# engine 변경이면 engine을 먼저 교체하고 healthy 및 engine readiness를 확인한 뒤 API를 교체한다.
# compose의 --wait 지원 여부는 현장에서 확인되지 않았으므로 쉘 폴링으로 health를 확인한다.
# 단일 API 교체에는 기동 공백이 있다. 무중단은 별도 blue/green 전환 게이트를 통과한 경우에만 주장한다.
# 5) private/env.nas의 VIGNETTE_NAS_API_IMAGE/WEB_IMAGE를 새 이미지 ID로 교체
docker compose -f docker-compose.nas.yml --env-file private/env.nas config --quiet docker compose -f docker-compose.nas.yml --env-file private/env.nas config --quiet
docker compose -f docker-compose.nas.yml --env-file private/env.nas up -d docker compose -f docker-compose.nas.yml --env-file private/env.nas up -d --no-deps api web
# 5) readiness: public health ok·db/engine true, OpenAPI 200, /auth/me 401, 데이터 집계 전후 동일 # engine 변경 시에는 위 API/Web 명령 전에 별도로 `up -d --no-deps engine`을 실행한다.
# 6) API 교체 뒤 healthy, 공개 /health의 db/engine true, 실제 인증 UI, 데이터 집계 전후 동일을 확인한다.
# rollback은 자동 실행하지 않는다. 사전 DB dump와 이전 이미지·환경 파일을 보존하고 소유자가 결정한다.
``` ```
공개 웹(Cloudflare Pages)은 별도 배포한다: `apps/web`에서 `npm run build` 공개 웹(Cloudflare Pages)은 별도 배포한다: `apps/web`에서 `npm run build`
@ -109,6 +118,12 @@ docker compose -f docker-compose.nas.yml --env-file private/env.nas up -d
- `https://api-vignette.chanpaca.net/auth/me` -> `401 Unauthorized` (fail-closed 보장) - `https://api-vignette.chanpaca.net/auth/me` -> `401 Unauthorized` (fail-closed 보장)
- `https://vignette.chanpaca.net` -> `HTTP 200 OK` - `https://vignette.chanpaca.net` -> `HTTP 200 OK`
## 5.2 서비스별 교체·기동 공백 관찰 (2026-09-09, SHA `1306c524`)
- API와 engine을 동시에 재생성한 동안 사용자가 다운을 보고했다. 이는 단일 API 교체에도 기동 공백이 생길 수 있음을 드러낸 관찰이며, 영구 장애 원인으로 단정하지 않는다.
- 이후 같은 버전에서 컨테이너 healthy, 공개 `200`, 학습자 회기 조회 정상과 DB 전체 집계 동일을 확인했다. 이 회복 관찰은 무중단 배포 증거가 아니다.
- 다음 배포는 §5의 변경 범위 판정을 먼저 적용한다. engine 변경이 있으면 engine healthy·readiness 뒤 API를 교체하고, engine 변경이 없으면 API와 같은 이미지 참조만으로 engine을 재생성하지 않는다.
## 6. 남은 구성 작업 (TODO) ## 6. 남은 구성 작업 (TODO)
- [ ] Forgejo master 기준 NAS 자동배포 후크(수동 절차는 §5, §5.1로 실증 완료) - [ ] Forgejo master 기준 NAS 자동배포 후크(수동 절차는 §5, §5.1로 실증 완료)

View file

@ -1,6 +1,6 @@
# 실배포 Computer Use 128 실행 보고 # 실배포 Computer Use 128 실행 보고
> 기준: 2026-09-09 KST. 이 문서는 실제 배포 CUA 관찰과 local 수정 검증을 분리한다. 128개 카탈로그 생성은 완료됐지만, 128개 전체의 실제 배포 검증 완료를 뜻하지 않는다. 최신 ledger는 PASS 83, RED 2, BLOCKED 10, NOT_RUN 33이다. > 기준: 2026-09-09 KST. 이 문서는 실제 배포 CUA 관찰과 local 수정 검증을 분리한다. 128개 카탈로그 생성은 완료됐지만, 128개 전체의 실제 배포 검증 완료를 뜻하지 않는다. SHA `1306c524` 배포 뒤 최신 ledger는 PASS 84, RED 1, BLOCKED 10, NOT_RUN 33이다. 이전 PASS 전체를 이 새 빌드에서 재검증한 것은 아니다.
## 참조와 현재 범위 ## 참조와 현재 범위
@ -12,18 +12,18 @@
## 일반 학습자 실배포 관찰 ## 일반 학습자 실배포 관찰
- 새 회기는 문서 재로드 뒤에도 복원됐다. 리뷰 평가는 대기에서 완료로 전환됐다. - 새 회기는 문서 재로드 뒤에도 복원됐다. 리뷰 평가는 대기에서 완료로 전환됐다.
- 자기예측은 빈 입력을 차단했고 revision 1→revision 2→명시 잠금 뒤 reload에서도 같은 잠금 상태를 유지했다. - R09 자기예측은 빈 입력을 차단했고 revision 1→revision 2→명시 잠금 뒤 reload에서도 같은 잠금 상태를 유지했다.
- 워크시트 주호소 수정은 저장 완료 뒤 reload에서 복원됐다. - R14 워크시트 주호소 수정은 저장 완료 뒤 reload에서 복원됐다.
- 원장에 추가된 `익명 인물입니다` 관찰의 production 원인은 미확정이며 결함 확정이나 수정 완료로 쓰지 않는다. local guardrail의 contextless NAME 오탐 재현은 있으나 production 원인을 입증하지 않는다. 후속에는 비식별 안전 회귀 재현과 production 관찰의 독립 대조가 필요하다. - 원장에 추가된 `익명 인물입니다` 관찰의 production 원인은 미확정이며 결함 확정이나 수정 완료로 쓰지 않는다. local guardrail의 contextless NAME 오탐 재현은 있으나 production 원인을 입증하지 않는다. 후속에는 비식별 안전 회귀 재현과 production 관찰의 독립 대조가 필요하다.
## 실배포 RED와 local 수정 증거 ## 실배포 RED와 local 수정 증거
| ID | 실제 배포 상태 | local 수정·검증 | 배포 재검증 조건 | | ID | 실제 배포 상태 | local 수정·검증 | 배포 재검증 조건 |
|---|---|---|---| |---|---|---|---|
| H09 | `/learn/history`의 검색·필터를 적용한 뒤 특정 기록을 열고 돌아왔을 때 목록 맥락 복귀가 RED다. | `apps/web/src/pages/LearnerHome.tsx`가 history `q`·`status`를 URL search params로 소유하도록 수정했고 `uc-learner-practice-history` local 16 passed(22.9s)다. | 관리자 사용자 경로의 회귀와 순수 learner 계정의 기존 종료 테스트 기록에서 검색·필터→기록/리뷰→브라우저 뒤로 복귀를 실제 배포에서 다시 확인한다. | | H09 | 과거 `/learn/history` 검색·필터 맥락 복귀 RED는 SHA `1306c524` 배포 뒤 실제 배포에서 PASS로 재확인했다. | `apps/web/src/pages/LearnerHome.tsx`가 history `q`·`status`를 URL search params로 소유하도록 수정했고 `uc-learner-practice-history` local 16 passed(22.9s)다. | 이 PASS는 H09의 실제 배포 재검증이다. 다른 기존 PASS까지 새 빌드에서 재검증했다는 뜻은 아니다. |
| T18 | 감독·연구 화면의 producer drilldown이 legacy 경로를 가리켜 실제 배포에서 RED다. | `apps/api/app/services/supervision_research_producer.py`의 canonical `/teach/session/{id}/review` 경로와 `apps/web/src/pages/SupervisionResearch.tsx`의 legacy 링크 정규화를 수정했다. API 12 passed, local 교수자 15 passed(25.3s)다. | 관리자 사용자 경로의 회귀와 순수 teacher 계정에서 producer가 만든 비식별 signal의 `/teach/supervision`→drilldown→해당 리뷰 경로를 실제 배포에서 다시 확인한다. | | T18 | 감독·연구 화면의 producer drilldown은 수정본을 배포했지만, 현재 브라우저가 learner 역할이라 교수 링크를 실제 배포에서 재검증하지 못해 기존 RED를 종결하지 않았다. | `apps/api/app/services/supervision_research_producer.py`의 canonical `/teach/session/{id}/review` 경로와 `apps/web/src/pages/SupervisionResearch.tsx`의 legacy 링크 정규화를 수정했다. API 12 passed, local 교수자 15 passed(25.3s)다. | 순수 teacher 계정에서 producer가 만든 비식별 signal의 `/teach/supervision`→drilldown→해당 리뷰 경로를 실제 배포에서 다시 확인한다. |
두 항목의 local 증거는 배포본 교체 또는 실제 배포 재검증 증거가 아니다. 운영 설정·실사용자·승인 원장은 변경하지 않았다. H09의 최신 PASS는 실제 배포 재검증이지만 T18의 local 증거는 배포 기능 재검증 증거가 아니다. 운영 설정·실사용자·승인 원장은 변경하지 않았다.
## 상태 해석과 재개 조건 ## 상태 해석과 재개 조건