diff --git a/src/state_gate.rs b/src/state_gate.rs
index 5e548fd..67e43d4 100644
--- a/src/state_gate.rs
+++ b/src/state_gate.rs
@@ -21372,3 +21372,601 @@ fn the_r134_scanners_have_teeth() {
"派生失败必须是红"
);
}
+
+// ══════════════════════════════════════════════════════════════════════════════════════════
+// C2182:游客外壳必须**同时**保住「主题切换」与「回到登录页的路」,只收起账号身份
+// ══════════════════════════════════════════════════════════════════════════════════════════
+
+/// 侧边栏(``)里的一个元素:标签名 / id / 类名 / 父下标。
+///
+/// 只解析**结构**(标签配对 + `class`/`id`),不建 CSS 引擎 —— 本轴只需要回答两个问题:
+/// 「甲在不在乙里面」,以及「这条选择器**会不会**命中某个元素」。判据是纯词法的:格式良好的
+/// 标记里,`` 的父子关系由标签配对唯一确定(这是 HTML 的规范,不是本门禁的约定)。
+struct GuestElem {
+ tag: String,
+ id: Option,
+ classes: Vec,
+ parent: Option,
+}
+
+/// 不参与配对的元素(空元素 / 自闭合)。`` 这类靠行尾 `/` 认,不在此列。
+const GUEST_VOID: [&str; 6] = ["input", "br", "img", "hr", "meta", "link"];
+
+fn sidebar_elements(html: &str) -> Vec {
+ let clean = strip_html_comments(html);
+ let Some(start) = clean.find("