const PCB_STAGES = [
  {
    id: "lamination",
    step: "04",
    tag: "LAMINATION",
    title: "적층",
    verb: "합친다",
    oneLine: "검사된 내층과 절연 접착재를 정확한 순서로 쌓아 하나의 다층판으로 굳힌다.",
    change: "떨어져 있던 회로층이 절연된 한 장의 보드로 고정된다.",
    why: [
      "여러 내층을 물리적으로 한 장으로 만든다.",
      "층과 층 사이를 절연하면서 설계 위치에 고정한다.",
      "한 장 안에 많은 신호·전원 회로를 안정적으로 넣는다."
    ],
    analogyTitle: "뜨거운 프레스 샌드위치",
    analogy: "회로 시트와 반쯤 굳은 접착 시트를 순서대로 쌓고, 공기를 뺀 뒤 열과 압력으로 한 덩어리로 굳힌다.",
    risk: "층 순서 오류, 기포, 들뜸, 휨, 두께 이상, 층간 정렬 불량",
    flow: ["내층 표면 준비", "레이업", "진공·가열·가압", "경화", "냉각", "두께·정렬 확인"],
    controls: [
      ["레시피", "온도·압력·진공·시간의 변화 곡선"],
      ["상태", "프리프레그 보관, 자재 로트, 순서, 청정도"],
      ["결과", "총두께, 휨, 층간 정렬, 보이드·박리"]
    ],
    defects: [
      ["이물·공기 잔류", "보이드", "열 공정에서 박리 확대"],
      ["레이업/정렬 오류", "층 위치 어긋남", "드릴 브레이크아웃"],
      ["수지 흐름 이상", "두께·절연 간격 편차", "가공·전기 특성 편차"]
    ],
    ceo: [
      "현재 병목은 프레스 용량인가, 레시피 전환인가, 앞 공정 대기인가?",
      "적층 후 발견된 내층 기인 불량의 누적 손실은 얼마인가?",
      "프로파일 이탈을 실시간으로 잡는가, 결과 불량 뒤에 알게 되는가?"
    ],
    quiz: {
      q: "적층 전에 내층 AOI를 끝내야 하는 가장 큰 이유는?",
      options: ["적층 후에는 내부 결함이 봉인되고 후공정 비용이 누적되기 때문", "프레스 온도를 낮출 수 있기 때문", "드릴 비트를 덜 쓰기 때문"],
      answer: 0,
      explain: "내층 결함이 적층 뒤에 발견되면 드릴·도금 등 이미 투입된 비용까지 함께 잃을 수 있다."
    }
  },
  {
    id: "drill",
    step: "05",
    tag: "DRILLING",
    title: "드릴",
    verb: "뚫는다",
    oneLine: "적층판의 정확한 위치에 부품 삽입과 층간 연결이 지나갈 물리적 구멍을 만든다.",
    change: "층만 있던 판에 수직 통로가 생긴다. 아직 전기는 통하지 않는다.",
    why: [
      "정확한 위치와 직경의 빈 홀을 만든다.",
      "뒤의 도금이 층간 연결을 만들 표면과 공간을 준다.",
      "여러 층의 회로가 만날 수 있는 수직 경로를 준비한다."
    ],
    analogyTitle: "엘리베이터 승강로 공사",
    analogy: "건물 층마다 있는 출입구 중심을 정확히 관통해 빈 승강로를 만든다. 엘리베이터가 설치되기 전이라 아직 이동은 못 한다.",
    risk: "위치 이탈, 브레이크아웃, 직경 이상, 거친 홀, 버, 스미어, 공구 파손",
    flow: ["가공 데이터 확인", "패널 정렬·고정", "공구·보조재 구성", "CNC/레이저 가공", "홀 검사", "디스미어 인계"],
    controls: [
      ["레시피", "회전수, 이송, 스택 높이, 직경·깊이"],
      ["상태", "비트 히트 수, 마모, 런아웃, 집진, 고정"],
      ["결과", "홀 위치·직경, 거칠기, 버, 스미어, 브레이크아웃"]
    ],
    defects: [
      ["정렬·보정 오류", "홀 중심 이탈", "내층 패드 접촉 면적 감소"],
      ["마모 공구", "거친 홀·직경 편차", "도금 불균일·크랙 기점"],
      ["열·칩 배출 불량", "스미어·버", "내층 접속 및 도금 불량"]
    ],
    ceo: [
      "드릴 불량 1위는 공구 수명, 정렬, 레시피 중 무엇인가?",
      "히트 수 기준은 제품 두께·재료·직경별 데이터 기준인가?",
      "드릴 직후 잡을 결함이 도금 이후까지 넘어가는 비율은 얼마인가?"
    ],
    quiz: {
      q: "드릴 직후의 비아가 아직 전기적으로 연결되지 않은 이유는?",
      options: ["홀이 너무 작아서", "홀 벽이 절연재이고 연속 구리층이 없어서", "솔더마스크가 없어서"],
      answer: 1,
      explain: "드릴은 빈 공간만 만든다. 홀 벽에 연속적인 구리층을 만드는 도금이 뒤따라야 한다."
    }
  },
  {
    id: "desmear",
    step: "05.5",
    tag: "DESMEAR",
    title: "디스미어",
    verb: "청소한다",
    oneLine: "드릴 열로 홀 벽과 내층 접점에 번진 수지 찌꺼기를 제거한다.",
    change: "가려져 있던 내층 구리 접점이 깨끗하게 드러난다.",
    why: [
      "드릴 잔사와 번진 수지를 제거한다.",
      "홀 벽의 내층 구리 접점을 노출한다.",
      "새 도금 구리가 기존 내층 구리와 직접 이어지게 한다."
    ],
    analogyTitle: "벽을 뚫은 뒤 배관 접점 청소",
    analogy: "벽을 뚫으며 눌어붙은 먼지와 녹은 찌꺼기를 걷어내야 새 배관이 기존 배관에 제대로 맞닿는다.",
    risk: "수지 잔류, 과처리, 홀 벽 손상, 내층 접점 약화, 후속 도금 오픈",
    flow: ["세정", "수지 팽윤", "스미어 제거", "중화·수세", "표면 상태 확인", "무전해 인계"],
    controls: [
      ["레시피", "처리시간, 온도, 화학/플라즈마 조건"],
      ["상태", "약품 활성, 오염, 수세, 제품 재료 특성"],
      ["결과", "잔사 제거, 내층 접점 노출, 홀 벽 손상 여부"]
    ],
    defects: [
      ["처리 부족", "스미어 잔류", "내층 구리와 새 도금의 접촉 불량"],
      ["처리 과다", "수지 과식각·거친 홀", "도금 균일도·신뢰성 악화"],
      ["수세 부족", "약품 잔류", "후속 욕조 오염·도금 이상"]
    ],
    ceo: [
      "재료와 홀 구조별로 디스미어 조건이 구분돼 있는가?",
      "처리 부족과 과처리를 어떤 단면 기준으로 판정하는가?",
      "디스미어 기인 도금 불량을 발생 시점까지 추적할 수 있는가?"
    ],
    quiz: {
      q: "디스미어의 핵심 목적은 단순 먼지 제거보다 무엇에 가까운가?",
      options: ["홀 색상을 맞추는 일", "내층 구리 접점을 다시 드러내는 연결 준비", "홀 직경을 크게 만드는 일"],
      answer: 1,
      explain: "스미어가 접점 위를 가리면 뒤의 구리가 두꺼워도 기존 내층과 제대로 연결되지 않을 수 있다."
    }
  },
  {
    id: "electroless",
    step: "06A",
    tag: "ELECTROLESS Cu",
    title: "무전해 동도금",
    verb: "씨앗을 만든다",
    oneLine: "전기가 안 통하는 홀 벽 전체에 화학 반응으로 얇고 연속적인 구리 씨앗층을 만든다.",
    change: "비도전성 홀 벽이 처음으로 전류가 흐를 수 있는 표면이 된다.",
    why: [
      "수지·유리섬유가 드러난 홀 벽에 구리막을 만든다.",
      "홀 벽 전체에 끊김 없는 전류 경로를 준비한다.",
      "뒤의 전해 동도금이 시작될 기반을 만든다."
    ],
    analogyTitle: "금속이 붙을 수 있게 하는 프라이머",
    analogy: "유리 같은 벽에는 금속을 바로 두껍게 키울 수 없다. 먼저 어떤 표면에도 붙는 아주 얇은 도전성 밑바탕을 두른다.",
    risk: "씨앗층 불연속, 스킵 도금, 홀 보이드, 후속 전해 미성장",
    flow: ["컨디셔닝", "촉매화", "활성화", "무전해 구리 석출", "수세", "연속성 확인"],
    controls: [
      ["레시피", "시간, 온도, pH, 약품 농도"],
      ["상태", "촉매 활성, 욕조 오염·수명, 수세 상태"],
      ["결과", "얇지만 끊김 없는 구리막, 홀 전체 피복"]
    ],
    defects: [
      ["표면 준비 부족", "국부 미도금", "전해도금도 해당 구간에서 성장하지 않음"],
      ["촉매·욕조 이상", "씨앗층 불연속", "홀 오픈·보이드"],
      ["수세·오염 관리 부족", "거친 막·욕조 교차오염", "후속 두께·접착 편차"]
    ],
    ceo: [
      "무전해 불연속과 전해 두께 부족을 분석에서 구분하는가?",
      "욕조 이상 시 영향 시간대와 로트를 즉시 추적할 수 있는가?",
      "씨앗층 연속성은 어떤 공정 내 지표로 조기 감지하는가?"
    ],
    quiz: {
      q: "무전해 동도금 없이 바로 전해 동도금하기 어려운 이유는?",
      options: ["홀 벽에 전류가 흐를 연속 도전층이 없어서", "구리 색상이 다르기 때문에", "보드가 너무 얇기 때문에"],
      answer: 0,
      explain: "전해도금은 전류가 흐르는 표면에서 구리가 자란다. 무전해 씨앗층이 그 최초 경로다."
    }
  },
  {
    id: "electrolytic",
    step: "06B",
    tag: "ELECTROLYTIC Cu",
    title: "전해 동도금",
    verb: "두껍게 키운다",
    oneLine: "씨앗층에 전류를 흘려 구리를 제품이 요구하는 기능 두께까지 성장시킨다.",
    change: "얇은 씨앗막이 열과 전류를 견디는 실제 구리 통로가 된다.",
    why: [
      "씨앗층 위 구리 두께를 키운다.",
      "홀 전체에 낮은 저항과 기계적 강도를 만든다.",
      "제품 수명 동안 열팽창과 전류를 견디는 층간 연결을 완성한다."
    ],
    analogyTitle: "밑칠 위에 실제 금속 벽 세우기",
    analogy: "얇은 밑칠만으로는 건물을 지탱할 수 없다. 전류를 이용해 그 위에 충분한 두께의 금속 벽을 성장시킨다.",
    risk: "홀 중앙 박막, 두께 편차, 버닝, 거친 도금, 노듈, 열 사이클 크랙",
    flow: ["랙·전기 접촉", "욕조 투입", "전류 인가", "구리 성장", "수세·건조", "두께·단면 확인"],
    controls: [
      ["레시피", "전류밀도, 파형, 시간, 교반·순환"],
      ["상태", "욕조 조성, 첨가제, 접점, 양극, 필터"],
      ["결과", "홀 중앙 최소 두께, 분포, 연성, 보이드·노듈"]
    ],
    defects: [
      ["깊고 좁은 홀·분포 불량", "홀 중앙 박막", "열 반복에서 중앙부 크랙"],
      ["접점·전류 편차", "패널 내 두께 차이", "외층 회로·홀 신뢰성 편차"],
      ["욕조·첨가제 이상", "거친 도금·연성 저하", "조기 파손·미세회로 결함"]
    ],
    ceo: [
      "표면이 아니라 홀 중앙 최소 두께를 어떤 빈도로 확인하는가?",
      "도금 병목은 체류시간, 랙 수, 제품 믹스, 분석 대기 중 무엇인가?",
      "구리·약품뿐 아니라 폐수·재작업·누적손실까지 원가에 포함하는가?"
    ],
    quiz: {
      q: "표면 구리가 충분히 두꺼워도 홀 신뢰성이 나쁠 수 있는 이유는?",
      options: ["솔더마스크 색상이 달라서", "홀 입구와 깊은 중앙의 도금 분포가 다를 수 있어서", "드릴 데이터가 없어져서"],
      answer: 1,
      explain: "깊고 좁은 홀은 중앙까지 약품 교환과 전류 분포가 어려워 표면보다 중앙이 얇을 수 있다."
    }
  },
  {
    id: "hpl",
    step: "06C",
    tag: "HOLE PLUGGING LAND",
    title: "HPL",
    verb: "채우고 위를 쓴다",
    oneLine: "당사 용어 기준, 비아를 채워 평탄하게 만든 뒤 그 위에 랜드나 패드를 구성하는 공법이다.",
    change: "빈 비아 공간이 충진·평탄화되고 상부까지 회로 공간으로 활용된다.",
    why: [
      "비아 내부를 충진해 빈 공간을 없앤다.",
      "표면을 평탄하게 만들어 상부 패드 형성 기반을 만든다.",
      "비아가 차지하던 영역 위까지 접속·배선 공간으로 활용한다."
    ],
    analogyTitle: "우물을 메우고 맨홀 위를 쓰기",
    analogy: "우물을 채우고 표면을 평평하게 한 뒤 튼튼한 맨홀 뚜껑을 만들어, 그 위 공간에도 물건을 올리는 것과 같다.",
    risk: "충진 보이드, 딤플, 돌출, 평탄도 불량, 상부 패드 변형·접속 문제",
    flow: ["도금된 비아 준비", "홀 충진/플러깅", "경화 또는 구리 성장", "연마·평탄화", "캡/랜드 형성", "보이드·평탄도 확인"],
    controls: [
      ["레시피", "충진 방식별 시간·압력·전류·경화 조건"],
      ["상태", "홀 청정도, 재료/욕조 상태, 연마 균일도"],
      ["결과", "내부 보이드, 딤플·돌출, 표면 평탄도, 상부 패드"]
    ],
    defects: [
      ["충진 불완전", "내부 보이드", "열·조립 공정에서 팽창·신뢰성 문제"],
      ["평탄화 부족", "딤플·돌출", "상부 패드·부품 접속 불균일"],
      ["공법 구분 불명확", "수지/구리 충진 기준 혼선", "잘못된 검사·판정"]
    ],
    ceo: [
      "HPL과 Via Fill을 현장 표준에서 구조·공정명으로 구분하는가?",
      "충진 재료별 보이드·딤플·평탄도 기준이 따로 있는가?",
      "상부 패드 문제를 충진, 평탄화, 캡도금 중 어디까지 추적하는가?"
    ],
    quiz: {
      q: "당사 용어 원장 기준 HPL의 올바른 설명은?",
      options: ["적층 프레스의 종류", "홀을 뚫기 전 표면세정", "비아를 채워 평탄화한 뒤 그 위에 랜드·패드를 구성하는 공법"],
      answer: 2,
      explain: "HPL은 Hole Plugging Land다. 실제 충진 재료와 세부 순서는 제품 구조와 당사 표준서로 확정한다."
    }
  }
];

