Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
6d1df5f
build(deps): 升級 Microsoft.GameInput 至 3.5.278 與 nuget-license 至 4.0.18
perditavojo Sep 26, 2026
c774df3
build(gameinput): 更新 InputWeave.GameInput v0.0.1 封裝來源至 89b1486 重發資產
perditavojo Sep 26, 2026
355ec67
docs: 將「Xbox 全螢幕體驗」更名為「Xbox 模式」
perditavojo Sep 26, 2026
8a87555
fix(release): 補上遞移相依套件的第三方授權聲明
perditavojo Sep 26, 2026
213e7a1
docs(comments): 移除延遲與連發註解中容易被誤解為模擬人類操作的措辭
perditavojo Sep 26, 2026
1289496
fix(restart): 程式內重啟時只授權新執行個體搶回前景
perditavojo Sep 26, 2026
5951d89
style(editorconfig): 依官方編碼慣例調整 var 使用規範
perditavojo Sep 26, 2026
a771f31
docs(agent): 依 Claude Code 最新官方文件更新橋接與支援依據
perditavojo Sep 26, 2026
f09a85b
fix(vibration): 修正熱保護在冷啟動時擋掉重要震動回饋
perditavojo Sep 26, 2026
54afe81
docs(safety): 明文記載前景視窗返回與 AttachThreadInput 的允許範圍
perditavojo Sep 26, 2026
37fe667
refactor(gamepad): 將兩個後端的 EMA 偏移補償係數與公式集中共用
perditavojo Sep 26, 2026
935c495
refactor(selection): 將右搖桿延伸選取的共用邏輯集中為 TextBox 擴充方法
perditavojo Sep 26, 2026
a43093d
refactor(a11y): 將三份閃爍警示實作的配色與動畫集中為 FlashAlertAnimator
perditavojo Sep 26, 2026
eca2108
refactor(menu): 將 1,454 行的 InitializeContextMenu 依子選單拆分
perditavojo Sep 26, 2026
5fa4c6c
refactor(dialogs): 將四個大型對話框依職責拆成 partial 檔
perditavojo Sep 26, 2026
285ab1a
fix(vibration): 相同 Critical 震動自動連發時降級交由熱保護節流
perditavojo Sep 27, 2026
6a3af4d
fix(restart): 以交接參數讓新執行個體接手單一執行個體 Mutex,並強化 Critical 連發節流
perditavojo Sep 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/inputbox-dev/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: inputbox-dev
description: Claude Code 對 InputBox 工程技能的橋接。當修改 InputBox 程式碼、UI、控制器邏輯、在地化、測試或 Git 工作流時使用。
description: 修改 InputBox 程式碼、UI、控制器邏輯、在地化、測試、工程規範或 Git 工作流時使用,負責載入對應的工程規範;一般只讀問答不需啟用。本檔為 Claude Code 橋接,權威內容在 .agents/skills/inputbox-dev/SKILL.md。
---

# InputBox Claude Code Skill Bridge
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/update-inputweave-gameinput/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: update-inputweave-gameinput
description: Claude Code 對 InputWeave.GameInput 更新技能的橋接。更新 InputBox 內嵌套件、來源 commit、雜湊、授權、CI 或 gh-pages 第三方資訊時使用。
description: 更新或重新封裝 InputBox 內嵌的 InputWeave.GameInput 套件,並同步來源 commit、SHA-256、授權、CI、release workflow 與 gh-pages 第三方資訊時使用。本檔為 Claude Code 橋接,權威流程在 .agents/skills/update-inputweave-gameinput/SKILL.md。
---

