운영 빌드 관리자 세션 쿠키의 Secure 속성을 설정 가능하게 (HTTP 사내망 배포에서 관리자 로그인 불가)
5/2/S
대기
lib/adminSession·login route 의 secure: NODE_ENV==='production' 때문에 Docker 이미지를 http://<LAN IP>:3000 으로 쓰면 브라우저가 쿠키를 버려 PUT 이 401. 2026-09-12 코드 재확인: 여전히 동일(app/api/auth/login/route.ts, session/route.ts). ADMIN_COOKIE_SECURE 환경 변수 또는 x-forwarded-proto 기반으로 제어하고 e2e 추가.
2026-09-12
삭제·상태 전파의 하위 탐색을 ID 접두사 대신 parentId 기반으로 변경
4/2/S
대기
lib/treeUtils deleteActivity 와 app/admin/page.tsx onStatusChange 가 id.startsWith(parent+'-') 로 하위를 찾는다. 2026-09-12 재확인: 여전히 동일. 업로드한 JSON 의 자식 ID 가 접두사를 따르지 않으면 삭제 시 고아가 남아 validateActivityImport 400 으로 조용히 실패.
2026-09-12
관리자 콘솔 PUT 실패를 화면에 표시하고 삭제 확인창 중복 제거
3/1/S
대기
ActivityTree 삭제 버튼과 admin page onDeleteActivity 가 각각 confirm 을 띄워 두 번 뜨고 두 번째는 루트 node.title 을 표시. PUT 응답(400/401)을 무시. 새 TrackingSettings 카드의 피드백 패턴(feedback state + details 목록)을 재사용하면 된다.
2026-09-12
validateActivityImport 단위 테스트 추가 (node --test)
3/1/S
대기
이번 회차에 `npm run test:unit`(node --test "lib/**/*.test.ts", Node 22 type stripping, tsconfig allowImportingTsExtensions) 이 생겼으므로 lib/activityData.test.ts 만 추가하면 된다. 단 activityData.ts 는 `@/` 없이 상대 import 이지만 node:fs 를 쓰므로 validateActivityImport 만 import 해 검증.
2026-09-12
CSP 위반 신고를 Reporting-Endpoints/report-to 로도 받고 Report-Only 시험 모드 제공
3/2/S
대기
report-uri 는 폐기 예정 지시어라 최신 브라우저에서도 아직 동작하지만, Reporting-Endpoints 헤더 + report-to 를 함께 보내면 안전하다. /api/csp-report 는 이미 두 형식 모두 파싱한다. 또 새 스니펫을 붙이기 전 Content-Security-Policy-Report-Only 로 먼저 시험하는 관리자 옵션은 위험 없이 막힌 출처를 모을 수 있다.
2026-09-12
미사용 코드 정리: lib/s3.ts, amplify.yml, *_bak/*_local 파일, reset-visitor API
2/1/S
대기
lib/s3.ts 는 어떤 라우트도 import 하지 않음(_bak 만). visitorCount 는 증가 코드가 없어 reset-visitor 도 의미 없음. 정리 시 README 아키텍처 그림의 S3 언급도 함께 수정.
2026-09-12
관리자 가이드에 방문 추적 카드 실제 화면 캡처 추가
2/1/S
대기
2026-09-11 회차의 캡처 스크립트(scripts/guide-screenshots)와 PDF 는 이 브랜치(main 기준)에 없다. 그 작업이 머지된 뒤 TrackingSettings 카드(막힌 출처 목록 포함) 캡처를 ADMIN_GUIDE 7장에 넣고 PDF 를 다시 굽는다.
2026-09-12
관리자가 화면에서 붙이는 방문 추적 스크립트 체계와 nonce 기반 CSP (캠페인 tracking-2026-09)
5/3/M
완료
proxy.ts 요청별 nonce CSP, lib/tracking(core/store/violations), /api/tracking·violations·csp-report, /momento/* 같은 오리진 프록시, 관리 화면 TrackingSettings 카드, 단위 25건·e2e 3건, ADMIN_GUIDE 7장. 기본 꺼짐. 운영 standalone 서버를 실제 Chrome 으로 검증.
2026-09-12
원장 (에이전트가 남긴 기록)
2026-09-11
선택: 사용자·관리자 가이드를 실제 화면 캡처가 들어간 표준 형식으로 완성 (가치 5 / 위험 1 / 작업량 M)
결과: 성공
요약: 기존 docs/USER_GUIDE.md·ADMIN_GUIDE.md(캡처 0장, 일부 내용이 코드와 불일치)를 GUIDE-STANDARD 구성으로 다시 쓰고, Playwright 기반 캡처 스크립트(scripts/guide-screenshots, 격리 데이터 파일 + 자체 dev 서버 + GUIDE_SHOT_* 전용 환경 변수)로 실제 화면 13장을 1440x900으로 찍어 docs/assets/guide/에 실었으며 공용 md2pdf로 두 PDF를 만들었다. 환경 변수 표·API 메서드·연동 규칙은 코드에서 읽어 작성했고, 운영 빌드(NODE_ENV=production)에서 Secure 쿠키 때문에 평문 HTTP LAN 주소로는 관리자 세션이 유지되지 않는 문제를 실측(LAN IP 401 / 127.0.0.1 200)으로 확인해 문서에 경고로 넣었다. 검증: eslint, tsc –noEmit, 기존 e2e 2건 통과, 캡처 스크립트 5건 통과, PDF 페이지를 렌더해 표지·표·그림 확인.
보류 아이디어: (1) 운영 빌드 관리자 세션 쿠키 Secure 속성을 환경 변수나 x-forwarded-proto 로 제어해 HTTP 사내망 배포에서도 관리자 로그인이 되게 한다 — 가치 5 / 위험 2 / S. (2) 삭제·상태 전파가 ID 접두사(<부모ID>-)에 의존해 업로드한 JSON 의 자식이 고아로 남아 삭제가 400 으로 조용히 실패한다 — parentId 기반 하위 탐색으로 바꾼다 — 가치 4 / 위험 2 / S. (3) 관리자 콘솔의 PUT 실패(400/401)를 화면에 표시하고 삭제 확인창이 두 번 뜨는 중복을 제거한다 — 가치 3 / 위험 1 / S. (4) 미사용 lib/s3.ts·amplify.yml·*_bak 파일과 사용되지 않는 reset-visitor API 정리 — 가치 2 / 위험 1 / S. (5) lib/activityData.ts validateActivityImport 단위 테스트(Node test runner) 추가 — 가치 3 / 위험 1 / S.
2026-09-12
선택: 캠페인 tracking-2026-09 — 관리자가 화면에서 붙이는 방문 추적 스크립트 체계와 nonce 기반 CSP (가치 5 / 위험 3 / 작업량 M)
결과: 성공
요약: 이 앱에는 CSP 가 아예 없었으므로 TRACKING-STANDARD 대로 proxy.ts(Next 16 Proxy, Node 런타임)에서 요청마다 nonce 를 만들어 script-src 'self' 'nonce-…'(unsafe-inline 없음, style-src 만 인라인 허용) 정책을 모든 화면에 달고 /api·/momento 는 default-src 'none' 으로 좁혔다. lib/tracking(core: 설정 정규화·검증·provider 별 스니펫·스니펫 출처 추출·정책 조립 / store: data/tracking.json, mtime 캐시 / violations: globalThis 고리 버퍼 100개)과 API(/api/tracking GET·PUT, /api/tracking/violations, /api/csp-report), Momento 같은 오리진 프록시(app/momento/[…path], 기본 켜짐), 관리 화면 카드(TrackingSettings: momento 첫 자리, 8KB 제한, 정책 출처 미리보기, 막힌 출처 목록 + 한 번에 허용)를 만들었다. 기본값 꺼짐이며 파일이 없으면 만들지 않는다. head 삽입은 React 요소, body 삽입은 문자열(React 가 async 외부 스크립트를 head 로 끌어올리는 것을 피하려고)로 그린다. 검증: eslint·tsc, node –test 단위 25건, Playwright e2e 5건(기존 2 + 신규 3: 기본 꺼짐/비화면 정책, 가짜 Momento 수집기까지 프록시로 실제 이벤트 도달·nonce 일치·placement·끄면 정책 복원, 위반 신고 기록·중복 방지·관리 화면에서 허용 추가·잘못된 allowed_hosts 거부), next build 경고 없음, standalone 운영 서버를 실제 Chrome 으로 띄워 Next 자체 인라인 스크립트에 nonce 가 붙고 CSP 콘솔 오류가 없음을 확인. docs/ADMIN_GUIDE.md 7장(CSP·설정 항목·Momento·막힌 출처)과 README 갱신. PDF 는 이 브랜치에 없어 굽지 않음.
보류 아이디어: (1) 운영 빌드 관리자 세션 쿠키 Secure 속성을 환경 변수/x-forwarded-proto 로 제어 — 가치 5 / 위험 2 / S. (2) 삭제·상태 전파의 하위 탐색을 ID 접두사 대신 parentId 기반으로 — 가치 4 / 위험 2 / S. (3) 관리자 콘솔 PUT 실패 표시와 삭제 확인창 중복 제거 — 가치 3 / 위험 1 / S. (4) 미사용 lib/s3.ts·amplify.yml·*_bak/_local·reset-visitor 정리 — 가치 2 / 위험 1 / S. (5) validateActivityImport 단위 테스트를 새로 생긴 npm run test:unit(node –test) 에 추가 — 가치 3 / 위험 1 / S. (6) CSP 위반 목록을 Reporting-Endpoints/report-to 헤더로도 받고, Content-Security-Policy-Report-Only 로 새 스니펫을 먼저 시험하는 모드 — 가치 3 / 위험 2 / S. (7) 관리자 가이드에 추적 카드 실제 화면 캡처 추가(캡처 스크립트가 있는 브랜치가 머지된 뒤) — 가치 2 / 위험 1 / S.