const CUTTING_PROCESS = {
  id: "cutting", step: "01", tag: "MATERIAL & CUTTING", title: "원판·재단", verb: "작업 크기로 자른다",
  navHint: "재료를 준비", phase: "회로를 그릴 준비", phaseNo: "A",
  oneLine: "큰 동박적층판을 자재와 방향을 확인한 뒤 설비가 다룰 작업 패널 크기로 자른다.",
  change: "큰 원판이 추적 가능한 작업 패널로 바뀐다. 아직 회로 기능은 없다.",
  why: ["설계에 맞는 재료와 두께를 선택한다.", "후속 설비가 다룰 표준 작업 크기를 만든다.", "패널마다 자재·로트·방향을 추적할 출발점을 만든다."],
  analogyTitle: "큰 원단을 재단하는 재봉실",
  analogy: "옷을 만들기 전 원단의 종류와 결 방향을 확인하고, 작업대에 맞는 크기로 정확히 자르는 단계다.",
  risk: "자재 혼입, 두께·동박 오류, 결 방향 오류, 치수 불량, 모서리 손상",
  flow: ["자재·사양 확인", "로트 식별", "재단 치수 설정", "원판 절단", "모서리·분진 정리", "치수·표기 확인"],
  controls: [["레시피", "재단 치수, 방향, 패널 배치"], ["상태", "자재 로트, 보관, 날·집진 상태"], ["결과", "크기, 직각도, 버, 손상, 식별표기"]],
  defects: [["자재 확인 오류", "잘못된 재료 투입", "후공정 전체 폐기"], ["재단 치수 오류", "패널 크기·직각도 이상", "노광·드릴 정렬 불량"], ["버·분진", "표면 오염·흠집", "필름 밀착·회로 결함"]],
  ceo: ["자재 혼입을 사람의 기억이 아니라 시스템으로 막는가?", "재단 수율과 남는 자재를 제품별로 관리하는가?", "첫 공정의 로트 정보가 출하까지 이어지는가?"],
  quiz: { q: "재단 공정이 단순히 크기만 자르는 일이 아닌 이유는?", options: ["구리를 두껍게 만들기 때문에", "자재·방향·로트 추적의 출발점이기 때문에", "전기검사를 동시에 하기 때문에"], answer: 1, explain: "처음부터 잘못된 자재나 방향이 들어가면 모든 후공정 비용이 잘못된 판에 누적된다." }
};

