[總管交辦] WEBHOOKS KV 退休 PR:拆雙寫/fallback/list-union + 移 binding(資料已全在 KBDB) #17

Open
opened 2026-07-07 04:33:00 +00:00 by Leo · 4 comments
Owner

[總管] 依 leo 徹查令(2026-07-07)+ 2026-07-06 釘死政策交辦,cloud-doable。

背景

WEBHOOKS KV 的資料 2026-07-06 已確認全數在 KBDB(workflow-store),只差退休 PR。⚠️ 前次盤點發現 WEBHOOKS 有 3 個消費者(不只 workflow 定義)——動工第一步先重新確認這 3 個消費者是誰、各自讀寫什麼,別只拆 workflow 那條。

任務

  1. 確認 3 個消費者的讀寫面(列清單附 code 位置)。
  2. PR:拆 cypher 對 WEBHOOKS 的雙寫/fallback/list-union,全部改走 KBDB。
  3. 移除每顆 wrangler.toml 的 WEBHOOKS binding。
  4. 驗證:POST /webhooks/named/{ns}/{name}/trigger 真端點 curl(如 notify_leo)仍通。

B 類平台維護 → PR + 總管 review → gated 部署 leo21c → leo dashboard 刪 WEBHOOKS namespace(不可逆,人閘)=第一顆真的能刪掉的 KV

關聯

#14(CREDENTIALS_KV)、RECIPES→KBDB(另張 issue)。

[總管] 依 leo 徹查令(2026-07-07)+ 2026-07-06 釘死政策交辦,cloud-doable。 ## 背景 WEBHOOKS KV 的資料 2026-07-06 已確認全數在 KBDB(workflow-store),只差退休 PR。⚠️ 前次盤點發現 **WEBHOOKS 有 3 個消費者**(不只 workflow 定義)——動工第一步先重新確認這 3 個消費者是誰、各自讀寫什麼,別只拆 workflow 那條。 ## 任務 1. 確認 3 個消費者的讀寫面(列清單附 code 位置)。 2. PR:拆 cypher 對 WEBHOOKS 的雙寫/fallback/list-union,全部改走 KBDB。 3. 移除每顆 wrangler.toml 的 WEBHOOKS binding。 4. 驗證:`POST /webhooks/named/{ns}/{name}/trigger` 真端點 curl(如 notify_leo)仍通。 ## 閘 B 類平台維護 → PR + 總管 review → gated 部署 leo21c → **leo dashboard 刪 WEBHOOKS namespace(不可逆,人閘)=第一顆真的能刪掉的 KV**。 ## 關聯 #14(CREDENTIALS_KV)、RECIPES→KBDB(另張 issue)。
Leo added the
s
backlog
label 2026-08-09 13:09:50 +00:00
Author
Owner

[總管·票務複驗 2026-08-09 晚] 仍然成立——用今天真的出貨到用戶手上的那顆 worker 反證,不是讀原始碼推測。

2026-08-09 出貨的 arcrun-rag 1.4.29(bundle manifest,source: Arcrun@19c82df),
裡面 arcrun-cypher-executor 這顆 worker 宣告它必須綁這些 KV 才跑得起來:

arcrun-cypher-executor -> requires.kv = [
  EXEC_CONTEXT, WEBHOOKS, CREDENTIALS_KV, ANALYTICS_KV, RECIPES, USERS_KV, SESSIONS_KV
]

對照這四張票要退休的東西:

  • #14 退休 CREDENTIALS_KV還在 requires 裡
  • #16 RECIPES KV → KBDB → 還在
  • #17 WEBHOOKS KV 退休 → 還在
  • #2 credential KV → D1 + Secrets Store → KV 那頭沒拆

⇒ 四張全部仍存在,而且不是「程式碼裡還有殘跡」這種軟證據——
  是今天新裝的用戶會被要求綁這些 KV,它們活在出貨路徑上。

📌 我把狀態標成 s/backlog(已驗過、確定要做、還沒排進任何 sprint)。
  這是保守的預設值,不是我對優先序的判斷——這個 repo 的 37 張票原本一張標籤都沒有,
  等於在看板上不存在。要往上排的請直接改標,不必回頭問我。

