Files
landing_page/REQUIREMENTS.md
T

70 KiB
Raw Blame History

📐 요구사항 명세서 (Requirements Specification)

경북대학교 AI 에이전트 네트워크 연구실 (ANL) 공식 홈페이지

항목 내용
문서 ID REQ-ANL-WEB-001
버전 1.8
작성일 2026-07-30
작성자 claude (canary-projects-landing-page-creator-claude) · Role: planner
상태 승인 (Approved) — v1.5에서 D-01 확정(A·B안 기각 / intl-conf 폐기 · 3개 카테고리), v1.6에서 D-06 확정(레이아웃 컨테이너 3계층 분리). v1.7에서 §6.1.2 Research Project PageView 신설 — 신규 미결 D-07(🔴 Funder 실데이터 부재)·D-08(🟡 프로젝트 집합 범위)은 각 기본값으로 구현을 차단하지 않는다. 잔여 미결 D-02·D-03·D-05는 🟡 등급으로 각 기본값이 적용되어 승인을 보류하지 않는다
대상 독자 General Manager, Developer Team Leader(Agy), Reviewer Team Leader(Cline), 지도교수
선행 문서 README.md, .agents/MULTI_AGENT_RULES.md, refer_landing_page/docs/DESIGN.md
적용 범위 refer_landing_page/ (Next.js 14 App Router 애플리케이션) 전체

본 문서의 성격: 코드를 포함하지 않는 명세 문서입니다. 데이터 스키마와 인터페이스 정의에 한해 TypeScript 타입 표기를 사용하나, 이는 계약(contract) 기술을 위한 것이며 구현 코드가 아닙니다.


1. 원본 요구사항 (사용자 제공 · 정본)

아래는 사용자가 직접 작성한 요구사항 원문이며, 본 명세서 전체의 정본(normative source) 이다. 이하 모든 절은 이 원문을 구체화한 것이며, 원문과 충돌하는 서술이 있다면 원문이 우선한다.

- 홈페이지 상단 탭은 다음과 같음
    - Home: 연구실 소개, 연구실 주요 연구 분야 소개, 오시는길
    - Members: 기존 정보 그대로 보존되어야 함
    - Publications: 기존 정보 그대로 보존되어야 하며, 다음 카테고리로 구분되어야 함
        - International Conference
        - International Journal & Conference
        - Domestic Journal & Conference
        - Patent
    - Lectures: 기존 정보 그대로 보존되어야 함
    - Standardization: 기존 정보 그대로 보존되어야 함

1.1 원문에서 도출되는 최상위 원칙

ID 원칙 근거 문구
PR-01 무손실 보존 (Lossless Preservation) — 레거시 ISL-2026/의 레코드는 한 건도 누락되지 않고, 문구·표기·순서가 임의로 변형되지 않은 채 이관되어야 한다 "기존 정보 그대로 보존되어야 함" (4회 반복)
PR-02 상단 탭 5종 고정 — Home / Members / Publications / Lectures / Standardization "홈페이지 상단 탭은 다음과 같음"
PR-03 Home 3구성 — 연구실 소개 · 주요 연구 분야 소개 · 오시는 길 Home 항목
PR-04 Publications 분류 — 원문에 명시된 4개 카테고리 라벨을 출발점으로 삼는다. (v1.5: 원문 1번 International Conference는 §12.1 D-01 확정에 따라 폐기되어 최종 3분류로 확정. 원문 문구 자체는 §1에 정본 그대로 보존하며, 이 축소는 해당 라벨에 배정된 레코드가 0건이므로 PR-01 무손실 원칙과 충돌하지 않는다) Publications 항목

⚠️ PR-01의 해석: "그대로 보존"은 데이터의 무손실을 의미하며, 레거시의 시각적 표현을 그대로 복제하라는 뜻이 아니다. 표현은 신규 디자인 시스템(§8)을 따르되, 레코드 단위의 정보량은 100% 보존한다. 점진적 노출(더 보기·접기)은 전체 레코드가 접근 가능한 한 허용된다(§9.4 참조).


2. 개요 및 배경 (Overview & Background)

2.1 목적

경북대학교 컴퓨터학부 연구실이 사물인터넷 표준 연구실 (IoT Standards Laboratory, ISL) 에서 AI 에이전트 네트워크 연구실 (AI Agent Networking Laboratory, ANL) 로 연구 정체성을 전환함에 따라, 공식 홈페이지를 다음 두 축으로 재구축한다.

  1. 정체성 전환 (Identity Transformation) — 연구실 명칭·연구 서사·시각 언어를 ANL 및 5대 핵심 연구 기둥 기준으로 전면 교체한다.
  2. 실데이터 마이그레이션 (Data Migration) — 레거시 사이트 ISL-2026/에 축적된 실측 연구 실적 총 223건(국제 논문 68 · 국내 논문 80 · 특허 75)과 표준화 문서 약 55건을 신규 애플리케이션의 타입 안전한 데이터 구조로 무손실 이관한다(PR-01).

2.2 현재 상태 (As-Is)

자산 경로 상태
레거시 공식 홈페이지 ISL-2026/ 정적 HTML. 실데이터 원본(Single Source of Truth)
신규 프로토타입 refer_landing_page/ Next.js 14.2.35 / React 18 / TS 5 / Tailwind 3. 라우트 5종 구현, 콘텐츠는 대부분 placeholder
연구 자산 multi-agent-orchestration/ 5대 연구 기둥의 근거 자료 (SLIDE.md, chapters/, lecture_summary.md)

완료된 선행 작업 (커밋 e35b46d315ba9ecdd0db3, 3차 교차 리뷰 [VERDICT: PASS])

  • 연구실 명칭 ANL 전환: Header / Footer / metadata / package.json(anl-landing) / docs/DESIGN.md / tailwind.config.ts
  • /intro 커버 스프레드를 5대 연구 기둥 3+2 매거진 조판으로 재구성
  • 강조색 시맨틱 계약 재정의: vermillion = Agent Eng / Orchestration (홀수), cobalt = MCP / A2A Protocol (짝수)
  • 빌드 게이트 정비: .eslintrc.json 도입, lint / tsc / build 3종 통과

미해결 상태

  • /(루트) 라우트 부재app/page.tsx가 없어 사이트 루트 직접 접근 시 404. PR-02의 Home 탭이 존재하지 않는다.
  • /members, /publications, /lectures, /standardization 본문이 전부 가상의 placeholder (연구원 A (placeholder), 가상 논문, 실재하지 않는 oneM2M/OMA LwM2M 기여 내역)
  • 레거시 실데이터 223건 + 표준 문서 약 55건 전량 미이관 — PR-01 미충족

3. 이해관계자 및 역할 (Stakeholders & Roles)

주체 역할 본 명세서에 대한 책임
지도교수 (고석주 교수) 콘텐츠 소유자 실데이터 정확성 최종 확인, §12 D-02·D-03·D-05 결정 (D-01은 v1.5에서 확정)
General Manager 오케스트레이터 잡 분배, 마일스톤 게이팅, 미결 결정 에스컬레이션
Agy (creator) 개발 팀장 §6·§7 구현, 데이터 추출·이관, 컴포넌트 개발
Cline (reviewer) 리뷰어 팀장 §9 비기능 요구사항 검수 (UI/UX 반응형, SEO, 접근성)
Claude (planner and reviewer) 기획·리뷰어 팀장 본 명세서 작성·유지, 데이터 무결성 교차 검증, 최종 Verdict

4. 정보 구조 (Information Architecture)

4.1 사이트맵

/                        Home            [🆕 신규] 연구실 소개 · 주요 연구 분야(5대 기둥) · 오시는 길
├── /members             Members         지도교수 · 재학 연구원 16명 · 졸업생 60명
├── /publications        Publications    개요 · 카테고리 분류 · Top 10 (총 223건)
│   ├── /publications/intl-journal-conf      International Journal & Conference (68)
│   ├── /publications/domestic-journal-conf  Domestic Journal & Conference (80)
│   └── /publications/patent                 Patent (75)
├── /lectures            Lectures        2004 Spring ~ 2026 Spring, 45개 학기
└── /standardization     Standardization 표준화 기구 6곳 · 표준 문서 44건

4.2 IA 설계 결정

ID 결정 근거
IA-01 현행 /intro의 커버 스프레드를 /(Home)으로 승격한다 PR-02가 상단 탭에 Intro를 포함하지 않으며, PR-03의 "연구실 소개"가 Home의 구성 요소로 명시되어 있다. /intro를 별도 유지하면 Home과 콘텐츠가 중복된다. 부수 효과로 기존 / 404 결함이 해소된다.
IA-02 /intro/로 308 영구 리다이렉트한다 3차에 걸친 리뷰 리포트·문서가 /intro를 참조하고 있어 링크 안정성이 필요하다. next.config.jsredirects()로 처리하며 별도 페이지 파일을 남기지 않는다.
IA-03 (v1.1 개정 · v1.5 수치 갱신) Publications 카테고리는 라우트 세그먼트 /publications/[category] + generateStaticParams() 로 구현한다. /publications는 개요 화면으로 유지한다 v1.0에서 "단일 라우트 + ?cat= 쿼리"였으나 §8.5의 실측 검증 결과에 따라 개정. 세그먼트 방식은 카테고리별 완전한 정적 HTML 3개(D-01 확정 전 4개)를 빌드 타임에 생성해 공유 링크가 필터 상태를 포함한 문서를 그대로 제공하며(AC-05 취지 충족), 뒤로/앞으로 가기·프리페치·스크롤 복원이 Next 라우터에서 기본 제공된다. 슬러그를 카테고리 레지스트리에서 도출하므로 라벨 변경이 레지스트리 한 곳 수정으로 끝난다는 v1.0의 근거는 그대로 유지된다(→ D-01 리스크 완화 불변). 상단 탭은 5종 그대로이므로 PR-02와 충돌하지 않는다(하위 라우트일 뿐 최상위 탭이 아니다).
IA-04 내비게이션 항목은 PR-02의 5개로 고정한다 components/Header.tsx의 데스크톱 내비가 5개 항목 기준으로 조판되어 있다. 항목 증감 시 헤더 레이아웃 재설계가 선행되어야 한다.

