jimmy60504 commited on
Commit
de4f1bc
·
1 Parent(s): fd689ff

feat(task T-20251025-duration-slider-0-30): limit duration slider to 0–30 seconds

Browse files

- UI: change gr.Slider range to 0–30, default 30
- Docs: update spec UI note; add change-log entry

Files changed (3) hide show
  1. app.py +4 -1
  2. change-log.md +19 -0
  3. docs/task.md +68 -47
app.py CHANGED
@@ -1178,7 +1178,10 @@ with gr.Blocks(title="TTSAM 震度預測系統") as demo:
1178
 
1179
  with gr.Row():
1180
  start_slider = gr.Slider(0, 300, value=0, step=1, label="開始時間 (秒)")
1181
- duration_slider = gr.Slider(1, 60, value=30, step=1, label="時間長度 (秒)")
 
 
 
1182
 
1183
  gr.Markdown("### 震央位置")
1184
  with gr.Row():
 
1178
 
1179
  with gr.Row():
1180
  start_slider = gr.Slider(0, 300, value=0, step=1, label="開始時間 (秒)")
1181
+ # 將時間長度滑桿限制為 0–30 秒,與模型固定窗口對齊;小於 30 秒將於尾段 0 填充
1182
+ duration_slider = gr.Slider(0, 30, value=30, step=1, label="時間長度 (秒)")
1183
+ # 說明:模型最多 30 秒;小於 30 秒會自動以 0 填充至 30 秒(3000 samples @ 100 Hz)
1184
+ gr.Markdown("> 模型最多 30 秒;小於 30 秒會自動以 0 填充至 30 秒(3000 samples @ 100 Hz)。")
1185
 
1186
  gr.Markdown("### 震央位置")
1187
  with gr.Row():
change-log.md CHANGED
@@ -37,3 +37,22 @@
37
  - 低;如需回滾,移除新增文檔即可。
38
  - 連結
39
  - Task: T-20251025-docs-workflow(規劃)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  - 低;如需回滾,移除新增文檔即可。
38
  - 連結
39
  - Task: T-20251025-docs-workflow(規劃)
40
+
41
+ ## 2025-10-25 — UI 對齊不變條件:時間長度滑桿改為 0–30 秒
42
+ - Highlights
43
+ - 將 `app.py` 之「時間長度 (秒)」滑桿範圍由 1–60 調整為 0–30(預設 30)。
44
+ - 新增說明文字:模型最多 30 秒;不足 30 秒以 0 填充至 30 秒(100 Hz,共 3000 點)。
45
+ - Spec/契約影響
46
+ - 與 `docs/spec.md` 不變條件一致;無公共行為或 I/O 破壞性變更。
47
+ - 行為或 I/O 變更
48
+ - UI 限制使用者輸入於 0–30 秒;後端行為不變(既有 30 秒窗口與補齊)。
49
+ - 資料/站台檔影響
50
+ - 無。
51
+ - 降級與 Logging
52
+ - 維持原有:duration < 30 秒時記錄 INFO 並 0 填充;其他降級策略不變。
53
+ - 測試與驗收
54
+ - 手動冒煙:duration=0/5/30 均可載入與預測;看到不足 30 秒之補齊 log 與正常輸出。
55
+ - 風險與回滾
56
+ - 低;若需回復,可將滑桿改回 1–60(單行改動)。
57
+ - 連結
58
+ - Task: T-20251025-duration-slider-0-30
docs/task.md CHANGED
@@ -1,21 +1,21 @@
1
- # Task: <在此填寫任務標題>
2
 
3
- - Task ID: T-<YYYYMMDD>-<shortname>
4
  - Owner: <name>
5
- - Date: <YYYY-MM-DD>
6
- - Status: Planning | In Progress | Review | Done
7
 
8
  ## 背景與目標
9
- - 背景:為何需要這個變更?與 `docs/spec.md` 的哪一段相關?
10
- - 目標:本次要達成的使用者價值與交付物(可量化)。
11
- - 不在範圍:明確說明此次不處理的部分,避免 scope creep
12
 
