### 2026-08-31
### 20:10 預設值調整八項(py 內建 INI_META 與 ini_template.json 同步)
- ERR_SCAN_SEC 300→10(選項補 10|預設;注意 agent SMB 連線常駐佔 S001 20 條上限風險)、FlushDelay 0→33(30fps)、FILE_XFER 0→1、background y→n、box_type 2→4、OpenDbfWait 0→0.01(選項補 0.01|預設)。
- user_box_type 本來就是 true、LOC_EXE 本來就與 LOC_SYS 同動態規則(master C:/STK/{st}、ws w:/{st}),未動。
- Build_Deploy_INI_Editor.bat 重建部署至 E:/update/update/toAWI_Home/tools(exe+json)。驗收通過。

 INI_EDITOR 更新記錄 (UpdateList)

> 本檔為 **INI_EDITOR 專屬**的連續更新記錄。以往 INI_EDITOR 的變更散落在 HBSTK 共用 UpdateList.md
> 與零星 PDF,難以單獨追蹤;自 2026-07-16 起,INI_EDITOR 的每次修改一律記到本檔。

---

## 基本資訊

| 項目 | 內容 |
|------|------|
| 原始碼 | `E:\ConvertFW\HBSTK\build\ini_editor.py` (Python / Tkinter,~2689 行) |
| 打包 spec | `E:\ConvertFW\HBSTK\build\INI_Editor.spec` (PyInstaller) |
| 產出 exe | `E:\ConvertFW\HBSTK\build\dist\INI_Editor.exe` |
| 外部模板 | `ini_template.json` (預設值/schema 外部化,exe 同層) |
| 部署目標 | `HBSTK/build/dist/`、`update_server/update_pack/TOOLS/INI_Editor.exe`、各站 |
| 用途 | 編輯各工作站 System.ini / stk.ini / stk_agent.ini;跨站 schema 同步;補齊缺漏 KEY |
| 定位 | 標題註明「僅限 SERVER(S001) 使用」 |

### 建置 / 部署
1. 改 `ini_editor.py`(UTF-8) 或 `ini_template.json`
2. PyInstaller 依 `INI_Editor.spec` 重建 exe
3. 部署 exe 到 `dist/` 與 `update_server/update_pack/TOOLS/`,並同步 `ini_template.json`
4. ★注意:`.py` 改後若沒重建 exe,部署端跑的是舊版(2026-07-16 觀察到 exe 06-27 比 .py 07-13 舊)

### 記錄格式(往後每次修改)
- 標題:`### HH:MM 功能/修正名稱`(最新在上)
- 內容:問題、解決方法、踩坑、修改函式/行、是否已重建 exe
- 對應內部版本標記(v39/v47…)也一併註明

---

## 待修問題清單 (更新於 2026-07-16 18:20)

1. **[F 調查中] 客戶 stk.ini 的 PATH 被改成開發機路徑 E:\CONVERTFW\900\...**:
   非 INI_EDITOR 預設(template 是 C:\STK\{st} / w:\{st});正好等於本開發機 stk.ini
   →疑似部署把開發機 stk.ini 推送到各站。需客戶被改的 stk.ini + 旁邊 .bak 對照確認來源
   (uploader/UpdStk/setmerge 打包清單也要查)。
2. **[次要] add_key 編碼 fallback**:encode 失敗退 `ascii errors='replace'`,中文 KEY/值會變 ?(建議改成報錯)。

---

## 更新歷史 (往回追溯,以程式內版本標記與既有文件重建)