[總管·票務複驗 2026-08-09 晚] **仍然成立**——用今天真的出貨到用戶手上的那顆 worker 反證,不是讀原始碼推測。 2026-08-09 出貨的 `arcrun-rag` 1.4.29(bundle manifest,`source: Arcrun@19c82df`), 裡面 `arcrun-cypher-executor` 這顆 worker 宣告它**必須**綁這些 KV 才跑得起來: ``` arcrun-cypher-executor -> requires.kv = [ EXEC_CONTEXT, WEBHOOKS, CREDENTIALS_KV, ANALYTICS_KV, RECIPES, USERS_KV, SESSIONS_KV ] ``` 對照這四張票要退休的東西: - `#14` 退休 `CREDENTIALS_KV` → **還在 requires 裡** - `#16` `RECIPES` KV → KBDB → **還在** - `#17` `WEBHOOKS` KV 退休 → **還在** - `#2` credential KV → D1 + Secrets Store → **KV 那頭沒拆** ⇒ 四張全部**仍存在**,而且不是「程式碼裡還有殘跡」這種軟證據——   是**今天新裝的用戶會被要求綁這些 KV**,它們活在出貨路徑上。 📌 我把狀態標成 `s/backlog`(已驗過、確定要做、還沒排進任何 sprint)。   這是**保守的預設值,不是我對優先序的判斷**——這個 repo 的 37 張票原本一張標籤都沒有,   等於在看板上不存在。要往上排的請直接改標,不必回頭問我。
Author
Owner

🔴 2026-08-12:這筆債今天出事了,而且系統還在繼續加碼

leo 今天問:「對 KV 的使用有禁令,但卻會把資產放在這裡,這不是違法嗎?

答案是。而且不只是舊帳:

① 禁令與票都在,五個星期沒動

2026-07 的政策(status-archive-2026-07.md:1127):