const INNER_PROCESS = {
  id: "inner", step: "02", tag: "INNER-LAYER IMAGING", title: "내층회로", verb: "안쪽 길을 그린다",
  navHint: "내부 회로 형성", phase: "회로를 그릴 준비", phaseNo: "A",
  oneLine: "빛과 약품을 이용해 안쪽 층에서 필요한 구리 배선만 남긴다.",
  change: "면 전체의 구리가 신호·전원·접지 역할을 하는 회로 패턴으로 바뀐다.",
  why: ["적층 뒤 보이지 않을 내부 회로를 먼저 만든다.", "신호와 전원이 지나갈 정확한 구리 길을 남긴다.", "다층 PCB의 기능 밀도를 만든다."],
  analogyTitle: "판화로 길을 새기기",
  analogy: "남길 부분만 빛으로 보호한 뒤, 보호되지 않은 구리를 약품으로 녹여 원하는 길만 남긴다.",
  risk: "미세 단선·합선, 과에칭·미에칭, 선폭 편차, 필름 들뜸, 흠집",
  flow: ["표면 세정", "드라이필름 부착", "노광", "현상", "에칭", "필름 박리·검사"],
  controls: [["레시피", "노광량, 현상·에칭 시간과 온도"], ["상태", "표면 청정도, 필름 밀착, 약품 농도"], ["결과", "선폭·간격, 잔동, 단선·합선, 패턴 형상"]],
  defects: [["표면 오염", "필름 들뜸", "회로 끊김·돌기"], ["과에칭", "선폭 감소", "저항 증가·단선"], ["미에칭", "잔동", "합선·절연 불량"]],
  ceo: ["미세회로 한계는 노광, 약품, 자재 중 무엇이 결정하는가?", "선폭 편차를 패널 위치별로 보고 있는가?", "내층 결함의 수리 가능 범위와 폐기 기준은 명확한가?"],
  quiz: { q: "에칭 공정에서 약품으로 녹여내는 것은?", options: ["필요 없는 구리", "프리프레그 전체", "완성된 비아 도금"], answer: 0, explain: "감광막으로 보호되지 않은 구리를 제거하고 필요한 회로만 남긴다." }
};

