주기 회기 GREEN 증거 갱신

This commit is contained in:
Yun Chan 2026-08-12 17:01:27 +09:00
parent f380cc4641
commit 0f08c91286
5 changed files with 19 additions and 20 deletions

View file

@ -50,15 +50,13 @@ G8 배포 source 기준선은 branch `master`, HEAD `61a41d1f08239b5f9e99cfae42a
listener owner와 generation readiness를 강제하고 loopback contract **8/8**을 통과했다. 실제 9100 listener, listener owner와 generation readiness를 강제하고 loopback contract **8/8**을 통과했다. 실제 9100 listener,
NAS 설정·컨테이너·DB는 건드리지 않았다. 다음 mutation은 소유자 승인 뒤 단일 owner가 check-only→actual 1회→ NAS 설정·컨테이너·DB는 건드리지 않았다. 다음 mutation은 소유자 승인 뒤 단일 owner가 check-only→actual 1회→
NAS health/auth/OpenAPI/assets/실회기 재검증 순서로만 수행한다. NAS health/auth/OpenAPI/assets/실회기 재검증 순서로만 수행한다.
- 마지막 full disposable GREEN은 clean `64e1b221…``periodic-learner-e2e-20260812-150209.json`·SHA-256 - 최신 full disposable GREEN은 clean `f380cc46…`·tree `a6865ba9…`
`a7b2f758…8071`이다. 새 진단과 NAS 로그인 폭 보정을 commit `f97e7fad…`·tree `bdc83f24…`로 고정한 뒤 `periodic-learner-e2e-20260812-164929.json`·SHA-256 `14124ff6…ab67`이다. 500.0초에 동일 학습자
full run을 1회 실행했지만 detached checkout의 `infra/db/init/99_app_role.sh`가 CRLF가 돼 브라우저 회기 생성·SSE·review ready·G4/G5 `0→1→1`, 별도 returned desktop/mobile 4/4와 route mock 0을
`#!/usr/bin/env bash\r` exit 127로 DB가 재시작했다. receipt `periodic-learner-e2e-20260812-163742.json`· 통과했고 public/NAS/active DB 접촉 0, container·volume·network·listener·temp 잔여 0을 독립 재확인했다.
SHA-256 `ad403712…d840f`은 브라우저 전 FAILED, public/NAS/active DB 접촉 0과 cleanup 잔여 0을 증명한다. - 앞선 두 DB init 실패는 `core.autocrlf=true` detached checkout이 `99_app_role.sh`를 CRLF로 만든 것이었고,
- 원인은 Git blob LF와 `core.autocrlf=true` detached worktree 사이의 checkout 계약 누락으로 확정했다. `.gitattributes``*.sh text eol=lf` 뒤 새 worktree에서 tracked shell CRLF 0·해당 파일 CR 0과 실제 DB healthy를
저장소 `.gitattributes``*.sh text eol=lf`를 추가했으며, 같은 장애가 두 번째라 이번 heartbeat에서는 확인해 닫았다. auth overflow 수정은 source/full E2E GREEN이지만 아직 공개/NAS에는 배포하지 않았다.
full runner를 재실행하지 않는다. 다음 gate는 이 수정의 새 commit→새 detached checkout에서 CR 0 확인→
preflight→single full run이다. auth overflow 수정도 아직 공개/NAS에 배포하지 않았다.
- 마지막 완료 작업은 G8 source HEAD `61a41d1f…6af`·tree `87dec55d…3b77`·archive `4d15d055…119d4d` - 마지막 완료 작업은 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 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`을 확인했다. ok·db/engine true·auth 401·OpenAPI 126, fresh dump `36ec8748…24db8`을 확인했다.
@ -715,7 +713,7 @@ route fixture는 90건이므로 전체 숫자를 실제 회기 폐루프로 부
검증한 뒤 sentinel resource·PID·listener·temp 잔여 0을 영수증으로 남긴다. 공개 8001/55432/9099와 NAS는 금지다. 검증한 뒤 sentinel resource·PID·listener·temp 잔여 0을 영수증으로 남긴다. 공개 8001/55432/9099와 NAS는 금지다.
최초 세 full run은 SSE body replay, durable turn 전 종료, 비종료 SSE `response.finished()` 대기를 차례로 찾아 모두 최초 세 full run은 SSE body replay, durable turn 전 종료, 비종료 SSE `response.finished()` 대기를 차례로 찾아 모두
fail-closed했다. 4차 clean run은 reload 뒤 persisted episode를 `학습자만 실행`으로 표시하는 제품 결함을 검출했다. fail-closed했다. 4차 clean run은 reload 뒤 persisted episode를 `학습자만 실행`으로 표시하는 제품 결함을 검출했다.
5·6차 clean run은 핵심 동일 학습자 SSE·review·G4/G5 `0→1→1`을 연속 통과했지만 fixture 공유와 mobile success-state locator를 각각 fail-closed했다. 7차 clean `aa81af29…`는 첫 전체 GREEN을 만들었고 최신 full GREEN은 clean `64e1b221…``periodic-learner-e2e-20260812-150209.json`·SHA-256 `a7b2f758…8071`이다. `94666192…` 단일 run은 disposable DB init health에서 브라우저 전에 FAILED했고 진단 보강 뒤 `f97e7fad…` 단일 run도 같은 단계에서 멈췄다. 두 번째 receipt `periodic-learner-e2e-20260812-163742.json`·SHA-256 `ad403712…d840f`의 cleanup 전 로그가 `99_app_role.sh``#!/usr/bin/env bash\r` exit 127을 확정했다. 두 실행 모두 public/NAS/active DB 접촉 0·cleanup 0이다. Git blob은 LF지만 `core.autocrlf=true`의 새 worktree가 CRLF로 바꾼 것이 원인이므로 `.gitattributes``*.sh text eol=lf`를 고정했다. 같은 장애가 두 번 반복돼 이번 heartbeat에서는 재시도하지 않으며, 새 clean commit/worktree의 CR 0을 확인한 다음 single full run GREEN 전까지 current source를 완료로 부르지 않는다. 5·6차 clean run은 핵심 동일 학습자 SSE·review·G4/G5 `0→1→1`을 연속 통과했지만 fixture 공유와 mobile success-state locator를 각각 fail-closed했다. 7차 clean `aa81af29…`는 첫 전체 GREEN을 만들었다. `94666192…``f97e7fad…` run은 disposable DB init에서 멈췄고 두 번째 receipt의 cleanup 전 로그가 `99_app_role.sh``#!/usr/bin/env bash\r` exit 127을 확정했다. Git blob LF를 Windows checkout에서도 보존하도록 `.gitattributes``*.sh text eol=lf`를 고정한 clean `f380cc46…`·tree `a6865ba9…`의 single full run은 500.0초에 GREEN이었다. 최신 receipt `periodic-learner-e2e-20260812-164929.json`·SHA-256 `14124ff6…ab67`은 same-learner SSE·review·G4/G5 `0→1→1`, returned desktop/mobile 4/4, route mock 0, public/NAS/active DB 접촉 0과 exact cleanup 0을 증명한다. heartbeat는 최신 GREEN이 6시간 이상 오래됐거나 material milestone이 바뀔 때만 다시 실행한다.
## 9. 핵심 변경 파일 ## 9. 핵심 변경 파일

