Commit Graph
99 Commits
Author SHA1 Message Date
HeuJung bd215bc586 feat(identity): NHN KCP 휴대폰 본인확인 플러그인 추가
메일 인증 대신 휴대폰 본인확인을 쓸 수 있게 하는 플러그인을 추가한다.
가입·비밀번호 재설정·성인인증 등 코어 IDV 가 강제하는 모든 지점에서 동작하며,
테스트 모드로 계약 없이 전 흐름을 확인할 수 있다.

구현·검수 과정에서 드러난 저장소 전역 결함을 함께 처리했다.

- 외래키 컬럼의 한국어 comment 가 방출되지 않던 문제 (소스 38건 교정 +
 기설치본 백필 업그레이드 스텝 7종). ->comment 를 ->constrained 뒤에
 체인하면 예외 없이 통과하면서 comment 가 조용히 사라진다
- 로케일 전환 후 확장 액션 핸들러가 소실되던 문제 (플러그인 3종에
 재등록 진입점 노출)
- 본인인증 상태 폴링 응답이 누적 시도 횟수를 함께 내보내던 문제
- 인증 안내 문구와 실제 진행 방식의 폭 경계 불일치 (768~1023px).
 엔진과 같은 값을 같은 방법으로 읽도록 교정
- transition_overlay_target 이 replace 없이 무효이던 관리자 목록 40곳.
 로딩 표시가 나오지 않아도 경고가 남지 않아 화면을 봐야만 알 수 있었다

두 인증 플러그인의 코어 최소 요구 버전을 7.0.6 으로 올린다. 운영 모드
자격증명 필수 검사가 7.0.6 의 설정 저장 검증 표면에 의존하며, 그보다 낮은
코어에서는 그 검사가 조용히 통과해 빈 자격증명으로 저장할 수 있었다.

재발 차단으로 정적 검사 룰 4종을 신설하고, 검사 도구가 미커밋 신규 확장을
"검사 파일 0" 으로 통과시키던 사각을 함께 막았다.
2026-07-31 00:32:46 +09:00
chym1217 ac57df93bd fix(sirsoft-gdpr): HMAC 서명 만료시각 추가 + sequence handler 위치 정리
PR 전 마지막 재검토에서 남겨뒀던 두 항목을 처리한다.

- 게스트 세션 쿠키 HMAC 서명에 만료시각을 추가했다. 결제 플러그인
 (IssuesReceiptCookie)과 동일하게 값 형식을 {uuid}|{만료시각}|{서명}
 3단 구조로 바꾸고, 서명 자체가 만료시각도 함께 해시하므로 만료시각만
 위조해 유효기간을 늘리는 시도도 차단된다. 만료 기간은 쿠키 자체의
 브라우저 만료(1년)와 동일하게 맞췄다 — 결제 정보가 아닌 쿠키 선호도
 식별자라 짧게 잘라 잦은 재발급을 강제할 실익이 없다.
- 관리자 설정 화면의 정책 버전 이력 토글 버튼에서 sequence handler의
 actions 배열이 params 안에 잘못 중첩되어 있던 걸 발견해 바로잡았다.
 엔진(ActionDispatcher.handleSequence)이 두 위치를 모두 인식하는
 fallback을 갖고 있어 실제 동작은 정상이었지만, 정석 위치(top-level)로
 정리하고 실제 클릭 시 이력 표가 펼쳐지는지 검증하는 E2E를 추가했다.
2026-07-30 12:19:53 +09:00
chym1217 4d50fa2cde fix(sirsoft-gdpr): 관리자 설정 카드 제목 경고 색상 오용 수정
가 GDPR 관리자 설정 화면 스크린샷에서 카드 제목만 다른 확장과 달리
빨간색으로 표시되는 것을 발견해 지시했다.

「운영 주체」·「쿠키 동의 배너」·「자동 차단 정책」 카드 제목과 차단
도메인 안내 소제목이 에러/경고 전용 시맨틱(text-error-strong, red 계열)을
잘못 사용하고 있었다. 일반 카드 제목이므로 다른 정상 카드와 동일한
중립 톤(section-heading-md)으로 교체.

원래 develop 에 이미 있던 기존 결함이며 다른 확장(marketing,
pay_kginicis 등)에도 동일 패턴이 있으나, 이번엔 GDPR 플러그인 범위로
한정해 수정한다.

기존 Vitest 회귀 가드가 이 색상 버그를 "의도된 설계"로 잘못 확정해두고
있어 함께 뒤집었고, 실제 브라우저에서 색상을 검증하는 E2E 테스트도
추가했다(computed style RGB 값 검사).
2026-07-30 10:50:50 +09:00
chym1217 11d3cc6445 fix(sirsoft-gdpr): E2E 시드 커맨드 보안·멱등성 결함 2건 수정
PR 생성 직전 마지막 점검으로 변경분 전체를 라인 단위 재검토한 결과,
직전 커밋에서 신규 작성한 게스트→로그인 배너 재노출 E2E 시드 커맨드
(PlaywrightSeedGdprGuestLogin)에서 2건을 발견해 수정한다.

- 로그인 테스트 계정 비밀번호가 코드에 고정 문자열로 박혀 있어, 실수로
 프로덕션 DB에서 실행되면 알려진 비밀번호로 로그인 가능한 계정이
 남는 위험이 있었다. 실행마다 Str::random(32)로 무작위 생성하도록
 변경.
- 이메일/게스트 세션 ID를 매번 새로 발급해 재실행할 때마다 계정과
 동의 이력이 계속 누적됐다. 고정값으로 바꾸고 재실행 시 기존 데이터를
 먼저 삭제하도록 변경(sirsoft-page 모듈의 선삭제 패턴과 동일).
 2회 연속 실행 후 DB 조회로 누적되지 않음을 확인.

부수: cookie_banner.json 의 배너 재노출 조건에 "회원 로그인 후 로그아웃"
케이스가 회귀 테스트로 고정되어 있지 않아 추가 (로직 자체는 기존에도
정상 동작 확인됨 — 커버리지 보강).
2026-07-30 10:50:49 +09:00
chym1217 2a036704f4 fix(sirsoft-gdpr): 쿠키 동의 보안 결함 3건 수정 + 하위호환 고지
이슈 체크리스트와는 별개로, 처리 완료 후 지시로 진행한
sirsoft-gdpr 플러그인 전수 비판적 검토에서 발견한 보안·결함 3건을
수정한다.

- Admin 설정 저장 API 의 검증 우회 fallback(빈 요청 시 $request->all
 사용) 제거. UpdateAdminSettingsRequest 필드가 모두 nullable 이라
 검증을 거치지 않은 임의 키가 저장 로직까지 전달될 수 있었다.
- 게스트 세션 식별 쿠키(gdpr_session) 에 HMAC-SHA256 서명 적용.
 api 미들웨어 그룹에는 EncryptCookies 가 없어 쿠키가 평문으로 오가
 임의 UUID로 타인의 게스트 동의 상태를 조회/철회할 수 있었다.
 결제 플러그인들의 IssuesReceiptCookie 트레이트와 동일 컨벤션 채택.
 이 조치로 배포 이전 발급된 비회원 쿠키는 1회 초기화되며 이미
 배너를 닫았던 비회원은 다음 방문 시 배너를 다시 보게 된다(회원
 동의 이력은 영향 없음) — CHANGELOG 에 고지.