const AOI_PROCESS = {
  id: "aoi", step: "03", tag: "AUTOMATED OPTICAL INSPECTION", title: "내층 AOI", verb: "봉인 전에 검사한다",
  navHint: "내층 결함 차단", phase: "회로를 그릴 준비", phaseNo: "A",
  oneLine: "카메라가 내층 회로를 설계 데이터와 비교해 단선·합선·형상 이상을 찾는다.",
  change: "회로의 물리 모습보다 적층 투입 가능 여부가 확정된다.",
  why: ["내층 패턴의 미세 결함을 자동으로 찾는다.", "수리·폐기할 판을 적층 전에 분리한다.", "비싼 후공정이 불량 내층에 누적되는 것을 막는다."],
  analogyTitle: "벽을 닫기 전 배관 검사",
  analogy: "벽 안에 들어갈 배관을 사진과 설계도로 대조해 끊김과 잘못된 연결을 찾은 뒤에만 벽을 닫는다.",
  risk: "미검출, 과검출, 수리 오류, 불량 내층 적층 투입, 데이터 버전 불일치",
  flow: ["검사 데이터 호출", "패널 정렬", "카메라 스캔", "기준과 비교", "의심부 재확인", "수리·폐기·합격"],
  controls: [["레시피", "검사 해상도, 민감도, 기준 데이터"], ["상태", "카메라 초점, 조명, 정렬, 표면 청정"], ["결과", "실불량, 과검출, 미검출, 수리 이력"]],
  defects: [["민감도 부족", "미세 결함 미검출", "완제품 전기불량"], ["민감도 과다", "과검출 증가", "판정 대기·생산성 저하"], ["수리 오류", "패턴 추가 손상", "적층 후 잠복 불량"]],
  ceo: ["AOI 검출 건수와 실제 불량의 일치율은 얼마인가?", "적층 후 발견되는 내층 기인 결함은 왜 AOI를 통과했는가?", "수리품의 후속 신뢰성을 별도로 추적하는가?"],
  quiz: { q: "내층 AOI를 적층 전에 하는 가장 큰 이유는?", options: ["적층 후 내부 회로는 봉인되고 비용이 누적되기 때문에", "구리 색을 맞추기 위해", "패널을 작게 자르기 위해"], answer: 0, explain: "적층 뒤 발견하면 내부 결함을 직접 고치기 어렵고 후공정 비용까지 함께 잃는다." }
};