5. 콘텐츠 정본: 핵심 연구 분야

PR-03의 "연구실 주요 연구 분야 소개"에 해당하는 콘텐츠다. README.md §2를 정본(canonical) 으로 하며, UI의 모든 연구 서술은 여기서 파생되어야 한다. 어휘를 임의로 변형하지 않는다.

# 분야 (KO) 분야 (EN) 핵심 키워드 강조색
1 AI Agent 기능 확장 프로토콜 Extensibility & Protocol MCP, SKILL, CLI 코딩 에이전트 vermillion
2 멀티 에이전트 협업 및 오케스트레이션 Multi-Agent Systems HERDR, crewAI, LangGraph cobalt
3 에이전트 상호운용성 개방형 표준 Interoperability Standards A2A, ACP, Agent Card vermillion
4 AIoT & 고성능 통신 백본 High-Performance Backbone gRPC/QUIC, Protobuf, MQTT/CoAP cobalt

R-5.1 강조색은 §8.3의 홀수/짝수 규칙을 따른다. 분야 순서를 변경하면 색 배정도 함께 갱신해야 한다. R-5.2 핵심 연구 분야 서술 전문(全文)은 Home에만 두고, 타 페이지에는 요약 키워드만 노출한다. 동일 문장을 여러 페이지에 중복 하드코딩하지 않는다. R-5.3 레거시 introduction.html의 구 연구 분야(QUIC, CoAP, IVI, VLC/OWC, mSCTP, SCTP, Mobility Management, Tabu Search 등)는 Home의 연구 분야 소개에서 제외한다. 단, 이들 주제로 산출된 논문·특허·표준은 PR-01에 따라 실적 페이지에 전량 보존된다.


6. 페이지별 상세 요구사항

각 항목의 [MUST] / [SHOULD] / [MAY]는 RFC 2119 수준을 따른다.

6.1 Home (/) — 🆕 신규 라우트

PR-03에 따라 연구실 소개 · 주요 연구 분야 소개 · 오시는 길 3개 블록을 필수 포함한다.

ID 요구사항 수준
H-01 app/page.tsx를 신규 생성하고, 현행 app/intro/page.tsx의 섹션 구성(커버 스프레드 → 지표 카운터 → Mission 풀쿼트 → 핵심 연구 분야 → Focus Areas)을 이관한다 MUST
H-02 (v1.7 개정) 킥커 경북대학교 컴퓨터학부 · AI Agent Networking Lab (ANL)는 유지한다. 슬로건 헤드라인(에이전트 네트워크의 / 미래를 짓다, 디스플레이 Agents / in Motion)은 §6.1.2 Research Project PageView로 교체할 수 있다. 단 교체 시에도 H-03(연구실 소개 서술 블록) · H-04(주요 연구 분야 그리드) · H-05(오시는 길) · H-06·H-07(지표 카운터) · H-10(HeroComposition)은 반드시 존속한다 — 히어로 재구성 중 이들이 유실되면 AC-02가 즉시 실패한다 MUST
H-03 [연구실 소개] 연구실 개요·지도교수·비전을 서술하는 블록을 배치하고, 상세는 /members로 연결한다 MUST
H-04 [주요 연구 분야] §5의 핵심 연구 분야 전문을 매거진 조판으로 노출한다 MUST
H-05 [오시는 길] 아래 §6.1.1 요구사항을 충족하는 블록을 배치한다 MUST
H-06 지표 카운터는 데이터 배열에서 도출된 값만 사용한다. 근거 없는 홍보성 수치(가동률·만족도 등) 게시 금지 MUST
H-07 H-06의 권장 지표: 연구 분야 = 4, 누적 연구 실적 = 논문+특허 합계(223), Issue · 발행 = 2026(static) SHOULD
H-08 대표 실적 하이라이트 — 최신 국제 저널 3건을 /publications로 연결 SHOULD
H-09 표준화 기여 요약 밴드 — 기구 6곳 약칭 Marquee + /standardization 연결 SHOULD
H-10 HeroComposition SVG는 현행(A2A 노드 메시 × QUIC/gRPC 스트림)을 그대로 재사용한다 MUST
H-11 /intro/ 308 리다이렉트를 next.config.js에 등록한다 (IA-02) MUST
H-12 components/Header.tsx의 브랜드 링크 href/intro/로 바꾸고, 내비 배열 첫 항목을 Home(/)으로 교체한다 MUST

6.1.1 오시는 길 (Directions) 세부 요구사항

레거시 index.html에 주소가 HTML 주석 처리된 상태로 존재한다. 이를 복원해 사용한다.

ID 요구사항 수준
H-13 소재지를 표기한다: 경북대학교 IT대학 5호관(415동) 527호 / School of Computer Science and Engineering, Kyungpook National University MUST
H-14 연락처를 표기한다: sjkoh@knu.ac.kr (지도교수). 전화·팩스는 레거시에 존재하지 않으므로 창작하지 않는다 MUST
H-15 소속 기관 링크를 제공한다: KNU(knu.ac.kr), 컴퓨터학부(cse.knu.ac.kr), IT대학(it.knu.ac.kr) MUST
H-16 지도 표현 방식은 §12 D-03의 결정을 따른다. 외부 지도 스크립트를 임의로 도입하지 않는다(R-9.13 최소 의존성 원칙과 충돌) MUST
H-17 주소는 시맨틱 <address> 요소로 마크업한다 MUST
H-18 대중교통·주차 안내는 레거시에 데이터가 없으므로 이번 범위에서 제외한다. 필요 시 지도교수 확인 후 별도 잡으로 추가 MUST

6.1.2 Research Project PageView (v1.7 신설)

Home의 슬로건 히어로를 실제 연구 프로젝트 카드 뷰로 전환한다(H-02 개정).

레거시 실측 — 실재하는 프로젝트 3건: ISL-2026/index.html <section class="portfolio-block skills">card-title/card-text 및 이어지는 확장 섹션 2개가 유일한 원본이다. (projects-cards 클래스는 표준화 기구 로고 그리드이며 연구 프로젝트가 아니다 — 오독 주의.)