13
  ## 相關文件與位置
14
- - 規格:`docs/spec.md`(若公共行為變更,務必同步更新)
15
- - 主程式:`app.py`
16
- - 即時樣板:`ttsam_realtime.py`
17
- - 站台資料:`station/site_info.csv`, `station/eew_target.csv`
18
- - 其他:<連結到 PR、議題、筆記、外部參考>
19
 
20
  ## 不變條件與約束(對齊 spec 要點)
21
  - 取樣率固定 100 Hz;模型輸入固定 30 秒(3000 samples)。不足 30 秒時尾段 0 填充。
@@ -27,64 +27,85 @@
27
  - `station/site_info.csv` 欄位:Station, Latitude, Longitude, Elevation。
28
  - `station/eew_target.csv` 欄位:station, latitude, longitude, elevation。
29
 
30
- > 若本任務可能影響以上不變條件,請明列風險與必要的 `docs/spec.md` 更新計畫。
31
 
32
  ## 任務拆解(可勾選,可跨對話沿用)
33
- - [ ] 子任務 1:<描述>(變更檔案:`...`)
34
- - 驗收標準:<明確可驗證的條件>
35
- - 測試/冒煙:<如何驗證,輸入/輸出示例>
36
- - [ ] 子任務 2:<描述>(變更檔案:`...`)
37
- - 驗收標準:<...>
38
- - 測試/冒煙:<...>
39
- - [ ] 子任務 3:<描述>(變更檔案:`...`)
40
- - 驗收標準:<...>
41
- - 測試/冒煙:<...>
42
-
43
- > 建議每個子任務都能在 1 小時內完成並可獨立驗收;大型變更請再細分。
 
 
 
 
 
 
 
 
 
44
 
45
  ## 介面與資料形狀變更評估
46
- - UI 影響:是否需要新增/修改警告訊息或欄位?
47
- - I/O shape:輸入/輸出張量或資料欄位是否改變?
48
- - 向後相容:如何保持既有使用者不受影響?若無法,請先更新 `docs/spec.md` 並標註破壞性變更。
49
 
50
  ## 降級與記錄策略
51
- - 可能失敗點:<列出>(例如:Vs30 查詢失敗、缺分量、測站不足等)
52
- - 降級方案:<對應每一種失敗點的替代行為>
53
- - Logging:<關鍵訊息,包含警告/錯誤的字串格式,便於追蹤>
 
 
54
 
55
  ## 測試與驗收
56
- - 單元/整合測試:<若有測試框架,列出測試案例>
57
  - 手動冒煙:
58
- - 啟動方式:`./run_local.sh` 或 `python app.py`(視專案而定)
59
- - 驗收步驟:<步驟 1, 2, 3>
60
- - 預期結果:<清楚描述>
 
 
 
 
 
 
 
61
  - 品質檢查(最低):
62
  - [ ] Build/型別/格式檢查通過
63
- - [ ] 關鍵邊界情境可正確降級並記錄 log
64
- - [ ] 與 `docs/spec.md` 之契約一致
65
 
66
  ## 風險、回滾與後續
67
- - 風險:<列出主要風險與緩解方式>
68
- - 回滾:<若出問題如何快速回復>
69
- - 後續工作:<可選,列出延伸 task>
 
 
 
 
70
 
71
  ## 進度紀錄(跨對話追蹤)
72
- - <YYYY-MM-DD HH:MM>:<進度更新,關鍵決策/PR 連結/驗收結果>
73
 
74
  ---
75
 
76
  附錄 A:Commit 信息模板
77
 
78
  ```
79
- feat(task T-<YYYYMMDD>-<shortname>): <簡述>
80
 
81
- - <子任務/變更點 1>
82
- - <子任務/變更點 2>
83
 
84
- Refs: T-<YYYYMMDD>-<shortname>
85
  ```
86
 
87
  附錄 B:分支/PR 命名