const PLATING_SUBSTAGES = [
  { ...PCB_STAGES[2], step: "06-1", navHint: "홀 벽 청소" },
  { ...PCB_STAGES[3], step: "06-2", navHint: "씨앗층 형성" },
  { ...PCB_STAGES[4], step: "06-3", navHint: "구리 두께 성장" },
  { ...PCB_STAGES[5], step: "06-4", navHint: "선택 구조: 충진·랜드" }
];

const OUTER_PROCESS = {
  id: "outer", step: "07", tag: "OUTER-LAYER CIRCUIT", title: "외층회로", verb: "바깥 길을 완성한다",
  navHint: "외부 회로 형성", phase: "바깥 기능을 완성", phaseNo: "C",
  oneLine: "도금된 패널의 바깥면에 부품 패드와 최종 배선 패턴을 만든다.",
  change: "바깥면의 넓은 구리가 부품과 홀을 연결하는 최종 회로로 바뀐다.",
  why: ["부품이 붙을 패드와 외부 배선을 만든다.", "도금된 홀과 표면 회로를 설계대로 연결한다.", "조립 가능한 전기 인터페이스를 완성한다."],
  analogyTitle: "건물 밖 도로와 출입구 만들기",
  analogy: "이미 내부 통로가 연결된 건물 바깥에 도로와 출입구를 그려 사람과 차량이 목적지에 닿게 한다.",
  risk: "미세 단선·합선, 과에칭, 패턴 도금 편차, 잔동, 스크래치",
  flow: ["표면 전처리", "감광막 형성", "노광·현상", "패턴 도금", "에칭·박리", "외층 AOI"],
  controls: [["레시피", "노광·현상·도금·에칭 조건"], ["상태", "표면 청정, 필름 밀착, 약품·전류 분포"], ["결과", "선폭·간격, 패드 형상, 단선·합선, 잔동"]],
  defects: [["정렬 오류", "패드·회로 위치 이탈", "홀과 외층 접속 면적 감소"], ["에칭 편차", "선폭 과소·잔동", "단선·합선"], ["도금 분포 불량", "패턴 높이 편차", "에칭·임피던스 편차"]],
  ceo: ["외층 미세회로 수율을 지배하는 공정은 무엇인가?", "패널 위치별 선폭·도금 편차를 보고 있는가?", "외층 AOI가 놓친 불량이 전기검사까지 가는 비율은?"],
  quiz: { q: "외층회로가 내층회로와 다른 핵심 이유는?", options: ["부품 패드와 외부 연결을 최종 완성하기 때문에", "절연재만 남기기 때문에", "구멍을 처음 뚫기 때문에"], answer: 0, explain: "외층은 부품과 직접 만나는 패드, 배선, 도금홀의 표면 연결을 완성한다." }
};