# InputWeave.GameInput Claude Code Skill Bridge
Expand Down
2 changes: 1 addition & 1 deletion .config/dotnet-tools.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
]
},
"nuget-license": {
"version": "4.0.17",
"version": "4.0.18",
"commands": [
"nuget-license"
]
Expand Down
9 changes: 8 additions & 1 deletion .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,16 @@ dotnet_style_allow_statement_immediately_after_block_experimental = true
#### C# 編碼慣例 ####

# var 喜好設定
# 依 Microsoft C# 編碼慣例與 .NET Runtime 程式碼風格:
# - 型別可由右側直接看出(new、明確轉型)時可使用 var,亦可使用 target-typed new()。
# - 內建型別、方法回傳值等型別無法由右側直接看出時,一律使用明確型別;不以方法或變數名稱推測型別。
# - foreach 迴圈變數使用明確型別;LINQ 匿名型別等必要情況除外。
csharp_style_var_elsewhere = false
csharp_style_var_for_built_in_types = false
csharp_style_var_when_type_is_apparent = false
csharp_style_var_when_type_is_apparent = true
# IDE0008:型別無法直接看出卻使用 var 時提示改為明確型別;IDE0007(改用 var)不主動提示,保留既有明確型別寫法。
dotnet_diagnostic.IDE0008.severity = suggestion
dotnet_diagnostic.IDE0007.severity = silent

# 運算式主體成員
csharp_style_expression_bodied_accessors = true
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ jobs:
Write-Error "InputWeave.GameInput 套件 SHA256 不符。Expected=$expected Actual=$actual"
}

$expectedCommit = "a3985f29c19b35365124d70cfbf0c21d1596ad3e"
$expectedCommit = "89b148669ffe58d9927495ed0d89f9997bf4962a"
$inspectDir = Join-Path $env:RUNNER_TEMP "inputweave-gameinput-package"
if (Test-Path $inspectDir) {
Remove-Item -LiteralPath $inspectDir -Recurse -Force
Expand Down
13 changes: 7 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ jobs:
Write-Error "InputWeave.GameInput 套件 SHA256 不符。Expected=$expected Actual=$actual"
}