# Title 확장 정보
1 IoT Standards
2 CCIS "This project is developing a series of standards in IEC/TC 100/TA 17"
3 VLC-IoT "This project is purposed to develop a series of standards in ITU-T SG20."
ID 요구사항 수준
PJ-01 데이터는 content/projects.ts에 두고, 타입은 ResearchProject 로 명명한다. StandardsBody.projects(WG 단위 표준화 프로젝트)와 의미가 다르므로 이름을 재사용하지 않는다 MUST
PJ-02 content/projects.tsscripts/extract/generate_all.pyparse_projects()로 자동 생성한다. 수작업 편집 금지(기존 AUTO-GENERATED 규약 · AC-24) MUST
PJ-03 abstract는 레거시 원문을 바이트 동일하게 보존한다(PR-01). 요약·재작성·line-clamp로 인한 정보 손실 금지 MUST
PJ-04 periodcontent/standards.ts standardsBodies[].period조인해 도출한다. 교차 검증 출처는 ISL-2026/sjkoh/index.html의 Project Editor 이력이다 MUST
PJ-05 deliverablescontent/standards.ts projects[].documents[]조인해 도출한다. 임의 생성 금지 MUST
PJ-06 keywords[]모든 원소는 해당 프로젝트 abstract 원문에 부분문자열로 실제 등장해야 한다. 키워드 창작을 기계적으로 차단하기 위한 규칙이다 (→ AC-30) MUST
PJ-07 funder옵셔널이며 현재 전건 미확보다(§12.1 D-07). 값이 없으면 UI에 해당 행·라벨·자리표시자를 렌더하지 않는다(R-9.18). 레거시가 실제로 명시하는 표준화 트랙은 Funder가 아닌 Standards Track 라벨로 노출한다 MUST
PJ-08 [금지] 활성 슬라이드만 마운트하는 캐러셀을 구현하지 않는다. 프로젝트 전건이 항상 DOM에 존재해 정적 HTML에 포함되어야 한다(R-8.15 · AC-27) MUST
PJ-09 [금지] 슬라이드·페이지 상태를 URL에 동기화하지 않는다. searchParams prop은 라우트를 ƒ Dynamic으로 전환시키고(R-8.11), useSearchParams()<Suspense> 경계를 요구하며 경계 안쪽 콘텐츠가 정적 HTML에서 누락된다(R-8.12·R-8.13). 상태는 컴포넌트 로컬로 유지한다 MUST
PJ-10 [금지] 캐러셀·슬라이더 외부 라이브러리를 도입하지 않는다(swiper·embla 등). 현행 런타임 의존성 3종(next/react/react-dom)을 유지한다(R-9.13) MUST
PJ-11 트랙은 CSS scroll-snap + 컨테이너 내부 overflow-x-auto 로 구현해 JS 비활성 상태에서도 전건 열람이 가능해야 한다. 페이지 레벨 가로 스크롤을 유발해서는 안 되며(R-9.15·AC-19), full-bleed를 위해 w-screen을 쓰지 않는다(R-8.18) MUST
PJ-12 데이터 렌더는 서버 컴포넌트, 인터랙션(버튼·인디케이터)만 "use client" 로 분리한다. 페이지네이션 인디케이터는 <a href="#project-…"> 앵커로 두어 JS 없이도 동작하게 한다. 스크롤 애니메이션은 prefers-reduced-motion 존중(components/Counter.tsx·globals.css 선례) MUST
PJ-13 (v1.8 개정) 반응형 카드 노출: 360 px 1장 / md 2장(w-[calc(50%-12px)]2×(50%12px)+24px = 100%대수적 정확값) / desktop(1240 px)에서는 스크롤 트랙이 아니라 desktop:grid desktop:grid-cols-3 desktop:overflow-visible 정적 3열로 전환하고 카드는 desktop:w-full로 둔다. 데스크톱 카드 폭에 퍼센트 연산을 사용하지 않는다. 근거: Tailwind grid-cols-3repeat(3, minmax(0, 1fr))로 전개되어 min-content 넘침을 구조적으로 차단하며, overflow-visible이 해당 요소를 스크롤 컨테이너에서 해제해 스크롤 잔재·불필요한 포커스 가능 스크롤 영역을 함께 제거한다(→ AC-34). 브레이크포인트는 desktop 토큰만 사용한다(R-8.20 · AC-26) MUST
PJ-14 접근성: 트랙 role="group" + aria-roledescription="carousel", 카드 aria-roledescription="slide" + aria-label="N개 중 M번째", 버튼 aria-labelaria-controls, 카드 제목은 <h3> MUST
PJ-15 (v1.8 신설) 카드에 min-w-0 과 텍스트 줄바꿈(break-words, 국문은 R-9.16 break-keep)을 적용한다. flex-shrink: 0인 플렉스 아이템은 콘텐츠의 min-content 폭 이하로 줄지 않으므로, standardsTrack(IEC/TC 100/TA 17deliverables[].ref(ISO/IEC TR 30189)처럼 /를 포함해 기본 줄바꿈 기회가 없는 문자열이 폭 수식과 무관하게 트랙을 넘치게 할 수 있다. PJ-13의 그리드 전환은 데스크톱만 보호하므로, 모바일·태블릿 구간은 이 규칙으로 보호한다 MUST
PJ-16 (v1.8 신설) 스크롤바를 숨기는 경우([scrollbar-width:none] 등) 잔여 넘침이 시각적 단서 없이 은폐되므로, AC-34 검증을 반드시 동반한다 MUST

6.2 Members (/members) — PR-01 적용

레거시 실측: 재학 16명(교수 1 · Ph.D. 1 · Ph.D. Candidate 4 · Ph.D. Student 5 · M.S. Candidate 3 · M.S. Student 2), 졸업생 60명(2007~2026).

ID 요구사항 수준
M-01 현행 placeholder(연구원 A~G) 전량을 ISL-2026/member.html 실데이터로 교체한다. 재학 16명 + 졸업생 60명 = 76명 전원 보존 MUST
M-02 지도교수 피처 스프레드: 고석주 교수 / Prof. Seok-Joo Koh, 이메일 sjkoh@knu.ac.kr, 개인 홈페이지(ISL-2026/sjkoh/) 및 GitHub(github.com/sjkoh12) 링크 MUST
M-03 재학 연구원을 학위 과정별로 그룹핑하고, 레거시의 Candidate/Student 구분을 보존한다 MUST
M-04 소속 학과가 컴퓨터학부와 다른 연구원(정보보호학과·정보과학과·과학기술학과·ICT융합학과·컴퓨터학부 등 8명)은 소속 표기를 함께 노출한다 MUST
M-05 졸업생 60명을 졸업 연도 역순으로 게시하고, 학위·졸업시점·전공·현 소속을 표기한다 MUST
M-06 졸업생 목록은 최근 3년을 기본 노출하고 나머지는 더 보기로 확장한다. 확장 시 60명 전원이 노출되어야 한다 (PR-01) SHOULD
M-07 이름 표기 형식을 통일한다: 한글명 (Romanized Name). 외국인 연구원(Hoang Anh Dang 등)은 원문 그대로 표기 MUST
M-08 인원 통계 카운터는 배열 길이에서 도출한다 (H-06 원칙 동일 적용) MUST
M-09 개인 이메일·연락처는 지도교수 외 게시하지 않는다 MUST
M-10 졸업생의 현 소속 문구(He is now with ...)는 레거시 원문 정보를 보존하되, 국문 페이지 맥락에 맞게 소속명만 추출해 표기해도 무방하다 SHOULD

6.3 Publications (/publications) — PR-01 + PR-04 적용

레거시 실측: paper-international.html 68건(저널 67 + 학술대회 1) · paper-domestic.html 80건(KCI 등재 48) · patent.html 75건 = 총 223건.

ID 요구사항 수준
P-01 (v1.5 개정) 3개 카테고리를 사용한다: International Journal & Conference / Domestic Journal & Conference / Patent. D-01 확정(v1.5): PR-04의 1번 라벨 International Conference는 대응 레거시 원본이 없어 실측 0건이었고, 2번 라벨의 부분집합으로 범위가 중첩되므로 단독 카테고리를 폐기한다. 국제 학술대회 논문(실측 1건)은 International Journal & Conference에 포함해 보존한다 MUST
P-02 카테고리는 레지스트리 상수 1곳에 정의하고, 개별 레코드는 category 판별 필드만 갖는다. 라벨 변경·교체가 레지스트리 수정만으로 완결되어야 한다 MUST
P-03 223건 전량 보존 — 어떤 카테고리에도 배정되지 않아 누락되는 레코드가 있어서는 안 된다. (v1.5 확인: D-01 확정으로 카테고리가 3개로 축소되었으나 intl-conf 배정 레코드가 0건이었으므로 축소는 무손실이다. 실측 68 + 80 + 75 = 223) MUST
P-04 레거시 paper-international.html은 저널과 학술대회 논문이 혼재되어 있다(학술대회 1건 확인: International Conference on ICTC, 2023). 이관 시 게재처 문자열로 판별해 분류한다 MUST
P-05 기본 정렬은 발행 연월 내림차순, 동일 연월 내에서는 레거시 게시 순서를 보존한다 MUST
P-06 (v1.1 개정) 카테고리 필터 UI를 제공한다. 필터 상태는 URL 경로(/publications/<slug>)에 반영되어 공유 가능한 링크가 되어야 한다. 슬러그는 §7.2 PubCategory 값을 그대로 사용한다. 구현 방식은 §8.5의 렌더링 제약을 반드시 따른다 MUST
P-06a (v1.1 신설) 카테고리 내비게이션은 next/link<Link>로 구현한다. window.history.pushState 직접 호출·useSearchParams() 사용 금지 (§8.5 R-8.11~8.14) MUST
P-07 전체 223건을 단일 화면에 일괄 렌더하지 않는다. 연도별 그룹 헤더 + 지연 확장 또는 페이지네이션으로 초기 렌더 부하를 제한하되, 전 레코드가 접근 가능해야 한다 (§9.4) MUST
P-07a (v1.1 신설) 레코드 목록 자체는 서버 컴포넌트에서 정적 HTML로 렌더되어야 한다. 목록 데이터를 클라이언트 컴포넌트 내부나 <Suspense> 경계 안쪽에 두어 정적 문서에서 누락시켜서는 안 된다 (§8.5 R-8.15). 근거: JS 미실행 환경·크롤러에서도 PR-01의 전 레코드가 문서에 존재해야 한다 MUST
P-08 국내 논문의 (KCI) 등재 표시를 배지로 보존한다 (48건) MUST
P-09 특허 레코드는 다음을 모두 보존한다: 발명자 목록, 출원번호·출원일, 등록번호·등록일(있는 경우), 국가(한국/US). 출원/등록 상태를 구분 표기한다 MUST
P-10 파생 통계 카운터: 카테고리별 건수를 배열에서 도출해 표기 SHOULD
P-11 DOI·원문 링크는 레거시에 존재하지 않으므로 이번 범위에서 제외한다. 스키마에 선택 필드로 예약만 한다 MUST
P-12 저자명·논문 제목·게재처 표기는 레거시 원문을 그대로 보존한다. 임의 축약·재배열·번역 금지 (PR-01) MUST
P-13 국문·영문 제목이 혼재하는 국내 논문 목록에서 언어를 통일하지 않는다 (PR-01) MUST

6.4 Lectures (/lectures) — PR-01 적용

레거시 실측: 2016 Fall ~ 2026 Spring, 약 20개 학기, 과목명 + 학수번호 형식.

ID 요구사항 수준
L-01 현행 placeholder 3건(사물인터넷 개론, 메타버스 상호운용성과 표준 등)을 실제 강의 이력으로 교체한다. 전 학기 전 과목 보존 MUST
L-02 학기별(Spring/Fall + 연도) 그룹핑을 레거시 구조 그대로 보존한다 MUST
L-03 최근 3개 학기를 기본 노출하고 이전 이력은 전체 이력 보기로 확장한다. 확장 시 전 학기가 노출되어야 한다 (PR-01) SHOULD
L-04 과목 레코드: 학수번호(COMP 0414 등), 과목명(EN), 학부/대학원 구분 MUST
L-05 과목명 한글 번역은 레거시에 없으므로 신규 창작하지 않는다. 영문 원문을 정본으로 노출한다 (→ §12 D-02) MUST
L-06 Fall 2023 — No Class (Sabbatical)과 같은 비강의 학기도 이력에 보존한다 (PR-01) MUST
L-07 동일 과목이 여러 분반(ITEC 401003, ITEC 401004)으로 개설된 경우 분반을 합치지 않고 보존한다 (PR-01) MUST

6.5 Standardization (/standardization) — PR-01 적용

레거시 실측: 기구 6곳 / 표준 문서 약 55건 / 활동 기간 2000~현재.

기구 활동 기간 주요 산출물 구분
IEC TC100 (Multimedia Systems and Equipment) 2018 ~ 현재 IEC 63614(Metaverse) 4건, IEC 63478(QoE, WG11 Convenor) 3건, IEC 63479(Infotainment) 3건, IEC 63246(CCIS) 4건 국제
ISO/IEC JTC1/SC41 (IoT and Digital Twin) 2020 ~ 현재 ISO/IEC TR 30189 2건 국제
ITU-T SG20 (IoT Services based on VLC) 2018 ~ 2020 Y.4465, Y.4474 국제
ITU-T SG13 (Mobility Management) 2002 ~ 2012 Q.Sup52, Q.1706~1709, Y.2052, Y.2809 등 7건 국제
ISO/IEC JTC1/SC6 WG7 (Network and Transport) 2000 ~ 2014 ECTP(14476), RMCP(16512), MMC(24793), FN-PSR(29181) 계열 다수 국제
TTA/PG425 (가시광 통신 기반 사물인터넷) 2018 ~ 2020 TTAK.KO-10.1158 part1~3 국내
ID 요구사항 수준
S-01 현행 4개 기구(oneM2M, W3C WoT, IETF QUIC, OMA LwM2M)는 실제 기여 이력이 아닌 placeholder이므로 전량 교체한다 MUST
S-02 국제 표준화 / 국내 표준화 2개 섹션으로 구분한다 (레거시 구조 보존) MUST
S-03 기구별 카드에 활동 기간과 역할(예: WG11 Convenor, WG30(TA17))을 명시한다 MUST
S-04 표준 문서는 기구 → 워킹그룹/프로젝트 → 문서의 3단 계층으로 표현하고, 문서 55건 전량을 보존한다 MUST
S-05 문서 상태(IS / TS / TR / CDV / WDTR / In Progress)를 배지로 구분 노출한다 MUST
S-06 In Progress 문서(IEC WDTR 63614-4, IEC CDV 63478-3, ISO/IEC CDTR 30189-2)는 진행 중임이 시각적으로 명확해야 한다 MUST
S-07 기구 카드 강조색은 §8.3 홀수/짝수 교차 규칙을 따른다 MUST
S-08 카운터는 기구 수·문서 수를 배열에서 도출한다 MUST
S-09 5대 연구 기둥 중 기둥 4(A2A/ACP 개방형 표준) 와의 연결 서술을 도입부에 배치해, 과거 표준화 역량이 신규 연구 방향으로 이어짐을 드러낸다 SHOULD

7. 데이터 모델 및 마이그레이션 명세

7.1 데이터 배치 원칙

ID 요구사항 수준
DM-01 콘텐츠 데이터는 페이지 컴포넌트에서 분리해 content/ 디렉터리의 타입 지정 모듈로 이관한다 (content/members.ts, content/publications.ts, content/lectures.ts, content/standards.ts) MUST
DM-02 각 모듈은 명시적 TypeScript 인터페이스를 export 한다. any 사용 금지 MUST
DM-03 (v1.1 문구 정정) 데이터는 빌드 타임 정적 상수로 유지한다. 런타임 fetch·외부 API·DB를 도입하지 않는다. 전 라우트가 빌드 타임 정적 프리렌더(○ Static 또는 ● SSG)를 유지해야 하며, ƒ Dynamic 라우트가 발생해서는 안 된다 (§8.5 R-8.16) MUST
DM-04 각 페이지 상단의 // CUSTOMIZATION HOOK 주석 규약(DESIGN.md "콘텐츠 우선" 원칙)은 content/ 모듈로 이전하되 규약 자체는 유지한다 MUST

7.2 스키마 정의 (계약)

// content/members.ts
type Degree = "Professor" | "PhD" | "PhDCandidate" | "PhDStudent" | "MSCandidate" | "MSStudent";

interface Member {
  ko: string;                 // "최동규"  (외국인 연구원은 원문 표기)
  en: string;                 // "Dong-Kyu Choi"
  degree: Degree;
  affiliation?: string;       // 컴퓨터학부 외 소속일 때만 (M-04)
}

interface Alumnus {
  ko: string;
  en: string;
  degree: "PhD" | "MS";
  graduatedAt: string;        // "2026-08"  (ISO 8601 부분 표기)
  major?: string;             // "Computer Science and Engineering"
  currentPosition?: string;   // "Daegu Catholic University (대구가톨릭대학교) as Professor"
}

// content/publications.ts
//   D-01 확정(v1.5) 후 3개 카테고리. 라벨 문자열은 레지스트리에서만 정의한다 (P-02).
type PubCategory =
  | "intl-journal-conf"      // International Journal & Conference
  | "domestic-journal-conf"  // Domestic Journal & Conference
  | "patent";                // Patent

interface Publication {
  category: PubCategory;      // P-02: 판별 필드
  title: string;              // P-12: 원문 보존
  authors?: string;           // P-12: 원문 보존
  venue?: string;             // 저널/학술대회명
  volume?: string;            // "Vol. 23, pp. 4490~4505"
  publishedAt: string;        // "2026-04"  (P-05 정렬 키)
  kci?: boolean;              // P-08
  doi?: string;               // P-11: 예약 필드, 현재 미사용
}

interface Patent {
  category: "patent";
  title: string;
  inventors: string;          // "고석주, 정중화, 남혜빈, 최동규"
  applicationNo: string;      // "2023-0180751"
  applicationAt: string;      // "2023-12-13"
  registrationNo?: string;    // "2963109"
  registrationAt?: string;    // "2026-05-06"
  country: string;            // "한국" | "US"
  publishedAt: string;        // 정렬 키 (= applicationAt 의 연월)
}

// content/lectures.ts
interface Semester {
  term: "Spring" | "Fall";
  year: number;
  courses: { code: string; en: string; note?: string }[];  // L-05, L-06, L-07
}

// content/standards.ts
type DocStatus = "IS" | "TS" | "TR" | "CDV" | "WDTR" | "InProgress";

interface StandardsBody {
  org: string;                // "IEC TC100"
  full: string;               // "Multimedia Systems and Equipment"
  scope: "international" | "domestic";   // S-02
  period: string;             // "2018 ~ Present"
  role?: string;              // "WG11 Convenor"
  projects: {
    wg: string;               // "WG12"
    name: string;             // "Multimedia Systems and Equipment for Metaverse (IEC 63614)"
    documents: { title: string; ref: string; status: DocStatus; publishedAt?: string }[];
  }[];
}

// content/projects.ts  (v1.7 신설 · §6.1.2)
//   ⚠️ StandardsBody.projects(WG 단위 표준화 프로젝트)와 의미가 다르다. 이름 재사용 금지 (PJ-01).
interface ProjectDeliverable {
  title: string;              // standards.ts 문서 제목 원문
  ref: string;                // "IEC 63246" / "ISO/IEC TR 30189"
  status: DocStatus;          // 기존 유니온 재사용
}

interface ResearchProject {
  slug: string;               // "iot-standards" | "ccis" | "vlc-iot"
  title: string;              // 레거시 card-title 원문
  abstract: string;           // 레거시 card-text 원문 — 바이트 동일 보존 (PJ-03)
  keywords: string[];         // 전 원소가 abstract 부분문자열이어야 함 (PJ-06)
  standardsTrack?: string;    // "IEC/TC 100/TA 17" — 레거시 확장 섹션 원문
  standardsOrg?: string;      // standards.ts `org` 조인 키
  period?: string;            // standards.ts `period` 에서 도출 (PJ-04)
  deliverables: ProjectDeliverable[];  // standards.ts documents 에서 도출 (PJ-05)
  funder?: string;            // 현재 전건 미확보(D-07). 값 없으면 UI 미렌더 (PJ-07)
}

7.3 마이그레이션 절차

ID 요구사항 수준
MG-01 추출은 재현 가능한 스크립트로 수행하고, 스크립트를 scripts/ 하위에 커밋한다. 수작업 복사·붙여넣기 금지 MUST
MG-02 추출 후 건수 대조 검증을 수행한다. 기대값: 국제 68 / 국내 80 / 특허 75 / 표준 문서 55 / 재학 16 / 졸업생 60 / 학기 약 20 MUST
MG-03 한글·특수문자(~, ·, , o, 전각 기호) 인코딩 손실이 없어야 한다. 레거시 파일에 BOM()이 존재하므로 제거한다 MUST
MG-04 날짜는 전부 ISO 8601로 정규화한다 (2026년 6월2026-06, April 20262026-04, 2023.12.132023-12-13) MUST
MG-05 레거시에 없는 정보를 추정·창작하지 않는다. 누락 필드는 optional로 두고 UI에서 조건부 렌더한다 (PR-01) MUST
MG-06 이미지 자산은 실제 사용분만 public/으로 이관한다. 원본 총량 11.6MB(image/ 3.4MB + assets/ 8.2MB)를 무조건 복사하지 않는다 MUST
MG-07 이관 이미지는 WebP 변환 및 next/image 적용 SHOULD
MG-08 마이그레이션 완료 후 렌더 HTML 전수 스캔으로 구 정체성 잔재 0건을 확인한다 (검사어: 사물인터넷 표준, IoT Standards, MCM, 메타버스 상호운용성, 홍길동, placeholder). 단, 논문·특허 제목에 포함된 도메인 용어는 실데이터이므로 예외로 취급한다 MUST

⚠️ MG-08의 중요한 예외: 레거시 실적에는 사물인터넷, 메타버스, oneM2M 등이 논문 제목·표준 문서명으로 실재한다(예: IEC 63614 Multimedia Systems and Equipment for Metaverse). 이는 구 정체성 잔재가 아니라 보존해야 할 실데이터다(PR-01). 잔재 검사는 연구실 정체성 서술 영역(Header/Footer/metadata/Home 소개문)에 한정해 적용한다.


8. 디자인 시스템 준수 규격

정본은 refer_landing_page/docs/DESIGN.md("Issue 01")이며, 본 절은 위반 시 리뷰에서 반려되는 항목만 발췌한다.

8.1 색상 토큰 (변경 금지)

토큰 용도
ink / ink-soft / ink-mute #0A0A0A / #262420 / #6B655B 본문·괘선
ivory / paper / line #F5F1E8 / #ECE6D6 / #D8D1C0 종이 배경 / 인셋 / 헤어라인
vermillion / vermillion-dark #D9342B / #A8231C 강조 (Hot)
cobalt / cobalt-dark #1B3A8A / #122863 강조 (Cool)

R-8.1 신규 색 토큰 추가 금지. 색상 값 변경 시 tailwind.config.tsapp/globals.css:root CSS 변수를 반드시 함께 수정한다. R-8.2 brand / accent 별칭은 레거시 호환 전용이며 신규 코드에서 사용 금지.

8.2 타이포그래피 · 유틸리티 클래스

R-8.3 지정 서체만 사용한다 — 영문 디스플레이 Fraunces(font-display), 국문 헤드라인 Noto Serif KR(headline-ko), 본문 산세리프 Pretendard/Inter(font-sans). R-8.4 기존 유틸리티 클래스를 우선 사용한다: .container-content, .display, .display-sm, .headline-ko, .kicker, .pull-quote, .reveal. 동등 기능의 임의 클래스 신설 금지.

8.3 강조색 시맨틱 계약

R-8.5 vermillion = Agent Engineering / Orchestration(홀수 항목), cobalt = MCP / A2A Protocol(짝수 항목). 목록 렌더 시 인덱스 기반 교차 배정을 따른다.

8.4 컴포넌트 재사용

R-8.6 기존 7종을 우선 재사용한다: Header, Footer, PageHeader, SectionLabel, Reveal, Counter, Marquee. 신규 컴포넌트는 기존 조합으로 구현 불가함을 리뷰에서 입증한 경우에만 추가한다. R-8.7 PageHeaderindex prop은 IA 순서를 따른다 — Home 1 / Members 2 / Publications 3 / Lectures 4 / Standardization 5. R-8.8 [중요 제약] Counter정수 전용이다. 내부에서 Math.round()로 표시값을 산출하므로 소수를 넘기면 반올림된 값이 표시되고, prefers-reduced-motion 경로에서는 반올림이 적용되지 않아 모션 설정에 따라 값이 달라진다. 소수 지표가 필요하면 Counter의 소수 대응 확장을 선행 과제로 처리한다. R-8.9 그리드에서 gap-px bg-line 헤어라인 기법은 테두리 없는 카드 전용이다. border border-ink를 가진 카드에는 bg-line을 함께 걸지 않는다. R-8.10 항목 수가 열 수로 나누어떨어지지 않는 그리드는 col-span으로 마지막 행을 채운다. 빈 트랙이 배경색 블록으로 노출되어서는 안 된다 (5개 항목 → lg:grid-cols-6 기준 2/2/2 · 3/3 조판이 확립된 패턴).

8.5 Next.js 렌더링 제약 (v1.1 신설)

출처: 개발 팀장(Agy)의 기술 이의제기(Job 175860e4)를 계기로, 본 프로젝트의 실제 환경(Next.js 14.2.35, refer_landing_page/)에서 4가지 구현 방식을 직접 빌드해 실측한 결과다. 추정이 아닌 재현된 관측치이며, 프로브 라우트는 검증 후 전량 삭제해 저장소에 남기지 않았다.

실측 결과표

# 구현 방식 빌드 결과 정적 HTML에 담기는 내용
1 Client Component에서 useSearchParams()<Suspense> 없음 빌드 실패
useSearchParams() should be wrapped in a suspense boundary at page "/…"Export encountered errors
2 useSearchParams()<Suspense> 있음 ○ (Static) 경계 안쪽은 fallback만 저장됨.
경계 바깥의 서버 렌더 콘텐츠는 정상 프리렌더됨
3 Client useState + window.history.pushState ○ (Static) 클라이언트 초기 상태만 저장됨 (cat=all). 공유 링크 진입 시 마운트 후 보정 → 비필터 상태가 먼저 표시됨
4 Server Component의 searchParams prop 사용 ⚠️ ƒ (Dynamic) — 정적 생성 탈락 매 요청 서버 렌더
5 [category] 세그먼트 + generateStaticParams() ● (SSG) — 카테고리별 HTML 4개 생성 카테고리 값이 HTML에 그대로 포함됨 (cat=patent)

도출 규칙

R-8.11 [금지] Server Component 페이지에서 searchParams prop을 사용하지 않는다. 실측 #4에서 확인된 대로 해당 라우트가 ƒ (Dynamic)으로 전환되어 DM-03·NF-03을 직접 위반한다. 본 프로젝트에서 정적 생성을 깨뜨리는 유일하게 확인된 경로다.

R-8.12 [금지] useSearchParams()<Suspense> 경계 없이 호출하지 않는다. 실측 #1에서 프로덕션 빌드가 중단됨을 확인했다.

R-8.13 [제한적 허용] useSearchParams() + <Suspense> 조합은 정적 생성을 깨뜨리지 않는다(실측 #2에서 ○ Static 유지 확인). 다만 경계 안쪽 콘텐츠가 정적 HTML에서 누락되므로, 필터 컨트롤 등 소규모 UI에 한해 사용하고 레코드 목록에는 사용하지 않는다(R-8.15).

R-8.14 [금지] 라우팅 목적의 window.history.pushState 직접 호출을 하지 않는다. Next 라우터를 우회하므로 뒤로/앞으로 가기 시 URL만 바뀌고 UI가 갱신되지 않으며, 이를 보정하려면 popstate 리스너를 직접 등록·해제해야 한다. 카테고리 이동은 next/link로 처리한다(P-06a).

R-8.15 [필수] 대량 레코드(Publications 223건, Alumni 60명, 표준 문서 44건)는 서버 컴포넌트에서 정적 HTML로 렌더한다. 클라이언트 상태나 <Suspense> 경계 안쪽에 넣어 정적 문서에서 누락시키지 않는다. 실측 #2에서 경계 바깥 서버 렌더 콘텐츠는 프리렌더된다는 점이 확인되었으므로, 목록은 바깥에 두고 인터랙션만 안쪽에 두는 분리가 가능하다.

R-8.16 [표기] generateStaticParams()를 사용하는 라우트는 빌드 리포트에서 ○ (Static)이 아니라 ● (SSG) 로 표기된다. 두 표기 모두 "빌드 타임 정적 프리렌더"이며 요구사항을 충족한다. 수용 기준의 판정은 §10 AC-17의 개정된 문구를 따른다.

8.6 레이아웃 컨테이너 아키텍처 · 브레이크포인트 토큰 (v1.6 신설)

Job 343b5808 검증에서 본문 좌우 여백·최대 폭 미적용(B1)이, 개발 팀장 이의제기(Job 2560771b)에서 그 수정 방식의 확장성 제약이 각각 확인되었다. 아래 규칙은 D-06 확정 사항이다.

R-8.17 [계층 분리 · 필수] 레이아웃은 3계층으로 분리한다.

  1. <main> (app/layout.tsx) — 뷰포트 전체 폭을 유지한다. max-w-* / px-* / container-content부여하지 않는다.
  2. 라우트 최상위 래퍼 — 각 페이지 파일의 루트 <div>container-content를 부여해 본문 여백(24/40/48/64 px)과 최대 폭(78 rem = 1248 px) 중앙 정렬을 확보한다.
  3. Full-bleed 밴드 — 전체 폭 배경 밴드·구획선·마퀴 티커는 2계층 래퍼 바깥(즉 <main> 직속)에 배치한다.

R-8.18 [금지] Full-bleed 연출을 위해 container-content 자식에서 w-screen 또는 -mx-[50vw] 계열 탈출 기법을 사용하지 않는다. 현재 html·bodyoverflow-x 가드가 전무하므로(실측 확인), 폭 제한 컨테이너 내부의 w-screen은 좌측 기준점이 부모 콘텐츠 박스여서 우측으로 넘쳐 가로 스크롤을 유발하고 R-9.15/AC-19를 위반한다. Full-bleed가 필요하면 R-8.17의 3계층으로 올린다.

R-8.19 [필수] 라우트 래퍼 방식은 신규 라우트 추가 시 누락될 수 있으므로, 빌드 산출 HTML의 모든 라우트에서 <main> 하위에 container-content가 존재함을 자동 게이트로 검증한다(→ AC-25). 이 게이트 없이는 본 아키텍처를 채택하지 않는다.

R-8.20 [토큰] 데스크톱 내비 전환 임계값은 tailwind.config.tstheme.extend.screensdesktop: "1240px" 단일 토큰으로 등록하고 desktop: 변형으로만 사용한다. 임의값 클래스(min-[1240px]:)를 소스에 직접 쓰지 않는다.

  • 실측 확인: Tailwind v3는 extend로 추가한 스크린도 min-width 값 기준으로 정렬해 출력하므로(1024 → 1240 → 1280 → 1536 순서 확인), 2xl 등 상위 브레이크포인트를 덮어쓰는 캐스케이드 사고는 발생하지 않는다. screens 전체를 재정의할 필요가 없다.
  • 주의: lg(1024px)와 desktop(1240px)이 공존하므로, 헤더 내 데스크톱/모바일 전환은 desktop:으로만 통일한다. 동일 속성에 lg:desktop:을 혼용하면 1024–1239 px 구간에 의도치 않은 중간 상태가 생긴다(B2가 정확히 이 사고였다).

9. 비기능 요구사항 (Non-Functional Requirements)

9.1 빌드 품질 게이트 — 병합 필수 조건

ID 요구사항 검증 명령
NF-01 ESLint 경고·오류 0건 npm run lint
NF-02 TypeScript 오류 0건 npx tsc --noEmit
NF-03 (v1.1 문구 정정) 프로덕션 빌드 성공. 전 라우트가 빌드 타임 정적 프리렌더(○ Static 또는 ● SSG)이며 ƒ Dynamic 라우트가 0건이어야 한다 npm run build
NF-04 package.jsonpackage-lock.json 정합. 의존성 추가 시 lockfile 동시 커밋 npm install --package-lock-only 후 diff 확인

9.2 SEO

R-9.1 전 라우트에 고유한 metadata.title / metadata.description을 정의한다. 타이틀 템플릿은 현행 %s | ANL · 경북대학교를 유지한다. R-9.2 Open Graph(og:title, og:description, og:image, og:type, og:locale=ko_KR) 및 Twitter Card 메타를 추가한다. R-9.3 시맨틱 HTML5 요소(<main>, <article>, <section>, <nav>, <address>, <time>)를 사용한다. 논문·특허 날짜는 <time dateTime>으로 표기한다. R-9.4 app/sitemap.tsapp/robots.ts를 추가한다. R-9.5 지도교수 및 연구실 정보에 Person / ResearchOrganization JSON-LD 구조화 데이터를 삽입한다. (SHOULD)

9.3 접근성 (Accessibility)

R-9.6 WCAG 2.1 AA 색 대비를 충족한다. 특히 ink-mute(#6B655B) on ivory(#F5F1E8) 조합은 소형 텍스트 사용 시 대비 실측 후 적용한다. R-9.7 장식용 SVG·요소는 aria-hidden, 의미 전달 SVG는 role="img" + aria-label을 갖는다. R-9.8 prefers-reduced-motion: reduce에서 Reveal·Counter·Marquee의 모션이 비활성화되어야 한다(현행 구현 유지). R-9.9 키보드 내비게이션으로 전 인터랙티브 요소(필터, 확장 토글, 링크)에 도달 가능하고 포커스 링이 보여야 한다. R-9.10 필터·확장 토글은 aria-expanded / aria-controls를 갖는다.

9.4 성능

R-9.11 초기 렌더 DOM 노드 수를 제한한다. Publications 223건, Alumni 60명, Lectures 약 20학기는 전량 즉시 렌더 금지(P-07, M-06, L-03). 단 PR-01에 따라 전 레코드가 사용자 조작으로 도달 가능해야 한다. R-9.12 라우트별 First Load JS는 현행 수준(공유 87.3 kB + 라우트별 1 kB 내외)에서 +30 kB를 초과하지 않는다. R-9.13 신규 런타임 의존성 추가 시 사전 승인을 받는다. 현행 의존성은 next / react / react-dom 3종뿐이며 이 최소 구성을 유지한다.

9.5 반응형

R-9.14 (v1.6 개정) 지원 브레이크포인트는 Tailwind 기본값 sm(640px) / md(768px) / lg(1024px)에 커스텀 토큰 desktop(1240px) 을 더한 구성이다(R-8.20). 검수 기준 뷰포트는 360 / 768 / 1024 / 1440 px 4종에 1239 px과 1240 px을 추가한 6종이다 — 데스크톱 내비 전환 경계의 양쪽을 반드시 확인해야 한다. R-9.15 어느 뷰포트에서도 가로 스크롤이 발생하지 않아야 한다. R-9.16 긴 국문 제목의 줄바꿈은 break-keep을 적용한다.

9.6 콘텐츠 무결성

R-9.17 [최우선] 사이트에 게시되는 모든 수치·실적·인물 정보는 ISL-2026/ 실데이터 또는 README.md 정본에서 출처를 추적할 수 있어야 한다. 근거 없는 홍보성 지표 게시를 금지한다. R-9.18 실명·실제 이메일이 게시되는 페이지이므로, 추정 정보를 사실처럼 표기하지 않는다. 불확실한 항목은 노출하지 않는다. R-9.19 문서(README.md, docs/DESIGN.md)와 코드의 서술이 어긋나서는 안 된다. 마이그레이션이 미완인 영역은 문서에 미완임을 명시한다(문서가 코드보다 앞서 나가지 않는다).


10. 수용 기준 (Acceptance Criteria)

병합 승인은 아래 전 항목 충족 시에만 이루어진다.

기능 (PR-02·PR-03)

  • AC-01 / 접근 시 Home이 정상 렌더되고 404가 발생하지 않는다
  • AC-02 Home에 연구실 소개 · 주요 연구 분야 · 오시는 길 3개 블록이 모두 존재한다
  • AC-03 /intro 접근 시 /로 308 리다이렉트된다
  • AC-04 상단 탭 5종(Home/Members/Publications/Lectures/Standardization)이 전부 정상 라우팅된다
  • AC-05 (v1.1 개정 · v1.5 수치 갱신) Publications 3개 카테고리가 각각 고유 URL(/publications/<slug>)을 가지며, 해당 URL로 직접 진입했을 때 정적 HTML이 이미 해당 카테고리 상태를 담고 있다(비필터 상태가 먼저 보였다가 바뀌는 현상이 없어야 한다)
  • AC-06 Lectures가 학기별 그룹으로 렌더되고 최근 3개 학기가 기본 노출된다

데이터 무손실 (PR-01)

  • AC-07 건수 대조 통과: 국제 68 / 국내 80 / 특허 75 / 표준 문서 44 / 재학 16 / 졸업 60 / 강의 45학기
  • AC-08 Publications 223건 중 어느 카테고리에도 배정되지 않은 레코드가 0건이다
  • AC-09 확장 UI 조작 시 졸업생 60명·전 학기 강의·전 논문이 모두 도달 가능하다
  • AC-10 한글·특수문자 인코딩 손실 0건, BOM 제거 확인
  • AC-11 날짜 전 항목 ISO 8601 정규화 확인
  • AC-12 연구실 정체성 서술 영역에서 금지어 0건 (사물인터넷 표준, IoT Standards, MCM, 메타버스 상호운용성, placeholder) — 논문·표준 제목의 도메인 용어는 예외(MG-08)
  • AC-13 전 카운터 수치가 데이터 배열에서 도출됨을 코드로 확인
  • AC-14 (v1.1 신설) JS를 비활성화한 상태에서 /publications/<slug> 문서에 해당 카테고리 레코드가 전부 포함되어 있다 (R-8.15 · PR-01)

품질 게이트

  • AC-15 npm run lint 통과 (경고 0)
  • AC-16 npx tsc --noEmit 통과
  • AC-17 (v1.1 개정) npm run build 성공. 빌드 리포트에 ƒ (Dynamic) 라우트가 0건이고 전 라우트가 ○ (Static) 또는 ● (SSG)이다 — 도 빌드 타임 정적 프리렌더이므로 충족으로 판정한다 (§8.5 R-8.16)
  • AC-18 First Load JS 증가분 ≤ 30 kB
  • AC-19 4종 뷰포트에서 가로 스크롤 없음
  • AC-20 신규 Tailwind 반응형 유틸리티가 빌드 CSS에 실제 생성됨을 확인 (JIT 누락 시 빌드는 성공하나 조판이 무너짐)
  • AC-21 (v1.1 신설) generateStaticParams()로 카테고리별 정적 HTML 3개가 실제 생성됨을 .next/server/app/publications/ 파일 목록으로 확인
  • AC-22 (v1.1 신설) 소스 전역에 searchParams prop 사용·useSearchParams() 호출·라우팅 목적 pushState 호출이 0건임을 grep으로 확인 (§8.5 R-8.11·8.12·8.14)

문서

  • AC-23 README.md·docs/DESIGN.md 서술이 구현 결과와 일치
  • AC-24 마이그레이션 스크립트가 scripts/에 커밋됨
  • AC-25 (v1.6 신설 · R-8.19) 빌드 산출 .next/server/app/**/*.html모든 라우트에서 <main> 하위에 container-content가 존재함을 자동 게이트로 확인. <main>에는 max-w-*/px-*부여되지 않았음을 함께 확인 (R-8.17)
  • AC-26 (v1.6 신설 · R-8.18·R-8.20) 소스 전역에 w-screen·-mx-[50vw] 계열 탈출 기법과 임의값 클래스 min-[1240px]: 사용이 0건임을 grep으로 확인

Research Project PageView (v1.7 신설 · §6.1.2)

  • AC-27 (PJ-08 · R-8.15) content/projects.ts 전건title·abstract.next/server/app/index.html 정적 HTML에 존재함을 확인
  • AC-28 (PJ-09) Home 라우트가 여전히 ○ (Static)이며 빌드 전체에 ƒ (Dynamic)0건
  • AC-29 (PJ-03 · PR-01)abstract가 레거시 원문과 바이트 동일함을 파서 재실행으로 확인
  • AC-30 (PJ-06) 모든 keywords[] 원소가 해당 abstract부분문자열임을 verify_counts.py로 확인 (창작 차단)
  • AC-31 (PJ-07 · R-9.18) funderundefined인 프로젝트에 대해 산출 HTML에 Funder 라벨·자리표시자가 렌더되지 않음을 확인
  • AC-32 (PJ-05) 모든 deliverables[].refcontent/standards.ts에 실재하는 문서 참조와 일치함을 조인 검증
  • AC-33 (H-02 개정 · AC-02 회귀 방어) 히어로 재구성 후에도 연구실 소개 서술 블록 · 주요 연구 분야 그리드 · 오시는 길 · 지표 카운터 3종 · HeroComposition 이 Home 정적 HTML에 전부 존속함을 확인
  • AC-34 (v1.8 신설 · PJ-13·PJ-15·PJ-16) 프로젝트 트랙의 넘침을 브라우저 실측 수치로 판정한다 — 데스크톱(≥1240 px)에서 track.scrollWidth === track.clientWidth(스크롤 잔재 0), 모바일·태블릿에서는 scrollWidth > clientWidth정상 동작이다. 어느 뷰포트에서도 문서 레벨 가로 스크롤은 0이어야 한다(AC-19 · R-9.15). 데스크톱 3카드 폭의 서브픽셀 거동은 브라우저 없이는 확정할 수 없으므로 이 단정으로 판정을 이관한다

11. 구현 계획 (Implementation Plan)

11.1 단계별 작업 분해

Phase 작업 산출물 담당 선행 조건
P0 D-01(Publications 카테고리 1·2 중첩) 확정 결정 기록 GM ← 지도교수 완료 (v1.5 · 51aae14)
P1 레거시 데이터 추출 스크립트 작성 및 content/*.ts 생성 4개 데이터 모듈 + 추출 스크립트 Agy P0
P1-R 건수·인코딩·날짜 정규화 교차 검증 (AC-07~11) 검증 리포트 Claude P1
P2 Home 신설(소개·연구 분야·오시는 길) + /intro 리다이렉트 + Header 내비 갱신 app/page.tsx, next.config.js Agy P1-R
P3 Members / Lectures 실데이터 반영 2개 라우트 Agy P1-R
P4 Publications — /publications + [category] 세그먼트 4종 (§8.5 렌더링 제약 준수, 대량 데이터 처리 포함) 1개 라우트 + 4개 세그먼트 Agy P1-R
P5 Standardization 3단 계층 뷰 1개 라우트 Agy P1-R
P6 자산 이관·최적화 (MG-06·07) public/ Agy P2~P5
P7 SEO·접근성·반응형 검수 (§9.2·9.3·9.5) 검수 리포트 Cline P6
P8 최종 교차 리뷰 및 Verdict 리뷰 리포트 Claude P7

병렬 가능: P3 / P4 / P5는 P1-R 완료 후 상호 독립이므로 동시 진행 가능하다. P2는 Header.tsx를 수정하므로 P3~P5와 파일 충돌 가능성이 있어 먼저 완료할 것을 권장한다.

11.2 잡 분할 권고

Publications(P4)는 데이터 규모(223건)와 필터·점진적 노출 요구로 인해 타 라우트 대비 작업량이 크다. P4를 단독 잡으로 분리하고 P3·P5를 묶는 편이 리뷰 단위로 적절하다.

11.3 리뷰 프로토콜

.agents/MULTI_AGENT_RULES.md §3에 따라 Phase 완료 시마다 리뷰 사이클을 돌린다. 리뷰어는 NOT PASS사유와 검증된 개선 방향을 반드시 함께 제시하고, 개발 팀장은 부당하다고 판단하는 지적에 대해 근거를 갖춰 반박한다.


12. 리스크 및 미결 결정 (Risks & Open Decisions)

12.1 미결 결정 등록부

ID 결정 사항 상태 기본값(잠정) 영향
D-01 Publications 카테고리 1(International Conference)과 2(International Journal & Conference)의 범위 중첩 해소 확정 (v1.5, 2026-07-30) 결정: 1번 단독 카테고리 폐기 → 3개 카테고리 확정. A안(저널/학술대회 분리)은 학술대회가 1건에 불과해 기각, B안(미수록 논문 확보)은 신규 데이터 유입 없이 실행 불가하여 기각. 레지스트리 1곳(content/categories.ts) + PubCategory 유니온 수정으로 완결되었고 223건 무손실을 유지했다(P-03). 근거: intl-conf 배정 레코드 실측 0건
D-02 강의 과목명 한글 병기 여부 🟡 미결 영문 원문만 노출 (L-05) Lectures 표기. 병기 시 지도교수 확인 필요
D-03 오시는 길의 지도 표현 방식 🟡 미결 주소 텍스트 + 캠퍼스 링크 (지도 임베드 없음) H-16. 외부 지도 스크립트는 R-9.13 최소 의존성 원칙과 충돌
D-04 졸업생 기본 노출 범위(N년) 🟢 위임 최근 3년 M-06. 구현자 재량
D-05 연구실 GitHub 조직명(github.com/iot-standards-laboratory) 개명 여부 🟡 미결 현행 URL 유지 조직명이 구 정체성. 개명 시 기존 링크 무효화 위험
D-06 본문 여백·최대 폭 컨테이너를 어느 계층에 부여할 것인가 확정 (v1.6, 2026-07-30) 결정: <main> 일괄 부여안 기각 → 라우트 래퍼 방식 + 자동 게이트 채택. Planner 초안(<main>container-content)은 1행 수정·누락 불가라는 장점이 있으나, 개발 팀장 이의제기(Job 2560771b)대로 full-bleed 밴드·마퀴 티커를 구조적으로 차단한다. 래퍼 방식의 유일한 약점(신규 라우트 누락)은 AC-25 게이트로 상쇄되므로 래퍼 방식이 우월하다. → R-8.17~R-8.19
D-07 Research Project 카드의 Funder/Sponsor 실데이터 확보 여부 🔴 미결 funder 미노출 + 실존하는 Standards Track 표기 PJ-07. ISL-2026/ 전체를 과제·연구비·IITP·NRF·한국연구재단·정보통신기획평가원 등으로 검색해 0건이다. 임의 생성은 MG-05·R-9.17·R-9.18 위반이며 실명·실제 이메일이 게시되는 페이지이므로 절대 불가. 기본값으로 구현 차단은 아니며, 지도교수가 사업명·부처·기간을 제공하면 content/projects.ts 재생성만으로 반영된다
D-08 Research Project 집합의 정체성 범위 — 레거시 3건(IoT/CCIS/VLC)만인지, ANL 신규 과제를 포함할지 🟡 미결 레거시 3건 노출, 섹션 라벨 Research Projects 레거시 3건은 IoT 시대 실적이고 현 정체성은 ANL이다. 신규 과제 추가는 지도교수 입력이 필요하다(MG-05). 레거시 3건 비노출은 PR-01에 역행하므로 배제

D-01 상세

PR-04에 명시된 4개 라벨 중 1번과 2번의 범위가 논리적으로 중첩된다. International Journal & Conference가 국제 저널과 국제 학술대회를 모두 포함한다면, International Conference는 그 부분집합이 되어 동일 레코드가 두 카테고리에 해당하게 된다.

레거시 데이터 구조와의 대조:

레거시 파일 실제 내용 PR-04 라벨과의 대응
paper-international.html 국제 저널 67 + 국제 학술대회 1 = 68 International Journal & Conference에 정확히 대응
paper-domestic.html 국내 논문 80 (KCI 48) Domestic Journal & Conference에 정확히 대응
patent.html 특허 75 Patent에 정확히 대응
대응 원본 없음 International Conference⚠️

권고안 (A안) — 국제 실적을 저널/학술대회로 분리: International Journal / International Conference / Domestic Journal & Conference / Patent → 1번 라벨이 Journal의 오기라는 가정. 레거시 국제 목록을 게재처로 분리하면 저널 67 / 학술대회 1이 되어 학술대회 카테고리가 1건으로 빈약해지는 점을 함께 확인해야 한다.

대안 (B안) — 원문 라벨을 그대로 두고 1번을 국내외 통합 학술대회 카테고리로 재정의: International Conference에 미수록 학술대회 논문을 지도교수로부터 확보해 채운다.

리뷰어 판단: 어느 안이든 P-02의 레지스트리 설계로 인해 구현 착수를 막지 않는다. P1 단계에서는 레거시 3개 원본을 그대로 3개 카테고리에 적재하고, D-01 확정 후 4번째 카테고리 분리를 적용하는 순서를 권고한다. 단 P-03(레코드 무손실) 은 어느 안에서도 반드시 지켜져야 한다.

확정 결과 (v1.5, 2026-07-30 · commit 51aae14)C안: 1번 단독 카테고리 폐기로 결정되었다.

항목 내용
기각된 A안 국제 실적을 저널/학술대회로 분리 → 학술대회가 실측 1건뿐이어서 단독 카테고리로 성립하지 않음
기각된 B안 미수록 학술대회 논문을 추가 확보 → MG-05(ISL-2026/에 없는 데이터 생성 금지) 에 저촉되며 신규 원본 유입 없이는 실행 불가
채택된 C안 intl-conf 슬러그·라벨·타입 유니온을 제거하고 3개 카테고리로 확정
무손실 검증 intl-conf 배정 레코드 0건 → 축소가 정의상 무손실. 실측 68 + 80 + 75 = 223건 유지
변경 범위 content/categories.ts, content/types.ts(유니온), E2E 기대 라우트 목록, README.md 라우트 맵 — P-02 설계 예측대로 레지스트리 중심 수정으로 완결

이 확정으로 §4.1 사이트맵·§7 PubCategory·P-01·P-03이 v1.5에서 함께 갱신되었고, 문서 상태가 승인(Approved)으로 전환되었다.

12.2 리스크

ID 리스크 영향 완화 방안
R-01 레거시 HTML의 비정형 마크업으로 추출 정확도 저하 PR-01 위반 (데이터 누락·오배치) MG-01 스크립트화 + MG-02 건수 대조 + P1-R 독립 검증
R-02 223건 일괄 렌더로 초기 로드 지연 성능 저하 P-07 점진적 노출, R-9.11·9.12 예산 명시
R-03 Tailwind JIT이 동적 조립 클래스를 인식하지 못함 빌드는 성공하나 조판이 조용히 붕괴 클래스는 완전한 문자열 리터럴로 작성. AC-20으로 빌드 CSS 실측 검증
R-08 (v1.1 신설) Publications 필터 구현이 정적 생성을 깨뜨림 ƒ Dynamic 전환 → DM-03·NF-03 위반, 또는 빌드 중단 §8.5 실측 규칙 R-8.11~8.16 준수. AC-17·AC-21·AC-22로 검증
R-09 (v1.1 신설) 레코드 목록이 클라이언트 렌더로 밀려 정적 문서에서 누락 PR-01 실질 위반 — 크롤러·JS 미실행 환경에서 실적이 보이지 않음 R-8.15 서버 렌더 강제. AC-14로 JS 비활성 검증
R-04 실명·실적 데이터 오기재 연구실 신뢰도 훼손 R-9.17·9.18 무결성 원칙, MG-05 창작 금지, 지도교수 최종 확인
R-05 잔재 검사(MG-08)가 논문 제목의 도메인 용어까지 오검출 실데이터를 잔재로 오인해 삭제 → PR-01 위반 MG-08 예외 규정을 검사 스크립트에 반영. 검사 범위를 정체성 서술 영역으로 한정
R-06 문서-코드 불일치 재발 후속 작업자 혼선 R-9.19. 미완 영역은 문서에 미완으로 표기
R-07 P2(Header 수정)와 P3~P5 병렬 진행 시 충돌 머지 충돌 §11.1 주석대로 P2 선행 완료

13. 부록: 레거시 데이터 인벤토리 (실측)

ISL-2026/ 기준, 2026-07-30 파싱 실측치.

원본 파일 레코드 수 비고
member.html 재학 16 / 졸업 60 재학: 교수 1, Ph.D. 1, Ph.D. Candidate 4, Ph.D. Student 5, M.S. Candidate 3, M.S. Student 2. 졸업생 2007~2026
paper-international.html 68 저널 67 + 학술대회 1. 최신 2026-04(IEEE TNSM), 최고(最古) 1995
paper-domestic.html 80 KCI 등재 표시 48건. 최신 2026-06
patent.html 75 국내 출원 다수 + US 출원 일부. 최신 출원 2025-12-16
standard.html 기구 6 / 문서 약 55 국제 5개 기구 + 국내 1개(TTA/PG425). 2000~현재
lecture.html 약 20개 학기 2016 Fall ~ 2026 Spring
index.html 연구분야 3종 IoT Standards, CCIS, VLC-IoT폐기 대상(5대 기둥으로 교체, R-5.3)
introduction.html 연구 주제 13종 구 연구 분야 상세 — 폐기 대상(R-5.3)
image/, assets/ 11.6 MB image/ 3.4 MB + assets/ 8.2 MB. 선별 이관(MG-06)

연락처·소재지 (H-13~H-15 원천)

  • 소재지: 경북대학교 IT대학 5호관(415동) 527호 (레거시 index.html에 HTML 주석 처리된 상태로 존재 — 복원 필요)
  • 소속: School of Computer Science and Engineering, Kyungpook National University
  • 지도교수 이메일: sjkoh@knu.ac.kr
  • 연구실 GitHub: https://github.com/iot-standards-laboratory (→ D-05)
  • 지도교수 GitHub: https://github.com/sjkoh12
  • 기관 링크: KNU http://www.knu.ac.kr/ · 컴퓨터학부 http://cse.knu.ac.kr/ · IT대학 http://it.knu.ac.kr/
  • 전화·팩스: 레거시에 없음 (H-14에 따라 창작 금지)

14. 변경 이력

버전 일자 작성자 내용
1.0 2026-07-30 claude (planner) 최초 작성. 사용자 원본 요구사항(§1)을 정본으로 확장. Job 4148350e
1.1 2026-07-30 claude (planner) 개발 팀장(Agy) 기술 이의제기(Job 175860e4) 반영. §8.5 Next.js 렌더링 제약 신설(실측 5종). IA-03을 라우트 세그먼트 방식으로 개정, P-06 개정 + P-06a·P-07a 신설, DM-03·NF-03·AC-05·AC-16 문구 정정, AC-22~24 및 R-08·R-09 신설. Job 45d05868
1.2 2026-07-30 agy (creator) 교차 리뷰 리포트(Job 3820bdc8) 결함 피드백 전면 반영. F1 §4.1 사이트맵 쿼리 표기를 라우트 세그먼트(/publications/<slug>)로 갱신, F2 §2.1·§2.2 연구 실적 수치 279건 → 223건 정정, F3 §10 수용 기준 AC-14~24 순서 및 그룹핑 정돈. Job f3e09780
1.3 2026-07-30 agy (creator) 교차 리뷰 리포트(Job 60c92d3a) 결함 피드백 전면 반영. G-1 417행 R-8.16 참조 AC-16 → AC-17 정정, G-4 575행 R-03 참조 AC-19 → AC-20 정정, G-2 576행 R-08 참조 AC-16/22/23 → AC-17/21/22 정정, G-3 577행 R-09 참조 AC-24 → AC-14 정정. Job a535ce20
1.4 2026-07-30 agy (creator) 구현 교차 리뷰 리포트(Job 777c3ab8) 피드백 전면 반영. I1 전 파서 ISO 8601 정규화 100%, I2 Footer 주소/이메일 실주소 교체, I3 README 라우트 맵 갱신, I4 verify_counts.py 엄격 게이트로 강화 및 실측 수치(표준 44, 학기 45) 정정, I5 pycache 제거 및 .gitignore 차단, I6/I7 Home 카운터 및 5대 기둥 영문 라벨 정본 정렬. Job a54723ce
1.5 2026-07-30 claude (planner) D-01 확정 및 문서 상태 승인(Approved) 전환. commit 51aae14(백로그 4건 반영)에 대한 검증 결과를 정본에 동기화: intl-conf 단독 카테고리 폐기(A·B안 기각, C안 채택 — §12.1 D-01 상세에 결정 근거 기록), §4.1 사이트맵·§7 PubCategory 유니온·P-01·P-03·IA-03·§11 P0 갱신, 사이트맵의 학기(45)·표준 문서(44) 실측치 정정. Job 343b5808
1.6 2026-07-30 claude (planner) 개발 팀장(Agy) 기술 이의제기(Job 2560771b) 반영. §8.6 레이아웃 컨테이너 아키텍처·브레이크포인트 토큰 신설(R-8.17~R-8.20) — <main> 일괄 부여안을 기각하고 3계층 분리(전체 폭 <main> / 라우트 래퍼 container-content / full-bleed 밴드)를 채택, w-screen 탈출 기법 금지(R-8.18) 및 desktop: 1240px 스크린 토큰화(R-8.20, Tailwind 정렬 동작 실측 확인). D-06 신설·확정, AC-25·AC-26 신설, R-9.14 검수 뷰포트 6종으로 확대. AC-21 정적 HTML 4개 → 3개, R-8.15 표준 문서 55 → 44건 실측치 정정. Job 019b7331
1.7 2026-07-30 claude (planner) Home Hero → Research Project PageView 전환 계획 반영. §6.1.2 신설(PJ-01PJ-14) — 레거시 실재 프로젝트 3건(IoT Standards·CCIS·VLC-IoT) 확인, period·deliverablescontent/standards.ts 조인으로 도출하는 무창작 설계, 활성 슬라이드 전용 캐러셀 금지(PJ-08)·URL 상태 동기화 금지(PJ-09)·캐러셀 라이브러리 금지(PJ-10)·scroll-snap 기반 JS-off 동작 보장(PJ-11) 규정. H-02 개정(슬로건 교체 허용 + H-03·H-04·H-05·H-06·H-07·H-10 존속 명시). **AC-27AC-33 신설**, §7 ResearchProject·ProjectDeliverable 타입 추가, D-07·D-08 신설. Job 6b3840a1
1.8 2026-07-30 claude (planner) 개발 팀장(Agy) 기술 이의제기(Job 2299a6b9) 반영. PJ-13 개정 — 데스크톱 3카드를 flex 스크롤 트랙에서 grid-cols-3 정적 3열 + overflow-visible 로 전환하고 데스크톱 퍼센트 연산을 제거. PJ-15·PJ-16 신설(min-w-0+줄바꿈으로 shrink-0 min-content 넘침 방어 / 스크롤바 은폐 시 AC-34 동반 의무), AC-34 신설(데스크톱 scrollWidth === clientWidth 실측 판정). 이의제기의 근거 수식은 정정 — calc(33.333%-16px)은 초과가 아니라 0.0125 px 미달이며, 대안 B의 분수식은 여유가 0이어서 해당 실패 모드에 오히려 더 취약하다. Tailwind가 calc 연산자 공백을 자동 삽입함과 grid-cols-3minmax(0,1fr) 전개·미디어 쿼리 출력 순서를 실측 확인. Job 294570ab