From b544d5cccd76735e034c8055918a50927b437474 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期二, 10 十一月 2026 08:29:04 +0800
Subject: [PATCH] fix: 维护模式重复进入失败与按钮灰死 + Broker 并发验证用例
---
docs/仪器注册与调试_逻辑与时序梳理.html | 333 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 333 insertions(+), 0 deletions(-)
diff --git "a/docs/\344\273\252\345\231\250\346\263\250\345\206\214\344\270\216\350\260\203\350\257\225_\351\200\273\350\276\221\344\270\216\346\227\266\345\272\217\346\242\263\347\220\206.html" "b/docs/\344\273\252\345\231\250\346\263\250\345\206\214\344\270\216\350\260\203\350\257\225_\351\200\273\350\276\221\344\270\216\346\227\266\345\272\217\346\242\263\347\220\206.html"
new file mode 100644
index 0000000..b1245c5
--- /dev/null
+++ "b/docs/\344\273\252\345\231\250\346\263\250\345\206\214\344\270\216\350\260\203\350\257\225_\351\200\273\350\276\221\344\270\216\346\227\266\345\272\217\346\242\263\347\220\206.html"
@@ -0,0 +1,333 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>浠櫒娉ㄥ唽涓庣‖浠惰皟璇� 路 杞欢閫昏緫涓庢椂搴忔⒊鐞嗭紙V3.0 娣峰悎鏋舵瀯 路 2026-11-09锛�</title>
+<style>
+:root{--bg:#f6f7f9;--card:#fff;--ink:#24292f;--sub:#57606a;--line:#d0d7de;--blue:#0b5cad;--green:#1a7f37;--red:#cf222e;--orange:#bc4c00;--purple:#8250df;--code:#f0f2f5}
+*{box-sizing:border-box}body{margin:0;font-family:"Microsoft YaHei","Segoe UI",sans-serif;background:var(--bg);color:var(--ink);line-height:1.7}
+.wrap{max-width:1080px;margin:0 auto;padding:24px 20px 80px}
+header{background:linear-gradient(135deg,#0b3d6e,#0b5cad 60%,#127fc4);color:#fff;border-radius:12px;padding:26px 30px;margin-bottom:22px}
+header h1{margin:0 0 8px;font-size:24px}header p{margin:2px 0;opacity:.88;font-size:13.5px}
+.badge{display:inline-block;background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.35);border-radius:20px;padding:1px 12px;font-size:12px;margin:6px 8px 0 0}
+h2{font-size:19px;margin:34px 0 12px;padding-left:12px;border-left:5px solid var(--blue)}
+h3{font-size:15.5px;margin:22px 0 8px;color:#0b3d6e}
+.card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:16px 20px;margin:10px 0}
+pre.seq{background:#0f1720;color:#cfe3f5;border-radius:8px;padding:14px 16px;overflow-x:auto;font-family:Consolas,monospace;font-size:12.5px;line-height:1.55}
+pre.seq b{color:#7fd0ff}pre.seq i{color:#85e3a5;font-style:normal}pre.seq u{color:#ffc46b;text-decoration:none}pre.seq s{color:#ff9b9b;text-decoration:none}
+table{border-collapse:collapse;width:100%;margin:10px 0;font-size:13px}
+th{background:#eef3f8;text-align:left}th,td{border:1px solid var(--line);padding:6px 10px;vertical-align:top}
+code{background:var(--code);border-radius:4px;padding:1px 6px;font-family:Consolas,monospace;font-size:12.5px}
+.tag{display:inline-block;border-radius:4px;padding:0 8px;font-size:11.5px;font-weight:600;color:#fff;margin-right:6px;white-space:nowrap}
+.t-local{background:var(--green)}.t-broker{background:var(--blue)}.t-warn{background:var(--orange)}.t-err{background:var(--red)}.t-core{background:var(--purple)}
+.note{background:#fff8e6;border:1px solid #e8d48a;border-radius:8px;padding:10px 14px;font-size:13px;margin:10px 0}
+.fixed{background:#e8f5ec;border:1px solid #9fd3ae;border-radius:8px;padding:10px 14px;font-size:13px;margin:10px 0}
+ul,ol{margin:6px 0;padding-left:24px}li{margin:3px 0}
+.small{font-size:12px;color:var(--sub)}
+.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}@media(max-width:820px){.grid2{grid-template-columns:1fr}}
+.toc a{display:inline-block;margin:2px 10px 2px 0;font-size:13px;color:var(--blue);text-decoration:none}.toc a:hover{text-decoration:underline}
+</style>
+</head>
+<body><div class="wrap">
+
+<header>
+<h1>浠櫒娉ㄥ唽涓庣‖浠惰皟璇� 路 杞欢閫昏緫涓庢椂搴忔⒊鐞�</h1>
+<p>渚濇嵁銆奓ocal + DeviceBroker 娣峰悎鏋舵瀯璇︾粏璁捐璇存槑涔� V3.0銆嬩笌褰撳墠浠g爜瀹炲喌鏁寸悊锛堝惈杩戞湡缂洪櫡淇鍚庣殑鏈�缁堥�昏緫锛�</p>
+<p class="small">鑼冨洿锛歅lugin.DeviceConfig锛堜华鍣ㄤ华琛ㄦ敞鍐岋級 路 Plugin.DeviceDebug锛堢‖浠惰皟璇曪級 路 Aging.Infrastructure / Aging.ResourceContracts锛堝熀纭�璁炬柦涓庡绾︼級 路 DeviceBroker.exe锛堝叡浜华鍣ㄥ涓伙級 路 Plugin.IntegrationTest锛堥泦鎴愭祴璇曠幆澧冿級</p>
+<span class="badge">鐘舵�侊細鐜拌瀹炵幇鍩虹嚎 2026-11-09</span><span class="badge">net472 / WPF / SQLite / Named Pipes</span><span class="badge">涓よ繘绋嬩徊瑁佸煙锛歭ocal-main + broker-b01</span>
+</header>
+
+<div class="card toc">
+<b>鐩綍</b>锛�
+<a href="#s1">1 杩涚▼涓庢暟鎹嫇鎵�</a><a href="#s2">2 鍚姩鍒濆鍖栨椂搴�</a><a href="#s3">3 浠櫒娉ㄥ唽閫昏緫</a><a href="#s4">4 椹卞姩鍒嗘淳涓庨厤缃搱甯�</a><a href="#s5">5 璋冭瘯椤甸�夎澶囨椂搴�</a><a href="#s6">6 缁存姢妯″紡鐘舵�佹満涓庣绾�</a><a href="#s7">7 鎶ユ枃鏀跺彂鍏ㄩ摼璺�</a><a href="#s8">8 寮傚父涓庤嚜鎰堟満鍒�</a><a href="#s9">9 鍏抽敭浠g爜绱㈠紩</a><a href="#s10">10 宸茬煡闄愬埗</a>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s1">1銆�杩涚▼涓庢暟鎹嫇鎵�</h2>
+<div class="card">
+<pre class="seq">
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 娴嬭瘯/鎿嶄綔鍛樺伐浣滅珯锛堝崟鏈猴級 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 鈹�
+鈹� <b>Plugin.IntegrationTest.exe</b>锛堜富绋嬪簭杩涚▼锛屼竴鍒� UI 涓庝笟鍔¤皟鐢ㄦ柟鐨勫涓伙級 鈹�
+鈹� 鈹溾攢 Plugin.DeviceConfig 浠櫒浠〃娉ㄥ唽椤碉紙缂栬緫鑽夌/鍙戝竷闂ㄧ/鐗堟湰绠$悊锛� 鈹�
+鈹� 鈹溾攢 Plugin.DeviceDebug 纭欢璋冭瘯椤碉紙浼氳瘽鐘舵�佹満/缁存姢鐢宠/CAN路鐢垫簮路PLC闈㈡澘锛夆攤
+鈹� 鈹溾攢 Aging.Infrastructure DeviceManager / DeviceService / AutoDeviceFacade 鈹�
+鈹� 鈹� 鈹溾攢 Local 璁惧 鈫� 鐩撮┍椹卞姩锛圕anDriverAdapter 绛夛紝鐗╃悊浼氳瘽鍦ㄦ湰杩涚▼锛� 鈹�
+鈹� 鈹� 鈹斺攢 Broker 璁惧 鈫� <b>BrokeredCanDriver 浠g悊椹卞姩</b>锛堜笉鎸佺墿鐞嗕細璇濓級 鈹�
+鈹� 鈹斺攢 LayeredResourceManager 鈹�鈹�鈹愶紙杩涚▼鍐呯紦瀛� grants + 濮旀墭 DbLeaseStore锛� 鈹�
+鈹� 鈹� 鈹�
+鈹� 鍛藉悕绠¢亾 RPC 鈹� 鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� aging.<u>brokerId</u>.v1锛堝抚鍗忚锛� 鈹� 鈹� <b>DeviceBroker.exe</b>锛堝叡浜华鍣ㄥ涓昏繘绋嬶級鈹�
+鈹� 鈼勨攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� BrokerServer锛氫笁閲嶅叧鍗�+SessionGate 鈹�
+鈹� 鈹� DbLeaseStore(broker-b01) 璇讳徊瑁佸簱 鈹�
+鈹� 鈹� CanDriverAdapter 鈫� 鐗╃悊浼氳瘽鍞竴鎸佹湁鈹�
+鈹� 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹� 鏁版嵁灞傦紙鏈満 SQLite锛岀姝㈢綉缁滅洏锛夛細 鈹�
+鈹� <i>data.db</i> 閰嶇疆搴擄細DeviceDefinition(鍚墽琛屼綅缃�5鍒�)/DeviceChannel/Slot鏄犲皠/鐗堟湰 鈹�
+鈹� <i>arb.db</i> 浠茶搴擄細resource_state/lease_history/recovery_checkpoint/authority_meta 鈹�
+鈹� <u>debug.db</u> 璋冭瘯浼氳瘽搴擄細debug_session锛堢姸鎬佹満鎸佷箙鍖栵級锛嬫搷浣滄棩蹇� 鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+</pre>
+<p><span class="tag t-local">Local 鐩磋繛</span>閫傚悎宸插垎閰嶇粰鍞竴鎵ц杩涚▼銆佸彲鐙珛杩炴帴鐨勮澶囷紱鐗╃悊浼氳瘽鍦ㄥ鎴风杩涚▼鍐呫��<br>
+<span class="tag t-broker">Broker 浠g悊</span>閫傚悎璺ㄨ繘绋嬪叡浜澶囷細鐗╃悊浼氳瘽鐢� DeviceBroker.exe <b>鍞竴鎸佹湁</b>锛屽鎴风鍙仛 RPC 濮旀墭銆�</p>
+<p class="small">娉細CAN 鎬荤嚎妯℃嫙鍣紙CanSimulator锛夋槸<b>杩涚▼鍐�</b>铏氭嫙鎬荤嚎鈥斺�斾富绋嬪簭涓庡涓诲悇鑷寔鏈変竴濂� CAN_BUS_1 瀹炰緥锛岃法杩涚▼涓嶅彲瑙侊紱鐪熷疄纭欢锛堢墿鐞嗗崱/鎬荤嚎锛夊ぉ鐒跺叡浜紝鏃犳闄愬埗銆傛祴璇曠幆澧冪敤鍚屽涓荤殑 CAN-004 浣滀负 CAN-003 鐨勫绔��</p>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s2">2銆�鍚姩鍒濆鍖栨椂搴忥紙MainWindow.InitializePlugins锛�</h2>
+<div class="card">
+<pre class="seq">
+ 1. DeviceConfig.InitFinish 鈫� 寤哄簱/杩佺Щ data.db锛圥RAGMA 妫�鏌モ啋ALTER 琛ユ墽琛屼綅缃�5鍒楋級
+ 2. SeedPresetCanDevices() 鈫� 棰勭疆 CAN-001/002/003锛�<b>蹇呴』鍏堜簬鍩虹璁炬柦</b>锛欱ootstrapper 鎵簱鍐冲畾椹卞姩娉ㄥ唽锛�
+ 3. InitializeAutoServices()
+ 3.1 InfrastructureBootstrapper.Initialize(data.db 璺緞)
+ a. DbLeaseStore(arb.db, "local-main")
+ b. <u>ReconcileAfterBoot</u> 鈫� 鍚姩瀵硅处锛歋weepExpired + ApproveRecovery 鍥炴敹涓婃杩涚▼娉勬紡绉熺害
+ c. LayeredResourceManager 娉ㄥ唽杩� UtilContainer锛�"ResourceManager"/"LeaseCoordinator"锛�
+ d. DeviceManager / DeviceService / PowerSupplyService / AutoDeviceFacade / CanBusService
+ e. <b>RegisterBrokeredDrivers</b> 鈫� 鎵� data.db锛欵xecutionMode='Broker' 鐨勮澶囨敞鍐�
+ BrokeredCanDriver(绠¢亾=aging.{BrokerId}.v1, 鎼哄惎鍔ㄦ椂 configHash)
+ 3.2 浠� UtilContainer 鎷夊彇 IAutoDeviceFacade / ICanBusService锛屾敞鍐� Local CAN 鐩撮┍
+ 3.3 <b>TryStartDeviceBroker()</b> 鈫� 鑻ュ瓨鍦� Broker 璁惧锛歅rocess.Start DeviceBroker.exe
+ --db data.db --arb arb.db --broker broker-b01
+ 4. DeviceDebug.InitFinish 鈫� 浠� UtilContainer 鍙� DeviceManager/DeviceService/ResourceManager
+ <b>锛堝繀椤诲湪 3 涔嬪悗锛佸�掔疆浼氬彇鍒� null锛屼徊瑁�/椹卞姩澶嶇敤閾捐矾鍏ㄩ儴闈欓粯闄嶇骇锛�</b>
+ 5. ForceRefreshForTest()脳2 鈫� 涓ゆ彃浠跺垪琛ㄥ埛鏂�
+ Window_Closing锛欿ill DeviceBroker 瀛愯繘绋嬶紙鍏剁墿鐞嗕細璇濋殢杩涚▼娑堜骸锛岀绾﹂潬 TTL+鍚姩瀵硅处鏀跺彛锛�
+</pre>
+<div class="fixed">鉁� <b>淇璁板綍</b>锛氬師鏃跺簭涓� DeviceDebug.InitFinish 鏃╀簬 Bootstrapper.Initialize锛屽鑷磋皟璇曢〉鍙栧埌 null 鏈嶅姟鈥斺�旂淮鎶や徊瑁佽缁曡繃銆丅roker 璁惧杩炴帴鐘舵�佹亽"鏈繛鎺�"銆侀潰鏉块��鍖栦负鏈湴鐩撮┍銆傜幇宸茶皟鏁翠负"寤哄簱鈫掗缃啋鍩虹璁炬柦鈫掕皟璇曟彃浠�"銆�</div>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s3">3銆�浠櫒娉ㄥ唽閫昏緫锛圥lugin.DeviceConfig锛�</h2>
+<div class="grid2">
+<div class="card">
+<h3>3.1 缂栬緫寮圭獥锛圖eviceEditModal锛夊瓧娈典笌鑱斿姩</h3>
+<table>
+<tr><th>鍖哄潡</th><th>瀛楁</th><th>瑙勫垯</th></tr>
+<tr><td rowspan="5">璁惧淇℃伅</td><td>DeviceId</td><td>鏂板鍙紪杈戙�佺紪杈戝彧璇伙紱淇濆瓨鏃舵煡閲�</td></tr>
+<tr><td>Kind / DriverType</td><td>绫诲瀷鑱斿姩椹卞姩寤鸿锛圕anDevice鈫扖AN锛孭owerSupply鈫扴CPI鈥︼級</td></tr>
+<tr><td>Transport</td><td>Tcp/Serial/Visa/SDK/Can</td></tr>
+<tr><td>Endpoint</td><td>鎸� Transport 鏍¢獙鏍煎紡骞舵洿鏂版彁绀猴紙CAN锛氭�荤嚎:鑺傜偣锛�</td></tr>
+<tr><td>閫氶亾鍒楄〃</td><td>ChannelId 鍞竴锛岃兘鍔�/鐢靛帇/鐢垫祦/SessionKey</td></tr>
+<tr><td rowspan="5">鎵ц浣嶇疆<br>(V3.0 搂05)</td><td>ExecutionMode</td><td>鍗曢�� <span class="tag t-local">Local</span>锛堥粯璁わ級/<span class="tag t-broker">Broker</span>锛涗笌浠茶鍩�<b>鍙屽悜鑱斿姩</b></td></tr>
+<tr><td>AuthorityId</td><td>蹇呭~涓嬫媺锛屽�欓�夋潵鑷� <code>V3AuthorityCatalog</code>锛坅ppSettings <code>V3.AuthorityIds</code>锛屾湭閰嶇疆鍥為�� <code>local-main;broker-b01</code>锛�</td></tr>
+<tr><td>BrokerId</td><td>浠� Broker 鏄剧ず锛涘�欓�� <code>V3.BrokerIds</code>锛涢棬绂佽姹� BrokerId==AuthorityId</td></tr>
+<tr><td>OwnerProcessId</td><td>鍙=褰撳墠杩涚▼ PID锛圡VP 鍗犱綅锛夛紱<b>涓嶅叆閰嶇疆鍝堝笇</b>锛堣繍琛屾湡淇℃伅锛�</td></tr>
+<tr><td>PhysicalSessionKey</td><td>浠� Broker锛涘�欓�変负绔偣瑙勮寖鍖栫殑鍐欐瀛楃涓诧細<code>can/{bus}/main</code>銆�<code>tcp/{ip:port}/main</code>銆�<code>serial/{COM}/main</code>銆�<code>{deviceId}/main</code>銆佸凡瀛橀�氶亾 SessionKey</td></tr>
+<tr><td>璁块棶绛栫暐</td><td>AccessPolicy</td><td><b>鍙娲剧敓</b>涓嶈惤搴擄細Local鈫�"鐙崰鐩磋繛路鏈繘绋嬫寔鏈夌墿鐞嗕細璇�"锛汢roker鈫�"鍏变韩浠茶路Broker SessionGate 浠g悊"</td></tr>
+</table>
+<p class="small">鑱斿姩瑙勫垯锛氶�� Broker 鈫� 浠茶鍩熻嚜鍔ㄥ垏鍒伴涓� Broker 鍊欓�夛紱閫� local- 鍩� 鈫� 鑷姩鍒囧洖 Local銆俋AML 鍒濆鍖栨湡浜嬩欢鍔犳帶浠剁┖寮曠敤瀹堝崼銆�</p>
+</div>
+<div class="card">
+<h3>3.2 鏁版嵁妯″瀷涓庢寔涔呭寲</h3>
+<ul>
+<li><code>DeviceDefinition</code> 琛� 13 鍒� = 鍘� 8 鍒� + 鎵ц浣嶇疆 5 鍒楋紱鏃у簱缁� <code>PRAGMA table_info</code> 妫�鏌ュ悗 <code>ALTER TABLE ADD COLUMN</code> 杩佺Щ锛屽瓨閲忔暟鎹粯璁� <code>Local/绌篈uthorityId</code>銆�</li>
+<li>瀹炰綋榛樿鍊� <code>ExecutionMode=Local</code>锛涜鍙栫 <code>HasColumn</code> 瀹归敊缂哄垪銆�</li>
+<li>鎵归噺鐢熸垚锛圔atchGenerateModal锛夎蛋鍚屼竴 <code>SaveDevice</code>锛屾柊鍒楀彇榛樿銆�</li>
+</ul>
+<h3>3.3 鐗堟湰鐘舵�佹満锛堝彂甯冨伐浣滄祦 搂05锛�</h3>
+<pre class="seq">
+Draft 鈹�鈹�淇濆瓨鑽夌鈹�鈹�鈻� (閲嶇畻 hash 钀藉簱)
+Draft 鈹�鈹�鍙戝竷(PublishVersion)鈹�鈹�鈻� 鈶� ValidatePublishGate() 鎷︽埅
+ 鈶� 閫氳繃鈫掗噸绠� hash鈫抯tatus=Published
+Published 鈹�鈹�搴旂敤(Apply)鈹�鈹�鈻� Effective锛堟棫 Effective 閫�鍥� Published锛�
+</pre>
+<h3>3.4 鍙戝竷闂ㄧ鏍¢獙椤癸紙ValidatePublishGate锛�</h3>
+<ol>
+<li>AuthorityId 蹇呭~涓斿湪閰嶇疆鏋氫妇鍐咃紙瀛橀噺绌哄�� 鈫� 鎻愮ず"鏃ф暟鎹閲嶆柊淇濆瓨"锛�</li>
+<li>Local 璁惧鐨勫煙蹇呴』 <code>local-</code> 鍓嶇紑</li>
+<li>Broker 璁惧锛欱rokerId 蹇呭~銆佸湪鏋氫妇鍐呫�佷笖涓� AuthorityId 涓�鑷达紙鍩熶竴鑷达級</li>
+<li>Broker 璁惧锛歅hysicalSessionKey 蹇呭~</li>
+<li>鍚屼竴 PhysicalSessionKey 鍙厑璁镐竴涓涓诲煙锛�"鍚屼竴浼氳瘽鍙兘鏈変竴涓涓�"锛�</li>
+</ol>
+<div class="note">浠讳竴澶辫触 鈫� 寮圭獥鍒楀嚭閿欒锛堟渶澶氭樉绀� 8 鏉★級骞堕樆姝㈠彂甯冿紱鍐茬獊妫�娴嬶紙IP/Slot/瓒婄晫锛変粛璧� <code>DetectConflicts</code>銆�</div>
+</div>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s4">4銆�椹卞姩鍒嗘淳涓庨厤缃搱甯岋紙INV-04锛�</h2>
+<div class="card">
+<pre class="seq">
+ 娉ㄥ唽椤典繚瀛樿澶�(鍚墽琛屼綅缃�) 鈹�鈹�鈻� data.db
+ 鈹�
+ Bootstrapper 鍚姩鎵弿 鈻�
+ ExecutionMode='Local' 鈹�鈹�鈻� DriverFactory.CreateDriver 鈹�鈹�鈻� 鐩撮┍锛堟湰杩涚▼鐗╃悊浼氳瘽锛�
+ ExecutionMode='Broker' 鈹�鈹�鈻� <b>BrokeredCanDriver</b>(deviceId, aging.{BrokerId}.v1, hash鈧�)
+ 鈹� hash鈧� = DeviceConfigHash.Compute(data.db)
+ 鈹� 瑙勫垯涓� DeviceConfigModel.ComputeConfigHash 瀹屽叏涓�鑷达細
+ 鈹� DEVICE(id|kind|driver|transport|endpoint|<b>mode|authority|broker|sessionKey</b>)
+ 鈹� + CHANNEL + SLOT 涓夋鎷兼帴 SHA256锛汷wnerProcessId 涓嶅弬涓�
+ 鈻� 姣忔 RPC 鎼哄甫
+ 瀹夸富鍑洪槦鏃朵笌鑷繁閲嶇畻鐨勭敓鏁� hash 瀵硅处 鈫� 涓嶄竴鑷� RejectedConfigMismatch
+</pre>
+<ul>
+<li><b>鍒嗘淳鐐瑰湪椹卞姩灞�</b>锛�<code>DeviceService</code> 涓嶆劅鐭� Local/Broker鈥斺�斿畠鍙粠 <code>DeviceManager.GetDriver(deviceId)</code> 鍙栭┍鍔ㄣ�備笂灞傦紙鑷姩鍖栭棬闈€�佽皟璇曢潰鏉匡級闆舵敼鍔ㄣ��</li>
+<li>閰嶇疆鍝堝笇 = 蹇収鎸囩汗锛欱roker 鐢� <code>DeviceConfigHash.Compute</code>锛堜笌娉ㄥ唽椤靛悓绠楁硶锛岀己琛ㄨ烦杩囩┖娈碉級姣� 2s 鎯版�ч噸绠椼��</li>
+</ul>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s5">5銆�璋冭瘯椤甸�夎澶囨椂搴忥紙OnDeviceSelected锛�</h2>
+<div class="card">
+<pre class="seq">
+璁惧涓嬫媺鍙樻洿
+ 1. LoadDeviceInfo(deviceId) 鈫� 璇� data.db锛欿ind/Endpoint/EffectiveVersion
+ 2. OpenSession(deviceId) 鈫� DebugSessionManager
+ a. GetActiveSessionByDevice 鈫� 鍛戒腑涓�<b>鍦ㄦ湰杩涚▼鍐呭瓨</b> 鈫� 澶嶇敤杩斿洖
+ b. 鍛戒腑浣嗕粎瀛樺湪浜� debug.db锛堣繘绋嬮噸鍚仐鐣欐浼氳瘽锛夆啋 <u>寮哄埗鍥炴敹涓� Closed</u> 鍐嶆柊寤�
+ c. 鏂板缓 session锛圫tate=ReadOnly锛屽啓 debug_session 琛� + 鍏ュ唴瀛樼紦瀛橈級
+ 3. DeviceManager.ConnectAsync(deviceId)
+ <span class="tag t-local">Local</span> 鐩撮┍ ConnectAsync锛氭敞鍐屾�荤嚎鑺傜偣/寤虹珛 TCP鈥�
+ <span class="tag t-broker">Broker</span> BrokeredCanDriver 鈫� RPC CONNECT锛�<b>鏃犵绾︿篃鍏佽</b>锛氫粎鐧昏瀹夸富鐗╃悊浼氳瘽锛屾棤鎬荤嚎杈撳嚭锛�
+ 寮傚父鈫掍粎杩炴帴鐘舵�佹樉绀�"杩炴帴澶辫触"锛屼笉鎶涘嚭
+ 4. UpdateButtonStates() 鈫� "杩涘叆缁存姢"浠� ReadOnly 鏃跺彲鐢�
+ 5. LoadPanel(kind)
+ CAN 闈㈡澘锛欵xistingDriver = DeviceManager.GetDriver(deviceId)
+ 鈹溾攢 闈� null锛圔roker 璁惧锛夆啋 闈㈡澘澶嶇敤璇ラ┍鍔紝<b>绂佹鏈湴鐩撮┍</b>锛堜笉 Dispose 澶栭儴椹卞姩锛�
+ 鈹斺攢 null锛堟湭娉ㄥ唽锛夆啋 闄嶇骇鏈湴鐩撮┍锛堟ā鎷熷櫒璇箟锛宱wns=true锛�
+ 闈㈡澘杩炴帴鍚庯細DispatcherTimer 100ms 杞鍚姩锛圲pdateStats + 浠g悊椹卞姩閭鎶藉彇锛�
+ 椤堕儴"杩炴帴鐘舵��"涓庨潰鏉垮唴"鐘舵��"涓轰袱涓寚鏍囷細鍓嶈��=DeviceManager 閫氳矾锛屽悗鑰�=闈㈡澘瀹為檯浣跨敤鐨勯┍鍔�
+</pre>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s6">6銆�缁存姢妯″紡鐘舵�佹満涓庣绾︽椂搴�</h2>
+<div class="grid2">
+<div class="card">
+<h3>6.1 浼氳瘽鐘舵�佹満</h3>
+<pre class="seq">
+ RequestMaintenance 鉁� ActivateMaintenance
+ ReadOnly 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈻� AcquiringMaintenance 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈻� <b>MaintenanceActive</b>
+ 鈻� 鈹傚け璐�(鍗犵敤/瓒呮椂) 鈹� CloseSession
+ 鈹傚洖鏀舵浼氳瘽(Closed) 鈻� 鈻�
+ 鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 淇濇寔 ReadOnly Closing 鈫� Closed
+ 锛堥噴鏀剧淮鎶ょ绾︼級
+</pre>
+<h3>6.2 杩涘叆缁存姢锛堝惈璺ㄨ繘绋嬩徊瑁侊級</h3>
+<pre class="seq">
+"杩涘叆缁存姢" 鈫� RequestMaintenance(sessionId)
+ 1. 浼氳瘽鍦ㄥ唴瀛樼紦瀛橈紵涓嶅湪鈫抎ebug.db 鎭㈠鍏滃簳锛涗粛鏃犫啋鎷掔粷
+ 2. State==ReadOnly锛熷惁鍒欐嫆缁濓紙鎸夐挳宸叉寜姝ょ疆鐏帮級
+ 3. <b>鍙�/寤轰細璇濃啋浠ょ墝缂撳瓨 _sessionOwnerTokens[sessionId]</b>
+ 锛圧esourceOwnerToken.TokenId 鏄殢鏈� GUID锛�<u>蹇呴』澶嶇敤鍚屼竴瀹炰緥</u>锛�
+ 鍚﹀垯 LayeredResourceManager 鎸� TokenId 绱㈠紩鐨� grants 閲婃斁鏃舵壘涓嶅洖锛�
+ 4. ResourceManager.ReserveAsync(token, key=deviceId)
+ 鈫� DbLeaseStore.Acquire锛坅rb.db BEGIN IMMEDIATE 鍗曚簨鍔★級
+ 鈹� Acquired/Reused 鈫� Active 绉熺害锛圱TL 300s锛孏eneration+1锛�
+ 鈹� ConflictHeld 鈫� 鎶� ResourceConflictException 鈫� 鎷掔粷锛堟彁绀哄惈鍗犵敤鑰�/鏈哄櫒/PID锛�
+ 鈹� RecoveryBlocked 鈫� 鎷掔粷锛堣繃鏈熷緟鍥炴敹锛岃 搂8锛�
+ 5. State=AcquiringMaintenance 鈫� ActivateMaintenance 鈫� MaintenanceActive
+ 6. LoadPanel 閲嶅缓 鈫� 闈㈡澘 IsMaintenanceMode=true锛堝啓鎺т欢瑙i攣锛�
+</pre>
+</div>
+<div class="card">
+<h3>6.3 閫�鍑虹淮鎶�</h3>
+<pre class="seq">
+"閫�鍑虹淮鎶�" 鈫� CloseSession
+ 1. State=MaintenanceActive锛熲啋 Closing
+ 2. ReleaseReservationAsync(<b>澶嶇敤杩涘叆鏃剁殑鍚屼竴浠ょ墝</b>)
+ 鈫� DbLeaseStore.Release 鈫� Phase=0(Free)锛宭ease_history 璁� Released
+ 3. Closed + closed_at 钀藉簱銆佺Щ鍑哄唴瀛樼紦瀛樸�佹竻浠ょ墝缂撳瓨
+ <b>鏍¢獙鐐�</b>锛歛rb.db resource_state 搴斿彉鍥� Free 鈥斺�� 娉勬紡绉熺害鏇惧鑷�
+ "绗簩娆¤繘鍏ョ淮鎶ゆ案涔呭け璐�"锛屾牴鍥犱笌淇瑙� 搂8/搂10
+</pre>
+<h3>6.4 缁存姢涓庡啓鏉冮檺鐭╅樀锛堝涓讳晶鎵ц璇箟锛�</h3>
+<table>
+<tr><th>鎿嶄綔</th><th>绉熺害瑕佹眰</th><th>鍘熷洜</th></tr>
+<tr><td>CONNECT / DISCONNECT</td><td><i>璞佸厤</i></td><td>浠呯櫥璁�/閲婃斁瀹夸富鐗╃悊浼氳瘽锛屾棤鎬荤嚎杈撳嚭</td></tr>
+<tr><td>RECV / RECV_ALL / LOG / STATUS</td><td><i>璞佸厤</i></td><td>绾閭/鐘舵�侊紝琚姩鐩戞帶鏀寔璋冭瘯椤靛彧璇荤洃鍚�</td></tr>
+<tr><td>SEND锛堝抚鍙戦�侊級</td><td><b>蹇呴』 Active</b></td><td>鎬荤嚎鍐欙紝INV-01 绂佹鏃犵绾︾洿鎺� I/O</td></tr>
+<tr><td>AUTO_RESPONSE / FILTER / PROMISCUOUS</td><td><b>蹇呴』 Active</b></td><td>鏈夊壇浣滅敤鐨� QUERY锛屾敼鍙樿妭鐐硅涓�</td></tr>
+</table>
+<div class="fixed">鉁� 鍥犳姝g‘鎿嶄綔椤哄簭鍗虫偍鎸囧嚭鐨勶細<b>鍏堣繘鍏ョ淮鎶ゆā寮� 鈫� 鎵嶈兘鎵撳紑鑷姩鍝嶅簲/鍙戦��</b>锛涘彧璇�"鐪嬪抚"涓嶉渶瑕佺淮鎶ゃ��</div>
+</div>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s7">7銆�鎶ユ枃鏀跺彂鍏ㄩ摼璺椂搴忥紙Broker 璁惧锛�</h2>
+<div class="card">
+<h3>7.1 鍙戦�侊紙缁存姢妯″紡涓嬶紝CAN-003 鈫� 鎬荤嚎锛�</h3>
+<pre class="seq">
+闈㈡澘"鍙戦��" 鈫� BrokeredCanDriver.SendCommandAsync("SEND:0x123:55 66")
+ 鈹斺攢 BrokerClientChannel.EnsureConnectedAsync 鈫� 鎯版�э細绠¢亾鏂紑鑷姩閲嶈繛+閲嶆彙鎵�
+ 鈹斺攢 <b>Hello</b> 鈫� 瀹夸富鍥� {ServerEpoch, ConfigHash, BrokerId, ProtocolVersion}
+ 鍗忚涓荤増鏈笉绗� 鈫� 鏂紑鎷掔粷
+ 鈹斺攢 <b>SubmitTask</b>锛堝抚=4瀛楄妭澶х闀垮害+UTF8 JSON 灏佸锛汻equestId 鍏宠仈銆乨eadline 瓒呮椂锛�
+ Body={DeviceId, OpCode=SEND, Payload, ResourceKey=deviceId, ClientInstanceId}
+ 鈻� 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� DeviceBroker.exe 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+ 鈶犵櫧鍚嶅崟+鍩熷唴璁惧杩囨护 闈炴湰鍩�/鏈煡op 鈫� Failed
+ 鈶�<b>configHash 瀵硅处</b>(INV-04) 涓嶄竴鑷� 鈫� RejectedConfigMismatch("鍏� Apply 鍐� I/O")
+ 鈶�<b>鏍呮爮鍐嶆牎楠�</b>(INV-01/03) RecoveryRequired鈫掓嫆缁濓紱鏃� Active 绉熺害鈫扲ejectedStaleLease
+ 鈶�<b>SessionGate</b>锛堟寜 PhysicalSessionKey 涓茶鍘熷瓙鐗囨锛�
+ 闃熷垪绛夊緟 5s 瓒呮椂 鈫� Failed RESOURCE_BUSY锛堢‘瀹氭湭鎵ц锛屽彲瀹夊叏閲嶈瘯锛�
+ 鈶anDriverAdapter.SendFrame锛堝涓昏繘绋嬬墿鐞�/妯℃嫙鎬荤嚎锛�
+ 鈶esultBody{State, Readback, ServerEpoch} 鍚岀閬撹繑鍥�
+ 鈻� 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹� 瀹㈡埛绔� 鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+ Succeeded鈫掕繑鍥炶澶囧搷搴斾覆 | RejectedStaleLease鈫掓姏 LEASE_STALE
+ ConfigMismatch鈫掓姏寮傚父 | Unknown(瓒呮椂/鐗囨涓紓甯�)鈫�<u>TimeoutException 绂佹鍋囧畾鏈墽琛�(INV-06)</u>
+</pre>
+<h3>7.2 鎺ユ敹锛堟�荤嚎甯� 鈫� 闈㈡澘鏄剧ず锛�</h3>
+<pre class="seq">
+鎬荤嚎骞挎挱 鈫� 瀹夸富鍐� node(CAN-003) 鏀跺抚 鈫� RxCount++锛屽抚鍏� _recvBuffer + 鑺傜偣閭
+瀹㈡埛绔潰鏉� DispatcherTimer(100ms) 姣� 10 tick锛堚増1s锛夛細
+ DrainBrokerMailbox 鈫� RPC QUERY <b>"RECV_ALL"</b>锛堝彧璇伙紝<u>鏃犻渶绉熺害</u>锛�
+ 鈫� 瑙f瀽 "RECV_ALL:n:id:data[:ts]|鈥�" 鈫� AddReceivedFrame(RX, 鏉ユ簮=<b>BUS@broker</b>)
+ RPC 澶辫触锛堝涓讳笉鍙揪绛夛級闈欓粯璺宠繃锛屼笅涓�绉掗噸璇曪紝涓嶅脊閿欒
+锛圠ocal 鐩撮┍璁惧鏃犻渶杞锛欴riverFrameReceived 浜嬩欢鍗虫椂鏄剧ず锛�
+瀵圭妯℃嫙锛氱湡瀹炵‖浠跺悓涓�鎬荤嚎澶╃劧浜掗�氾紱妯℃嫙鍣ㄥ満鏅敤<b>鍚屽涓荤殑 CAN-004</b> 浣滃绔獙璇併��
+</pre>
+<div class="fixed">鉁� <b>淇璁板綍</b>锛氣憼 浠g悊椹卞姩鏃犲抚浜嬩欢涓旈潰鏉夸粠涓嶆煡閭 鈫� "鍙湁鍙戦�佹病鏈夋帴鏀�"锛岀幇澧炲姞 RECV_ALL 鍙杞锛涒憽 瀹夸富 <code>HandleRecvAll</code> 鏇炬妸鍚屼竴甯х粡 buffer+閭鍙岃矾涓婃姤锛圧X 閲嶅琛岋級锛屽凡鏀逛负 buffer 浼樺厛銆侀偖绠变粎鍏滃簳銆�</div>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s8">8銆�寮傚父涓庤嚜鎰堟満鍒�</h2>
+<div class="card">
+<table>
+<tr><th>鍦烘櫙</th><th>鏈哄埗</th><th>琛ㄧ幇/鍘诲悜</th></tr>
+<tr><td>杩涚▼寮傚父閫�鍑猴紙宕╂簝/琚潃锛�</td><td>绉熺害涓嶅啀缁湡 鈫� TTL(300s) 杩囨湡 鈫� <b>RecoveryRequired</b>锛圛NV-03 绂佹鑷姩绉讳氦锛�</td><td>涓嬫 Acquire 杩斿洖 RecoveryBlocked 鈫� "鏃犳硶杩涘叆缁存姢"</td></tr>
+<tr><td>瀹夸富/涓荤▼搴�<b>閲嶅惎</b></td><td><b>ReconcileAfterBoot</b>锛歋weepExpired锛堣繃鏈熲啋寰呭洖鏀�+鍘嗗彶锛夆啋 閫愪釜 ApproveRecovery锛堢櫥璁拌鍥炶瘉鎹繘 recovery_checkpoint锛孭hase=Free锛孏eneration 涓嶅洖閫�锛�</td><td>鍚姩鍗宠嚜鎰堬紱璇佹嵁鍙湪 arb.db 瀹¤</td></tr>
+<tr><td>璋冭瘯椤电淮鎶ょ绾︽硠婕�</td><td>鏍瑰洜锛氳繘鍑虹淮鎶ゅ悇鑷� new Token锛圱okenId 闅忔満 GUID锛夆啋 閲婃斁鎸� TokenId 鏌ユ壘钀界┖銆備慨澶嶏細浼氳瘽鈫掍护鐗屽疄渚嬬紦瀛樺鐢�</td><td>閫�鍑虹淮鎶ゅ悗 resource_state 蹇呭洖 Free</td></tr>
+<tr><td>debug.db 姝讳細璇濇畫鐣�</td><td>OpenSession 妫�鍑�"DB 鏈夈�佸唴瀛樻棤"鐨勬湭鍏抽棴浼氳瘽 鈫� 鍥炴敹 Closed 鍐嶆柊寤�</td><td>涓嶅啀鍑虹幇"浼氳瘽涓嶅瓨鍦�"鍨嬫嫆缁�</td></tr>
+<tr><td>绉熺害杩囨湡鍚庝娇鐢紙浣滅敤鍩熺绾︼級</td><td>AutoDeviceLease 蹇冭烦 8s Renew锛涜繛缁� 2 娆″け璐� 鈫� LeaseLost 浜嬩欢 + 鍚庣画璋冪敤鎶� <b>LEASE_STALE</b>锛堢啍鏂級</td><td>鑷姩鍖栨楠ゅ揩閫熷け璐ヨ�岄潪闈欓粯鍗婃墽琛�</td></tr>
+<tr><td>RPC 瓒呮椂/鏂嚎</td><td>鍝嶅簲鍏宠仈瓒呮椂 鈫� State=<b>Unknown</b>锛圛NV-06锛夛紱璇诲惊鐜柇绾挎劅鐭� 鈫� 涓嬫璋冪敤鎯版�ч噸杩為噸鎻℃墜</td><td>闈㈡澘杞闈欓粯閲嶈瘯锛涙樉寮� I/O 鎶涘紓甯哥姝㈤噸璇曞亣瀹氭湭鎵ц</td></tr>
+<tr><td>閰嶇疆鐗堟湰閿欎綅锛堝鎴风蹇収鏃э級</td><td>瀹夸富姣忔鍑洪槦瀵硅处 configHash 鈫� RejectedConfigMismatch</td><td>寮哄埗"鍏� Apply 鍐� I/O"</td></tr>
+</table>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s9">9銆�鍏抽敭浠g爜绱㈠紩</h2>
+<div class="card">
+<table>
+<tr><th>鑱岃矗</th><th>鏂囦欢</th><th>鍏抽敭鎴愬憳</th></tr>
+<tr><td>鍚姩瑁呴厤</td><td>Plugin.IntegrationTest/MainWindow.xaml.cs</td><td>InitializePlugins / SeedPresetCanDevices / InitializeAutoServices / TryStartDeviceBroker</td></tr>
+<tr><td>娉ㄥ唽 UI/鑱斿姩/鏍¢獙</td><td>Plugin.DeviceConfig/DeviceEditModal.xaml(.cs)</td><td>Open / ExecMode_Changed / CbAuthority_SelectionChanged / RefreshSessionKeyCandidates / SaveBtn_Click</td></tr>
+<tr><td>鍊欓�夋灇涓鹃厤缃�</td><td>Plugin.DeviceConfig/V3AuthorityCatalog.cs + Plugin.IntegrationTest/App.config</td><td>AuthorityIds / BrokerIds / LocalAuthorityId / IsLocalAuthority</td></tr>
+<tr><td>鍙戝竷闂ㄧ/鍝堝笇/杩佺Щ</td><td>Plugin.DeviceConfig/Model/DeviceConfigModel.cs</td><td>MigrateExecutionColumns / ValidatePublishGate / ComputeConfigHash / SaveDevice</td></tr>
+<tr><td>瀹炰綋</td><td>Plugin.DeviceConfig/Entity/DeviceDefinition.cs</td><td>ExecutionModeKind / AuthorityId / BrokerId / PhysicalSessionKey / AccessPolicy(娲剧敓)</td></tr>
+<tr><td>鏈嶅姟瑁呴厤</td><td>Aging.Infrastructure/InfrastructureBootstrapper.cs</td><td>Initialize / RegisterBrokeredDrivers</td></tr>
+<tr><td>璺ㄨ繘绋嬬绾�</td><td>Aging.Infrastructure/Core/DbLeaseStore.cs 路 LayeredResourceManager.cs</td><td>Acquire/Renew/Release/PhaseOf/SweepExpired/ApproveRecovery/<b>ReconcileAfterBoot</b></td></tr>
+<tr><td>缁存姢浼氳瘽鐘舵�佹満</td><td>Plugin.DeviceDebug/Model/DebugSessionManager.cs</td><td>OpenSession(姝讳細璇濆洖鏀�) / RequestMaintenance(浠ょ墝澶嶇敤) / ActivateMaintenance / CloseSession</td></tr>
+<tr><td>璋冭瘯椤垫椂搴�</td><td>Plugin.DeviceDebug/DeviceDebug.xaml.cs 路 Panels/CanDebugPanel.xaml.cs</td><td>OnDeviceSelected / LoadPanel(ExistingDriver 娉ㄥ叆) / DoConnect / PollTimer_Tick / DrainBrokerMailbox</td></tr>
+<tr><td>Broker 瀹㈡埛绔�</td><td>Aging.Infrastructure/Broker/BrokerClientChannel.cs 路 Drivers/BrokeredCanDriver.cs</td><td>EnsureConnectedAsync(Hello) / SendAsync(鍏宠仈+瓒呮椂) / SubmitAsync / ThrowForState</td></tr>
+<tr><td>Broker 瀹夸富</td><td>DeviceBroker/BrokerServer.cs 路 Program.cs</td><td>LoadDevices / ExecuteOneShotAsync(涓夐噸鍏冲崱) / SessionGate / RunFragmentAsync / ProbeReadback</td></tr>
+<tr><td>绾垮崗璁�/濂戠害</td><td>Aging.ResourceContracts/BrokerIpc.cs 路 IpcEnvelope.cs 路 DeviceOperationTypes.cs 路 LeaseTypes.cs</td><td>甯х紪瑙g爜 / SubmitBody路ResultBody / LeaseGrant路AcquireRequest</td></tr>
+</table>
+</div>
+
+<!-- ============================================================ -->
+<h2 id="s10">10銆�宸茬煡闄愬埗涓庣畝鍖栵紙P2 璁″垝椤癸級</h2>
+<div class="card">
+<ul>
+<li><b>owner鈫攃lientInstanceId 寮卞榻�</b>锛氬悓鏈� arb.db 鏍呮爮鍙仛瀛樺湪鎬�/鐩镐綅妫�鏌ワ紝鏈牎楠岀敵璇疯�呰韩浠戒笌璇锋眰杩炴帴涓�涓�瀵瑰簲锛堝緟绛惧悕鍑嵁/epoch token锛夈��</li>
+<li><b>妯℃嫙鍣ㄨ法杩涚▼鎬荤嚎</b>锛欳anSimulator 杩涚▼鍐呭疄渚嬩簰涓嶇浉閫氾紝璺ㄨ繘绋嬫敹鍙戜粎鍚屽涓昏澶囬棿鍙揪锛涚湡瀹炵‖浠舵棤姝ら檺鍒躲��</li>
+<li><b>鎺ㄨ繜鑳藉姏</b>锛欴raining 鑷姩璁╂浮銆佸懆鏈熶换鍔�/璁㈤槄/ResultOutbox銆佺埗璁惧 Permit 澶氶�氶亾浠茶銆丳repare/Activate 涓ゆ寮忚法鍩熼鐣欍�佸彂甯冮瑙堝樊寮傘��</li>
+<li><b>UI 寰呭姙</b>锛欰pp.Success/App.Warn 鏍囬鏈湰鍦板寲锛涢��鍑虹淮鎶ゅ悗璁惧閫夋嫨鍣ㄨ閲嶇疆锛涗复鏃惰瘖鏂棩蹇楋紙brokerrx_diag.log锛夊緟楠岃瘉閫氳繃鍚庢挙闄わ紱RecoveryRequired 灏氭棤浜哄伐瀹℃壒 UI锛堝綋鍓嶇敱鍚姩瀵硅处浠e伩锛夈��</li>
+<li><b>BrokerId/OwnerProcessId 璇箟</b>锛歄wnerProcessId 涓� MVP 鍗犱綅锛堝綋鍓嶈繘绋� PID锛夛紝Broker 甯搁┗杩涚▼搴斾负鍏跺涓� PID 涓旈殢瀹夸富閲嶅惎鏇存柊鈥斺�斾笉鍏ュ搱甯岀殑璁捐宸查鐣欍��</li>
+</ul>
+<p class="small">鏈枃妗d笌浠g爜瀹炲喌鍚屾浜� 2026-11-09锛涘疄鐜板彉鏇磋鍚屾鏇存柊鏈枃浠躲��</p>
+</div>
+
+</div></body>
+</html>
--
Gitblit v1.9.1