View file

@ -166,7 +166,7 @@
> 6.3분 안에 동일 학습자 SSE·review ready·G4 원장 0→1까지 통과한 뒤, full reload가 persisted episode를 화면에 hydrate하지 > 6.3분 안에 동일 학습자 SSE·review ready·G4 원장 0→1까지 통과한 뒤, full reload가 persisted episode를 화면에 hydrate하지
> 못해 이미 기록된 상태를 `학습자만 실행`으로 되돌리는 제품 결함을 잡았다. 네 번 모두 public/NAS/active DB 접촉 0·자원 잔여 0이다. > 못해 이미 기록된 상태를 `학습자만 실행`으로 되돌리는 제품 결함을 잡았다. 네 번 모두 public/NAS/active DB 접촉 0·자원 잔여 0이다.
> 현재 UI는 현재 session+prescription의 persisted episode를 `현재 원장 상태`로 복원하며 route fixture desktop/mobile 6/6을 통과했다. > 현재 UI는 현재 session+prescription의 persisted episode를 `현재 원장 상태`로 복원하며 route fixture desktop/mobile 6/6을 통과했다.
> 5·6차 clean run은 핵심 동일 학습자 SSE·review·G4/G5 `0→1→1`을 연속 통과했지만 fixture 공유와 mobile success-state locator를 각각 fail-closed했다. 보정 후 7차 clean `aa81af29…`same-learner SSE·review·G4/G5 `0→1→1`, 별도 zero-state returned desktop/mobile 4/4, route mock 0과 exact cleanup 0으로 첫 전체 GREEN을 만들었다. 최신 full GREEN은 clean `64e1b221…``periodic-learner-e2e-20260812-150209.json`·SHA-256 `a7b2f758…8071`이다. `94666192…`와 진단 보강 commit `f97e7fad…`의 single run은 모두 disposable DB init health에서 브라우저 전에 FAILED했지만 public/NAS/active DB 접촉 0·exact cleanup 0을 유지했다. 두 번째 receipt `periodic-learner-e2e-20260812-163742.json`·SHA-256 `ad403712…d840f`는 detached checkout의 `99_app_role.sh`가 CRLF라 `bash\r` exit 127이 난 것을 확정했다. `.gitattributes``*.sh text eol=lf`를 추가했으며 같은 blocker가 두 번 반복돼 이번 heartbeat에서는 재시도하지 않는다. 새 clean commit/worktree에서 CR 0과 single full run GREEN을 확인하기 전까지 current source를 완료로 부르지 않는다. > 5·6차 clean run은 핵심 동일 학습자 SSE·review·G4/G5 `0→1→1`을 연속 통과했지만 fixture 공유와 mobile success-state locator를 각각 fail-closed했다. 보정 후 7차 clean `aa81af29…`첫 전체 GREEN을 만들었다. 이후 `94666192…``f97e7fad…` run의 disposable DB init 실패는 두 번째 receipt의 cleanup 전 로그로 detached `99_app_role.sh` CRLF와 `bash\r` exit 127이 원인임을 확정했다. `.gitattributes``*.sh text eol=lf`를 고정한 clean `f380cc46…`·tree `a6865ba9…`의 single full run은 500.0초에 GREEN이었다. 최신 receipt `periodic-learner-e2e-20260812-164929.json`·SHA-256 `14124ff6…ab67`은 same-learner SSE·review·G4/G5 `0→1→1`, 별도 returned desktop/mobile 4/4, route mock 0, public/NAS/active DB 접촉 0과 exact cleanup 0을 증명한다.
> 증거: [배포 증거](./ops/nas-preview-deployment-evidence-2026-08-07.md), [기계 판독 증거](./ops/evidence/nas-preview-current-deploy-2026-08-07.json), [브라우저 증거](./ops/evidence/nas-preview-live-turn-2026-08-07.png). 이는 G7 물리 마이크·독립 사람 평가 증거를 대체하지 않는다. > 증거: [배포 증거](./ops/nas-preview-deployment-evidence-2026-08-07.md), [기계 판독 증거](./ops/evidence/nas-preview-current-deploy-2026-08-07.json), [브라우저 증거](./ops/evidence/nas-preview-live-turn-2026-08-07.png). 이는 G7 물리 마이크·독립 사람 평가 증거를 대체하지 않는다.
- [ ] **claude_cli ↔ Anthropic API live 동일성** — provider 라우팅·모델 탐색·설정 저장 경로는 구현 완료. 남은 게이트는 연구팀/기관 `ANTHROPIC_API_KEY`를 게이트웨이 호스트에 주입한 뒤 같은 프롬프트의 live 응답·계량·오류 표면화를 비교하는 것이다. - [ ] **claude_cli ↔ Anthropic API live 동일성** — provider 라우팅·모델 탐색·설정 저장 경로는 구현 완료. 남은 게이트는 연구팀/기관 `ANTHROPIC_API_KEY`를 게이트웨이 호스트에 주입한 뒤 같은 프롬프트의 live 응답·계량·오류 표면화를 비교하는 것이다.