- 게스트로 쿠키 배너를 닫은 뒤 동의 이력 없는 다른 계정으로 로그인해도
 배너가 계속 숨겨져 있던 결함 수정. _global.gdprBannerDismissedFor 가
 "닫힘 여부"(boolean) 대신 "누가 닫았는지"(사용자 식별자)를 저장하도록
 변경해, 로그인으로 사용자가 바뀌면 다시 노출되게 한다. 실제 로그인
 폼 제출을 거쳐 재현하는 E2E spec 신규 작성(PlaywrightSeedGdprGuestLogin
 시드 커맨드 포함, sirsoft-page 의 PlaywrightSeedPage 패턴 재사용).

부수: 자동 차단 정책 안내에 보호 범위 한계 고지 추가, GDPR 플러그인
번들 로딩 우선순위 상향(다른 확장의 스크립트로부터 보호 범위 확대).
2026-07-30 10:50:49 +09:00
chym1217 192000cfce fix(sirsoft-gdpr): 쿠키 배너 노출 토글 안내 문구 및 필드 레이아웃 정정
banner_enabled(쿠키 배너 노출) 토글 안내가 "마이페이지 동의 관리 카드"까지
함께 켜지고 꺼지는 것처럼 서술되어 있었으나, 실제로는 카드가 이 토글과
무관하게 동의/철회 이력이 있는 회원에게 항상 노출된다(GDPR Art.7(3) 철회
대칭성 보장, mypage_privacy_tab.json 회귀 가드로 이미 고정된 설계).
문구만 실제 동작과 어긋나 있어 ko/en 양쪽 hint 및 관련 코드 주석을
바로잡았다.

문구 확인 과정에서 field_legal_entity_name / field_data_storage_location /
field_banner_enabled / field_banner_position 4개 필드가 텍스트 스타일
전용 클래스(section-heading-md, grid 미정의)를 컨테이너로 잘못 사용해
안내 문구가 길어지면 입력/토글 컨트롤이 아래 줄로 밀려나던 기존 UI
결함도 함께 발견해 수정했다. 같은 파일의 field_privacy_policy_slug가
이미 쓰던 올바른 grid-3col-responsive 패턴으로 통일.
2026-07-30 10:42:04 +09:00
chym1217 a0cc36a9db fix(sirsoft-gdpr): 정책 버전 본문 페이지 링크 404 수정
정책 버전 snapshot 모달의 본문 페이지 링크가 /{{slug}} 로 조합되어
페이지 모듈(sirsoft-page) URL 패턴 /page/{slug} 와 불일치해 404가
발생하던 문제를 수정. 쿠키 배너의 동일 링크와 조합 방식을 통일했다.

회귀 검증을 위해 GDPR 플러그인에 Playwright E2E 인프라를 최초 도입.
2026-07-30 10:42:04 +09:00
chym1217 d5b6f4b457 fix(sirsoft-gdpr): 마이페이지 쿠키 동의 철회 시 철회일 미표시 수정
철회 이력(status=revoked)이 있는 항목에 한해 status_at_formatted·
status_label 을 채워 마이페이지에 철회일이 표시되도록 한다. 거부·
미설정 상태는 기존대로 미표시 유지 ( 확인).

동의/철회 날짜 줄을 초록/빨강으로 구분해 시각적으로 대등하게
강조한다 (배지·관리자 GDPR 동의 이력 화면과 동일 톤).
2026-07-30 10:42:03 +09:00
HeuJung 7b56d5f23a feat(core,board,ecommerce,page,ckeditor5,kginicis): 업로드 이미지 축소·로그인 2단계 인증 도입 + 파생 결함 수정
인터뷰에서 방향만 정하고 남겨 뒀던 후속 5건을 구현하고, 커밋 전 종합 점검에서
발견한 결함 2건을 함께 고쳤다.

기능 도입:
- 업로드 이미지 축소 — `upload.image_max_width` / `image_max_height` / `image_quality`
 는 저장·검증만 되고 리사이즈 코드가 0건이었다. 비율 유지, 상한 이내면 재인코딩하지
 않음(불필요한 화질 손실 방지), 한계 미설정이면 무동작(기존 사이트 이미지 보호).
 PNG·GIF·WebP 투명도 보존. 실패해도 업로드는 계속되고 원본이 저장된다.
- 로그인 2단계 인증 — `security.two_factor_auth` 는 설정 항목만 있고 구현도 화면
 컨트롤도 없었다. 코어 IDV 인프라를 재사용해 purpose `login` 을 추가하고, 비밀번호
 확인 통과 후 challenge 만 발행한다(토큰 미발급 + logout). `POST /api/auth/login/two-factor`
 가 코드를 확인해야 토큰이 나가며, 로그인과 같은 요청 제한을 적용한다. challenge 의
 purpose 를 대조해 다른 흐름의 challenge 로 로그인하는 것을 막는다. 코드 발송이
 실패하면 실패로 알린다 — 2단계를 건너뛰고 로그인시키면 통제가 조용히 열린다.

결함 수정:
- 게시글 수정 시 사용자 경로가 `attachment_ids` 를 Service 로 넘기지 않아, 검증과
 권한은 통과하고 200 을 받는데 첨부만 조용히 연결되지 않았다. 관리자 경로는 넘기고
 있어 같은 요청이 화면에 따라 다르게 동작했다.
- 설정 화면 라디오가 `pointer-events-none` + Label click 으로만 상태를 바꿔, 키보드
 방향키(change) 조작 시 화면 표시와 저장될 값이 어긋났다. 동일 패턴 4개 레이아웃
 12개 라디오에 change 액션을 부여하고 params 를 click 과 동일하게 고정한다.
- 주문완료 화면이 결제수단 확인보다 영수증 조회를 앞세워, PG 를 거치지 않는 주문에서도
 매번 404 요청이 나갔다.
- 개별 게시판 폼의 숫자 항목에 경계값 바인딩이 없어 환경설정 화면과 안내가 달랐다.

커밋 전 점검에서 발견:
- 2단계 인증이 반쪽으로 들어가 있었다. enum 에 case 만 추가하고 코어 purpose
 레지스트리와 ko/en 라벨을 빠뜨려, 목적 목록 API 에서 통째로 빠지고 `hasPurpose`
 가 false 였으며 라벨 대신 i18n 키 원문이 반환됐다. 관리자가 이 목적의 메시지
 템플릿·정책을 만들 수 없는 상태였다. 세 곳을 enum 기준으로 전수 대조하는 회귀
 테스트를 함께 둔다.
- 업로드 이미지 축소가 적용되지 않은 8번째 서비스(레이아웃 편집기 첨부)가 있었다.
 열거형 커버리지 테스트는 내 조사 결과를 green 으로 고정할 뿐 전수를 증명하지
 못한다 — 같은 규약을 조건으로 표현한 audit 룰이 첫 실행에서 검출했다.

재발 방지:
- audit 룰 `upload-service-image-resize` (신규 업로드 서비스의 축소 누락 검출)
- 트러블슈팅 사례 20 (코어 설정이 일부 경로에만 적용되는 증상의 진단 절차)
- `sirsoft-ckeditor5` 의 코어 최소 요구 버전을 7.0.6 으로 상향 (신설 클래스 의존)

공개 이슈: gnuboard/g7
2026-07-30 07:57:06 +09:00
HeuJung d17ea28da5 fix(core,board,ecommerce,page,kginicis): 정책값 하드코딩·계약 분리 결함 일괄 수정
관리자 환경설정이 값을 저장은 하지만 실제 동작에는 닿지 않던 결함군을 정리했다.
설정 화면(min/max)·저장 검증(FormRequest)·런타임 적용(Service) 세 계층이 각자
리터럴을 들고 있어 서로 조용히 갈라지던 것이 공통 원인이다.

경계값 SSoT 도입:
- config/core.php `settings_limits` 를 단일 출처로 두고, FormRequest 는 이 값으로
 규칙을 만들고 화면은 설정 응답의 `_meta.limits` 로 같은 값을 받아 바인딩한다.
- 게시판·이커머스도 각 모듈 config 의 limits 를 동일 구조로 노출한다.

적용되지 않던 정책을 실제로 적용:
- 비밀번호 최소 길이·특수문자 필수(신규 지정 7개 경로. 로그인은 제외 — 정책을
 올렸을 때 기존 회원이 자기 계정에 접근조차 못 하는 데드락을 막기 위함)
- 계정 잠금 시간 0 = 무한대(전용 컬럼 분리. timestamp 상한과 NULL 규약 때문에
 기존 컬럼 재사용이 불가능하다) + 관리자 수동 해제 경로
- 업로드 최대 크기·허용 확장자, 게시판 첨부 개수·댓글 깊이, 페이지 첨부 정책,
 장바구니 수량·구매 한도, 마일리지 사용 한도, 주문 부가세

파생 결함:
- 큐 Job(sync 드라이버)이 진행 중인 요청의 Request 바인딩을 덮어써, 뒤이어 실행되는
 훅 리스너가 헤더를 잃고 조용히 건너뛰었다. Job 이 원 바인딩을 복원하도록 고치고,
 전송 헤더가 필요한 리스너는 동기 실행으로 선언한다.
- 확장 업데이트 실패 시 상태만 되돌리고 상태 캐시를 비우지 않아, 그 확장의 관리자
 화면만 캐시 TTL(기본 하루) 동안 404 로 남았다. 실패 경로에도 무효화를 대칭으로
 두고, 빈 목록 자체를 캐시하지 않는다.
- 글 작성 시 첨부 파일이 Service 로 전달되지 않아 검증·권한은 통과하고 첨부만 사라졌다.
- 환경설정 저장 실패 안내가 내부 설정 키를 그대로 노출했다(105개 항목에 라벨 부여).

재발 방지:
- audit 룰 3종(레이아웃 경계 리터럴 / FormRequest 경계 불일치 / Service 재클램프)
- 테스트 실행 범위 강제 훅(check-test-scope)
- 트러블슈팅 사례 2건(큐 Job 요청 오염 / 확장 상태 캐시 고착)

공개 이슈: gnuboard/g7
2026-07-30 07:52:24 +09:00
chym1217 023ab4f099 chore(sirsoft-board,sirsoft-ecommerce,message_bizppurio): 코드 주석 내부 이슈번호 제거 + 시나리오 매니페스트 저장검증 effect 반영
PR 준비 비판적 재검토 중 발견한 잔여 항목 2건 정리.

- 게시판·이커머스 알림톡 연동 UI 테스트/레이아웃의 e2e:allow 주석·describe
 블록에 남아있던 작업 중 이슈번호 제거 (audit 정규식은 형식만 검사해
 이슈번호 잔존은 검출하지 못함)
- alimtalk-dispatch-binding.yaml 시나리오 매니페스트에 NotificationBindingService
 저장 시점 승인 재검증(assertSendable) effect 2건 추가 — 코드/테스트는
 이전 커밋에 있었으나 매니페스트만 누락
2026-07-28 16:56:13 +09:00
chym1217 0a6a8d6968 fix(message_bizppurio): 결과코드 5002 언어팩 누락 + 알림톡 템플릿 저장 승인검증 부재 수정
PR 준비 최종 검토 중 문제코드 처리 대조표를 재검증하며 발견한 결함 2건.

- ResultCodeResolver 가 5002(요청 과다)를 재시도 대상으로 분류하지만 ko/en/ja
 언어팩 어디에도 사유가 없어 코드값만 노출되던 결함 수정
- 알림톡 템플릿 연결 저장이 승인 상태(RDY/ACT) 재검증 없이 그대로 upsert되어,
 화면 드롭다운(승인 템플릿만 노출)을 우회한 API 직접 호출 시 미승인 템플릿도
 저장 가능했던 결함 수정 — bind 에 카카오 승인 목록 대조 추가, 조회 자체
 실패 시에도 안전측으로 저장 거부
2026-07-28 16:56:13 +09:00
chym1217 40d3ce9639 feat(sirsoft-board,sirsoft-ecommerce,message_bizppurio): 게시판·이커머스 알림 설정에 카카오 알림톡 연동 UI 추가
코어 알림 설정 화면에만 있던 비즈뿌리오 카카오 알림톡 템플릿 연결 UI(연결 버튼,
검수모드 배너, 안내박스)가 게시판·이커머스 알림 설정 화면에는 빠져 있었다.
Phase 6 재설계 시 "후속 작업"으로 남겨두고 실제 반영이 되지 않았던 부분이다.

- 게시판·이커머스 알림 정의 행에 코어와 동일한 notification_definition_row_footer
 확장 슬롯을 추가하고, 게시판 레이아웃에는 코어/이커머스와 동일한 채널 콘텐츠
 wrapper id를 신설해 구조를 맞췄다.
- 비즈뿌리오 플러그인에 게시판·이커머스 전용 overlay 확장 파일을 추가해 배너·
 안내박스·연결모달·데이터소스를 각 레이아웃에 주입한다. 백엔드는 notification_type을
 확장 구분 없는 문자열 키로 이미 3영역 공용 처리하고 있어 프론트 진입점만 보완했다.
- 회귀 테스트: 이커머스 화면에서 최초 구현 시 발견된 위치 버그(연결 버튼이 변수
 뱃지 아래가 아니라 토글/편집 버튼 옆으로 붙던 문제)를 fail 재현 후 수정,
 같은 회귀를 잡는 구조 검증 테스트를 게시판·이커머스 양쪽에 추가했다.
2026-07-28 12:40:22 +09:00
chym1217 49edacf5e0 docs(message_bizppurio): 운영자용 README 추가 + CHANGELOG 미배포 기준 정비
플러그인 README가 없어 webhook 등록, 검수/운영 계정, 알림톡 템플릿 역할 분리
등 운영자가 알아야 할 내용이 문서화되어 있지 않았다. 결제 플러그인(KG이니시스
등) README 관례를 따라 요구사항, 설치, 관리자 설정, webhook 등록, 발송 흐름,
결과 코드, 훅, API, 삭제 시 동작을 담은 README를 추가한다.

CHANGELOG는 아직 공개 저장소가 없는 미배포 상태이므로, 개발 중 쌓인 이력성
문구("예전에는 ~였지만 이제 ~")를 걷어내고 1.0.0이 처음 제공하는 기능 목록만
남기도록 정리한다. ja 번들 언어팩 CHANGELOG도 동일 기준으로 정리한다.
2026-07-28 12:40:20 +09:00
chym1217 f66f1a2f20 fix(message_bizppurio): 발송 실패 시 비즈뿌리오 응답의 실제 사유·결과코드를 이력에 기록
발송 API(/v3/message) 가 HTTP 오류로 실패하면 "메시지 발송 요청에 실패했습니다"
라는 고정 문구만 남고 비즈뿌리오가 준 실제 사유·코드를 버려, 발송 이력·로그로
원인을 알 수 없었다. 실패 응답 body 의 code·description 을 추출해 예외에 실어
발송 이력에 "발신 프로필 키가 유효하지 않음 (7103)"처럼 구체 사유가 남도록 한다.
body 가 없으면 기존 기본 문구로 폴백한다(결과코드 null).
2026-07-28 12:40:20 +09:00
chym1217 a706422401 fix(message_bizppurio): 발송 결과 코드 사유를 최신 공식 명세로 정합화
발송 결과 코드 사유 문구를 비즈뿌리오 최신 공식 명세
(bizppurio.github.io/response-codes)에 맞춰 정비한다. 인증·계정 계열
코드(3001·3004·3007·3009 등) 설명이 실제 의미와 달라 관리자가 실패 원인을
오해할 수 있던 것을 정정하고, 누락 코드(3003·3010 IP 오류·4431 수신거부·
7103 발신프로필 키 무효)를 추가한다. 재시도 분류에 5002(요청 과다)를 포함한다.
ko/en 및 ja 언어팩 사유를 함께 갱신한다.
2026-07-28 12:40:19 +09:00
chym1217 4b5ec6ebd6 fix(message_bizppurio): 잔액부족 알림 본문 변수 미치환 수정 + 후불 한도초과 대응
잔액부족 관리자 알림 본문의 {channel_label}·{result_code} 등이 실제 값으로
치환되지 않고 중괄호째 노출되던 결함을 수정한다. balance.low 훅 인자와 사이트
메타를 알림 data 로 채우는 extract_data 구독 리스너(BalanceLowNotificationDataListener)
를 추가해, 코어 알림 본문 치환이 성립하도록 한다.

후불 한도 초과(9071)를 잔액부족과 동일 분류에 포함해 관리자 알림이 발화되도록
하고, 채널군 라벨(문자/알림톡)·결과코드 사유를 ko/en 및 ja 언어팩에 추가한다.
2026-07-28 12:40:19 +09:00
chym1217 f49d939ec1 chore(message_bizppurio): A-2 브라우저 검수용 데모 시더 제거
DispatchResultDemoSeeder 는 코어 알림 발송 이력 화면의 비즈뿌리오 결과
컬럼·토글 노출을 눈으로 확인하기 위한 일회성 검수용 시더였다. 검수가
끝나 공개 릴리스에 데모 데이터 생성기가 포함되지 않도록 제거한다.
2026-07-28 12:40:19 +09:00
chym1217 a1b30fd218 docs(message_bizppurio): 삭제 시 채널 정리 CHANGELOG 기재 + 알림톡 연동 저장 방식 주석 정정
플러그인 삭제 시 문자·알림톡 채널이 정리되고 재설치 시 복원된다는
사용자 관점 항목을 CHANGELOG 에 추가한다.

알림톡 연동 저장 방식이 "코어 저장 훅 편승"에서 "행 하단 [연결/변경]
버튼 → 우리 연결 모달 → 우리 API 직접 저장"으로 확정됐으나 일부 주석이
옛 설명으로 남아 있어, 실제 구현과 일치하도록 3곳을 정정한다(로직 불변).
2026-07-28 12:40:19 +09:00
chym1217 f2c11d2edb fix(message_bizppurio): webhook 미들웨어 self-gate 전환 + 발송 시나리오 scale 면제
라우트 파일에서 직접 부착하던 webhook IP 화이트리스트를 plugin.php
getMiddleware self-gate 선언으로 전환한다(코어 확장 미들웨어 규정).
테스트 게이트 활성 헬퍼를 이식해 webhook 보안 테스트를 복구하고,
단건 발송 Job 시나리오에 scale 축 면제를 명시한다(볼륨 무관 상수 메모리).
webhook API 문서에 self-gate 부착 방식을 함께 보강한다.
2026-07-28 12:40:18 +09:00
chym1217 8521428636 fix(message_bizppurio): 알림톡 템플릿 검색 결과 없음이 오류로 처리되던 문제 수정
카카오 kapi 결과코드 508("요청한 데이터가 없음")은 검색 결과 0건을 나타내는
정상 응답인데, 예외로 전파해 화면에 아무 반응 없이 이전 목록만 남는 문제가
있었다. 목록 조회에서만 508을 빈 결과로 흡수하도록 수정.
2026-07-28 12:40:17 +09:00
chym1217 e8784854aa fix(message_bizppurio): 발송 건너뜀이 코어 이력에 성공으로 오표시되던 문제 수정
SMS 템플릿 없음·알림톡 카카오 템플릿 미연결 등으로 발송 자체를 시도하지
못한 경우, 채널 드라이버가 조용히 return하면 코어가 예외 미발생을
성공으로 착각해 발송 이력에 "성공"으로 잘못 기록했다. 드라이버가
NotificationSendSkippedException을 던지도록 바꿔, 코어의 기존
실패 처리 경로(channel_send_failed 훅)를 그대로 태워 "실패"로 정확히
기록되게 한다. 코어 파일은 수정하지 않는다.

실패 사유 메시지의 알림 유형도 내부 코드값(welcome) 대신 사람이 읽는
이름(회원가입 환영)으로 표시하도록 함께 개선했다.
2026-07-28 12:40:17 +09:00
chym1217 efe1a81cb8 feat(message_bizppurio): 알림톡 실제 발송 내용을 발송 이력 화면에 별도 표시
코어 notification_logs.body는 알림톡의 경우 SMS 대체발송용 코어 템플릿
본문이라, 실제 카카오에 발송된 내용(승인 템플릿 전체)과 다르다. 코어
공용 파일은 다른 채널도 함께 쓰므로 직접 수정하지 않고, 결과 컬럼
오버레이 방식을 확장해 알림톡 채널일 때만 실제 발송 내용을 별도로
보여준다.
2026-07-28 12:40:16 +09:00
chym1217 e41f9c14c3 fix(message_bizppurio): SMS 대체발송 결과가 미요청 건에도 잘못 표시되던 문제 수정
비즈뿌리오가 대체발송 미요청 건에도 webhook TELRES/KAORES 값을 채워 보내
빈 문자열 검사만으로는 요청 여부를 구분할 수 없었다. 발송 시점에 우리가
실제로 대체발송을 요청했는지(request_payload의 resend 키 존재)를 판단
기준으로 바꿔, 미요청 건은 webhook 값과 무관하게 결과를 표시하지 않는다.
2026-07-28 12:40:16 +09:00
chym1217 4e77d25926 feat(message_bizppurio): 검수 모드 라벨 통일 + 발송 payload 저장 + 알림톡 URL 프로토콜 중복 방지
발송 이력 화면의 "테스트 모드" 표기를 "검수 모드"로 통일하고, 검수 모드 발송 건은
상태 라벨 대신 "검수" 라벨로 표시한다. 설정 미완료 상태에서도 검수 모드 안내가
함께 표시되도록 배너 노출 조건을 수정한다.

발송 요청 payload가 어디에도 저장되지 않아 실패 원인을 사후 재구성할 수 없던 문제를
해결한다. bizppurio_dispatches.request_payload 컬럼을 신설해 발송 시점(성공/실패
무관)에 실제 비즈뿌리오 전송 payload를 저장하되, 다른 컬럼과 중복되는 개인식별
정보(수신번호·치환된 본문 텍스트)는 제외하고 저장한다.

카카오 알림톡 버튼 URL과 완전한 URL 변수(action_url 등, 항상 프로토콜 포함)가
결합될 때 프로토콜이 중복(https://https://...)되어 잘못된 링크로 발송되던 문제를
방지한다.

플러그인 제거 후 재설치 시 sms·alimtalk 채널 템플릿이 재생성되지 않던 문제를
해결한다. 리스너 등록 이력 캐시가 재활성화 후에도 남아있어 재등록이 조용히
스킵되던 것으로, 코어 수정 없이 플러그인 내부에서 리플렉션으로 우회한다.
2026-07-28 12:40:15 +09:00
chym1217 a8a85ac0cf feat(message_bizppurio): 검수/운영 별도 계정 안내 + 사전 준비 UI 2단 카드화
비즈뿌리오는 검수/운영을 별도 계정으로 운영하도록 권장하나 본 플러그인은
계정을 1벌만 보관하므로, 관리자가 이를 인지하도록 검수 모드 카드에 안내를
상시 노출한다. 검수 모드 안내의 "(개발)" 표현도 제거했다.

또한 사전 준비 안내가 세로로 길어 보이는 문제를 개선해, 문자·카카오를
넓은 화면에서 2단 카드 + 채널 아이콘으로 정리했다(모바일 1단 유지).
2026-07-28 12:40:15 +09:00
chym1217 d4bb117b9b feat(message_bizppurio): 알림톡 카카오 템플릿 내용 발송 반영 + 연결 소실 감지
- 알림톡 발송이 카카오 승인 템플릿의 본문·버튼·요소를 실제로 채워 보내도록 구현(B안):
 카카오 상세조회 + template_code 단위 캐시(기본 60분, 수동 초기화·끄기 지원),
 카카오→발송 형식 변환 + 변수 치환
- 결과코드 재시도 분류 정정(알림톡 일시오류 7306/7307/7421/7437 추가)
- 발신프로필 응답 파싱 정정(data.success[])
- 연결한 카카오 템플릿 소실(삭제·차단·미승인) 시 알림 설정에 "사용 불가" 표시,
 조회 실패/승인 없음 구분 안내(결함 2·3)
2026-07-28 12:40:14 +09:00
chym1217 ca5c9a3438 fix(message_bizppurio): 알림톡 연결 모달에서 조회 실패와 '승인 템플릿 0건'을 구분
자격증명 오류 등으로 카카오 템플릿 조회가 실패하면 드롭다운이 비면서
'승인된 템플릿이 없습니다'로 떠서 실제 0건과 구분되지 않던 문제를 수정한다.
데이터소스 fallback 에 load_failed 마커를 실어, 드롭다운이 비었을 때
조회 실패(설정 확인 안내)와 진짜 0건(승인 템플릿 없음)을 문구로 분기한다.
에러 토스트 재도입 없이 모달 내 인라인 문구로만 구분한다.
2026-07-28 12:40:13 +09:00
chym1217 8aa395c3a1 fix(notification): 비활성 확장이 제공하던 알림 채널을 발송 대상에서 제외
비활성 상태의 확장이 등록했던 발송 수단(문자·알림톡 등)을 코어 via가
저장된 채널 설정만 보고 계속 발송·"건너뜀" 로깅하던 문제를 수정한다.
사용 가능한 채널 목록에 없는 채널은 로그 없이 조용히 제외하며,
알림 설정·템플릿은 그대로 유지되어 확장을 다시 켜면 복구된다.

아울러 발송이 타임아웃·연결실패로 최종 실패할 때 pending 으로 방치되던
이력을 failed 로 마감한다(webhook 이 먼저 확정한 건은 덮어쓰지 않음).
2026-07-28 12:40:13 +09:00
chym1217 eb0c72c32b fix(message_bizppurio): 알림 채널 미저장 시 발송 차단 + 토글 저장·노출 정정
관리자가 SMS·알림톡 채널을 꺼도 발송이 계속되던 문제 수정.

- 원인: 채널 토글 저장이 map-only 라 미등록 확장 채널(sms/alimtalk)의
 on/off 가 저장되지 않았고, 백엔드는 미저장 채널을 활성으로 판정
- 프론트: 토글 저장을 upsert 로 전환(미저장 채널도 저장), 하단 채널 탭을
 source 기준으로 필터(확장 채널은 미저장/OFF 시 숨김) — 코어·게시판·이커머스
- 백엔드: 플러그인이 core.notification.channel_enabled 훅을 구독해
 확장 채널 미저장 시 OFF 로 게이트(코어 무수정, 코어 기본 채널은 하위호환 유지)
2026-07-28 12:36:29 +09:00
chym1217 92f36e86b1 feat(message_bizppurio): 알림톡 템플릿 화면을 조회 전용으로 전환
템플릿 등록·수정·삭제·검수·상태변경을 제거하고 목록·상태·내용 조회 +
알림 연결만 남긴다. 등록·관리는 비즈뿌리오 콘솔로 위임 — 콘솔이 이미
이미지메이커·AI생성·캐러셀을 잘 제공하고, 카카오 규격이 자주 바뀌어 등록
폼을 유지하면 규격을 영구히 쫓아가야 하는 유지보수 부채가 크기 때문이다.
이 플러그인의 고유 가치는 카카오 템플릿 ↔ G7 알림 연결(binding)이다.

주요 변경:
- 라우트/컨트롤러/서비스에서 변경(manage) 메서드 전부 제거, 조회만 유지
- dev_sample 임시 개발코드 + FormRequest 3종 + 이미지 업로드 경로 제거
- 레이아웃: 등록 폼·상태변경 모달 제거, 상세는 내용만+[닫기], 목록 관리열은 [내용]만
- 환경설정 사용 전 준비 안내 + 목록 상단 콘솔 위임 안내(배지 의미색) 추가
- 안내 배너 중복 해소: 목록 조회 실패 배너에 ready 게이트를 걸어 설정 안내와 배타 표시

동반 변경(직전 세션 잔여, lang 얽힘으로 같은 커밋):
- 연동 행 SMS 대체발송 배지(ON/OFF solid 색) 추가
2026-07-28 12:36:27 +09:00
chym1217 5e9d046812 fix(message_bizppurio): 설치 시 문자·알림톡 채널 템플릿 자동 시딩
PluginManager::activatePlugin 이 status=active 로 바꾸기 전에 activate 를
호출하므로, 그 시점엔 SeedChannelTemplatesListener 가 아직 등록되지 않아 재시딩이
sms·alimtalk 채널 template 을 붙이지 못했다(알림 설정 탭이 비어 토글도 미노출).

activate 가 재시딩 전에 해당 리스너를 명시적으로 선등록하도록 수정. register
는 동일 프로세스 내 중복 등록을 막으므로 멱등하며, 코어는 수정하지 않는다.

- plugin.php: activate 에 리스너 선등록 추가
- 회귀 테스트: activate 후 sms·alimtalk 템플릿 생성 검증 (fail→green)
- CHANGELOG: working(1.0.0) Added 항목에 설치 시 자동 시딩 문구 흡수
2026-07-28 12:36:27 +09:00
chym1217 11f1d79540 feat(message_bizppurio): 코어 알림 발송 이력 화면에 문자·알림톡 결과 주입
발송 결과(성공/실패·사유·잔액부족·SMS 대체발송)를 코어 "알림 발송 이력" 화면의 각 행에
표시한다. 코어 앱·코어 테이블 무수정 — 연결 표식은 bizppurio_dispatches.notification_log_id
에만 두고, 발송 사이클의 코어 after_log_sent/after_log_failed 훅으로 그 로그 id 를 연결한다.

- 결과 조회는 파라미터 없는 GET /dispatch-results/recent 로 최근 결과 맵을 받아 row.id 매칭
 (목록 로드 순서에 무관 — 빈 배열 전송·타이밍으로 결과가 비던 문제 해소).
- 코어 이력 datagrid 에 결과 컬럼을 layout_extensions 로 주입하고, 행 토글에도 상세 결과를
 얹는다. 메일·사이트내알림 탭에선 컬럼(헤더 포함)을 숨긴다. 다크모드 배지 색 보강.
- 브라우저 검수용 데모 시더(4상태·엣지 케이스 21건) + 전 계층 테스트(백엔드·Vitest 렌더)
 + 시나리오 매니페스트 + API 레퍼런스 동반.
2026-07-28 12:36:26 +09:00
chym1217 fc00e30fc4 fix(message_bizppurio): 알림톡 카카오 오류 사유 노출 + 탭 전환·목록 오류 표시
- 카카오 kapi HTTP 실패 시 응답 body의 message/code를 예외에 실어
 운영자에게 실제 사유(IP 차단·반려 등)를 노출 (기존 고정 문구로 뭉개지던 문제 해소)
- 설정 탭 전환을 replaceUrl→navigate(replace)로 교체
 (URL만 바뀌고 화면이 전환되지 않던 문제 해소)
- 템플릿 목록 조회 실패 시 카카오 사유를 빨간 배너로 표시
- report_url 데이터소스 if 조건으로 templates 탭 불필요 재조회 억제
2026-07-28 12:36:25 +09:00
chym1217 17a95bb556 feat(message_bizppurio): 알림톡 연동 행 슬롯·연결 모달 재설계
알림 설정 알림톡 탭에서 각 알림에 카카오 알림톡 템플릿을 연결하는 UI.
코어 편집 모달·저장 버튼은 건드리지 않는다(무오염).

- 각 알림 행 하단에 범용 확장 슬롯(notification_definition_row_footer) — 연결 상태 줄
 + [연결/변경] 버튼. 코어 편집 모달 내부 주입 불가(엔진 modals 미탐색) 회피.
- 우리 전용 연결 모달(modals 병합) — 승인 템플릿 드롭다운·SMS 대체 토글·변수 안내 +
 [취소][저장]. 저장은 우리 API(코어 저장 무관). openModal 을 승인 조회보다 먼저 실행.
- 상태 배너(readiness 미충족/테스트 모드, 문제 있을 때만) + 알림톡 탭 안내 박스.
- SMS 대체발송 안내(실패 시 이 알림 본문이 SMS로 발송) + 다크 모드 solid 색.
- 카카오 API 422 는 errorHandling.suppress 로 조용히 처리(전 탭 에러 토스트 제거).

Vitest 17 통과, audit 위반 0, Chrome MCP 다크·저장 검수 통과.
2026-07-28 12:36:25 +09:00
chym1217 af43a7c41d feat(message_bizppurio): 알림톡 연동 편집모달 전용칸 즉시저장 + 시딩 필터 훅 template 증강
Phase 6 재설계 — 코어 알림 설정 화면을 그대로 쓰고 알림톡 편집 시 전용 칸만 얹는다.

- 시딩 필터 훅(seed.*.notifications.translations) 편승으로 회원 알림에 sms·alimtalk
 template 증강 (코어·모듈 무수정, cleanupStaleTemplates 에도 유지)
- 코어 편집 모달에 overlay 로 전용 칸 append(연결 템플릿·SMS 대체) — 변경 즉시 저장,
 코어 저장 버튼과 무관 (코어 템플릿 무오염)
- 알림톡·SMS 탭 상태 배너(설정 미완료/테스트 모드)
- 1차 구현(우리 목록 통째 교체·게이트·우리 편집 모달) 폐기

전 계층 테스트 통과 (백엔드 170 / 프론트 63), audit 위반 0.
2026-07-28 12:36:24 +09:00
chym1217 73b05aa42f feat(message_bizppurio): 알림톡 템플릿 관리 화면 (설정 페이지 탭)
설정 페이지 알림톡 템플릿 탭에서 카카오 알림톡 템플릿을 등록·수정·삭제·검수·
상태변경한다. 진입은 코어 소유 설정 페이지 하나로 통일하고 getAdminMenus 는
폐기했다. 템플릿은 kapi 에 실시간 위임하며 DB 에 저장하지 않는다.

등록 폼은 계획서 §6-4 전체를 구현한다: 템플릿 코드(자동 생성/직접 입력),
카테고리 2단 드롭다운, 템플릿 유형(기본형/이미지형/강조표기형), 이미지형
파일 업로드, 본문 변수 클릭 삽입 + 알림별 변수 참고표, 선택 항목 6개
체크펼침(부가정보·미리보기·버튼·바로연결·대표링크·보안), 등록/등록 후
검수요청 2버튼.
2026-07-28 12:36:22 +09:00
chym1217 77df8c9a7c feat(message_bizppurio): 발송 결과 기록 + webhook 수신 + 결과코드
문자·알림톡 발송 결과를 DB에 기록하고, 비즈뿌리오 webhook(URL PUSH)으로
도달 여부를 갱신한다. 결과코드를 사유+분류로 해석하고, 잔액 부족 시
관리자에게 쿨다운(기본 1시간) 내 1회만 알린다.

발송 결과를 확인하는 화면은 플러그인 독립 페이지 대신 코어 알림 이력에
얹는 방식(후속)으로 이관하기로 하여, 이번에 만든 독립 이력 화면과
화면 전용 백엔드는 제거했다. webhook 결과 저장·수신·해석 뼈대는 유지한다.
2026-07-28 12:36:21 +09:00
chym1217 fd7e216639 feat(message_bizppurio): 설정 화면 KG이니시스식 개편 + 검수 모드 전환
- 설정 화면을 공용 클래스·2단 그리드·상단 안내 패널·필드 인라인 에러로 통일
- 연동 환경(dev/live)을 검수 모드 Toggle(is_test_mode)로 전환, 독립 카드로
 분리하고 운영 경고 박스를 API 연동 카드 상단에 배치
- 검수 모드를 끄면(운영) 발송 자격증명(아이디·비밀번호·발신번호)을
 required 로 강제하는 조건부 검증 필터 훅 추가
- 리포트 수신 주소를 설정 화면에서 확인·복사 (플러그인 라우트가
 config('app.url') 기준 절대 URL 반환, 코어 무수정)
- 명칭 "메시징→메시지 발송", 설명 "자동발송→발송", "(다우기술)" 제거
- 설정 저장 테스트가 실제 런타임 설정 파일을 오염시키던 결함 격리
2026-07-28 12:36:20 +09:00
chym1217 a3495d8dc6 feat(message_bizppurio): 문자·알림톡 채널 등록 + 자동발송
Phase 3 — 코어 알림 시스템에 sms·alimtalk 채널을 코어 무수정으로 등록하고,
가입·주문 등 이벤트 발생 시 문자를 자동발송한다. 실제 발송·재시도는 Phase 2
발송 Job 에 위임한다.

- filter_available_channels 훅으로 sms·alimtalk 채널 노출(비회원 발송 허용).
 channel_readiness 로 발신 정보 미설정 시 필요한 항목을 안내.
- 코어/게시판/이커머스 3영역의 채널 후보 훅을 구독해 자동발송 커버.
- sms 채널 드라이버를 ChannelManager 에 등록(코어 무수정) — 전화번호 해석
 (회원=프로필, 비회원=주문 연락처) → 본문 길이로 SMS/LMS 판별 → 발송 위임.
- 비회원 주문 전화번호는 이커머스 알림 데이터 훅을 구독해 채운다. 이커머스
 모듈은 무수정(자체 관행대로 배송지 연락처를 직접 읽음).

알림톡은 채널 등록·readiness 까지만. 실제 발송·템플릿 연동·탭 UI 는 Phase 5·6,
발송 이력 DB 는 Phase 4 로 이관.
2026-07-28 12:36:19 +09:00
chym1217 6549170bda feat(message_bizppurio): 비즈뿌리오 발송 엔진 API 클라이언트
발송 시스템(api.bizppurio.com)과 카카오 관리 시스템(kapi.ppurio.com)의
API 클라이언트를 인증 방식(토큰 vs bizId+apiKey)에 따라 분리 구현했다.
토큰 캐시(23h)·재발급, SMS/LMS EUC-KR byte 자동 판별, ShouldQueue 발송
Job(429·일시오류 재시도, 영구실패 즉시)을 포함한다. 실제 발송 없이
Http::fake 단위테스트 30건으로 검증했다.
2026-07-28 12:36:18 +09:00
chym1217 b48ac91fec feat(message_bizppurio): 비즈뿌리오 메시징 플러그인 골격 + 환경설정
Phase 1 — 플러그인 설치·활성화 시 권한·메뉴·환경설정 화면이 뜨는 기반 구축.
이후 발송엔진·채널·이력·템플릿 Phase 의 전제가 된다.

- 관리자 환경설정 화면(3섹션: API 연동/발송 설정/연동 안내) — 비즈뿌리오
 아이디·비밀번호·API 키·발신번호·알림톡 발신프로필 키·연동 환경(검수/운영).
 크리덴셜은 마스킹 + 프론트 미노출.
- 조회/관리 권한 2개 + 「메시지 발송 관리」 관리자 메뉴(알림톡 템플릿·발송 이력 하위).
- 잔액 부족 시 관리자 알림 정의(webhook 결과코드 감지는 Phase 4).
- 발송 관련 Enum 4종(채널/상태/출처/결과분류) — Phase 2~4 소비용 골격.

알림톡 채널 기본 body 시드는 채널 등록(Phase 3)·탭 연동(Phase 6)과 강결합이라
Phase 6 으로 이관(plugin.php 주석 명시).

테스트: PHPUnit 12건(설치·권한·메뉴·알림 정의·Enum) + Vitest 22건(환경설정 레이아웃).
설치→활성화 실검증으로 권한 4·메뉴 3·알림 1·설정 초기값 로드 확인.
2026-07-28 12:36:18 +09:00
chym1217 da031804ae fix(sirsoft-gdpr): 관리자 환경설정 카테고리 목록 id 중복 + 다크모드 배지 색상 누락 수정
- cookie_categories_rows / blocked_domains_taginputs iteration 컨테이너의 정적 id를
 index_var(categoryIdx)로 동적화 — 카테고리가 여러 개일 때 동일 HTML id가 중복 렌더되던
 W3C id 유일성 위반 수정 (audit layout-iteration-static-id)
- 카테고리 「필수」 배지 dark:bg-red-800 / text-danger-soft 클래스 사이 공백 누락으로
 다크 모드 배경·글자색이 미적용되던 오타 수정

이슈 작업 중 audit-branch 전수 검사에서 발견한 기존 결함 (이번 이슈 기능과 무관, )
2026-07-27 15:58:30 +09:00
chym1217 1c6217f90d feat(gdpr): 마이페이지 쿠키 동의 관리 버튼 재설계
- 토글 스위치 → 상태 배지 + 동의/철회 버튼으로 재설계
 (user 템플릿 미해석 클래스로 인한 스타일 회귀 + "켜짐/꺼짐" 표현 개선)
- 동의 시에도 확인 모달 경유, 라벨에 "쿠키" 접미사, "모두 동의" 바
- 동의한 항목만 동의일 표시 (상태는 라벨 옆 배지가 표현)
- 카테고리 설명을 코드 기본값에서 조회 — 관리자 설정 화면에 설명 편집 UI가
 없어 라벨만 저장 시 설명이 유실되던 문제 해결
- 철회/동의 모달 버튼을 목록 버튼과 톤 맞춰 정리 (취소=테두리형)
- cookie_banner 운영주체 라인 admin 전용 클래스 → 공통 클래스 치환
2026-07-27 15:58:29 +09:00
chym1217 ef13a1ddff feat(gdpr): 쿠키 거부 기능 + 마이페이지 동의 관리 토글 재설계
STEP 1~7 (거부 기능):
- 쿠키 배너에 「동의하지 않고 계속하기」 거부 버튼 추가 (intent=reject)
- is_rejected/rejected_at 컬럼 + ConsentAction Enum 3분기 (동의/철회/거부)
- 관리자 동의 이력에 [거부] 필터 + amber 배지

STEP A~F (토글 재설계):
- 필수 카테고리를 동의 축에서 완전 제외 (status/history 미저장) — ePrivacy Art.5(3) 면제
- 마이페이지 표→토글 전환: 필수=「항상 켜짐」 잠금, 선택=on/off 스위치, 동의일 제거, 「모두 켜기」 바
- 거부 토스트 문구 정정: consent.granted → rejected_saved (배너 + 컨트롤러 응답)

테스트: 백엔드 201/201, 프론트 288/288, 시나리오 커버리지 audit 통과
Chrome MCP 실측: 토글 grant/revoke/모두켜기 + 배너 거부 토스트 + 거부 직후 마이페이지 표기 확인
2026-07-27 15:58:28 +09:00
HeuJung b505ac7ba7 fix(core,board,ecommerce,page,gdpr): 목록 컨텍스트 왕복·엔진 렌더 파이프 결함 일괄 수정 + 공개문서 정리
세 갈래의 결함을 한 브랜치에서 정리한다.

## 목록 컨텍스트 왕복 시 URL 상태 소실 ( @jiwonpapa 님께서 제보해주셨습니다.)

목록에서 상세·형제 상세(이전/다음)·작성/수정 폼에 다녀오면 보고 있던
page/search/category/filters 가 사라지던 문제를 전 도메인에서 수정했다.

- 엔진(engine-v1.54.2): `mergeQuery: true` 만 적고 `query` 를 생략하면 병합이
 통째로 건너뛰어지던 함정을 교정 — `ActionDispatcher.handleNavigate`/`handleReplaceUrl`.
- 게시판·이커머스·페이지·회원·마이페이지·gdpr 등 9개 확장 레이아웃의 왕복 leg 전수
 적용(mergeQuery: true). 의도적 리셋(검색/필터 초기화·탭 전환·프리셋)은 면제 주석으로 구분.
- 무한스크롤 목록(브랜드·상품 공통정보·고시정보)의 새로고침이 URL 검색·정렬을 떨구던
 결함 수정.
- 재발 차단: audit 룰 `layout-list-context-navigate-merge-query`(목록 클러스터 자동 도출,
 page/필터 URL 신호 4종) + `layout-navigate-path-absolute`(navigate path 동작 키워드 금지).

## cellChildren 등 반복 렌더에서 단일 바인딩 파이프 미적용 ( @glitter-gim 님께서 제보해주셨습니다.)

목록 표의 각 칸에 넣은 날짜·숫자 서식(`{{row.x | datetime(...)}}`)이 빈 값이 되거나
서식 없는 원본으로 나오던 문제를, 표현식 판정 로직이 엔진 전역에 복제되며 갈라진
구조적 결함으로 진단하고 판정 경로를 단일화했다(engine-v1.54.3).

- `RenderHelpers`(renderItemChildren·evaluateIfCondition)·`ConditionEvaluator`·
 `DataBindingEngine.resolveObject`·`DynamicRenderer` props 5곳에 단일 바인딩 파이프 분기 추가.
- 계획: `g7-scalable-lobster.md`(렌더 경로 비대칭 결함 일괄 수정).

## 공개 문서 내부 도구 귀속 제거

release 에 포함되는 공개 문서(`docs/**`)에서 내부 audit 룰 ID 귀속 서술을
도구 비귀속 표현("정적 검사")으로 정리. 재발 차단 룰 `public-no-internal-audit-reference` 신설.

전 계층 테스트(PHPUnit·Vitest·Playwright)·회귀 테스트 동반, 버전/CHANGELOG/활성 디렉토리 동기 완료.
2026-07-26 15:17:56 +09:00
HeuJung 7f8fb6870f fix(core,board,ecommerce): 조건부 검증 결함 패밀리 일괄 수정 및 실패 안내 노출
여러 화면에서 조건부(FormRequest) 검증이 우회되거나 과도하게 제한되던 결함을 한 계열로 묶어 수정한다.

- 검증 규칙 확장 필터 이름 10개를 나머지 92개와 동일 규칙으로 통일
- 설명 길이를 바이트가 아닌 글자 수로 계산(한글 오검출 해소)
- 비활성 언어팩 번역 보존한 채 수정 허용
- 알림 템플릿 제목 nullable 존중, 미지원 발송 수단 저장 차단
- 일정/실행 이력 목록 조회 검증 정합
- 게시판 첨부 미사용 시 빈 확장자 통과, new_display_hours/최소 길이 0 허용, 일괄 적용 override_values 범위 검증(SSoT)
- 이커머스 클레임 사유 조회 검증, 용어 정정
- 원문 i18n 키 노출 다수 해소, 저장/삭제 실패 시 사유 화면 노출
- 아이콘 크기/다크모드 대비 회귀 수정

번들 확장(모듈3·플러그인6·템플릿2·언어팩5) 버전 new-bump 및 CHANGELOG 반영, ja 언어팩 동기.
2026-07-23 10:54:17 +09:00
HeuJung 707919719c chore(build): 번들 확장 소스맵 산출물 제거 (--production 재빌드)
결제 플러그인 3종(pay_kginicis/nhnkcp/nicepayments)과 sirsoft-basic 템플릿의
배포 JS 에 //# sourceMappingURL 주석과 .map 파일이 남아 있어, 공개 배포판에
원본 TS/TSX 전문(sourcesContent)이 노출될 수 있었다(NoSourcemapArtifactsTest 2건 실패).

각 확장을 --production(G7_BUILD_SOURCEMAP=0) 으로 재빌드해 소스맵 주석·.map 을
제거하고 {plugin|template}:update 로 활성 디렉토리에 반영. 기능 코드는 바이트 동일,
소스맵 주석만 제거된다. nhnkcp/nicepayments 의 components.json 파생 버전도 매니페스트
SSoT(1.0.0)로 재동기화. 매니페스트 버전은 무변경(동작 변화 없는 배포본 위생 수정).

NoSourcemapArtifactsTest 4/4 green.
2026-07-19 20:23:00 +09:00
HeuJung 8828c80b56 chore(changelog): 7.0.5 사이클 코어·확장·언어팩 출시일 2026-07-16 통일
코어 7.0.5 릴리즈와 함께 버전이 오른 확장·언어팩의 CHANGELOG 출시 날짜를 오늘(2026-07-16)로 맞춤.

- 코어 7.0.5, ecommerce 1.0.4, gdpr 1.0.1, pay_kginicis 1.0.1, basic 1.0.3 출시일 통일
- core-ja 1.0.4, ecommerce-ja 1.0.4 출시일 통일
- pay_kginicis-ja: [Unreleased] 항목을 1.0.1 로 릴리즈 (manifest version 1.0.0 → 1.0.1 bump)
- pay_nhnkcp-ja / pay_nicepayments-ja 1.0.1 누락 날짜 명시
2026-07-16 15:32:29 +09:00
HeuJung 7b7a175c07 chore(payment): 나이스페이먼츠·NHN KCP 결제 플러그인 정식 1.0.0 승격
두 결제 플러그인을 1.0.0-beta.4 에서 정식 1.0.0 으로 올린다.
공개 release latest(beta.3) 대비 프리릴리즈 → 정식 승격으로
버전 bump 규정에 정합(new-bump). manifest/package/composer/lock
4개 파일 버전 동기화 + CHANGELOG [Unreleased] 를 1.0.0 으로 확정
(nicepayments 는 중복 Fixed 챕터 병합). g7_version(>=7.0.5) 은
코드가 7.0.5 도입 표면(미들웨어 self-gate·애플페이 iOS 컨텍스트)에
의존하므로 그대로 유지.
2026-07-16 15:00:49 +09:00