88
- - 分支:`feature/T-<YYYYMMDD>-<shortname>`
89
- - PR 標題:`T-<YYYYMMDD>-<shortname>: <簡述>`
90
-
 
1
+ # Task: 將「時間長度」滑桿限制為 0–30 秒(與模型輸入窗口一致)
2
 
3
+ - Task ID: T-20251025-duration-slider-0-30
4
  - Owner: <name>
5
+ - Date: 2025-10-25
6
+ - Status: Planning
7
 
8
  ## 背景與目標
9
+ - 背景:模型輸入固定為 30 秒(3000 samples @ 100 Hz),超過 30 秒並無實質效益,且小於 30 秒時會於尾段 0 填充。現行 UI 的「時間長度」滑桿範圍為 1–60 秒,與不變條件不一致,可能造成誤解。
10
+ - 目標:將 UI 的「時間長度 (秒)」滑桿範圍調整為 0–30 秒(含 0),與模型契約一致;0 代表完全依賴 0 填充(極端測試/早期秒數)。
11
+ - 不在範圍:不調整「開始時間」滑桿範圍;不改變內部資料管線與模型契約;不新增後端 API
12
 
13
  ## 相關文件與位置
14
+ - 規格:`docs/spec.md`(Section 4, 5, 8)
15
+ - 主程式:`app.py`(Gradio UI:`duration_slider`)
16
+ - 即時樣板:`ttsam_realtime.py`(不需改)
17
+ - 站台資料:`station/site_info.csv`, `station/eew_target.csv`(不需改)
18
+ - 其他:`change-log.md`
19
 
20
  ## 不變條件與約束(對齊 spec 要點)
21
  - 取樣率固定 100 Hz;模型輸入固定 30 秒(3000 samples)。不足 30 秒時尾段 0 填充。
 
27
  - `station/site_info.csv` 欄位:Station, Latitude, Longitude, Elevation。
28
  - `station/eew_target.csv` 欄位:station, latitude, longitude, elevation。
29
 
30
+ > 本任務僅限 UI 範圍,不改動上述契約與流程。
31
 
32
  ## 任務拆解(可勾選,可跨對話沿用)
33
+ - [ ] 子任務 1:調整 UI 滑桿範圍(變更檔案:`app.py`)
34
+ - 將 `duration_slider = gr.Slider(1, 60, value=30, step=1, label="時間長度 (秒)")` 改為 `gr.Slider(0, 30, value=30, step=1, label="時間長度 (秒)")`。
35
+ - 驗收標準:UI 顯示範圍為 0–30;預設值 30;無法選到 31–60;可選 0。
36
+ - 測試/冒煙:啟動 UI,檢查滑桿邊界值(0、30)與步階 1。
37
+ - [ ] 子任務 2:在 UI 增補說明文字(變更檔案:`app.py`)
38
+ - 在滑桿附近新增說明:「模型最多 30 秒;小於 30 秒會自動以 0 填充」。
39
+ - 驗收標準:說明文字出現在參數區域,語意清楚不遮蓋元件。
40
+ - 測試/冒煙:視覺檢查文字呈現;暗色/亮色主題下可讀性良好。
41
+ - [ ] 子任務 3:邊界秒數冒煙測試與 log 檢查(無程式碼變更)
42
+ - 使用 `duration=0, 5, 30` 分別跑「載入波形」與「執行預測」。
43
+ - 驗收標準:
44
+ - UI 不崩潰,能產出地圖與統計;輸入波形圖正常標註選取範圍(0 長度時兩條紅線重合)。
45
+ - Log 出現「時間長度 X 秒 < 30 秒,將以 0 遮罩補齊至 30 秒」訊息(X=0 或 5)。
46
+ - `stats_output` 包含開始/長度/震央資訊、使用測站數、缺分量統計、目標點數、最大震度。
47
+ - [ ] 子任務 4:文件同步與變更摘要(變更檔案:`docs/spec.md`, `change-log.md`)
48
+ - `docs/spec.md` Section 8「調整 UI」補充:時間長度滑桿限制 0–30 秒(與不變條件一致)。
49
+ - `change-log.md` 新增條目:說明 UI 變更與不變條件對齊,無破壞性行為變更。
50
+ - 驗收標準:文件語意清楚;不影響既有契約描述。
51
+
52
+ > 建議每個子任務都能在 1 小時內完成並可獨立驗收。
53
 