View file

@ -301,7 +301,7 @@
<div class="pulse-main"> <div class="pulse-main">
<span class="eyebrow">project pulse</span> <span class="eyebrow">project pulse</span>
<h1>지금 위치: <em>G0~G6 · G8 증거 DONE</em>. <em>NAS 엔진 복구 · G7 external proof</em>가 남았다.</h1> <h1>지금 위치: <em>G0~G6 · G8 증거 DONE</em>. <em>NAS 엔진 복구 · G7 external proof</em>가 남았다.</h1>
<p class="pulse-state"><b>현재:</b> 공개 앱은 GREEN이다. 주기 실회기 current 확인은 DB init에서 fail-closed(cleanup 0), NAS는 health timeout이다. <b>다음:</b> clean single run → 승인 relay → G7 mic·human proof.</p> <p class="pulse-state"><b>현재:</b> 공개 앱과 current 주기 실회기는 GREEN, NAS만 health timeout이다. <b>다음:</b> 승인 relay → NAS 재검증 → G7 mic·human proof.</p>
<details class="pulse-details"> <details class="pulse-details">
<summary>운영 복구·watchdog·배포 상세 보기</summary> <summary>운영 복구·watchdog·배포 상세 보기</summary>
<p class="pulse-state"><b>2026-08-12 현재 인시던트:</b> 공개 API는 health ok·db/engine true·OpenAPI 126·auth 401과 local voice를 유지한다. NAS 프리뷰는 앞선 3/3 <code>degraded·db=true·engine=false</code>에서 15:24 KST local health 3회 타임아웃으로 악화됐고 정적 로그인 화면만 계속 보인다. NAS API의 고정 <code>ENGINE_URL=http://192.168.0.223:9100</code> 대상 listener가 사라졌으며 공개 엔진은 별도 loopback <code>127.0.0.1:9099</code>에서 정상이다. G8 clean-head candidate 112/112·실제 origin 112/112와 rollback receipt는 완료 증거로 보존하지만, 현 NAS runtime은 relay를 source/secret/task에 결속해 복구하고 health 3/3·auth·OpenAPI·assets·실제 회기를 다시 통과할 때까지 DEGRADED다. 자동 재시작·포트 노출·배포는 실행하지 않았다. G7은 별도로 명시 동의 mic·동시 high-water·human evidence가 남는다.</p> <p class="pulse-state"><b>2026-08-12 현재 인시던트:</b> 공개 API는 health ok·db/engine true·OpenAPI 126·auth 401과 local voice를 유지한다. NAS 프리뷰는 앞선 3/3 <code>degraded·db=true·engine=false</code>에서 15:24 KST local health 3회 타임아웃으로 악화됐고 정적 로그인 화면만 계속 보인다. NAS API의 고정 <code>ENGINE_URL=http://192.168.0.223:9100</code> 대상 listener가 사라졌으며 공개 엔진은 별도 loopback <code>127.0.0.1:9099</code>에서 정상이다. G8 clean-head candidate 112/112·실제 origin 112/112와 rollback receipt는 완료 증거로 보존하지만, 현 NAS runtime은 relay를 source/secret/task에 결속해 복구하고 health 3/3·auth·OpenAPI·assets·실제 회기를 다시 통과할 때까지 DEGRADED다. 자동 재시작·포트 노출·배포는 실행하지 않았다. G7은 별도로 명시 동의 mic·동시 high-water·human evidence가 남는다.</p>
@ -682,6 +682,7 @@
<p class="dg-note">203차 관측·보강(2026-08-12): detached-clean <code>94666192…</code>의 periodic full run은 전용 engine ready를 통과한 뒤 <code>app.ci_regression_dag_node</code>가 준비되지 않은 disposable PostgreSQL health에서 실패해 브라우저 단계 전에 종료됐다. receipt <code>periodic-learner-e2e-20260812-155929.json</code>·SHA-256 <code>1bd95e01…52a8</code>은 FAILED이며 public·NAS·active DB 접촉 0과 container·volume·network·listener·temp 잔여 0을 확인했다. stack source는 마지막 GREEN <code>64e1b221…</code>과 동일하지만 cleanup 전에 DB/API 로그를 영수증에 남기지 않아 정확한 환경/init 원인은 미확정이다. 같은 heartbeat에서 재시도하지 않았다. runner는 이제 cleanup 전에 <code>compose ps</code>와 db/api 로그 tail을 캡처하고 secret·email·UUID·민감 query를 제거하며 raw SHA만 결속한다. contract <b>14/14</b>·Ruff·compile을 통과했다.</p> <p class="dg-note">203차 관측·보강(2026-08-12): detached-clean <code>94666192…</code>의 periodic full run은 전용 engine ready를 통과한 뒤 <code>app.ci_regression_dag_node</code>가 준비되지 않은 disposable PostgreSQL health에서 실패해 브라우저 단계 전에 종료됐다. receipt <code>periodic-learner-e2e-20260812-155929.json</code>·SHA-256 <code>1bd95e01…52a8</code>은 FAILED이며 public·NAS·active DB 접촉 0과 container·volume·network·listener·temp 잔여 0을 확인했다. stack source는 마지막 GREEN <code>64e1b221…</code>과 동일하지만 cleanup 전에 DB/API 로그를 영수증에 남기지 않아 정확한 환경/init 원인은 미확정이다. 같은 heartbeat에서 재시도하지 않았다. runner는 이제 cleanup 전에 <code>compose ps</code>와 db/api 로그 tail을 캡처하고 secret·email·UUID·민감 query를 제거하며 raw SHA만 결속한다. contract <b>14/14</b>·Ruff·compile을 통과했다.</p>
<p class="dg-note">204차 적용(2026-08-12): actual NAS 로그인 390×844에서 <code>innerWidth=390</code>, document usable width <code>380</code>, login root width <code>390</code>으로 10px 가로 넘침이 계속 재현돼 200차의 <code>100vw→100%</code> 보정만으로는 부족함을 확인했다. auth/login 최상위 shell을 block auto-size와 <code>max-inline-size:100%</code>로 바꿔 classic scrollbar를 usable scrollport에서 이중 계산하지 않게 했다. route-mocked 학생 자기주도·G1~G5·G7 desktop/mobile <b>76/76</b>, 인증 <b>2/2</b>, 대시보드 <b>10/10</b>, type/API contract·SSOT checker를 통과했다. 이 수정은 아직 공개/NAS에 배포하지 않았고, 현 NAS는 health 타임아웃·실제 화면 overflow 10px인 DEGRADED 상태다.</p> <p class="dg-note">204차 적용(2026-08-12): actual NAS 로그인 390×844에서 <code>innerWidth=390</code>, document usable width <code>380</code>, login root width <code>390</code>으로 10px 가로 넘침이 계속 재현돼 200차의 <code>100vw→100%</code> 보정만으로는 부족함을 확인했다. auth/login 최상위 shell을 block auto-size와 <code>max-inline-size:100%</code>로 바꿔 classic scrollbar를 usable scrollport에서 이중 계산하지 않게 했다. route-mocked 학생 자기주도·G1~G5·G7 desktop/mobile <b>76/76</b>, 인증 <b>2/2</b>, 대시보드 <b>10/10</b>, type/API contract·SSOT checker를 통과했다. 이 수정은 아직 공개/NAS에 배포하지 않았고, 현 NAS는 health 타임아웃·실제 화면 overflow 10px인 DEGRADED 상태다.</p>
<p class="dg-note">205차 진단·보강(2026-08-12): 진단과 로그인 폭 수정을 commit <code>f97e7fad…</code>·tree <code>bdc83f24…</code>의 새 detached-clean worktree에 고정해 periodic full runner를 한 번 실행했다. 전용 engine ready 뒤 disposable DB가 restart 127로 unhealthy가 돼 브라우저 전에 fail-closed했다. receipt <code>periodic-learner-e2e-20260812-163742.json</code>·SHA-256 <code>ad403712…d840f</code>의 cleanup 전 secret/PII-safe 로그가 <code>99_app_role.sh</code><code>#!/usr/bin/env bash\r</code><code>No such file or directory</code>를 확정했다. Git blob은 LF지만 Windows <code>core.autocrlf=true</code>가 새 worktree를 CRLF로 만든 것이 원인이다. <code>.gitattributes</code><code>*.sh text eol=lf</code>를 추가했다. public·NAS·active DB 접촉 0, container·volume·network·listener·temp 잔여 0이며, 같은 blocker가 두 번 반복돼 이번 heartbeat에서는 재실행하지 않는다. 다음 gate는 새 commit→새 detached checkout CR 0→preflight→single full run이다.</p> <p class="dg-note">205차 진단·보강(2026-08-12): 진단과 로그인 폭 수정을 commit <code>f97e7fad…</code>·tree <code>bdc83f24…</code>의 새 detached-clean worktree에 고정해 periodic full runner를 한 번 실행했다. 전용 engine ready 뒤 disposable DB가 restart 127로 unhealthy가 돼 브라우저 전에 fail-closed했다. receipt <code>periodic-learner-e2e-20260812-163742.json</code>·SHA-256 <code>ad403712…d840f</code>의 cleanup 전 secret/PII-safe 로그가 <code>99_app_role.sh</code><code>#!/usr/bin/env bash\r</code><code>No such file or directory</code>를 확정했다. Git blob은 LF지만 Windows <code>core.autocrlf=true</code>가 새 worktree를 CRLF로 만든 것이 원인이다. <code>.gitattributes</code><code>*.sh text eol=lf</code>를 추가했다. public·NAS·active DB 접촉 0, container·volume·network·listener·temp 잔여 0이며, 같은 blocker가 두 번 반복돼 이번 heartbeat에서는 재실행하지 않는다. 다음 gate는 새 commit→새 detached checkout CR 0→preflight→single full run이다.</p>
<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>
<div class="dg-principles" aria-label="디자인 생성 가드레일"> <div class="dg-principles" aria-label="디자인 생성 가드레일">
<div><b>래스터만 사용</b><span>이미지 생성 도구 산출물은 PNG 기반 시안이다. SVG·벡터·와이어프레임·로고 시트로 해석하지 않는다.</span></div> <div><b>래스터만 사용</b><span>이미지 생성 도구 산출물은 PNG 기반 시안이다. SVG·벡터·와이어프레임·로고 시트로 해석하지 않는다.</span></div>
<div><b>기능 우선</b><span>메인 라우트의 실제 액션과 정보 구조를 먼저 반영한다. 장식은 기능을 가리지 않는 수준에서만 쓴다.</span></div> <div><b>기능 우선</b><span>메인 라우트의 실제 액션과 정보 구조를 먼저 반영한다. 장식은 기능을 가리지 않는 수준에서만 쓴다.</span></div>