$expectedCommit = "a3985f29c19b35365124d70cfbf0c21d1596ad3e"
$expectedCommit = "89b148669ffe58d9927495ed0d89f9997bf4962a"
$inspectDir = Join-Path $env:RUNNER_TEMP "inputweave-gameinput-package"
if (Test-Path $inspectDir) {
Remove-Item -LiteralPath $inspectDir -Recurse -Force
Expand Down Expand Up @@ -232,7 +232,8 @@ jobs:
# -i:指定專案檔路徑。
# -o:指定輸出格式為 Markdown(讓純文字檔內有整齊的表格排版)。
# -fo:指定輸出的檔案名稱(File Output)。
dotnet tool run nuget-license -i ./src/InputBox/InputBox.csproj -o Markdown -fo ThirdPartyNotices.txt -ignore Microsoft.GameInput
# -t:一併列出遞移相依套件(例如 InputWeave.GameInput 相依的 Microsoft.Extensions.DependencyInjection.Abstractions),避免隨附的函式庫缺少授權聲明。
dotnet tool run nuget-license -i ./src/InputBox/InputBox.csproj -t -o Markdown -fo ThirdPartyNotices.txt -ignore Microsoft.GameInput

if (Test-Path "ThirdPartyNotices.txt") {
Write-Host "✅ 成功產生專案依賴套件的 ThirdPartyNotices.txt!"
Expand All @@ -254,13 +255,13 @@ jobs:
Add-Content -Path $noticePath -Encoding utf8 -Value '## InputWeave.GameInput'
Add-Content -Path $noticePath -Encoding utf8 -Value ''
Add-Content -Path $noticePath -Encoding utf8 -Value '- 套件:InputWeave.GameInput 0.0.1'
Add-Content -Path $noticePath -Encoding utf8 -Value '- 來源:https://github.com/rubujo/InputWeave.GameInput/tree/a3985f29c19b35365124d70cfbf0c21d1596ad3e'
Add-Content -Path $noticePath -Encoding utf8 -Value '- 來源:https://github.com/rubujo/InputWeave.GameInput/tree/89b148669ffe58d9927495ed0d89f9997bf4962a'
Add-Content -Path $noticePath -Encoding utf8 -Value '- 作者:https://github.com/rubujo'
Add-Content -Path $noticePath -Encoding utf8 -Value '- 貢獻者:https://github.com/rubujo/InputWeave.GameInput/graphs/contributors'
Add-Content -Path $noticePath -Encoding utf8 -Value '- 封裝來源:https://github.com/rubujo/InputWeave.GameInput/commit/a3985f29c19b35365124d70cfbf0c21d1596ad3e'
Add-Content -Path $noticePath -Encoding utf8 -Value '- 封裝來源:https://github.com/rubujo/InputWeave.GameInput/commit/89b148669ffe58d9927495ed0d89f9997bf4962a'
Add-Content -Path $noticePath -Encoding utf8 -Value '- 套件檔案:eng/nuget/InputWeave.GameInput.0.0.1.nupkg'
Add-Content -Path $noticePath -Encoding utf8 -Value '- SHA256: 3e9a3d65861a9211380aec6211ccf9f6b9151eae20df6d8917d3e75a98b9b589'
Add-Content -Path $noticePath -Encoding utf8 -Value '- 授權:Creative Commons CC0 1.0 Universal(SPDX:CC0-1.0);詳見本 Licenses 目錄中的 InputWeave.GameInput_LICENSE.txt 與 https://github.com/rubujo/InputWeave.GameInput/blob/a3985f29c19b35365124d70cfbf0c21d1596ad3e/LICENSE。'
Add-Content -Path $noticePath -Encoding utf8 -Value '- SHA256: 3342051977f6f1b91f2a18acfc224456320264dd67633ed4bc41c8188c9fcdb7'
Add-Content -Path $noticePath -Encoding utf8 -Value '- 授權:Creative Commons CC0 1.0 Universal(SPDX:CC0-1.0);詳見本 Licenses 目錄中的 InputWeave.GameInput_LICENSE.txt 與 https://github.com/rubujo/InputWeave.GameInput/blob/89b148669ffe58d9927495ed0d89f9997bf4962a/LICENSE。'

- name: 產生執行檔的雜湊值(SHA256)
shell: pwsh
Expand Down
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@

若需使用控制器目前配置下的取消鍵關閉觸控式鍵盤,可將其「鍵盤配置」設定為「遊戲控制器」。

### 2. 從 Xbox 全螢幕體驗切換回 Windows 桌面後,應用程式視窗過大 📺
### 2. 從 Xbox 模式切換回 Windows 桌面後,應用程式視窗過大 📺

可手動縮放視窗大小(使用手指或滑鼠)。

Expand Down Expand Up @@ -592,7 +592,8 @@ Remove-Item Env:INPUTBOX_RUN_UI_TESTS -ErrorAction SilentlyContinue

- [.NET Runtime](https://github.com/dotnet/runtime):由 [Microsoft](https://github.com/microsoft) 及其 [貢獻者](https://github.com/dotnet/runtime/graphs/contributors) 開發並採用 [**MIT License**](https://github.com/dotnet/runtime/blob/main/LICENSE.TXT) 授權,作為本應用程式之底層執行環境,相關第三方聲明請參閱 [**THIRD-PARTY-NOTICES**](https://github.com/dotnet/runtime/blob/main/THIRD-PARTY-NOTICES.TXT)。
- [Windows Forms(WinForms)](https://github.com/dotnet/winforms):由 [Microsoft](https://github.com/microsoft) 及其 [貢獻者](https://github.com/dotnet/winforms/graphs/contributors) 開發並採用 [**MIT License**](https://github.com/dotnet/winforms/blob/main/LICENSE.TXT) 授權,提供桌面視窗圖形介面基礎架構,相關第三方聲明請參閱 [**THIRD-PARTY-NOTICES**](https://github.com/dotnet/winforms/blob/main/THIRD-PARTY-NOTICES.TXT)。
- [InputWeave.GameInput 0.0.1](https://github.com/rubujo/InputWeave.GameInput/tree/a3985f29c19b35365124d70cfbf0c21d1596ad3e):由 [rubujo](https://github.com/rubujo) 及其 [貢獻者](https://github.com/rubujo/InputWeave.GameInput/graphs/contributors) 開發並採用 [**CC0 1.0 Universal**](https://github.com/rubujo/InputWeave.GameInput/blob/a3985f29c19b35365124d70cfbf0c21d1596ad3e/LICENSE) 授權,提供 GameInput 執行階段、用戶端、裝置、讀取狀態與震動控制介面。套件固定於本儲存庫的 NuGet 來源 `eng/nuget/InputWeave.GameInput.0.0.1.nupkg`,封裝來源為 [`a3985f29c19b35365124d70cfbf0c21d1596ad3e`](https://github.com/rubujo/InputWeave.GameInput/commit/a3985f29c19b35365124d70cfbf0c21d1596ad3e),套件 SHA256 為 `3e9a3d65861a9211380aec6211ccf9f6b9151eae20df6d8917d3e75a98b9b589`。
- [Microsoft GameInput Redistributable](https://www.nuget.org/packages/Microsoft.GameInput):由 Microsoft 提供,作為選用的 GameInput 執行階段可轉散發套件。正式發佈 ZIP 檔會隨附 `redist/GameInputRedist.msi` 供使用者手動安裝;本應用程式不會自動安裝。手動安裝 `redist/GameInputRedist.msi` 即表示使用者需遵守 [Microsoft.GameInput 授權條款](https://www.nuget.org/packages/Microsoft.GameInput/3.5.270/License);相關授權與 NOTICE 檔案位於 `Licenses/Microsoft.GameInput_LICENSE.txt` 與 `Licenses/Microsoft.GameInput_NOTICE.txt`,且該可轉散發安裝程式不屬於本專案 CC0 授權範圍。
- [InputWeave.GameInput 0.0.1](https://github.com/rubujo/InputWeave.GameInput/tree/89b148669ffe58d9927495ed0d89f9997bf4962a):由 [rubujo](https://github.com/rubujo) 及其 [貢獻者](https://github.com/rubujo/InputWeave.GameInput/graphs/contributors) 開發並採用 [**CC0 1.0 Universal**](https://github.com/rubujo/InputWeave.GameInput/blob/89b148669ffe58d9927495ed0d89f9997bf4962a/LICENSE) 授權,提供 GameInput 執行階段、用戶端、裝置、讀取狀態與震動控制介面。套件固定於本儲存庫的 NuGet 來源 `eng/nuget/InputWeave.GameInput.0.0.1.nupkg`,封裝來源為 [`89b148669ffe58d9927495ed0d89f9997bf4962a`](https://github.com/rubujo/InputWeave.GameInput/commit/89b148669ffe58d9927495ed0d89f9997bf4962a),套件 SHA256 為 `3342051977f6f1b91f2a18acfc224456320264dd67633ed4bc41c8188c9fcdb7`。
- [Microsoft.Extensions.DependencyInjection.Abstractions](https://www.nuget.org/packages/Microsoft.Extensions.DependencyInjection.Abstractions):由 [Microsoft](https://github.com/microsoft) 及其 [貢獻者](https://github.com/dotnet/runtime/graphs/contributors) 於 [.NET Runtime](https://github.com/dotnet/runtime) 儲存庫開發並採用 [**MIT License**](https://github.com/dotnet/runtime/blob/main/LICENSE.TXT) 授權,作為 InputWeave.GameInput 的相依套件,提供相依性插入(Dependency Injection)抽象介面。
- [Microsoft GameInput Redistributable](https://www.nuget.org/packages/Microsoft.GameInput):由 Microsoft 提供,作為選用的 GameInput 執行階段可轉散發套件。正式發佈 ZIP 檔會隨附 `redist/GameInputRedist.msi` 供使用者手動安裝;本應用程式不會自動安裝。手動安裝 `redist/GameInputRedist.msi` 即表示使用者需遵守 [Microsoft.GameInput 授權條款](https://www.nuget.org/packages/Microsoft.GameInput/3.5.278/License);相關授權與 NOTICE 檔案位於 `Licenses/Microsoft.GameInput_LICENSE.txt` 與 `Licenses/Microsoft.GameInput_NOTICE.txt`,且該可轉散發安裝程式不屬於本專案 CC0 授權範圍。

本專案的詳細條款與免責聲明,請參閱隨附之 [**LICENSE**](LICENSE) 文件;發佈檔 `Licenses/` 資料夾內含 `ThirdPartyNotices.txt`(NuGet 套件授權聲明清單)、`InputWeave.GameInput_LICENSE.txt`、`Microsoft.GameInput_LICENSE.txt`、`Microsoft.GameInput_NOTICE.txt`,以及各元件完整授權文字;[Microsoft.GameInput 3.5.270 線上授權頁](https://www.nuget.org/packages/Microsoft.GameInput/3.5.270/License) 另可於 NuGet 查閱。
本專案的詳細條款與免責聲明,請參閱隨附之 [**LICENSE**](LICENSE) 文件;發佈檔 `Licenses/` 資料夾內含 `ThirdPartyNotices.txt`(NuGet 套件授權聲明清單)、`InputWeave.GameInput_LICENSE.txt`、`Microsoft.GameInput_LICENSE.txt`、`Microsoft.GameInput_NOTICE.txt`,以及各元件完整授權文字;[Microsoft.GameInput 3.5.278 線上授權頁](https://www.nuget.org/packages/Microsoft.GameInput/3.5.278/License) 另可於 NuGet 查閱。
1 change: 1 addition & 0 deletions docs/engineering/a11y-safety.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
- 深色中性(未反轉,深色主題)→ `LightBlue` (≥7.2:1 AAA)
- 淺色中性(未反轉,淺色主題)→ `MediumBlue` (8.14:1 AAA)
- **視覺脈衝 (Flash Alert)**:
- **唯一實作**:警示色、每幀配色與動畫節奏集中於 `FlashAlertAnimator`;各視窗只負責套用目標控制項與結束後的視覺還原,不得自行複製脈衝或配色邏輯。
- 頻率:1Hz 平滑正弦波脈衝。
- 基色:固定為焦點反轉底色 (深色用 White,淺色用 Black)。
- **動態 ForeColor 連動**:背景亮度 **L > 0.1791** 時切換文字顏色。
Expand Down
6 changes: 5 additions & 1 deletion docs/engineering/agent-support.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@
## 官方依據與查核日期

- OpenAI(2026-07-30):[`AGENTS.md` custom instructions](https://developers.openai.com/codex/guides/agents-md) 與 [Codex skills](https://developers.openai.com/codex/skills)。
- Claude Code、GitHub Copilot CLI 與 Antigravity CLI 的既有支援策略最後查核於 2026-05-25;若修改對應橋接或支援聲明,須先以各供應商最新官方文件重新查核。
- Anthropic(2026-09-27):[記憶與 `AGENTS.md`](https://code.claude.com/docs/en/memory) 與 [Skills](https://code.claude.com/docs/en/skills)。
- Claude Code 可直接讀取 `AGENTS.md`,但只在工作目錄以上沒有 `CLAUDE.md`、`.claude/CLAUDE.md` 或 `CLAUDE.local.md` 時才會讀取;部分工作階段無法直接讀取。因此保留 `CLAUDE.md` 的 `@AGENTS.md` 匯入,Claude 專屬內容只放在匯入之後;官方確認此寫法不會重複載入。
- Claude Code 只從 `.claude/skills/` 探索 project skill,不讀取 `.agents/skills/`,因此橋接 skill 仍屬必要。
- Skill 遵循 [Agent Skills](https://agentskills.io) 開放標準;`description` 應先寫主要使用情境(與 `when_to_use` 合計約 1,536 字元後截斷)。跨工具共用的權威 skill 只使用標準欄位(`name`、`description`、`license`、`compatibility`、`metadata`、`allowed-tools`),Claude Code 專屬欄位只可放在 `.claude/skills/` 橋接檔。
- GitHub Copilot CLI 與 Antigravity CLI 的既有支援策略最後查核於 2026-05-25;若修改對應橋接或支援聲明,須先以各供應商最新官方文件重新查核。

## Context 維護原則

Expand Down
5 changes: 4 additions & 1 deletion docs/engineering/core-engineering.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,14 @@
- **主題還原**:還原預設配色時應將屬性設為 `Color.Empty`,由 .NET 10 主題引擎自動判斷 (禁:硬式編碼 `SystemColors.Control`)。
- **程式內重啟與前景恢復**:
- **單次啟用標記**:若為本程式主動要求重新啟動,舊執行個體必須先寫入具短時效的一次性啟用標記,供新執行個體在首次顯示時消費;標記必須於讀取後立即清除,避免重複生效。
- **前景授權交接**:呼叫 `Application.Restart()` 前,應先透過 `AllowSetForegroundWindow(...)` 授權新執行個體搶回前景,降低焦點落回前一個視窗的機率。
- **前景授權交接**:由 `RestartProcessLauncher` 自行啟動新執行個體(取代 `Application.Restart()`),並在舊視窗關閉前以 `AllowSetForegroundWindow(新程序 PID)` 只授權該程序搶回前景;不得使用 `ASFW_ANY` 開放給所有程序,僅在無法啟動新程序而退回 `Application.Restart()` 時例外。授權必須在舊視窗仍位於前景時完成,因為控制器操作不會產生 Windows 輸入事件。
- **單一執行個體交接**:舊執行個體以 `--restart-handoff=<舊 PID>` 參數啟動新執行個體,**不得在啟動前釋放** 單一執行個體 Mutex,必須在關閉所有視窗後、`Environment.Exit` 之前於主執行緒明確釋放;新執行個體依 `SingleInstanceHandoff` 規則在主執行緒等待並接手 Mutex(被遺棄的 Mutex 亦視為接手成功),不得喚醒既有實例後退出。交接期間另外啟動的執行個體若喚醒失敗且偵測到重啟請求進行中,必須結束而不得 fallback 另開視窗。退回 `Application.Restart()` 時新執行個體不帶交接參數,才可先釋放 Mutex。
- **全域快速鍵先解除**:新執行個體會在舊視窗關閉前啟動,舊執行個體必須先解除全域快速鍵,避免新執行個體接手後註冊失敗。
- **新執行個體恢復流程**:新視窗啟動後應先走較強的前景還原路徑(例如 `WindowFocusService.RestoreWindowAsync(...)`),再以有限次數重試 `ShowWindow`、`BringWindowToTop`、`SetForegroundWindow`、`Activate()` 與輸入框 `Focus()`;不可只做單次 `Activate()` 後就假設成功。
- **避免錯誤回切**:當重啟是由程式內設定變更觸發時,舊執行個體應避免再把「前一個外部視窗」覆寫為目前狀態,以免新執行個體恢復焦點時誤切回錯誤目標。
- **格式與診斷紀律**:
- **EditorConfig 強制套用**:每次修改任何檔案後,必須遵循專案根目錄 `.editorconfig` 的縮排、編碼、換行與格式設定。
- **C# 診斷清零**:每次修改 `*.cs` 檔案後,提交或回覆前都必須檢查該檔案的 IDE 與 CS 類型診斷,並修正新增的建議、警告與錯誤。
- **`var` 使用原則**:依 [Microsoft C# 編碼慣例](https://learn.microsoft.com/dotnet/csharp/fundamentals/coding-style/coding-conventions#implicitly-typed-local-variables) 與 [.NET Runtime 程式碼風格](https://github.com/dotnet/runtime/blob/main/docs/coding-guidelines/coding-style.md),僅在型別可由右側直接看出(`new`、明確轉型)時使用 `var`,此時亦可使用 target-typed `new()`;內建型別、方法回傳值與 `foreach` 迴圈變數一律使用明確型別,不以方法或變數名稱推測型別;LINQ 匿名型別等必須使用 `var` 的情況除外。對應設定見 `.editorconfig`(IDE0007/IDE0008)。
- **Release 日誌門檻**:正式版預設只寫入 `Warning` 以上;`Info` 僅供 Debug、測試主機或 `INPUTBOX_LOG_LEVEL=Info` 臨時診斷使用。
- **可行動診斷原則**:正常 lifecycle、成功 probe、成功或略過震動、一般輪詢健康資料應維持 `Info`;會影響使用者操作、裝置可用性、API 呼叫失敗或資料修復失敗的訊號才可升級為 `Warning` 或 `Error`。
Loading
Loading