const MASK_PROCESS = {
  id: "mask", step: "08", tag: "SOLDER MASK", title: "솔더마스크", verb: "필요한 곳만 열어 둔다",
  navHint: "회로 보호", phase: "바깥 기능을 완성", phaseNo: "C",
  oneLine: "납땜·접촉할 패드만 열고 나머지 외층 회로를 보호 잉크로 덮는다.",
  change: "노출 구리 표면이 선택적으로 열린 보호 상태가 된다.",
  why: ["구리를 산화·오염·긁힘에서 보호한다.", "납이 옆 회로로 번지는 것을 막는다.", "조립 시 패드와 비패드 영역을 명확히 구분한다."],
  analogyTitle: "콘센트만 남긴 벽 보호도장",
  analogy: "벽 전체를 보호 코팅하되 실제로 연결해야 할 콘센트와 스위치 자리만 정확히 열어 둔다.",
  risk: "패드 덮임, 마스크 미스레지, 핀홀, 박리, 잉크 두께·경화 불량",
  flow: ["표면 전처리", "잉크 도포", "예비 건조", "노광", "현상", "최종 경화·검사"],
  controls: [["레시피", "도포 두께, 노광량, 현상·경화 조건"], ["상태", "잉크 점도, 청정도, 정렬, 설비 균일도"], ["결과", "개구 위치, 두께, 핀홀, 접착·경화"]],
  defects: [["정렬 불량", "패드 일부 덮임", "납땜·접촉 불량"], ["오염·경화 부족", "박리·기포", "조립 후 보호막 탈락"], ["핀홀·두께 부족", "구리 노출", "부식·절연 위험"]],
  ceo: ["마스크 불량은 도포, 노광, 현상, 경화 중 어디에서 가장 많이 생기는가?", "패드 개구 정렬능력이 미세피치 요구를 따라가는가?", "경화 불량을 출하 전에 어떤 시험으로 잡는가?"],
  quiz: { q: "솔더마스크가 일부 패드만 열어 두는 이유는?", options: ["납땜할 곳만 노출하고 나머지 회로를 보호하기 위해", "보드를 더 무겁게 만들기 위해", "내층을 다시 검사하기 위해"], answer: 0, explain: "패드 외 영역을 보호하고 납 번짐과 브리지를 줄이는 것이 핵심이다." }
};

const FINISH_PROCESS = {
  id: "finish", step: "09", tag: "SURFACE FINISH", title: "표면처리", verb: "접점을 마감한다",
  navHint: "패드 접점 마감", phase: "바깥 기능을 완성", phaseNo: "C",
  oneLine: "솔더마스크로 열린 구리 패드에 제품 목적에 맞는 금속 마감을 형성한다.",
  change: "산화되기 쉬운 구리 접점이 보관·접촉·납땜 가능한 표면이 된다.",
  why: ["노출 구리의 산화를 막는다.", "납땜 또는 접촉에 필요한 표면 특성을 만든다.", "조립까지의 보관성과 최종 접속 신뢰성을 확보한다."],
  analogyTitle: "녹슬지 않는 콘센트 접점",
  analogy: "전기가 실제로 만나는 접점에 목적에 맞는 마감재를 입혀 오래 보관해도 안정적으로 연결되게 한다.",
  risk: "도금 두께 편차, 패드 오염·산화, 평탄도 불량, 젖음성·접촉 저하",
  flow: ["패드 세정", "미세 에칭·활성화", "금속 마감", "수세", "건조", "두께·외관 확인"],
  controls: [["레시피", "처리시간, 온도, 약품·도금 조건"], ["상태", "욕조 조성, 오염, 수세, 패드 청정"], ["결과", "마감 두께, 평탄도, 외관, 납땜·접촉성"]],
  defects: [["세정 부족", "부분 미도금·변색", "접촉·납땜 불량"], ["두께 편차", "마감 성능 불균일", "보관·조립 신뢰성 편차"], ["표면 거칠기·오염", "젖음성 저하", "조립 불량"]],
  ceo: ["제품별 표면처리 선택 기준이 고객 용도와 연결돼 있는가?", "두께 결과와 욕조 분석을 같은 로트로 추적하는가?", "변색·납땜성 불량의 보관·포장 영향까지 분석하는가?"],
  quiz: { q: "표면처리가 솔더마스크와 다른 역할은?", options: ["열린 패드의 산화를 막고 접촉·납땜성을 만든다", "모든 회로를 잉크로 덮는다", "보드 외곽을 자른다"], answer: 0, explain: "솔더마스크는 보호 영역을 덮고, 표면처리는 열린 접점의 기능을 마감한다." }
};