View file

@ -285,13 +285,13 @@ persisted episode를 UI에 hydrate하지 못하는 제품 결함을 각각 fail-
SSE·review·G4/G5 `0→1→1`을 연속 통과했지만 fixture 공유와 mobile success-state locator를 각각 검출했다. 보정 후 7차 SSE·review·G4/G5 `0→1→1`을 연속 통과했지만 fixture 공유와 mobile success-state locator를 각각 검출했다. 보정 후 7차
clean `aa81af29…`는 same-learner SSE·review·G4/G5 `0→1→1`, 별도 zero-state returned desktop/mobile 4/4, route mock 0, clean `aa81af29…`는 same-learner SSE·review·G4/G5 `0→1→1`, 별도 zero-state returned desktop/mobile 4/4, route mock 0,
exact cleanup 0으로 첫 전체 GREEN receipt를 만들었다. 최신 full GREEN은 clean `64e1b221…` exact cleanup 0으로 첫 전체 GREEN receipt를 만들었다. 최신 full GREEN은 clean `64e1b221…`
`periodic-learner-e2e-20260812-150209.json`·SHA-256 `a7b2f758…8071`이다. `94666192…` run은 disposable DB `94666192…`와 `f97e7fad…` run은 disposable DB init에서 멈췄고, 두 번째 receipt의 cleanup 전 로그는 detached
init health에서 브라우저 전에 FAILED했고, 진단 보강 commit `f97e7fad…`의 single run도 같은 단계에서 멈췄다. `infra/db/init/99_app_role.sh`가 CRLF라 `/usr/bin/env: bash\r: No such file or directory`로 exit 127이 난 것을
두 번째 receipt `periodic-learner-e2e-20260812-163742.json`·SHA-256 `ad403712…d840f`의 cleanup 전 로그는 확정했다. Windows `core.autocrlf=true`에서도 shell entrypoint를 LF로 checkout하도록 `.gitattributes`
detached checkout의 `infra/db/init/99_app_role.sh`가 CRLF라 `/usr/bin/env: bash\r: No such file or directory` `*.sh text eol=lf`를 둔 clean `f380cc46…`·tree `a6865ba9…`의 single full run은 500.0초에 GREEN이었다.
exit 127이 난 것을 확정했다. 두 실행 모두 보호 runtime 접촉 0·exact cleanup 0이다. Windows `core.autocrlf=true` 최신 receipt `periodic-learner-e2e-20260812-164929.json`·SHA-256 `14124ff6…ab67`은 same-learner SSE·review·
환경에서도 shell entrypoint를 LF로 checkout하도록 `.gitattributes``*.sh text eol=lf`를 둔다. hourly heartbeat는 G4/G5 `0→1→1`, returned desktop/mobile 4/4, route mock 0, 보호 runtime 접촉 0과 exact cleanup 0을 증명한다.
동일 장애가 두 번 반복되면 같은 heartbeat에서 재실행하지 않고, 새 clean commit/worktree에서 CR 0을 먼저 확인한다. hourly heartbeat는 최신 GREEN이 6시간 이상 오래됐거나 material milestone이 바뀔 때만 다시 실행한다.
- **병렬 시나리오**: 166 tests (desktop 83 + mobile 83) - **병렬 시나리오**: 166 tests (desktop 83 + mobile 83)
- **`@single-run` 직렬 시나리오**: 49 tests (DB 영속화·세션 MVP·음성 성공경로·인증 시각 테마·회기말 평가 저장·교수자 명시 재평가 저장·교수자 턴 재평가 저장·교수자 UI 평가 재시도·교수자 사용자별 분석·source pack sync·이론모드 저장·동의 철회 후 voice 차단·브라우저 stream PII 마스킹·음성 transcript 저장 실패 UI 표면화 등) - **`@single-run` 직렬 시나리오**: 49 tests (DB 영속화·세션 MVP·음성 성공경로·인증 시각 테마·회기말 평가 저장·교수자 명시 재평가 저장·교수자 턴 재평가 저장·교수자 UI 평가 재시도·교수자 사용자별 분석·source pack sync·이론모드 저장·동의 철회 후 voice 차단·브라우저 stream PII 마스킹·음성 transcript 저장 실패 UI 표면화 등)