### 2026-07-16 18:20 資料安全大修:七項防呆一次到位(客戶端 INI 被莫名改/消失/重複 KEY)
- **症狀**:A 沒改就說很多KEY被改 / B KEY被莫名大批改 / C INI檔整個消失 / D 同KEY重複 / E 僅S001有備份。
- **修正內容**(ini_editor.py,備份 .bak_datasafe_20260716_1720):
  1. **[C] save() 資料安全加固**:拒絕寫入空內容;失敗「絕不刪 .tmp_save」(留新內容當救援檔,原本 except 刪 tmp 是 INI 整檔消失根因);寫後驗證存在且非空;備份檔名加秒(原到分,同分鐘第二次存會蓋掉備份);備份輪替保留最近10份(只清 .bak_YYYYMMDD_HHMMSS 格式,不動 .bak_autosync_*)。
  2. **[A,B] 載入不再污染**:_on_ini_change 原本載入就自動 dedupe+補齊 schema 預設 key 並標 modified=True→切站彈「要先儲存嗎?」按是=把沒改過的預設寫進檔案。改「只偵測、不改動」:載入後記憶體=磁碟原樣,狀態列顯示「重複N行(存檔時自動清)/缺N個key(按補齊鈕)」,modified 一律 False。
  3. **[A] 存檔假變更修正**:_on_save 比對前雙邊 strip,顯示層空白正規化不再誤判為「已改」。
  4. **[B] 跨站同步三重防呆**:啟動不再自動跑(移除 after(200,_run_startup_sync)),改工具列「跨站同步…」鈕手動觸發;SYNC_REMOVE 改白名單制(SYNC_REMOVE_WHITELIST,預設空=非 schema key 一律不動,不再大批誤刪);預覽對話框預設全不勾選(opt-in)。
  5. **[B] widget 複合鍵**:self.widgets 原以 key 為索引,同名 key 在多 section 共用同一輸入框→存檔交叉污染。改 section+"\x00"+key 複合鍵,每個 (section,key) 獨立 widget;_on_save/_key_diff/重置鈕/trace 全面同步;原「widget collision」警告改為「大小寫變體重複」偵測警告(不自動合併,避免動到 STK32 case-sensitive 讀取的那個)。
  6. **[D] 寫入防重複**:set_value/add_key 比對改不分大小寫(set_value 保留檔案原 KEY 大小寫只更新值;add_key 任何大小寫變體已存在就拒絕)→杜絕 DEBUG_LOG/Debug_Log 並存誕生;save() 前自動 dedupe(清外部程式塞入的完全相同重複,first-wins 對齊 STK32)。
  7. **[E] 審計 log**:新增 _audit_log()(exe 同層 ini_editor_audit.log),save/EDIT(含改了哪些key舊值→新值)/SYNC/失敗 全記錄;apply_station_diffs 備份時戳也加秒。
- **測試**:headless 單元測試 11 項全過(set_value/add_key 大小寫、拒寫空、自動去重 first-wins、備份含秒、輪替留10份且不動 autosync、大小寫變體不被誤刪、寫後內容正確)。
- **重建部署**:32-bit PyInstaller 重建 INI_Editor.exe(18:20)→ dist/ + update_server/update_pack/TOOLS/;ini_template.json 三處 md5 一致未動。
- **注意**:dedupe 維持 key 區分大小寫(對齊 STK32 GetIniValue first-wins);大小寫變體只警告不自動合併。


### 2026-06-05 (詳見 PDF) INI_EDITOR 預設模板外部化 + 動態預設
- ini_template.json 外部化疊加到 INI_META;resolve_default 動態(dyn=path/station/kmsn_bat 依站別/路徑/KMSN 算);dedupe 保留第一個;三 BUG(UTF-8 BOM 害 section 解析、切站 trace 累積、FontMap ASCII 降級)。
- 文件:HBSTK/doc/INI_EDITOR預設模板外部化與動態預設_20260605.pdf、INI_EDITOR三大BUG修復_20260605.pdf

### 程式內版本標記(節錄,無獨立日期)
- **v39**:存檔 atomic write(.tmp→os.replace)+保留原行尾(LF/CRLF/CR);add_key 防完全相同重複、優先取消註解 `; [Section]` 不建重複標頭;set_value 嚴格編碼(BIG5 不能編就報錯不靜默替換);widget 衝突偵測。
- **v43**:字型清單精簡為常用 5 種(原 13,移除 CE/CYR/Greek/TUR/Baltic)。
- **v47**:DEBUG_LOG 從 STK_INI_KEYS 移到 SYSTEM_INI_KEYS(改由 System.ini 控管 Stk32+PrnAsk log)。
- **v52**:標題加註「僅限 SERVER(S001) 使用」+顯示 EXE build 時間(mtime)。

> 註:v39 的 atomic-write except 刪 tmp 行為,即為上方待修問題 1 的根因;v39 dedupe/add_key 的 case-sensitive 比對即待修問題 3 的根因。
