PII 표시 토큰 누출 보정
This commit is contained in:
parent
61a41d1f08
commit
7cece90e33
19 changed files with 284 additions and 197 deletions
171
docs/HANDOFF.md
171
docs/HANDOFF.md
|
|
@ -1,15 +1,14 @@
|
|||
# Vignette G0~G8 완료 추진 핸드오프
|
||||
|
||||
> Updated: 2026-08-09 KST (다른 에이전트 실행용 최종 인계 · G7 외부-proof P0 코드 완료 · current-source fixture 분할 GREEN/clean HEAD 재실행)
|
||||
> Updated: 2026-08-09 KST (G8 clean-head NAS-origin 종료 · 남은 핵심은 G7 external proof)
|
||||
> Workspace: `D:\workspace\vignette`
|
||||
> 이 문서는 다음 에이전트가 **G0~G8 아홉 목표 중 남은 G7 외부 게이트와 G8 NAS-origin 재검증을 닫기 위한** 실행 기준이다.
|
||||
> 이 문서는 다음 에이전트가 **G0~G8 아홉 목표 중 마지막 G7 외부 게이트를 닫기 위한** 실행 기준이다.
|
||||
|
||||
## 0. 현재 상태 한 줄 요약
|
||||
|
||||
**G0~G6의 내부 구현·증거는 종료됐다. 단, 최종 clean source 전체 회귀는 다시 실행해야 한다. G8 실제 rollback
|
||||
receipt는 완료됐지만 current source clean-head 승격은 아직 0회다.
|
||||
두 execute는 모두 NAS mutation 전에 안전하게 중단됐다. naive `started_at`의 9시간 오차 P0는 UTC/KST 계약과
|
||||
실DB 브라우저 회귀로 수정됐고, 이제 새 clean commit 결속과 NAS-origin 전체 E2E가 남았다. G7 공개 런처의
|
||||
**G0~G6의 내부 구현·증거와 G8 clean-head NAS-origin runtime은 종료됐다. G8은 source HEAD
|
||||
`61a41d1f…6af`·tree `87dec55d…3b77`·archive `4d15d055…119d4d`로 candidate 112/112와 actual NAS-origin
|
||||
112/112를 모두 통과했다. 앞선 fail-closed·verified rollback 이력과 previous `6030a677…c611`은 보존했다. G7 공개 런처의
|
||||
local sidecar lifecycle·provider/model readiness·Uvicorn queue, fresh PID/source provenance, 3,120초 runner와
|
||||
3,000초 공통 시간창·canonical exit 계약은 소스에서 완료됐지만, current source 공개 배포와 외부 4-artifact 게이트는 남아 있다.**
|
||||
|
||||
|
|
@ -23,28 +22,24 @@ local sidecar lifecycle·provider/model readiness·Uvicorn queue, fresh PID/sour
|
|||
| G5 Calibration & Transfer | DONE | actual transfer execution, independent/model-run/instrument/evidence provenance, DB/browser idempotency |
|
||||
| G6 Supervision & Research | DONE | safety event metadata-only projection, safety priority 1 > deterioration 2, raw detail 0 |
|
||||
| G7 Multimodal Alliance | **internal DONE · external GATE** | consent/withdrawal, synthetic soak 59/59, G7 runner/checker/topology 86/86, launcher/sidecar 80/80, API voice 71/71 |
|
||||
| G8 Continuous Improvement | **receipt DONE · runtime REVALIDATION** | 실제 image rollback 2회 + executed receipt 2건. timestamp 수정 실DB GREEN, 새 clean commit·NAS-origin E2E 미완료 |
|
||||
| G8 Continuous Improvement | **DONE · CLEAN-HEAD NAS VERIFIED** | 실제 image rollback 2회 + executed receipt 2건, source/archive 결속, candidate 112/112, actual NAS-origin 112/112 |
|
||||
|
||||
대시보드 status count는 **32 done / 3 doing / 0 planned**다.
|
||||
대시보드 status count는 **33 done / 2 doing / 0 planned**다.
|
||||
|
||||
Git 기준선은 branch `master`, HEAD `94c681d450d2f3b4df55c036e333cd817db3f7fb`이고 `origin/master`보다 2 commit
|
||||
앞서 있다. 공유 worktree에는
|
||||
문서/대시보드/G7·G8 런북, 완결된 clean-head 릴리스 에이전트·테스트, UTC/KST session timestamp 수정과
|
||||
browser 회귀가 tracked dirty로 남아 있다. Git 작업은 stage/commit/push하지 않았다.
|
||||
G8 배포 source 기준선은 branch `master`, HEAD `61a41d1f08239b5f9e99cfae42a206be250416af`·tree
|
||||
`87dec55daf0a22ca5c2e489cd803a2f731e63b77`이며 2회 동일 archive SHA는
|
||||
`4d15d055d74f33f1fa2ff470afbf900d565ab238b19c79df34ca7ba240119d4d`다. 공유 worktree의 후속 변경은 이
|
||||
배포 source에 포함되지 않으므로 G8 완료 증거와 섞지 않는다.
|
||||
|
||||
### 이 문서가 인계된 정확한 중단점
|
||||
|
||||
- 사용자가 **현재 구현을 잠시 멈추고 다른 에이전트로 넘길 핸드오프를 만들라**고 요청했다. 핸드오프 정리 중
|
||||
public/NAS/DB/마이크/프로세스의 수동 mutation은 0회다. 5분 Scheduled Task는 한 번씩 자동 실행됐으나 아래
|
||||
source-pin gate에서 안전하게 exit 1로 중단됐다.
|
||||
- G8 clean-head execute는 격리 NAS preview만 변경했고 공개 API/DB·물리 마이크는 건드리지 않았다. source HEAD/tree와
|
||||
archive 2회 결정성, fresh dump, exact images, candidate/actual-origin 결과를 모두 결속했다.
|
||||
- active goal은 계속 `active`다. 목표는 “문서 작성”이 아니라 **G0~G8 아홉 목표를 실제 runtime과 E2E로
|
||||
모두 닫는 것**이다. G7 canonical checker exit 0과 G8 current clean source의 NAS-origin 0-failure가 없으면
|
||||
`goal complete`를 호출하지 않는다.
|
||||
- 마지막 완료 작업은 G7 runner/checker/topology·fresh public launcher provenance P0, session timestamp UTC/KST 계약,
|
||||
API full 921/921, gateway 58/58, Web API types·typecheck·build, 자기주도 route fixture desktop/mobile 6/6이다.
|
||||
fixture desktop/mobile은 마지막 단일
|
||||
120/120 뒤 dashboard spec/HTML이 다시 바뀌었고 그 변경의 dashboard 10/10을 별도로 확인했으므로,
|
||||
**현재 트리는 불변 110 + 최신 dashboard 10의 분할 GREEN**이다. 새 clean HEAD에서 exact 120을 다시 실행한다.
|
||||
모두 닫는 것**이다. G8은 종료됐고 G7 canonical checker exit 0이 없으면 `goal complete`를 호출하지 않는다.
|
||||
- 마지막 완료 작업은 G8 source HEAD `61a41d1f…6af`·tree `87dec55d…3b77`·archive `4d15d055…119d4d`의
|
||||
candidate 112/112와 actual NAS-origin 112/112다. API/Web `d5021950…e4b1`/`9796c092…4b36`, health
|
||||
ok·db/engine true·auth 401·OpenAPI 126, fresh dump `36ec8748…24db8`을 확인했다.
|
||||
- G7 Windows topology mode, 3,000초 공통 시간창, canonical checker-bound exit와 공개 런처의 local
|
||||
Whisper/MeloTTS lifecycle·exact readiness·Uvicorn queue·fresh API/cloudflared provenance 계약은 코드와 회귀가
|
||||
끝났지만 public launcher 실행과 capture는 수행하지 않았다.
|
||||
|
|
@ -61,8 +56,8 @@ browser 회귀가 tracked dirty로 남아 있다. Git 작업은 stage/commit/pus
|
|||
`status=ok, db=true, engine=true`다. clean commit 뒤 두 task를 동일한 detached stable
|
||||
release root로 재등록하고 action pin·watchdog result 0·로그온/reboot smoke를 확인하기 전에는 public runtime
|
||||
자동복구를 DONE으로 부르지 않는다.
|
||||
- 다음 에이전트의 첫 mutation은 **사용자 승인 아래 새 clean commit 생성**이어야 한다. 그 clean source만 G8 NAS
|
||||
preview 또는 G7 public runtime의 배포 입력으로 쓰고, 두 환경을 동시에 변경하지 말며 mutation owner는 한 명만 둔다.
|
||||
- 다음 mutation 대상은 G7 public runtime이다. G8 NAS는 새 material milestone이 생기기 전까지 읽기 전용 기준선으로
|
||||
두고, public/DB mutation owner는 한 명만 둔다.
|
||||
|
||||
### 완료 조건 판정 (2026-08-09 재검증)
|
||||
|
||||
|
|
@ -70,9 +65,9 @@ browser 회귀가 tracked dirty로 남아 있다. Git 작업은 stage/commit/pus
|
|||
|
||||
| # | 조건 | 판정 | 근거 |
|
||||
|---|---|---|---|
|
||||
| 1 | G0~G8 각각의 코드 계약과 실제 runtime 증거 | **부분 충족** | G0~G6 충족. G8 receipt는 충족했지만 NAS-origin 회기 재검증이 남았고 G7 외부 GATE가 열려 있다 |
|
||||
| 1 | G0~G8 각각의 코드 계약과 실제 runtime 증거 | **부분 충족** | G0~G6과 G8 충족. G7 외부 GATE만 열려 있다 |
|
||||
| 2 | 학생 홈→회기→리뷰→처방→재연습→전이 폐루프가 실제 API/DB/browser 통과 | **충족** | 일회용 클론에서 `returned-practice-db-closed-loop` desktop 2/2 + mobile 2/2, route mock 0 |
|
||||
| 3 | current source 증거와 대시보드·TODO·backlog 일치 | **충족** | SSOT checker FAIL 0, unit 5/5, dashboard E2E 10/10, count 32/3/0이 카드와 일치 |
|
||||
| 3 | current source 증거와 대시보드·TODO·backlog 일치 | **충족** | SSOT checker FAIL 0, dashboard E2E 10/10, count 33/2/0이 카드와 일치 |
|
||||
| 4 | G7을 가짜·합성 증거로 DONE 처리하지 않음 | **충족** | `check-g7-external-proof.py` exit 1 유지, G7 카드는 `GATE` |
|
||||
|
||||
재검증 수치: API **921 passed**, gateway **58**, executor **28**, probe **11**, helper launcher **37**,
|
||||
|
|
@ -89,8 +84,8 @@ live health 테스트는 React StrictMode 중복 조회의 첫 응답을 고정
|
|||
재검증됐다. 따라서 current tree의 정직한 판정은 **110 불변 + 10 최신 분할 GREEN**이며, 새 clean commit에서
|
||||
같은 120건을 한 번 재실행해 archive/source 결속 뒤의 결과를 고정한다.
|
||||
|
||||
**따라서 `update_goal complete`를 호출하지 않는다.** 조건 1이 G7과 G8 NAS-origin 재검증 때문에 미충족이고,
|
||||
조건 4가 G7을 합성 증거로 메우는 것을 금지한다. G8 receipt 자체는 종료됐다(§3).
|
||||
**따라서 `update_goal complete`를 호출하지 않는다.** 조건 1이 G7 external proof 때문에 미충족이고,
|
||||
조건 4가 G7을 합성 증거로 메우는 것을 금지한다. G8은 clean-head NAS-origin까지 종료됐다(§3·§5).
|
||||
|
||||
### G0~G8 목표별 인수 기준
|
||||
|
||||
|
|
@ -104,7 +99,7 @@ live health 테스트는 React StrictMode 중복 조회의 첫 응답을 고정
|
|||
| G5 | 자기평가 잠금, calibration 감소, unseen transfer 유지, subgroup drift | actual transfer execution과 independent/model-run/instrument/evidence provenance | G4와 같은 disposable DB에서 actual POST·read reload·1→1 멱등 재확인 |
|
||||
| G6 | 3-click queue, 원장 drilldown, 버전 재현, 역할/RLS/audit | safety metadata-only, safety priority 1 > deterioration 2, raw detail 0 | current HEAD producer/store/API와 supervisor UI 회귀 재실행 |
|
||||
| G7 | 시간 정렬, **물리 마이크+공개 WSS 장시간 E2E**, text-only 대비 음성 이득, 동의/삭제 정책 | 내부 계약·synthetic soak만 완료. canonical checker는 의도적으로 exit 1 | current 공개 배포→인증 WSS→명시 동의 mic 50분→동시 runtime/topology→독립 human pack→checker exit 0 |
|
||||
| G8 | source→draft→red-team→benchmark→catalog 재현, 누수/PII/무근거 0, 자동 calibration+rollback, incident→test/backlog 환류 | agentic worker·human gate·실제 rollback/restore receipt 2건, timestamp focused 실DB/browser GREEN | 사용자 승인 아래 새 clean commit→NAS 배포→**실제 NAS origin** 전체 회기 E2E GREEN→SSOT 동기화 |
|
||||
| G8 | source→draft→red-team→benchmark→catalog 재현, 누수/PII/무근거 0, 자동 calibration+rollback, incident→test/backlog 환류 | agentic worker·human gate·실제 rollback/restore receipt 2건, clean-head candidate/NAS-origin 112/112 | **종료.** 새 material milestone 전까지 NAS 기준선 보존 |
|
||||
|
||||
## 1. 작업 시작 전 반드시 읽을 파일
|
||||
|
||||
|
|
@ -126,13 +121,11 @@ live health 테스트는 React StrictMode 중복 조회의 첫 응답을 고정
|
|||
- Windows 11 + PowerShell 환경이다. 실행 전 OS·셸·도구 경로를 다시 확인한다.
|
||||
- 명령은 PowerShell 5.1 호환 문법을 기본으로 작성한다. NAS 원격 스크립트는 **UTF-8 base64 전달 방식**을 쓴다.
|
||||
(`$()`가 PowerShell에서 먼저 확장되는 것을 막는다.)
|
||||
- 이 핸드오프 작성 시 branch/HEAD는 `master` / `94c681d450d2f3b4df55c036e333cd817db3f7fb`이고 include 후보는
|
||||
52개다: UTC/KST timestamp, G7 voice/topology/public launcher, pinned `psutil`, G8 clean-head controller, public task source pin,
|
||||
학생 boot recovery, current fixture 안정화, dashboard/TODO/backlog/HANDOFF·런북 동기화다. 이 묶음들은 아직
|
||||
commit에 들어 있지 않다.
|
||||
- G8 배포 source는 `master` / `61a41d1f08239b5f9e99cfae42a206be250416af`이며 공유 worktree의 후속 변경은
|
||||
이 clean release와 분리한다. stage/commit 시 `git add -A`를 쓰지 않고 명시적 경로만 다룬다.
|
||||
- clean-head 구현은 unit 30/30, G7 runner/checker/topology는 86/86, G7 public launcher/sidecar는 80/80,
|
||||
public task source pin은 provenance 11개를 포함한 combined 22/22, timestamp·voice 계약을 포함한 API는
|
||||
921/921와 KST 실DB browser 1/1, current fixture는 110 불변 + 최신 dashboard 10 분할 GREEN,
|
||||
921/921와 KST 실DB browser 1/1, G8 candidate/NAS-origin은 각각 112/112,
|
||||
SSOT는 FAIL 0와 dashboard E2E 10/10을 통과했다. 다음 에이전트는 최초 diff review 뒤 동일한 focused gate를
|
||||
다시 실행하고, 서로 다른 lane의 파일을
|
||||
누락한 채 clean commit을 만들지 않는다.
|
||||
|
|
@ -148,7 +141,7 @@ live health 테스트는 React StrictMode 중복 조회의 첫 응답을 고정
|
|||
리스너를 정리할 수 있으므로 공개 런타임이 떠 있는 동안 실행하지 않는다.
|
||||
- 비밀값, 이메일, cookie, 사용자 UUID가 포함된 raw response, `.env` 내용은 로그·증거·채팅에 출력하지 않는다.
|
||||
|
||||
## 3. G8 receipt — 종료됨 · NAS-origin runtime 재검증은 열림
|
||||
## 3. G8 receipt + clean-head NAS-origin — 종료됨
|
||||
|
||||
### Gate6 계약 정정 (성립 불가능했던 이전 계약을 코드로 교체)
|
||||
|
||||
|
|
@ -216,29 +209,27 @@ UI가 active DB container에 직접 stop을 보내 같은 증상이 재발했다
|
|||
|
||||
공개 DB에는 current dirty source를 배포하지 않는다.
|
||||
|
||||
## 5. NAS 배포 기준선 — 현재 HEAD가 아니라 2026-08-07 릴리스
|
||||
## 5. NAS 배포 기준선 — 2026-08-09 clean-head DONE
|
||||
|
||||
- **2026-08-09 17:07 KST read-only snapshot:** URL `http://100.116.83.60:8088` · project
|
||||
`vignette-preview-20260807` · remote root `/volume1/docker/vignette-preview-20260807` · active release SHA
|
||||
`6030a677af7e87cbfabc422b553d108d53414fd3c446548734a13b036d35c611`.
|
||||
- API `sha256:52e0e816…8b2d` / Web `sha256:6fdbb646…f215` exact image가 실행 중이고 previous
|
||||
`79ec731f…0450` / `c530213f…62f28`도 보존돼 있다. Compose `api/web/db/proxy` 4개는 모두 running,
|
||||
restart policy는 `unless-stopped`다.
|
||||
- DB volume `vignette-preview-20260807_pgdata` · pre-proof dump `vignette-preview-g8-preproof-20260807T110610Z.dump`
|
||||
SHA256 `92ed4736…1570f`, 960,970 bytes · pre-clean-head dump
|
||||
`vignette-preview-pre-clean-head-20260809T051611Z.dump` SHA256 `726982…5d41c`, 1,015,222 bytes.
|
||||
- health 3/3(`db=true`, `engine=true`), auth 401, OpenAPI 126 + G1~G8 route, root/JS/CSS 200이다.
|
||||
- helper container 0, NAS listener 8018/18149 0, Windows tunnel listener 18018 0이다.
|
||||
- **P1 권한 관측:** remote release root와 Compose 파일이 mode `0777`이다. 다음 execute 전에 owner/mode를
|
||||
최소권한으로 좁히고 release agent preflight가 이를 fail-closed로 검증해야 한다. 현재 상태를 안전한 배포 신뢰
|
||||
경계로 간주하지 않는다.
|
||||
- localhost candidate browser E2E 108/108(634.578s), postdeploy SSE→DB review PASS
|
||||
- **G8 rollback/restore 이후 재검증:** 실제 브라우저 SSE→DB review 재실행 PASS(35.0s)
|
||||
- URL `http://100.116.83.60:8088` · project `vignette-preview-20260807` · remote root
|
||||
`/volume1/docker/vignette-preview-20260807`.
|
||||
- source HEAD `61a41d1f08239b5f9e99cfae42a206be250416af` · tree
|
||||
`87dec55daf0a22ca5c2e489cd803a2f731e63b77` · 2회 동일 active archive
|
||||
`4d15d055d74f33f1fa2ff470afbf900d565ab238b19c79df34ca7ba240119d4d`.
|
||||
- API `sha256:d502195021beafe869c555f3ec80269426062ef4586dc15a3e049f9c8660e4b1` / Web
|
||||
`sha256:9796c0925f6a984cb846b61a4f13fda4d403bda7b3a2b6232b728cebbcdc4b36` exact image가 실행 중이다.
|
||||
- candidate session E2E **112/112**, 실제 NAS 평문 origin browser review **112/112**(11 specs,
|
||||
desktop/mobile/single-run), health `status=ok·db=true·engine=true`, auth 401, OpenAPI 126.
|
||||
- fresh custom dump `vignette-preview-pre-clean-head-retry-61a41d1f-20260809T112038Z.dump`, SHA256
|
||||
`36ec8748cf28c520d9489d108dee9d4a154e6260f6996b4da3e0fe3b8a624db8`, 1,097,100 bytes,
|
||||
TOC 1,738 / TABLE DATA 129를 보존했다.
|
||||
- previous active `6030a677af7e87cbfabc422b553d108d53414fd3c446548734a13b036d35c611`과 이전 images,
|
||||
named DB volume을 삭제하지 않았다.
|
||||
|
||||
배포 중 첫 108 gate가 103/5로 fail-closed된 이력(G5 fixture drift, StrictMode retry fixture, `shell.css` manifest 누락)은
|
||||
지우지 않는다.
|
||||
|
||||
### ⚠ 배포된 SHA는 비-secure origin 결함을 갖고 있다 (수정은 소스에만 있음)
|
||||
### 과거 비-secure origin 결함 — 수정·배포 검증 완료
|
||||
|
||||
배포 후 NAS 프리뷰(`http://100.116.83.60:8088`, 평문 HTTP·비-localhost)에 전체 회기 스펙을 돌려보니 24건이
|
||||
실패했고, 원인은 단 하나였다. 페이지 스냅샷의 실제 예외는 `crypto.randomUUID is not a function`이다.
|
||||
|
|
@ -250,14 +241,13 @@ UI가 active DB container에 직접 stop을 보내 같은 증상이 재발했다
|
|||
- 수정: `apps/web/src/lib/uuid.ts`의 `randomUuid()`로 통일. fallback도 `crypto.getRandomValues`를 우선
|
||||
사용해 idempotency key의 예측 불가능성을 유지하고, Web Crypto가 아예 없을 때만 `Math.random`으로 내려간다.
|
||||
- 회귀: `apps/web/e2e/insecure-context-uuid.spec.ts` **6/6** (직접 호출 0건 검사 포함), typecheck·build 통과.
|
||||
- **아직 NAS에 배포하지 않았다.** 배포된 SHA `6030a677…c611`은 여전히 결함 빌드다. 다음 배포 때
|
||||
release agent로 승격하고, 승격 뒤에는 NAS origin에서 회기 스펙을 다시 돌려 24건이 사라지는지 확인한다.
|
||||
- UUID와 portable SHA-256 수정은 archive `4d15d055…119d4d`로 NAS에 배포했고 actual-origin 112/112를 통과했다.
|
||||
- 교훈: candidate gate를 localhost에서만 돌리면 secure-context 전용 API 결함을 못 잡는다. 배포 대상과
|
||||
같은 scheme/host 형태에서 최소 한 번은 회기 리뷰 라우트를 열어봐야 한다.
|
||||
|
||||
## 6. 다음 실행 순서 — G8 runtime 재검증 후 G7 외부 종료
|
||||
## 6. 다음 실행 순서 — G8 종료, G7 외부 종료
|
||||
|
||||
### 6.1 G8: clean-head 릴리스 경로부터 완성
|
||||
### 6.1 G8: clean-head 릴리스 경로 — DONE
|
||||
|
||||
`scripts/run-outcome-os-release-agent.py`의 명시적 clean-head 경로는 구현됐다. 기존 patch mode를 기본값으로
|
||||
보존하며, tracked-clean source worktree의 exact HEAD/tree/archive만 candidate로 사용한다. 수동 복사나 NAS 직접
|
||||
|
|
@ -275,18 +265,16 @@ UI가 active DB container에 직접 stop을 보내 같은 증상이 재발했다
|
|||
production candidate/NAS-origin은 실제 배포 번들에서 동작하는 11개 회기 스펙만 실행한다.
|
||||
7. unit/fake runner가 tracked dirty, archive SHA drift, evidence binding, patch-mode 무회귀를 검증해야 한다.
|
||||
|
||||
검증: release-agent unit 30/30, source-only insecure-context gate 12/12, Ruff, py_compile, `git diff --check` PASS. 공유 worktree에는
|
||||
인계 문서와 controller 변경이 있으므로 이 경로 자체가 의도대로 tracked-dirty를 차단한다. 실제 배포는 새 commit을
|
||||
가리키는 별도 detached clean worktree를 만들고 `--source-repo-root <clean-worktree>`로 지정한 뒤
|
||||
dry-run→execute 순서로 수행한다.
|
||||
검증: release-agent unit 30/30, source-only insecure-context gate 12/12, Ruff, py_compile, `git diff --check` PASS.
|
||||
최종 실행은 detached clean HEAD `61a41d1f…6af`에서 candidate 112/112와 actual NAS-origin 112/112를 통과했다.
|
||||
이하 preflight와 실패 기록은 최종 성공에 이르기까지의 역사 증거이며 다시 실행할 지시가 아니다.
|
||||
|
||||
#### clean commit preflight — include 52 / exclude 6
|
||||
#### 역사 기록: 첫 clean commit preflight — include 52 / exclude 6
|
||||
|
||||
2026-08-09 최종 경로 목록 SHA-256은 ordinal 정렬된 UTF-8 LF 경로를 줄바꿈으로 연결하고 마지막 개행 없이 계산해
|
||||
include `4d94694ccf9def6945272c61f673cac0eaa9fb59f4f9b6c165d661d819f891a1`, exclude
|
||||
`1ff8c26732772df6b5857bf84de01a53d7da9c3b7d52df08938e77f3a527f022`다. 아래 include 52개만
|
||||
사용자 승인 후 **명시적으로** stage한다. 그 직전 `git status --porcelain=v1 -uall`로 목록·해시를 다시 계산하고,
|
||||
새 경로가 하나라도 있으면 멈춘다. `git add -A`는 금지한다.
|
||||
`1ff8c26732772df6b5857bf84de01a53d7da9c3b7d52df08938e77f3a527f022`였다. 아래 목록은 첫 clean commit 범위를
|
||||
감사하기 위해 보존한 이력이며 현재 worktree staging 목록이 아니다.
|
||||
|
||||
```text
|
||||
apps/api/app/config.py
|
||||
|
|
@ -410,15 +398,15 @@ apps/web/test-results/g7-voice-consent-mobile.png
|
|||
- **테스트 강제 클릭이나 모달 닫기 우회는 사용하지 않았다.** 첫 clean source `5221f79e…1c69`에는 제품 수정과
|
||||
controller 변경이 포함됐고, production entry 차단 회귀 2건의 테스트 수정만 후속 clean commit으로 다시 고정한다.
|
||||
|
||||
### 6.2 G8: NAS preview 배포와 실제 origin E2E
|
||||
### 6.2 G8: NAS preview 배포와 실제 origin E2E — DONE
|
||||
|
||||
clean-head release mode가 GREEN이면 전용 NAS preview만 대상으로 백업→dry-run→배포→검증한다. 공개 DB·공개 API는
|
||||
이 단계에서 건드리지 않는다. 성공 조건은 다음 전부다.
|
||||
전용 NAS preview만 대상으로 백업→dry-run→배포→검증했고 공개 DB·공개 API는 건드리지 않았다. 아래 성공 조건을
|
||||
전부 충족했다.
|
||||
|
||||
직전 새 backup은
|
||||
`/volume1/docker/vignette-preview-20260807/backups/vignette-preview-pre-clean-head-20260809T051611Z.dump`,
|
||||
SHA-256 `72698232d132a8f848d81ff9d8602430e7e623c7646cc236cb39f978aab5d41c`,
|
||||
1,015,222 bytes, TOC 1,752다. 하지만 release agent 자체에는 `pg_dump`/`pg_restore` 실행 계약이 없다.
|
||||
최종 fresh backup은
|
||||
`/volume1/docker/vignette-preview-20260807/backups/vignette-preview-pre-clean-head-retry-61a41d1f-20260809T112038Z.dump`,
|
||||
SHA-256 `36ec8748cf28c520d9489d108dee9d4a154e6260f6996b4da3e0fe3b8a624db8`,
|
||||
1,097,100 bytes, TOC 1,738 / TABLE DATA 129다. release agent 자체에는 `pg_dump`/`pg_restore` 실행 계약이 없다.
|
||||
따라서 **매 execute 직전** 별도 승인된 백업 단계에서 fresh custom dump를 만들고 SHA-256·byte size·TOC parse/count와
|
||||
current DB identity를 증거에 결속한 뒤에만 승격한다. 기존 dump 존재만으로 이 단계를 생략하지 않는다.
|
||||
|
||||
|
|
@ -426,12 +414,13 @@ release agent의 자동 rollback 범위는 exact API/Web image, Compose 적용
|
|||
DB migration이나 데이터 변경은 자동 복구하지 않는다. migration/data restore는 별도 owner 승인·대상 DB identity·dump
|
||||
hash를 갖춘 복원 절차로만 수행한다. 이미지 rollback 성공을 DB rollback 성공으로 기록하면 안 된다.
|
||||
|
||||
- 새로운 active SHA와 exact API/Web image ID, predeploy dump SHA, previous image 보존.
|
||||
- health 3/3, db/engine true, auth 401, OpenAPI와 G0~G8 route 존재.
|
||||
- `http://100.116.83.60:8088` **실제 평문 NAS origin**에서 §8의 회기 E2E 묶음 0 failure.
|
||||
- active archive `4d15d055…119d4d`, exact API/Web `d5021950…e4b1`/`9796c092…4b36`, fresh dump SHA,
|
||||
previous `6030a677…c611` 보존.
|
||||
- health ok, db/engine true, auth 401, OpenAPI 126.
|
||||
- `http://100.116.83.60:8088` **실제 평문 NAS origin**에서 11-spec browser review 112/112.
|
||||
- `crypto.randomUUID` 예외 0, error boundary 0, SSE→DB review PASS.
|
||||
- 학생 홈→회기→리뷰→G4/G5 반환 연습의 desktop/mobile·DB read reload·멱등·UUID 비노출 유지.
|
||||
- 실패 시 자동 rollback과 previous image 복구를 검증하고, 성공 전에는 G8 카드 전체를 DONE으로 바꾸지 않는다.
|
||||
- 앞선 실패 시 자동 rollback과 previous image 복구를 검증했고 최종 성공 뒤 G8 카드를 DONE으로 바꿨다.
|
||||
|
||||
### 6.3 G7: 외부 종료 Gate
|
||||
|
||||
|
|
@ -694,7 +683,7 @@ node.exe .\node_modules\@playwright\test\cli.js test e2e/session-layout.spec.ts
|
|||
--project=chromium-desktop --project=chromium-mobile --project=chromium-single-run --workers=1 --reporter=line
|
||||
```
|
||||
|
||||
전체 Playwright inventory는 620 tests / 44 files다. 실행 환경/API/DB를 정확히 맞추지 않고 fixture failure를
|
||||
전체 Playwright inventory는 622 tests / 44 files다. 실행 환경/API/DB를 정확히 맞추지 않고 fixture failure를
|
||||
제품 failure로 오인하지 않는다. 같은 blocker가 두 번 반복되면 전체 재시도 대신 원인·증거·수정 계획을 먼저 보고한다.
|
||||
|
||||
## 9. 핵심 변경 파일
|
||||
|
|
@ -738,9 +727,9 @@ node.exe .\node_modules\@playwright\test\cli.js test e2e/session-layout.spec.ts
|
|||
대체 불가능한 동의·인증 세션·실제 참가자/평가자 승인만 요청한다. 동시 작업은 최대 세 하위 lane으로 나누되,
|
||||
NAS/public/DB mutation owner는 항상 한 에이전트만 둔다.
|
||||
|
||||
1. **G8 release lane:** clean-head release mode 구현·unit·dry-run·NAS preview 배포·NAS-origin E2E. 이 lane만 NAS mutation.
|
||||
2. **G7 proof lane:** current public route/config 감사, local provider readiness, `--rehearse`, 네 artifact 수집 준비.
|
||||
실제 마이크는 사용자 명시 동의 전 0회, public mutation은 G8 lane과 시간 겹치지 않게 단일 owner에게 인계.
|
||||
1. **G7 proof lane:** current public route/config 감사, local provider readiness, `--rehearse`, 네 artifact 수집 준비.
|
||||
실제 마이크는 사용자 명시 동의 전 0회, public mutation은 단일 owner에게 인계.
|
||||
2. **G8/NAS monitor lane:** 완료된 archive·images·health·자동화 drift를 읽기 전용으로 감시. 새 material milestone 전 mutation 0.
|
||||
3. **E2E/SSOT lane:** local fixture, disposable DB browser, visual/accessibility, dashboard/TODO/backlog 정합을 읽기 전용으로 감사.
|
||||
|
||||
루트 에이전트는 각 lane의 증거 SHA와 실패 원인을 합쳐 게이트를 판정한다. 같은 blocker가 두 번 반복되면 세 번째
|
||||
|
|
@ -752,17 +741,13 @@ NAS/public/DB mutation owner는 항상 한 에이전트만 둔다.
|
|||
D:\workspace\vignette의 docs/HANDOFF.md를 인수인계 SSOT로 읽고, AGENTS.md → docs/README.md →
|
||||
docs/dev_dashboard.html → docs/TODO.md → docs/ops/backlog-2026-06-26.md 순서로 현재 상태를 재확인해.
|
||||
|
||||
현재 master는 HEAD 94c681d…7fb이고 origin/master보다 2 commit 앞서며, timestamp·voice provider/model,
|
||||
G7 topology·public launcher·G8 clean-head·SSOT가
|
||||
아직 tracked dirty다. 기존 D:\workspace\vignette-clean-head-94c681d와 g8-focus-head-94c681d.tar는 이 최신 변경을
|
||||
포함하지 않으므로 배포 입력으로 사용하지 마. 먼저 git status/diff와 각 lane의 focused test를 재확인해.
|
||||
G8 배포 source는 HEAD `61a41d1f…6af`·tree `87dec55d…3b77`·archive `4d15d055…119d4d`다. 격리 NAS의
|
||||
API/Web `d5021950…e4b1`/`9796c092…4b36`, candidate 112/112, actual NAS-origin 112/112, health·auth 401·OpenAPI
|
||||
126을 통과했고 fresh dump `36ec8748…24db8`과 previous `6030a677…c611`을 보존했다. G8은 DONE이며 새 material
|
||||
milestone 전에는 NAS를 mutation하지 마. 현재 공유 worktree의 후속 dirty 변경은 이 배포 source와 분리해서 다뤄.
|
||||
|
||||
최종 목표는 G0~G8 아홉 목표를 코드-only가 아니라 실제 runtime 증거로 모두 닫는 것이다. G0~G6은 현재 내부 DONE
|
||||
증거를 보존하되 새 clean HEAD 전체 회귀로 재확인해. G8 rollback receipt와 clean-head controller는 구현됐지만
|
||||
2026-08-09 execute 두 번은 모두 NAS mutation 전에 fail-closed됐다. docs/HANDOFF.md §6.1의 naive
|
||||
session timestamp 버그는 UTC/KST 계약과 focused disposable DB/API/browser E2E로 GREEN이다. 테스트 강제 클릭 우회는
|
||||
없다. 사용자 승인을 받아 이 변경을 새 clean commit으로 만들고 HEAD/tree/archive를 다시 결속해 격리 NAS preview에
|
||||
배포한 다음 실제 NAS HTTP origin의 전체 회기 E2E를 0 failure로 통과시켜. G7은 내부 구현만 DONE이다. current source 공개 배포,
|
||||
최종 목표는 G0~G8 아홉 목표를 코드-only가 아니라 실제 runtime 증거로 모두 닫는 것이다. G0~G6과 G8은 DONE이다.
|
||||
G7은 내부 구현만 DONE이다. current source 공개 배포,
|
||||
local_whisper/melotts ready, authenticated public WSS, 사용자의 명시 동의를 받은 물리 마이크 50분 soak,
|
||||
같은 시간창의 runtime/topology high-water, 독립 human voice-gain pack까지 모아 canonical checker exit 0을 만들어야 한다.
|
||||
G7 runner exit의 checker exit 0/gate_closed 결속, browser Origin과 API/WSS host 분리, 3,120초 capture와
|
||||
|
|
@ -779,12 +764,6 @@ worktree와 legacy 인자를 가리키며, 5분 watchdog은 최신 실행에서
|
|||
현재 health ok지만 자동복구는 의도적으로 fail-closed다. clean commit 뒤 동일 stable release root로 두 task를
|
||||
재등록하고 action pin·watchdog result 0·로그온/reboot smoke를 증명한 뒤에만 runtime DONE으로 바꿔.
|
||||
|
||||
NAS 17:07 기준선은 active 6030a677…c611, API/Web 52e0…8b2d/6fdb…f215, previous images 보존,
|
||||
Compose 4개 running+unless-stopped, volume vignette-preview-20260807_pgdata, health/routes/assets GREEN, helper/listener 0이다.
|
||||
release agent는 DB dump/restore를 지원하지 않으므로 execute 직전 fresh custom dump SHA/size/TOC와 DB identity를
|
||||
별도로 결속해. 자동 rollback은 image/Compose/active-state뿐이고 migration/data restore는 별도 owner 승인이야.
|
||||
remote release root/Compose mode 0777 P1도 최소권한 preflight로 닫기 전에는 execute하지 마.
|
||||
|
||||
학생 자기주도 폐루프는 홈 추천→회기→리뷰→G4 처방/G5 전이→별도 재연습→completed-session observer→
|
||||
actual attempt/execution→read-model reload→before/after·멱등까지 desktop/mobile 실제 DB/browser로 검증해.
|
||||
최종 검증은 API full, gateway full, schema/provenance, Web API types/typecheck/build, fixture E2E, disposable DB E2E,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue