diff --git a/db/migrations/20260724-post-categories-seed.sql b/db/migrations/20260724-post-categories-seed.sql
new file mode 100644
index 0000000..8560688
--- /dev/null
+++ b/db/migrations/20260724-post-categories-seed.sql
@@ -0,0 +1,33 @@
+-- 포스트 보드 기본 카테고리 시드 — 편집형 일방 발행 taxonomy (Unity 5-mirror)
+-- 배경: post_categories 는 운영자 CRUD 대상이나(D1/G2), 런칭 시 기본 탭이 곧바로
+-- 렌더되도록 기본 5개 카테고리를 시드한다. 이후 운영자가 관리화면에서 추가/수정/
+-- 비활성 가능. 카테고리 축은 Unity 공식 블로그(News/DevBlog/Games/Engine&platform/
+-- Industry)를 미러링한 편집 taxonomy 다 — 포스트 보드가 제작자 상호 포럼이 아니라
+-- 일방 발행/소비 모델이기 때문.
+--
+-- 이 프로젝트는 flyway/liquibase 가 없다(db/apply-local-ddl.sh 참고). 이 파일은
+-- 작성만 한다. DB 적용은 orchestrator 가 사용자 확인 후 수행한다.
+--
+-- 멱등: slug UNIQUE(ux_post_categories_slug) 기준 ON CONFLICT DO NOTHING →
+-- 재실행해도 중복 미생성. 기존에 동일 slug 가 있으면 건드리지 않는다(운영자 변경 보존).
+--
+-- 적용 (로컬 dev 스키마, 가동중 컨테이너):
+-- docker exec -e PGOPTIONS="-c search_path=dev" -i bibimbap-db \
+-- psql -U bibimbap -d bibimbap -v ON_ERROR_STOP=1 -f - < db/migrations/20260724-post-categories-seed.sql
+-- 적용 (운영): 운영 스키마 search_path 로 동일 실행.
+
+INSERT INTO post_categories (name, slug, sort_order, is_active) VALUES
+ ('공지', 'notice', 1, true),
+ ('개발일지', 'devlog', 2, true),
+ ('쇼케이스', 'showcase', 3, true),
+ ('자료·튜토리얼', 'resources', 4, true),
+ ('업계 소식', 'industry', 5, true)
+ON CONFLICT (slug) DO NOTHING;
+
+-- 검증 (적용 후 위 slug 5건 전부 존재해야 함):
+-- SELECT id, name, slug, sort_order, is_active FROM post_categories ORDER BY sort_order;
+
+-- 롤백 (이 시드만 제거 — 운영자가 추가 생성한 카테고리는 보존):
+-- DELETE FROM post_categories WHERE slug IN ('notice','devlog','showcase','resources','industry');
+-- 주의: posts.category_id 는 NOT NULL FK 다. 해당 카테고리에 연결된 글이 있으면
+-- FK 위반으로 삭제 불가 → 글을 다른 카테고리로 이관하거나 is_active=false 로 숨길 것.
diff --git a/src/main/webapp/WEB-INF/views/fragments/posts-empty.jspf b/src/main/webapp/WEB-INF/views/fragments/posts-empty-nocats.jspf
similarity index 57%
rename from src/main/webapp/WEB-INF/views/fragments/posts-empty.jspf
rename to src/main/webapp/WEB-INF/views/fragments/posts-empty-nocats.jspf
index f697fb5..4632c24 100644
--- a/src/main/webapp/WEB-INF/views/fragments/posts-empty.jspf
+++ b/src/main/webapp/WEB-INF/views/fragments/posts-empty-nocats.jspf
@@ -1,7 +1,8 @@
<%@ page pageEncoding="UTF-8" %>
-<%-- posts-empty.jspf — 포스팅 목록 빈 상태 파편
- 사용: posts-list.jsp의 posts.isEmpty() 분기에서 include
- 필요: bibimbap.css (.empty-state 클래스)
+<%-- posts-empty-nocats.jspf — 포스팅 목록 빈 상태 (a): 활성 카테고리 0개(운영자 미생성)
+ 사용: posts-list.jsp의 posts.isEmpty() && categories.isEmpty() 분기에서 include
+ 필요: bibimbap.css(.empty-state/.btn/.empty-actions), 페이지 변수 canWrite
+ 정적 include(<%@ include %>)라 부모 posts-list.jsp의 page import(HtmlUtils)·스코프 공유
--%>
diff --git a/src/main/webapp/WEB-INF/views/fragments/posts-empty-noposts.jspf b/src/main/webapp/WEB-INF/views/fragments/posts-empty-noposts.jspf
new file mode 100644
index 0000000..febc3e3
--- /dev/null
+++ b/src/main/webapp/WEB-INF/views/fragments/posts-empty-noposts.jspf
@@ -0,0 +1,30 @@
+<%@ page pageEncoding="UTF-8" %>
+<%-- posts-empty-noposts.jspf — 포스팅 목록 빈 상태 (b): 섹션은 있으나 발행된 글 0개
+ 사용: posts-list.jsp의 posts.isEmpty() && !categories.isEmpty() 분기에서 include
+ 필요: bibimbap.css(.empty-state/.btn/.empty-actions), 페이지 변수 canWrite, activeCategoryName(nullable)
+ 정적 include(<%@ include %>)라 부모 posts-list.jsp의 page import(HtmlUtils)·스코프 공유
+--%>
+
+
+ <% if (activeCategoryName != null) { %>
+
‘<%= HtmlUtils.htmlEscape(activeCategoryName) %>’ 섹션의 첫 편을 준비 중입니다