KV 只留短效/暫存⋯⋯長效資料(credential 目錄、recipe、triplet)一律 KBDB/新家,
不得為閃避 KBDB 塞 KV。要退的:WEBHOOKSCREDENTIALS_KVRECIPES(+USERS_KV

本張與 Arcrun#17#16 就是那次交辦,至今 open

② 系統今天還在往 KV 寫

2026-08-12 的一次 update,那句「重新 seed recipe」又往 KV 寫了 11 個 recipe + 26 個 auth_recipe
⇒ 這不是「存量待遷」,是現行程式碼每次執行都在製造新的存量

③ 今天付了利息(Leo/Arcrun#97

一次更新把 worker 重綁到另一組 KV,leo 當下看到的是:
工作流一支都沒有、portal 登出、80 把 recipe 解不出來。

資料沒掉(在原本那幾顆裡),但從他的角度就是「我的東西不見了」

🔴 如果這兩樣早就在 KBDB,那次重綁一支都不會少。
會消失的只有 session 與執行上下文——而那兩樣本來就該可以消失。

判準(leo 今天給的,比原本的政策更好用)

這東西掉了,使用者要不要重做一次? 要 → 它就不是暫存。
(session 掉了=重登入,不算重做;工作流掉了=要重寫,那就是。)

這一則的用途

不是催進度,是把代價釘在票上——這張票躺著的期間,
它保護的東西真的出事了一次。下一個接手的人要看得到這件事。

## 🔴 2026-08-12:這筆債今天出事了,而且系統還在繼續加碼 leo 今天問:「**對 KV 的使用有禁令,但卻會把資產放在這裡,這不是違法嗎?**」 答案是**是**。而且不只是舊帳: ### ① 禁令與票都在,五個星期沒動 2026-07 的政策(`status-archive-2026-07.md:1127`): > KV **只留短效/暫存**⋯⋯長效資料(credential 目錄、recipe、triplet)一律 KBDB/新家, > **不得為閃避 KBDB 塞 KV**。要退的:`WEBHOOKS`/`CREDENTIALS_KV`/`RECIPES`(+`USERS_KV`) 本張與 `Arcrun#17`/`#16` 就是那次交辦,**至今 open**。 ### ② 系統今天還在往 KV 寫 2026-08-12 的一次 `update`,那句「重新 seed recipe」**又往 KV 寫了 11 個 recipe + 26 個 auth_recipe**。 ⇒ 這不是「存量待遷」,是**現行程式碼每次執行都在製造新的存量**。 ### ③ 今天付了利息(`Leo/Arcrun#97`) 一次更新把 worker 重綁到另一組 KV,leo 當下看到的是: **工作流一支都沒有、portal 登出、80 把 recipe 解不出來。** 資料沒掉(在原本那幾顆裡),但**從他的角度就是「我的東西不見了」**。 🔴 **如果這兩樣早就在 KBDB,那次重綁一支都不會少。** 會消失的只有 session 與執行上下文——而那兩樣本來就該可以消失。 ### 判準(leo 今天給的,比原本的政策更好用) **這東西掉了,使用者要不要重做一次?** 要 → 它就不是暫存。 (session 掉了=重登入,不算重做;工作流掉了=要重寫,那就是。) ### 這一則的用途 不是催進度,是把**代價**釘在票上——這張票躺著的期間, 它保護的東西真的出事了一次。下一個接手的人要看得到這件事。
Author
Owner

🔴 leo 2026-08-12 把這張票的層級拉高了:這不是技術債,是產品能不能成立

「現在是我幫他寫工作流,未來是他的 AI 自己寫工作流
如果零件和工作流的 recipe 不見了,是很可怕的事情。」

為什麼比「客戶資產遺失」更嚴重

今天(leo 自己寫) 未來(用戶的 AI 自己寫)
不見了,他知道少了什麼嗎 知道——他寫的 不知道。他從沒看過那些東西存在過
他能重做嗎 能,重寫一次 不能,他不知道要重做什麼
他會怎麼描述這件事 「我的工作流不見了」 「這系統怎麼突然變笨了」
他會回報嗎 不會——他沒有東西可以回報

⇒ 對那個用戶而言,這不是「資料遺失」,是他的系統無聲退化
無法描述、無法回報、無法自救,而我們這邊看到的只有「用戶流失」。

這改變了什麼

原本這張票的理由是「長效資料不該放 KV」——一條規約。
現在的理由是:AI 自主生成的東西,使用者沒有心智備份。

系統替使用者累積的能力,保存責任 100% 在系統這一側——
使用者沒有「我記得我有裝過什麼」這個安全網。這條在人寫的世界裡有,在 AI 寫的世界裡沒有。

⇒ 而 2026-08-12 已經真的發生一次(Leo/Arcrun#97):一次例行更新,
工作流全部從視野裡消失。那次是 leo,他看得懂、也查得出來。換成用戶就是無聲的。

因此判準要更嚴

不只是「掉了要不要重做」,還要加一條:
這東西是誰產生的?如果是系統/AI 替使用者產生的,那它的保存標準要比使用者自己輸入的更高
——因為使用者連「它存在過」都不知道。

## 🔴 leo 2026-08-12 把這張票的層級拉高了:這不是技術債,是產品能不能成立 > 「現在是我幫他寫工作流,**未來是他的 AI 自己寫工作流**, > 如果零件和工作流的 recipe 不見了,**是很可怕的事情**。」 ### 為什麼比「客戶資產遺失」更嚴重 | | 今天(leo 自己寫) | 未來(用戶的 AI 自己寫) | |---|---|---| | 不見了,他知道少了什麼嗎 | 知道——他寫的 | **不知道。他從沒看過那些東西存在過** | | 他能重做嗎 | 能,重寫一次 | **不能,他不知道要重做什麼** | | 他會怎麼描述這件事 | 「我的工作流不見了」 | 「這系統怎麼突然變笨了」 | | 他會回報嗎 | 會 | **不會——他沒有東西可以回報** | ⇒ 對那個用戶而言,這不是「資料遺失」,是**他的系統無聲退化**: 無法描述、無法回報、無法自救,而我們這邊看到的只有「用戶流失」。 ### 這改變了什麼 原本這張票的理由是「長效資料不該放 KV」——一條規約。 現在的理由是:**AI 自主生成的東西,使用者沒有心智備份。** 系統替使用者累積的能力,**保存責任 100% 在系統這一側**—— 使用者沒有「我記得我有裝過什麼」這個安全網。這條在人寫的世界裡有,在 AI 寫的世界裡沒有。 ⇒ 而 2026-08-12 已經真的發生一次(`Leo/Arcrun#97`):一次例行更新, 工作流全部從視野裡消失。那次是 leo,他看得懂、也查得出來。**換成用戶就是無聲的。** ### 因此判準要更嚴 不只是「掉了要不要重做」,還要加一條: **這東西是誰產生的?如果是系統/AI 替使用者產生的,那它的保存標準要比使用者自己輸入的更高** ——因為使用者連「它存在過」都不知道。
Author
Owner

📐 leo 2026-08-12 給了目標形狀,不必再討論「要不要另外設計一套」

「我要的是寫進 KBDB,不是 KV。他的 Recipes、Cypher 是一段話,文字,數據,一個 entry。」

這句話收掉的模糊空間

搬家最容易走歪的地方是「recipe 是基礎設施設定,所以要有專屬的存法」——
不是。recipe 就是一段文字/一份資料,一筆 entry 就是它的家。
工作流(cypher)同理。

⇒ 不新增表、不新增機制、不發明第二種存法(D38:KBDB 三張表打天下,
新型別=seed 一列 template,同 0003_library_map.sql0004_execution_log_template.sql 的手法)。

為什麼這個定位一開始就該是對的

它們本來就符合「使用者的內容」的每一個特徵:可以被搜尋、可以被列出、
可以被分享、丟了要重寫
。會被放進 KV,是因為當初把它們當成「系統設定」而不是「他的東西」。

判斷一樣東西住哪裡,看的是它對使用者是什麼,不是它對系統是什麼。

連帶好處(不是附加價值,是這個定位本來就該有的)

  • 進了 KBDB 就自然搜得到——AI 之後要找「有沒有現成的 recipe 可用」不必另接一套查詢
  • 一次重綁資源不會讓它們從視野裡消失(Leo/Arcrun#97 今天實撞)
  • 未來使用者的 AI 自己寫的工作流,跟他自己寫的知識住在同一個地方、同一套備份、同一套權限

給接手的人

目標形狀已經定了,不必再開設計討論。要問的只剩「怎麼搬既有的、怎麼讓舊路徑無縫」——
那是遷移題,不是設計題。

## 📐 leo 2026-08-12 給了目標形狀,不必再討論「要不要另外設計一套」 > 「我要的是**寫進 KBDB**,不是 KV。他的 **Recipes、Cypher 是一段話,文字,數據,一個 entry**。」 ### 這句話收掉的模糊空間 搬家最容易走歪的地方是「recipe 是基礎設施設定,所以要有專屬的存法」—— 不是。**recipe 就是一段文字/一份資料,一筆 entry 就是它的家。** 工作流(cypher)同理。 ⇒ 不新增表、不新增機制、不發明第二種存法(D38:KBDB 三張表打天下, 新型別=seed 一列 template,同 `0003_library_map.sql`/`0004_execution_log_template.sql` 的手法)。 ### 為什麼這個定位一開始就該是對的 它們本來就符合「使用者的內容」的每一個特徵:**可以被搜尋、可以被列出、 可以被分享、丟了要重寫**。會被放進 KV,是因為當初把它們當成「系統設定」而不是「他的東西」。 ⇒ **判斷一樣東西住哪裡,看的是它對使用者是什麼,不是它對系統是什麼。** ### 連帶好處(不是附加價值,是這個定位本來就該有的) - 進了 KBDB 就自然**搜得到**——AI 之後要找「有沒有現成的 recipe 可用」不必另接一套查詢 - 一次重綁資源不會讓它們從視野裡消失(`Leo/Arcrun#97` 今天實撞) - 未來使用者的 AI 自己寫的工作流,跟他自己寫的知識**住在同一個地方、同一套備份、同一套權限** ### 給接手的人 目標形狀已經定了,不必再開設計討論。要問的只剩「怎麼搬既有的、怎麼讓舊路徑無縫」—— 那是遷移題,不是設計題。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Leo/Arcrun#17