feat/reminder-queue
develop
助理算得出哪幾筆到期、哪幾筆逾期,但那些結果只留在監控頁上——人要自己去翻,或自己跑一次狀態查詢。這一批讓每一輪把「要送到人面前」的那幾筆寫成一份佇列檔。
這一張疊在 #40、#41、#42 上面。 讀佇列的那一端在 jsc-hooks 那邊,另一張 PR。
jsc-hooks
讓讀的那一端自己拿 due 欄與 next_run 去跟現在比,就是第二套到期判定,跟這裡那一套遲早對不上,而對不上的那一天兩邊都說自己是對的。
due
next_run
所以佇列的規則很窄:只印、不判。
助理沒在跑的時候佇列不會更新,而一份舊佇列讀起來跟新的一模一樣。
「沒有提醒」與「沒有人算提醒」不可以長得一樣。
同一筆既到期又逾期時只列逾期那一行。 同一批提醒裡出現兩行會被讀成兩件事,而「逾期五天」比「排定點過了」講得更清楚。
「逾期多久」直接取判定那一支算好的寫法。 不在這裡再寫一個時間長度格式化——同一個秒數在兩個地方就會印出兩種說法。
remind
5 天 3 小時
lint-scripts
check-behaviors
check-skill-paths
ste100-lint
助理算得出哪幾筆到期、哪幾筆逾期,但那些結果只留在監控頁上。這一批讓 每一輪把「要送到人面前」的那幾筆寫成一份佇列檔,位置固定在助理狀態目錄 底下,讀的那一端只印、不判。 判定不放在讀的那一邊,理由是漂移:讓讀的人自己拿 due 欄與 next_run 去跟 現在比,就是第二套到期判定,跟這裡那一套遲早對不上,而對不上的那一天 兩邊都說自己是對的。 這樣換來一個新的失效模式,所以檔頭寫足四個值:輪次代號、UTC 時間戳、 連續失敗筆數、待辦總筆數,再加同一刻的 epoch 秒。助理沒在跑的時候佇列 不會更新,而一份舊佇列讀起來跟新的一模一樣——讀的那一端要算得出它多舊, 「沒有提醒」與「沒有人算提醒」不可以長得一樣。epoch 是為了讓讀的那一端 不必自己解 ISO 字串:那等於在每一個讀取端各放一份日期解析。 同一筆待辦既到期又逾期時只列逾期那一行。同一批提醒裡出現兩行會被讀成 兩件事,而「逾期五天」比「排定點過了」講得更清楚。 逾期那幾行的「逾期多久」直接取判定那一支算好的寫法,不在這裡再寫一個 時間長度格式化——同一個秒數在兩個地方就會印出兩種說法。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
No dependencies set.
The note is not visible to the blocked user.
這一批做什麼
助理算得出哪幾筆到期、哪幾筆逾期,但那些結果只留在監控頁上——人要自己去翻,或自己跑一次狀態查詢。這一批讓每一輪把「要送到人面前」的那幾筆寫成一份佇列檔。
這一張疊在 #40、#41、#42 上面。 讀佇列的那一端在
jsc-hooks那邊,另一張 PR。判定留在這裡,佇列只是輸出
讓讀的那一端自己拿
due欄與next_run去跟現在比,就是第二套到期判定,跟這裡那一套遲早對不上,而對不上的那一天兩邊都說自己是對的。所以佇列的規則很窄:只印、不判。
換來一個新的失效模式,所以檔頭寫足
助理沒在跑的時候佇列不會更新,而一份舊佇列讀起來跟新的一模一樣。
「沒有提醒」與「沒有人算提醒」不可以長得一樣。
兩個小決定
同一筆既到期又逾期時只列逾期那一行。 同一批提醒裡出現兩行會被讀成兩件事,而「逾期五天」比「排定點過了」講得更清楚。
「逾期多久」直接取判定那一支算好的寫法。 不在這裡再寫一個時間長度格式化——同一個秒數在兩個地方就會印出兩種說法。
實測
remind那一行被濾掉5 天 3 小時,與判定那一支印的字串相同lint-scripts、check-behaviors、check-skill-paths、ste100-lint全 0