const ROUTING_PROCESS = {
  id: "routing", step: "10", tag: "PROFILE & ROUTING", title: "외형가공", verb: "제품 모양으로 자른다",
  navHint: "외곽·홈 가공", phase: "완성품임을 증명", phaseNo: "D",
  oneLine: "큰 생산 패널에서 고객 도면의 외곽, 홈, 슬롯을 가공해 개별 보드 형상을 만든다.",
  change: "여러 제품이 붙어 있던 패널이 정확한 외형의 개별 제품으로 분리된다.",
  why: ["고객 조립물에 맞는 외곽과 홈을 만든다.", "생산용 더미·레일과 실제 제품을 분리한다.", "최종 치수와 조립성을 확정한다."],
  analogyTitle: "쿠키 틀로 최종 모양 자르기",
  analogy: "큰 반죽 판에서 제품마다 정해진 외곽선을 따라 잘라 실제 사용할 모양으로 꺼내는 단계다.",
  risk: "외형 치수 오류, 버, 크랙, 슬롯 위치 오류, 회로 손상, 분진",
  flow: ["가공 데이터 확인", "패널 고정", "라우터/V-cut 가공", "홈·슬롯 가공", "분리·세정", "치수·버 확인"],
  controls: [["레시피", "공구, 회전수, 이송, 깊이, 경로"], ["상태", "공구 마모, 고정, 집진, 보정"], ["결과", "외형 치수, 슬롯 위치, 버, 크랙, 모서리"]],
  defects: [["공구 마모", "거친 절단면·버", "조립 간섭·크랙 기점"], ["좌표·보정 오류", "외형·슬롯 위치 이탈", "고객 조립 불가"], ["고정·집진 부족", "진동·분진", "회로 손상·오염"]],
  ceo: ["외형 불량은 공구비 절감 때문에 커지고 있지 않은가?", "제품별 치수능력과 고객 조립 불량을 연결해 보는가?", "라우터·V-cut 병목과 교체시간을 실효 생산성에 포함하는가?"],
  quiz: { q: "외형가공에서 생산 단위가 어떻게 바뀌는가?", options: ["원재료에서 동박으로", "큰 생산 패널에서 개별 제품으로", "전기검사품에서 내층으로"], answer: 1, explain: "생산 레일과 더미를 제거하고 고객이 사용할 최종 외곽 형상으로 분리한다." }
};

const ETEST_PROCESS = {
  id: "etest", step: "11", tag: "ELECTRICAL TEST", title: "전기검사", verb: "연결을 증명한다",
  navHint: "단선·합선 검사", phase: "완성품임을 증명", phaseNo: "D",
  oneLine: "설계대로 이어질 곳은 이어지고 분리될 곳은 절연되는지 전기적으로 측정한다.",
  change: "외형상 완성된 보드가 전기 연결과 절연을 통과한 제품으로 증명된다.",
  why: ["눈으로 볼 수 없는 내부 단선을 찾는다.", "서로 닿으면 안 되는 회로의 합선을 찾는다.", "고객 조립 전에 네트워크의 전기적 완전성을 보증한다."],
  analogyTitle: "완공 건물의 배선 통전검사",
  analogy: "모든 콘센트가 지정된 분전함과 연결됐는지, 서로 다른 회로가 잘못 붙지 않았는지 측정한다.",
  risk: "미검출, 오판정, 접촉 불량, 잘못된 테스트 데이터, 절연 기준 오류",
  flow: ["테스트 데이터 호출", "제품 정렬", "프로브 접촉", "연속성 측정", "절연 측정", "합격·불량 분리"],
  controls: [["레시피", "연속성·절연 판정값, 전압, 데이터 버전"], ["상태", "프로브 마모·오염, 접촉압, 정렬"], ["결과", "오픈·쇼트, 재검률, 접촉성 오판정"]],
  defects: [["프로브 접촉 불량", "가짜 오픈", "재검·생산성 저하"], ["데이터 오류", "잘못된 네트워크 판정", "실불량 출하 또는 양품 폐기"], ["검사범위 부족", "잠복 단선·합선 미검출", "고객 조립 후 불량"]],
  ceo: ["재검률 중 실제 제품 불량과 설비 접촉 불량의 비중은?", "고객 전기불량이 어떤 테스트 조건을 통과했는가?", "제품 데이터 개정과 테스트 데이터가 자동 연동되는가?"],
  quiz: { q: "전기검사가 외관검사를 대신할 수 없는 이유는?", options: ["전기검사는 연결·절연만 보고 치수·표면·표기는 별도이기 때문에", "전기를 사용하지 않기 때문에", "드릴 전에만 할 수 있기 때문에"], answer: 0, explain: "전기적 합격과 외관·치수·식별·가공 합격은 서로 다른 증거다." }
};

