diff --git a/refer_landing_page/content/projects.ts b/refer_landing_page/content/projects.ts
new file mode 100644
index 0000000..e4abee0
--- /dev/null
+++ b/refer_landing_page/content/projects.ts
@@ -0,0 +1,142 @@
+// AUTO-GENERATED by scripts/extract/generate_all.py — DO NOT EDIT BY HAND
+import { ResearchProject } from "./types";
+
+export const researchProjects: ResearchProject[] = [
+ {
+ "slug": "iot-standards",
+ "title": "IoT Standards",
+ "abstract": "Internet of Things covers a huge range of industries and use cases that scale from a single constrained device up to massive cross-platform deployments of embedded technologies and cloud systems connecting in real-time.",
+ "keywords": [
+ "Internet of Things",
+ "embedded technologies",
+ "cloud systems",
+ "real-time"
+ ],
+ "standardsOrg": "ISO/IEC JTC1/SC41",
+ "period": "2020 ~ Present",
+ "deliverables": [
+ {
+ "title": "Part 1: Framework",
+ "ref": "ISO/IEC TR 30189-1 (March 2025)",
+ "status": "TR"
+ },
+ {
+ "title": "Part 2: Use Cases",
+ "ref": "ISO/IEC CDTR 30189-2 (In Progress)",
+ "status": "InProgress"
+ }
+ ]
+ },
+ {
+ "slug": "ccis",
+ "title": "CCIS",
+ "abstract": "In-Vehicle Infotainment (IVI) refers to vehicle systems that combine entertainment and information delivery to drivers and passengers. Configurable Car Infotainment Service (CCIS) is a service that helps users to more easily manage and control In-Vehicle infotainment devices and content.",
+ "keywords": [
+ "In-Vehicle Infotainment",
+ "CCIS",
+ "infotainment devices"
+ ],
+ "standardsTrack": "IEC/TC 100/TA 17",
+ "standardsOrg": "IEC TC100",
+ "period": "2018 ~ Present",
+ "deliverables": [
+ {
+ "title": "Multimedia Systems and Equipment for Metaverse - Part 1: Genaral",
+ "ref": "IEC TR 63614-1 (May 2026)",
+ "status": "TR"
+ },
+ {
+ "title": "Multimedia Systems and Equipment for Metaverse - Part 2: Classification",
+ "ref": "IEC TS 63614-2 (May 2026)",
+ "status": "TS"
+ },
+ {
+ "title": "Multimedia Systems and Equipment for Metaverse - Part 3: Gap Analysis",
+ "ref": "IEC TR 63614-3 (March 2026)",
+ "status": "TR"
+ },
+ {
+ "title": "Multimedia Systems and Equipment for Metaverse - Part 4: AI Use Cases",
+ "ref": "IEC WDTR 63614-4 (In Progress)",
+ "status": "InProgress"
+ },
+ {
+ "title": "User's QoE for Multimedia Conference Services - Part 1: General",
+ "ref": "IEC TR 63478-1 (November 2023)",
+ "status": "TR"
+ },
+ {
+ "title": "User's QoE for Multimedia Conference Services - Part 2: Requirments",
+ "ref": "IEC IS 63478-2 (October 2025)",
+ "status": "IS"
+ },
+ {
+ "title": "User's QoE for Multimedia Conference Services - Part 3: Measurement Methods",
+ "ref": "IEC CDV 63478-3 (In Progress)",
+ "status": "InProgress"
+ },
+ {
+ "title": "Infotainment Services for Public Vehicles (PVIS) - Part 1: General",
+ "ref": "IEC TR 63479-1 (November 2023)",
+ "status": "TR"
+ },
+ {
+ "title": "Infotainment Services for Public Vehicles (PVIS) - Part 2: Requirements",
+ "ref": "IEC IS 63479-2 (February 2026)",
+ "status": "IS"
+ },
+ {
+ "title": "Infotainment Services for Public Vehicles (PVIS) - Part 3: Framework",
+ "ref": "IEC IS 63479-3 (January 2026)",
+ "status": "IS"
+ },
+ {
+ "title": "Configurable Car Infotainment Services (CCIS) - Part 1: General",
+ "ref": "IEC 63246-1 (August 2021)",
+ "status": "IS"
+ },
+ {
+ "title": "Configurable Car Infotainment Services (CCIS) - Part 2: Requirements",
+ "ref": "IEC 63246-2 (January 2022)",
+ "status": "IS"
+ },
+ {
+ "title": "Configurable Car Infotainment Services (CCIS) - Part 3: Framework",
+ "ref": "IEC 63246-3 (January 2022)",
+ "status": "IS"
+ },
+ {
+ "title": "Configurable Car Infotainment Services (CCIS) - Part 4: Protocol",
+ "ref": "IEC TR 63246-4 (December 2022)",
+ "status": "TR"
+ }
+ ]
+ },
+ {
+ "slug": "vlc-iot",
+ "title": "VLC-IoT",
+ "abstract": "Visible-light communication (VLC) transmits data by intensity modulating optical sources, such as light-emitting diodes (LEDs) and laser diodes (LDs), faster than the persistence of the human eye. The goal of IoT-VLC is to design a framework of IoT services based on VLC.",
+ "keywords": [
+ "Visible-light communication",
+ "VLC",
+ "light-emitting diodes",
+ "laser diodes",
+ "IoT services"
+ ],
+ "standardsTrack": "ITU-T SG20",
+ "standardsOrg": "ITU-T SG20",
+ "period": "2018 ~ 2020",
+ "deliverables": [
+ {
+ "title": "Framework of IoT Services based on Visible Light Communications (VLC)",
+ "ref": "ITU-T Recommendation Y.4465 (January 2020)",
+ "status": "IS"
+ },
+ {
+ "title": "Functional Architecture for IoT Services based on VLC",
+ "ref": "ITU-T Recommendation Y.4474 (August 2020)",
+ "status": "IS"
+ }
+ ]
+ }
+];
diff --git a/refer_landing_page/content/types.ts b/refer_landing_page/content/types.ts
index c8c8cba..6c8bbd1 100644
--- a/refer_landing_page/content/types.ts
+++ b/refer_landing_page/content/types.ts
@@ -80,3 +80,21 @@ export interface StandardsBody {
role?: string;
projects: StandardProject[];
}
+
+export interface ProjectDeliverable {
+ title: string;
+ ref: string;
+ status: DocStatus;
+}
+
+export interface ResearchProject {
+ slug: string;
+ title: string;
+ abstract: string;
+ keywords: string[];
+ standardsTrack?: string;
+ standardsOrg?: string;
+ period?: string;
+ deliverables: ProjectDeliverable[];
+ funder?: string;
+}
diff --git a/refer_landing_page/scripts/extract/generate_all.py b/refer_landing_page/scripts/extract/generate_all.py
index 4ea9586..e5ae727 100644
--- a/refer_landing_page/scripts/extract/generate_all.py
+++ b/refer_landing_page/scripts/extract/generate_all.py
@@ -443,6 +443,77 @@ def parse_standards():
return bodies
+def parse_projects():
+ bodies = parse_standards()
+ body_map = {b["org"]: b for b in bodies}
+
+ # Extract deliverables for CCIS (IEC TC100)
+ ccis_docs = []
+ if "IEC TC100" in body_map:
+ for p in body_map["IEC TC100"]["projects"]:
+ for d in p["documents"]:
+ ccis_docs.append({
+ "title": d["title"],
+ "ref": d["ref"],
+ "status": d["status"]
+ })
+
+ # Extract deliverables for VLC-IoT (ITU-T SG20)
+ vlc_docs = []
+ if "ITU-T SG20" in body_map:
+ for p in body_map["ITU-T SG20"]["projects"]:
+ for d in p["documents"]:
+ vlc_docs.append({
+ "title": d["title"],
+ "ref": d["ref"],
+ "status": d["status"]
+ })
+
+ # Extract deliverables for IoT Standards (ISO/IEC JTC1/SC41)
+ iot_docs = []
+ if "ISO/IEC JTC1/SC41" in body_map:
+ for p in body_map["ISO/IEC JTC1/SC41"]["projects"]:
+ for d in p["documents"]:
+ iot_docs.append({
+ "title": d["title"],
+ "ref": d["ref"],
+ "status": d["status"]
+ })
+
+ projects = [
+ {
+ "slug": "iot-standards",
+ "title": "IoT Standards",
+ "abstract": "Internet of Things covers a huge range of industries and use cases that scale from a single constrained device up to massive cross-platform deployments of embedded technologies and cloud systems connecting in real-time.",
+ "keywords": ["Internet of Things", "embedded technologies", "cloud systems", "real-time"],
+ "standardsOrg": "ISO/IEC JTC1/SC41",
+ "period": body_map.get("ISO/IEC JTC1/SC41", {}).get("period", "2020 ~ Present"),
+ "deliverables": iot_docs,
+ },
+ {
+ "slug": "ccis",
+ "title": "CCIS",
+ "abstract": "In-Vehicle Infotainment (IVI) refers to vehicle systems that combine entertainment and information delivery to drivers and passengers. Configurable Car Infotainment Service (CCIS) is a service that helps users to more easily manage and control In-Vehicle infotainment devices and content.",
+ "keywords": ["In-Vehicle Infotainment", "CCIS", "infotainment devices"],
+ "standardsTrack": "IEC/TC 100/TA 17",
+ "standardsOrg": "IEC TC100",
+ "period": body_map.get("IEC TC100", {}).get("period", "2018 ~ Present"),
+ "deliverables": ccis_docs,
+ },
+ {
+ "slug": "vlc-iot",
+ "title": "VLC-IoT",
+ "abstract": "Visible-light communication (VLC) transmits data by intensity modulating optical sources, such as light-emitting diodes (LEDs) and laser diodes (LDs), faster than the persistence of the human eye. The goal of IoT-VLC is to design a framework of IoT services based on VLC.",
+ "keywords": ["Visible-light communication", "VLC", "light-emitting diodes", "laser diodes", "IoT services"],
+ "standardsTrack": "ITU-T SG20",
+ "standardsOrg": "ITU-T SG20",
+ "period": body_map.get("ITU-T SG20", {}).get("period", "2018 ~ 2020"),
+ "deliverables": vlc_docs,
+ }
+ ]
+
+ return projects
+
def clean_dict(obj):
if isinstance(obj, dict):
return {k: clean_dict(v) for k, v in obj.items() if v is not None}
@@ -455,6 +526,7 @@ def main():
intl_p, dom_p, pat_p = parse_publications()
semesters = parse_lectures()
bodies = parse_standards()
+ projects = parse_projects()
os.makedirs(CONTENT_DIR, exist_ok=True)
@@ -481,5 +553,10 @@ def main():
f.write('import { StandardsBody } from "./types";\n\n')
f.write(f'export const standardsBodies: StandardsBody[] = {json.dumps(clean_dict(bodies), ensure_ascii=False, indent=2)};\n')
+ with open(os.path.join(CONTENT_DIR, "projects.ts"), "w", encoding="utf-8") as f:
+ f.write('// AUTO-GENERATED by scripts/extract/generate_all.py — DO NOT EDIT BY HAND\n')
+ f.write('import { ResearchProject } from "./types";\n\n')
+ f.write(f'export const researchProjects: ResearchProject[] = {json.dumps(clean_dict(projects), ensure_ascii=False, indent=2)};\n')
+
if __name__ == "__main__":
main()
diff --git a/refer_landing_page/scripts/extract/verify_counts.py b/refer_landing_page/scripts/extract/verify_counts.py
index 2051481..156df24 100644
--- a/refer_landing_page/scripts/extract/verify_counts.py
+++ b/refer_landing_page/scripts/extract/verify_counts.py
@@ -14,17 +14,18 @@ MONTH_MAP = {
}
def verify():
- from generate_all import parse_members, parse_publications, parse_lectures, parse_standards
+ from generate_all import parse_members, parse_publications, parse_lectures, parse_standards, parse_projects
active_m, alumni_m = parse_members()
intl_p, dom_p, pat_p = parse_publications()
semesters = parse_lectures()
bodies = parse_standards()
+ projects = parse_projects()
total_pubs = len(intl_p) + len(dom_p) + len(pat_p)
std_docs_count = sum(len(p["documents"]) for b in bodies for p in b["projects"])
- print("=== DATA VERIFICATION GATE (AC-07 / AC-08 / AC-10 / AC-11 / VOLUME CROSS-CHECK) ===")
+ print("=== DATA VERIFICATION GATE (AC-07 / AC-08 / AC-10 / AC-11 / AC-30 / VOLUME CROSS-CHECK) ===")
print(f"Active Members: {len(active_m)} (Expected: 16)")
print(f"Alumni: {len(alumni_m)} (Expected: 60)")
print(f"International Papers: {len(intl_p)} (Expected: 68)")
@@ -34,9 +35,20 @@ def verify():
print(f"Lectures Semesters: {len(semesters)} (Expected: 45)")
print(f"Standard Bodies: {len(bodies)} (Expected: 6)")
print(f"Standard Documents: {std_docs_count} (Expected: 44)")
+ print(f"Research Projects: {len(projects)} (Expected: 3)")
errors = []
+ if len(projects) != 3:
+ errors.append(f"Research Projects count mismatch: got {len(projects)}, expected 3")
+
+ # AC-30: Keyword Substring Verification (Ensures zero hallucinated/created keywords)
+ for proj in projects:
+ abstract = proj.get("abstract", "")
+ for kw in proj.get("keywords", []):
+ if kw not in abstract:
+ errors.append(f"AC-30 Keyword Violation in project '{proj.get('slug')}': keyword '{kw}' not in abstract")
+
# 1. Count checks
if len(active_m) != 16:
errors.append(f"Active Members count mismatch: got {len(active_m)}, expected 16")
diff --git a/refer_landing_page/tests/e2e_test_suite.py b/refer_landing_page/tests/e2e_test_suite.py
index 37c8466..713bbaf 100644
--- a/refer_landing_page/tests/e2e_test_suite.py
+++ b/refer_landing_page/tests/e2e_test_suite.py
@@ -93,5 +93,23 @@ class TestANLHomepageE2E(unittest.TestCase):
for token in ["--ink", "--ivory", "--paper", "--line", "--vermillion", "--cobalt"]:
self.assertIn(token, css, f"Missing CSS variable {token} in globals.css")
+ def test_07_research_projects_pageview(self):
+ """TC-T1-F7: Verify Research Project PageView content in Home static SSG HTML (AC-27 / AC-31)."""
+ html = self.read_html("index.html")
+
+ # 1. Project PageView Title & Projects
+ self.assertIn("주요 연구 프로젝트 (Research Projects)", html)
+ self.assertIn("IoT Standards", html)
+ self.assertIn("CCIS", html)
+ self.assertIn("VLC-IoT", html)
+
+ # 2. Key Deliverables references (Top visible items)
+ self.assertIn("ISO/IEC TR 30189-1", html)
+ self.assertIn("IEC TR 63614-1", html)
+ self.assertIn("ITU-T Recommendation Y.4465", html)
+
+ # 3. Assert zero placeholder Funder labels (AC-31)
+ self.assertNotIn("Funder:", html)
+
if __name__ == "__main__":
unittest.main()