54
  ## 介面與資料形狀變更評估
55
+ - UI 影響:僅限滑桿範圍與說明文字;不新增欄位;不移除現有功能。
56
+ - I/O shape:不變。模型仍接收 (1, 25, 3000, 3) 的 waveform 與對應 station/target。
57
+ - 向後相容:是。先前可選擇 >30 秒的行為被 UI 限制,但屬於與契約對齊的矯正;後端早已固定裁切/補齊至 30 秒,故無破壞性變更。
58
 
59
  ## 降級與記錄策略
60
+ - 可能失敗點:無新增失敗點;仍沿用既有的 Vs30 下載失敗、缺分量、測站不足等。
61
+ - 降級方案:
62
+ - duration < 30 秒:尾段 0 填充(現有行為)。
63
+ - 實際震度圖缺失:顯示空白占位並記錄 warning(現有行為)。
64
+ - Logging:維持 `extract_waveforms_from_stream` 對不足 30 秒的 INFO 訊息與缺分量統計。
65
 
66
  ## 測試與驗收
67
+ - 單元/整合測試:本變更屬 UI 層;暫無自動化測試,採手動冒煙。
68
  - 手動冒煙:
69
+ - 啟動方式:
70
+ - `./run_local.sh`(若已設定)或
71
+ - `python app.py`
72
+ - 驗收步驟:
73
+ 1) 確認「時間長度」滑桿範圍為 0–30,預設 30。
74
+ 2) 分別設定 duration=0、5、30,按「📊 載入波形」,檢查波形圖與範圍標註。
75
+ 3) 按「🔮 執行預測」,檢查預測地圖、`stats_output` 文字摘要、log 訊息。
76
+ - 預期結果:
77
+ - 0/5 秒均能正常運作並顯示補齊提示;30 秒顯示完整窗口。
78
+ - 對目標測站分批推論正常,地圖高度為 800px。
79
  - 品質檢查(最低):
80
  - [ ] Build/型別/格式檢查通過
81
+ - [ ] 關鍵邊界情境可正確降級並記錄 log(duration=0,5)
82
+ - [ ] 與 `docs/spec.md` 之契約一致(0–30 秒 UI 約束)
83
 
84
  ## 風險、回滾與後續
85
+ - 風險:
86
+ - 使用者既有習慣可能嘗試 >30 秒,需透過說明文字降低困惑。
87
+ - 回滾:
88
+ - 若需回復,可將滑桿範圍改回 1–60(單一行變更),不影響後端。
89
+ - 後續工作:
90
+ - 視需求新增「快速鍵/按鈕」切換常用窗口(如 5s/10s/20s/30s)。
91
+ - 可考慮將 0–30 秒改為步階 0.5 秒,提供更細控制(需再評估)。
92
 
93
  ## 進度紀錄(跨對話追蹤)
94
+ - 2025-10-25 10:00:建立 task 草案,確認不影響後端契約與流程。
95
 
96
  ---
97
 
98
  附錄 A:Commit 信息模板
99
 
100
  ```
101
+ feat(task T-20251025-duration-slider-0-30): limit duration slider to 0–30 seconds
102
 
103
+ - UI: change gr.Slider range to 0–30, default 30
104
+ - Docs: update spec UI note; add change-log entry
105
 
106
+ Refs: T-20251025-duration-slider-0-30
107
  ```
108
 
109
  附錄 B:分支/PR 命名
110
+ - 分支:`feature/T-20251025-duration-slider-0-30`
111
+ - PR 標題:`T-20251025-duration-slider-0-30: limit duration slider to 0–30 seconds`