View file

@ -98,7 +98,7 @@
무마이크 rehearsal은 완료됐지만 물리 마이크·human pack을 대체하지 않는다. 무마이크 rehearsal은 완료됐지만 물리 마이크·human pack을 대체하지 않는다.
격리 NAS 프리뷰 `http://100.116.83.60:8088`은 전용 Compose 프로젝트·포트·네트워크·볼륨에 배포했고, 실제 브라우저 회기와 격리 NAS 프리뷰 `http://100.116.83.60:8088`은 전용 Compose 프로젝트·포트·네트워크·볼륨에 배포했고, 실제 브라우저 회기와
review API 저장 축어록 2턴을 확인했다. 기존 프로젝트 중단·재생성 명령은 실행하지 않았다. 매시간 `Vignette 앱 상태·회기 E2E 정기 검증` review API 저장 축어록 2턴을 확인했다. 기존 프로젝트 중단·재생성 명령은 실행하지 않았다. 매시간 `Vignette 앱 상태·회기 E2E 정기 검증`
heartbeat(automation id `vignette-e2e`)는 ACTIVE이며 공개/NAS 화면·health는 읽기 전용으로 보여준다. NAS 112건은 실 API/DB 22와 route fixture 90으로 영수증에서 분리한다. 동일 학습자 SSE→review→G4/G5 actual 폐루프 runner의 clean HEAD/tree·보호 포트 거부·sentinel·exact cleanup과 unit 14/14는 완료됐다. 최초 세 full run은 하네스, 4차는 reload ledger hydration, 5차는 fixture 공유, 6차는 mobile success-state locator를 fail-closed했다. 7차 clean `aa81af29…` 이후 최신 full GREEN은 clean `64e1b221…``periodic-learner-e2e-20260812-150209.json`·SHA-256 `a7b2f758…8071`이다. `94666192…``f97e7fad…` single run은 disposable DB init health에서 브라우저 전에 FAILED했지만 public/NAS/active DB 접촉 0·cleanup 0을 유지했다. 두 번째 receipt `periodic-learner-e2e-20260812-163742.json`·SHA-256 `ad403712…d840f`의 secret/PII-safe 로그가 detached checkout의 `99_app_role.sh` CRLF와 `bash\r` exit 127을 확정했다. `.gitattributes``*.sh text eol=lf`를 추가했고 같은 blocker가 두 번 반복돼 이번 heartbeat에서는 자동 재시도하지 않는다. 새 clean commit/worktree의 CR 0과 single full run GREEN 전까지 current source를 완료로 부르지 않는다. release gate·NAS preflight·배포 SHA 변경 때만 프리뷰를 갱신한다. 2026-08-07 SHA `6030a677af7e87cbfabc422b553d108d53414fd3c446548734a13b036d35c611`의 localhost 108/108과 평문 origin UUID 24건 실패는 역사 기준선으로 보존한다. 실제 receipt-bound rollback은 같은 프리뷰에서 별도 helper로 두 번 실행해 종료했다([런북](./nas-preview-g8-rollback-proof-runbook.md), [기계 판독 증거](./evidence/nas-preview-g8-actual-rollback-2026-08-07.json)). 현재는 source HEAD/tree `61a41d1f…6af`/`87dec55d…3b77`의 active archive `4d15d055…119d4d`, exact API/Web `d5021950…e4b1`/`9796c092…4b36`이 실행 중이다. candidate 112/112와 실제 NAS-origin 112/112, health ok·db/engine true·auth 401·OpenAPI 126을 통과했고 fresh dump `36ec8748…24db8` 1,097,100 bytes·TOC 1,738/TABLE DATA 129와 previous `6030a677…c611`을 보존했다. 증거: [배포 증거](./nas-preview-deployment-evidence-2026-08-07.md), heartbeat(automation id `vignette-e2e`)는 ACTIVE이며 공개/NAS 화면·health는 읽기 전용으로 보여준다. NAS 112건은 실 API/DB 22와 route fixture 90으로 영수증에서 분리한다. 동일 학습자 SSE→review→G4/G5 actual 폐루프 runner의 clean HEAD/tree·보호 포트 거부·sentinel·exact cleanup과 unit 14/14는 완료됐다. 최초 세 full run은 하네스, 4차는 reload ledger hydration, 5차는 fixture 공유, 6차는 mobile success-state locator를 fail-closed했고 7차 clean `aa81af29…`가 첫 전체 GREEN을 만들었다. `94666192…``f97e7fad…`의 DB init 실패는 두 번째 receipt 로그로 detached `99_app_role.sh` CRLF와 `bash\r` exit 127이 원인임을 확정했다. `.gitattributes``*.sh text eol=lf`를 적용한 clean `f380cc46…`·tree `a6865ba9…` single run이 최신 full GREEN이다. receipt `periodic-learner-e2e-20260812-164929.json`·SHA-256 `14124ff6…ab67`은 same-learner SSE·review·G4/G5 `0→1→1`, returned desktop/mobile 4/4, route mock 0, public/NAS/active DB 접촉 0과 cleanup 0을 증명한다. heartbeat는 이 GREEN이 6시간 이상 오래됐거나 material milestone이 바뀔 때만 다시 실행한다. release gate·NAS preflight·배포 SHA 변경 때만 프리뷰를 갱신한다. 2026-08-07 SHA `6030a677af7e87cbfabc422b553d108d53414fd3c446548734a13b036d35c611`의 localhost 108/108과 평문 origin UUID 24건 실패는 역사 기준선으로 보존한다. 실제 receipt-bound rollback은 같은 프리뷰에서 별도 helper로 두 번 실행해 종료했다([런북](./nas-preview-g8-rollback-proof-runbook.md), [기계 판독 증거](./evidence/nas-preview-g8-actual-rollback-2026-08-07.json)). 현재는 source HEAD/tree `61a41d1f…6af`/`87dec55d…3b77`의 active archive `4d15d055…119d4d`, exact API/Web `d5021950…e4b1`/`9796c092…4b36`이 실행 중이다. candidate 112/112와 실제 NAS-origin 112/112, health ok·db/engine true·auth 401·OpenAPI 126을 통과했고 fresh dump `36ec8748…24db8` 1,097,100 bytes·TOC 1,738/TABLE DATA 129와 previous `6030a677…c611`을 보존했다. 증거: [배포 증거](./nas-preview-deployment-evidence-2026-08-07.md),
[브라우저 증거](./evidence/nas-preview-live-turn-2026-08-07.png). 위 health GREEN은 배포 당시 증거다. [브라우저 증거](./evidence/nas-preview-live-turn-2026-08-07.png). 위 health GREEN은 배포 당시 증거다.
2026-08-12 current NAS는 고정 LAN engine relay listener 상실로 degraded였고 15:24 KST local health 요청도 2026-08-12 current NAS는 고정 LAN engine relay listener 상실로 degraded였고 15:24 KST local health 요청도
3회 타임아웃했다. source-pinned relay launcher와 loopback contract 8/8은 완료했지만 실제 9100 시작·NAS 3회 타임아웃했다. source-pinned relay launcher와 loopback contract 8/8은 완료했지만 실제 9100 시작·NAS