diff --git a/app/services/hier_decomp/builder.py b/app/services/hier_decomp/builder.py
index 3718e54..416ef4d 100644
--- a/app/services/hier_decomp/builder.py
+++ b/app/services/hier_decomp/builder.py
@@ -26,7 +26,16 @@ _ATX = re.compile(r'^(#{1,6})\s+(?P
\S.*?)\s*#*\s*$')
_KO_JANG = re.compile(r'^\s*(?P제\s*\d+\s*장\b.*)$')
_KO_JEOL = re.compile(r'^\s*(?P제\s*\d+\s*절\b.*)$')
_KO_JO = re.compile(r'^\s*(?P제\s*\d+\s*조\b.*)$')
-_ENG = re.compile(r'^\s*(?P(?:Chapter|Section|Article|Part|PART)\s+[\dIVXLA-Z]+\b.*)$')
+# _ENG: 영문 구조 헤딩(ATX 미사용 문서용). ASME 파트는 보통 ATX(`# PART PG`)로 잡혀 _ENG 의존 낮음.
+# D1: 식별자 뒤가 소문자 문장연속이면("Part III to demonstrate to the satisfaction…") 본문이므로
+# 미탐지 — 가짜 절 차단. 선택 제목은 대문자/괄호/숫자로 시작해야 헤딩 인정(소문자 시작=문장으로 봄).
+# 식별자는 번호/PG/3.31/UHX/A-1 등 (.·- 소수·하이픈 확장 허용).
+_ENG = re.compile(
+ r'^\s*(?P(?:Chapter|Section|Article|Part|PART)\s+'
+ r'[\dIVXLA-Z]+(?:[.\-][\dA-Za-z]+)*'
+ r'(?:\s+[A-Z(\d][^\n]*)?'
+ r')\s*$'
+)
# 코드펜스 경계 (FE outlineAnchors.ts:60 `/^\s{0,3}(```|~~~)/` 와 동일). 펜스 내부 라인은
# heading 미탐지 — 코드블록 안 '# foo' 가 가짜 절을 만들지 않게(O3).
diff --git a/frontend/src/lib/components/SectionOutline.svelte b/frontend/src/lib/components/SectionOutline.svelte
index ab213aa..ea7f61f 100644
--- a/frontend/src/lib/components/SectionOutline.svelte
+++ b/frontend/src/lib/components/SectionOutline.svelte
@@ -1,13 +1,18 @@