fix(assistant): 提醒佇列把內建項標成另一種列

實測踩到:這台機器的佇列八筆全是委派清單種入的內建項,動作是只提醒、
還沒有執行入口,所以每一輪都到期。於是每一個工作階段開頭固定吐八行
一模一樣的東西。

那不是提醒,是噪音——而讀佇列那一支自己的註解裡就寫著「對著一個刻意的
決定每個工作階段催一次,那是噪音不是提醒」。這一批就犯了那一條,只是
換成另一種來源。

分法照該有的處置切:使用者自己登錄的那一筆,人看到就做得了;內建項那
幾筆等的是接線,不是人。所以佇列的第一欄多一種值 builtin,讀的那一端
把前兩種逐筆點名、第三種收成一行總數。

種類在這一邊判,不在讀的那一邊:spec_key 只有這裡讀得到,而讀的那一端
的規則是只印不判。收尾多印一個 reminders_builtin=。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-07 13:39:45 +08:00
co-authored by Claude Opus 5
parent 404cf8f4fd
commit 61f4a2dbc7
6 changed files with 37 additions and 10 deletions
+31 -4
View File
@@ -149,7 +149,8 @@
# 時,原因只寫在這裡
# tasks_total= tasks_failing= 待辦簿筆數與連續失敗筆數,供目錄頁那一個區塊與摘要用
# tasks_overdue= 逾期筆數(截止時間已經過了),取自到期判定那一支;判不出來時是減號
# reminders= reminders_file= 提醒佇列的筆數與路徑。工作階段開始那一支 hook 讀它
# reminders= reminders_builtin= reminders_file= 提醒佇列逐筆點名的筆數、只算總數的內建項
# 筆數,與佇列路徑。工作階段開始那一支 hook 讀它
# tasks_due= 本輪到期的筆數;到期判定那一支失敗時為空
# events_new= 本輪偵測到的新事件種類數;到期判定那一支失敗時為空
# due_status= due_rc= 到期判定那一支的結果與結束碼
@@ -214,6 +215,7 @@ DUE_EVENTS=''
DUE_OVERDUE=''
FAILING_LINES=''
REMINDERS=0
REMINDERS_BUILTIN=0
REMINDERS_FILE=''
# 這支腳本是不是從 $JSC_HOME/current 那一組路徑被叫起來的。不是就大聲警告,但照跑。
@@ -943,19 +945,43 @@ write_reminders() {
printf 'overdue\t%s\t%s\t%s\n' "$_oi" "${_oh:--}" "${_ot:--}"
done
fi
# 內建項的識別碼,一行一個。分兩種列要靠它:帶 spec_key 的那幾筆是依委派清單種入的,
# 使用者一筆都沒交辦過。
_specids="$RD/spec-ids"
: >"$_specids"
for _tf in "$STATE_DIR/tasks"/*; do
[ -f "$_tf" ] || continue
_sk=$(sed -n 's/^spec_key=//p' "$_tf" 2>/dev/null | head -n1)
[ -n "$_sk" ] || continue
_tid=$(sed -n 's/^id=//p' "$_tf" 2>/dev/null | head -n1)
[ -n "$_tid" ] || _tid=$(basename -- "$_tf")
printf '%s\n' "$_tid" >>"$_specids"
done
# 只提醒型而且到期的那幾筆。指令型不進佇列:它們由執行那一支真的跑掉了,人不必接手。
# 已經以逾期身分列過的那幾筆不再列第二次:同一筆待辦在同一批提醒裡出現兩行,讀的人會
# 當成兩件事,而且「逾期五天」比「排定點過了」講得更清楚——留強的那一行就好。
#
# 內建項與使用者交辦的分成兩種列,理由是它們該有的處置不一樣。
# 使用者自己登錄的那一筆,人看到就做得了;內建項那幾筆等的是接線不是人——動作是
# 「只提醒」的內建項,到現在還沒有任何執行入口,所以每一輪都到期、每一輪都一樣。
# 實測踩到:這台機器八筆全是那一種,於是每一個工作階段開頭固定吐八行一模一樣的東西。
# 那不是提醒,是噪音;而讀的那一端只印不判,分不出兩者,所以在這裡就把種類標好。
if [ -n "$DUE_ROWS" ] && [ -f "$DUE_ROWS" ]; then
awk -F'\t' -v idf="$_ovids" '
BEGIN { while ((getline _l < idf) > 0) seen[_l] = 1 }
awk -F'\t' -v idf="$_ovids" -v sidf="$_specids" '
BEGIN {
while ((getline _l < idf) > 0) seen[_l] = 1
while ((getline _s < sidf) > 0) spec[_s] = 1
}
NF >= 12 && $1 != "" && $2 == "due" && $5 == "remind" && !($1 in seen) {
printf "remind\t%s\t%s\t%s\n", $1, ($10 == "" ? "-" : $10), ($11 == "" ? "-" : $11)
printf "%s\t%s\t%s\t%s\n", ($1 in spec ? "builtin" : "remind"), \
$1, ($10 == "" ? "-" : $10), ($11 == "" ? "-" : $11)
}' "$DUE_ROWS" 2>/dev/null
fi
} >"$_rt" 2>/dev/null || { add_warn '提醒佇列寫不出來'; rm -f "$_rt"; return 0; }
if mv "$_rt" "$REMINDERS_FILE" 2>/dev/null; then
# 兩個數字分開算:逐筆點名的那幾筆,與只算一個總數的內建項。
REMINDERS=$(awk -F'\t' '$1 == "remind" || $1 == "overdue" { n++ } END { print n + 0 }' "$REMINDERS_FILE")
REMINDERS_BUILTIN=$(awk -F'\t' '$1 == "builtin" { n++ } END { print n + 0 }' "$REMINDERS_FILE")
else
add_warn '提醒佇列換不上去'
rm -f "$_rt"
@@ -1260,6 +1286,7 @@ case "$CMD" in
printf 'tasks_due=%s\n' "$DUE_TASKS"
printf 'tasks_overdue=%s\n' "${DUE_OVERDUE:--}"
printf 'reminders=%s\n' "$REMINDERS"
printf 'reminders_builtin=%s\n' "$REMINDERS_BUILTIN"
printf 'reminders_file=%s\n' "$REMINDERS_FILE"
printf 'events_new=%s\n' "$DUE_EVENTS"
printf 'due_status=%s\n' "$DUE_STATUS"