const SHIPPING_PROCESS = {
  id: "shipping", step: "12", tag: "FINAL INSPECTION & SHIP", title: "최종검사·출하", verb: "고객 인도품으로 만든다",
  navHint: "최종 보증·포장", phase: "완성품임을 증명", phaseNo: "D",
  oneLine: "외관·치수·표기·수량·성적서·포장을 최종 확인해 고객 인도 조건을 완성한다.",
  change: "공장 내부 제조품이 식별·보호·문서가 갖춰진 고객 출하품으로 바뀐다.",
  why: ["전기검사 밖의 외관·치수·표기 이상을 확인한다.", "품번·수량·성적서와 실제 제품을 일치시킨다.", "운송과 보관 중 제품을 보호해 고객에게 인도한다."],
  analogyTitle: "신차 출고 전 PDI",
  analogy: "차가 움직인다고 바로 출고하지 않고 외관, 옵션, 서류, 수량과 보호 상태를 마지막으로 확인한다.",
  risk: "품번·로트 혼입, 수량·라벨 오류, 외관·치수 불량, 성적서 누락, 포장 손상",
  flow: ["외관 검사", "치수·표기 확인", "수량·품번 대조", "성적서 확인", "진공·방습 포장", "출하 승인·이력 저장"],
  controls: [["레시피", "검사 기준, 샘플링, 포장·라벨 규격"], ["상태", "검사 조명, 계측기, 청정도, 포장재"], ["결과", "혼입·외관·치수·수량·문서·포장 일치"]],
  defects: [["식별 대조 부족", "품번·로트 혼입", "고객 라인 혼선"], ["포장 불량", "흡습·긁힘·운송 손상", "보관·조립 불량"], ["검사 기준 불명확", "판정자 편차", "클레임·재선별"]],
  ceo: ["최종검사에서 잡힌 불량을 실제 발생 공정으로 되돌려 개선하는가?", "혼입 방지가 이중 확인인가, 시스템 스캔인가?", "고객 클레임과 출하 검사 사진·로트·작업자를 즉시 연결할 수 있는가?"],
  quiz: { q: "전기검사에 합격해도 최종검사가 필요한 이유는?", options: ["외관·치수·식별·수량·포장은 전기검사로 증명되지 않기 때문에", "구리를 더 도금하기 위해", "내층 패턴을 다시 만들기 위해"], answer: 0, explain: "출하는 전기 기능뿐 아니라 고객이 주문한 제품과 문서·수량·포장까지 일치해야 완료된다." }
};

const PCB_PROCESSES = [
  CUTTING_PROCESS,
  INNER_PROCESS,
  AOI_PROCESS,
  { ...PCB_STAGES[0], step: "04", navHint: "층을 한 장으로", phase: "합치고 연결", phaseNo: "B" },
  { ...PCB_STAGES[1], step: "05", navHint: "수직 통로 생성", phase: "합치고 연결", phaseNo: "B" },
  { ...PCB_STAGES[4], id: "plating", step: "06", tag: "HOLE METALLIZATION", title: "도금", verb: "구멍을 전기길로 만든다", navHint: "홀 전기 연결", phase: "합치고 연결", phaseNo: "B", subStages: PLATING_SUBSTAGES },
  OUTER_PROCESS,
  MASK_PROCESS,
  FINISH_PROCESS,
  ROUTING_PROCESS,
  ETEST_PROCESS,
  SHIPPING_PROCESS
];

const PROCESS_PHASES = [
  { no: "A", range: "01–03", title: "회로를 그릴 준비", verb: "준비하고 그린다" },
  { no: "B", range: "04–06", title: "합치고 연결", verb: "합치고 뚫고 연결한다" },
  { no: "C", range: "07–09", title: "바깥 기능을 완성", verb: "회로·보호·접점을 완성한다" },
  { no: "D", range: "10–12", title: "완성품임을 증명", verb: "자르고 검사하고 출하한다" }
];

Object.assign(window, { PCB_STAGES, PCB_PROCESSES, PLATING_SUBSTAGES, PROCESS_PHASES });
