[總管交辦] 新零件:crypto 家族(hash/hmac/uuid/random/sign)——AI 不該每次自幹加密 #76

Open
opened 2026-07-31 08:29:35 +00:00 by Leo · 2 comments
Owner

缺口

AI 每次都要自幹加密/雜湊/UUID —— 這正是「零件該有卻沒有、於是退回寫 code」的典型(腹語術入口)。

leo 2026-08-01 指出,對照 n8n Crypto 節點

實測(2026-08-01,prod 實例逐顆查 /cypher/search

crypto / hash / uuid / sha256_hash / hmac / base64_encode / random_id
→ 全部 not_found

現有 20 顆零件(registry/components/沒有任何加密、雜湊、編碼能力
array_ops・auth_oauth2・auth_service_account・auth_static_key・claude_api・code・cron・
date_ops・filter・foreach_control・http_request・if_control・merge・number_ops・set・
string_ops・switch・try_catch・validate_json・wait

建議能力(對照 n8n Crypto,取 Workers 環境做得到的)

動作 說明 Workers 可行性
hash MD5/SHA-1/SHA-256/SHA-384/SHA-512,輸出 hex/base64 WebCrypto crypto.subtle.digest
hmac 同上演算法 + secret key crypto.subtle.sign('HMAC')
uuid 產生 UUID v4 crypto.randomUUID()
random 指定長度隨機字串(hex/base64/ascii) crypto.getRandomValues
sign 以私鑰簽章(RSA/ECDSA) crypto.subtle.sign (金鑰走 credential)
encrypt/decrypt 對稱加解密 ⚠️ 第二階段再評估(金鑰管理牽涉 D36)

leo 特別點名的用法:「把整段文字加指紋」(內容 hash → 去重/變更偵測),這正是 RAG 管線常用的。

紅線

  • 金鑰只准拿名字(D36):hmac/sign 的 key 一律 {{credential.<名字>}},執行前回填,不得寫進定義
  • 零件走 PR(add_new_wasm_component skill),不是 recipe——這是計算原語不是外部 API

服務哪條 CP

頂層 CP arcrun-usable 步驟 5「AI 能補全缺的部分(不必寫 code)」:
缺件分型指路已會說「這是計算原語→投稿零件 PR」,但該有的原語本身要補齊
否則 AI 照指示投稿的成本遠高於直接寫 code ⇒ 實務上還是會退回腹語術。

## 缺口 **AI 每次都要自幹加密/雜湊/UUID** —— 這正是「零件該有卻沒有、於是退回寫 code」的典型(腹語術入口)。 leo 2026-08-01 指出,對照 [n8n Crypto 節點](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.crypto)。 ## 實測(2026-08-01,prod 實例逐顆查 `/cypher/search`) ``` crypto / hash / uuid / sha256_hash / hmac / base64_encode / random_id → 全部 not_found ``` 現有 20 顆零件(`registry/components/`)**沒有任何加密、雜湊、編碼能力**: array_ops・auth_oauth2・auth_service_account・auth_static_key・claude_api・code・cron・ date_ops・filter・foreach_control・http_request・if_control・merge・number_ops・set・ string_ops・switch・try_catch・validate_json・wait ## 建議能力(對照 n8n Crypto,取 Workers 環境做得到的) | 動作 | 說明 | Workers 可行性 | |---|---|---| | `hash` | MD5/SHA-1/SHA-256/SHA-384/SHA-512,輸出 hex/base64 | WebCrypto `crypto.subtle.digest` ✅ | | `hmac` | 同上演算法 + secret key | `crypto.subtle.sign('HMAC')` ✅ | | `uuid` | 產生 UUID v4 | `crypto.randomUUID()` ✅ | | `random` | 指定長度隨機字串(hex/base64/ascii) | `crypto.getRandomValues` ✅ | | `sign` | 以私鑰簽章(RSA/ECDSA) | `crypto.subtle.sign` ✅(金鑰走 credential) | | encrypt/decrypt | 對稱加解密 | ⚠️ 第二階段再評估(金鑰管理牽涉 D36) | leo 特別點名的用法:**「把整段文字加指紋」**(內容 hash → 去重/變更偵測),這正是 RAG 管線常用的。 ## 紅線 - **金鑰只准拿名字**(D36):`hmac`/`sign` 的 key 一律 `{{credential.<名字>}}`,執行前回填,不得寫進定義 - 零件走 PR(`add_new_wasm_component` skill),不是 recipe——這是計算原語不是外部 API ## 服務哪條 CP 頂層 CP `arcrun-usable` 步驟 5「AI 能補全缺的部分(不必寫 code)」: 缺件分型指路已會說「這是計算原語→投稿零件 PR」,但**該有的原語本身要補齊**, 否則 AI 照指示投稿的成本遠高於直接寫 code ⇒ 實務上還是會退回腹語術。
Author
Owner

By Leo

需要考慮新增的零件,除了打外部 API 的用 http request + recipe 外,其他是需要自建零件等級的,我查了 n8n,依照他們的經驗所建立的零件,Arcrun 還缺了:

  • n8n 有的核心零件,Arcrun 需要考慮加的,不過並不是每個都要。
    • Flow
      • loop over items
      • compare data sets
      • execute sub workflow
      • stop and error
    • Data transformation
      • Edit fields
      • Limit
      • Remove duplicates
      • Split out
      • Aggretate
      • Summarize
      • Compression
      • Convert to file
      • Crypto
      • Edit image
      • Extract from file
      • HTML
      • Markdown
      • XML
      • Rename keys
      • Sort
    • Core
      • Webhook
      • Respond to webhook
      • Execution Data
      • FTP
      • Form
      • No operation, Do nothing
      • Track time saved
    • Triggers
      • Manual
      • On a schedule
      • On webhook call
      • On form submission
      • When executed by another workflow
      • On chat message
      • When running evaluation

Arcrun 的零件可能不需要這麼多,因為我們的用戶是 AI,不用完整的視覺上一個個分開,很多對我們不一定是好事,比如在 n8n 每個服務有 triggers 和 call api 的動作,但它的 trigger 對我來說就是兩種:

  • cron + http request + recipe,這就是定時去打的 trigger
  • webhook trigger + recipe,這就是對方有 webhook 的 trigger

所以所有的零件是否都要有?就要考量,哪些確實是需要的,就要做。

By Leo 需要考慮新增的零件,除了打外部 API 的用 http request + recipe 外,其他是需要自建零件等級的,我查了 n8n,依照他們的經驗所建立的零件,Arcrun 還缺了: --- - n8n 有的核心零件,Arcrun 需要考慮加的,不過並不是每個都要。 - Flow - loop over items - compare data sets - execute sub workflow - stop and error - Data transformation - Edit fields - Limit - Remove duplicates - Split out - Aggretate - Summarize - Compression - Convert to file - Crypto - Edit image - Extract from file - HTML - Markdown - XML - Rename keys - Sort - Core - Webhook - Respond to webhook - Execution Data - FTP - Form - No operation, Do nothing - Track time saved - Triggers - Manual - On a schedule - On webhook call - On form submission - When executed by another workflow - On chat message - When running evaluation --- Arcrun 的零件可能不需要這麼多,因為我們的用戶是 AI,不用完整的視覺上一個個分開,很多對我們不一定是好事,比如在 n8n 每個服務有 triggers 和 call api 的動作,但它的 trigger 對我來說就是兩種: - cron + http request + recipe,這就是定時去打的 trigger - webhook trigger + recipe,這就是對方有 webhook 的 trigger 所以所有的零件是否都要有?就要考量,哪些確實是需要的,就要做。
Author
Owner

🧩 零件需求總表(08-01 盤點 42 張 open issue 整合)

放這裡的理由:#76 是最新、最完整、且已含 n8n 對照表的零件需求票(leo 08-01 剛開),
本身就長得像總表的雛形。另開新票會讓 leo 多一個要追的號碼,且會與 #76 內容重疊 ⇒
就地擴充成總表,各分項仍保留自己的原票(#75/#54 不關),此處只當索引 + 判準對照。

判準(先分型再排優先度)

  • 計算原語 → 零件走 PRadd_new_wasm_component skill):純 stdin→stdout、無網路、無 token
  • 外部 API → recipe(URL+認證+參數映射),不鑄零件
  • 平台 binding → 零件但形狀特殊:無 endpoint/無 token,零件直接吃 binding(recipe 那套無東西可映射)

現有 20 顆(prod /cypher/search 實測,08-01)

array_ops・auth_oauth2・auth_service_account・auth_static_key・claude_api・code・cron・date_ops・filter・foreach_control・http_request・if_control・merge・number_ops・set・string_ops・switch・try_catch・validate_json・wait

註:main 的 registry/components/ 另有 kbdb_upsert_blockkm_writer 兩顆未出現在 prod 查詢結果,屬 domain 零件,非本表範圍。

總表

# 能力 分型 對應 n8n 節點 Workers 可行性 現有替代方案 優先度
#76 crypto 家族hashhmacuuidrandomsign 計算原語 → 零件 PR Crypto WebCrypto 全支援(subtle.digestsubtle.signrandomUUIDgetRandomValues 無。只能退回 code 手寫(=腹語術入口) P0
#75 send_email(CF 原生寄信 binding) 平台 binding → 零件(非 recipe) Send Email/Gmail cloudflare:email binding;⚠️ 手組 MIME 必含 Message-IDDate,否則靜默被判 spam(send() 不拋錯) 無。繞道自建 worker=不在零件體系內,工作流用不到 P0
#54 Extract 轉檔:docx/pptx/xlsx/pdf/md/csv/xml 自動辨識副檔名 計算原語(但歸屬待裁:TinyGo 零件 vs 平台 worker) Extract From File(無 docx/pptx ⚠️ OOXML=zip+XML,TinyGo archive/zipencoding/xml 可行性待 spike;pdf 在 Go 生態弱 現用 markitdown Python 容器(arcrun-rag 要拔掉的最後依賴) P1(需先出 SDD 裁歸屬)
#10 通用 code 零件 Code 已完成(本日關閉,main 有 registry/components/code/,含 sandbox_limits)

本次盤點在 42 張裡找到的其他零件類需求

來源 能力 分型判定 說明
#44 embeddings/向量檢索 provider 接縫(Workers AI→Ollama、Vectorize→sqlite-vec) 不是零件——是 embed.tsprovider seam(config 可切換) 地端版上游依賴,已請出 SDD。列此避免被誤當「Ollama 零件」
#55 Arcrun Local Daemon 不是零件——issue 明寫「雲端側零新零件」,用既有 http_request+一份 daemon recipe 守「外部 API 只有一條路」鐵律。列此避免誤鑄零件
#58 vector delete(deleteByIds 不是零件——KBDB base 能力 硬刪已接(本日複核),deprecate 分支+purge 端點仍缺

⚠️ 反例提醒:#44/#55/#58 三件都「看起來像缺零件」,實際分別是 seam/recipe/base API。
這正是判準要先跑的原因——別把 recipe 需求誤列成零件

🕳️ 待 leo 補:n8n 節點清單

leo 08-01 提到「查了一輪 n8n 清單要貼過來」但訊息沒帶到。此處預留

  • leo 貼上 n8n 節點清單
  • 逐項對照現有 20 顆 → 標「已有/缺(計算原語→零件)/缺(外部 API→recipe)/不適用(CF 無對應能力)」
  • 缺口併入上表排優先度

目前上表僅涵蓋本次 42 張 issue 內查得到的零件需求,尚未做 n8n 全節點清單的系統性 gap 分析。

服務哪條 CP

頂層 CP arcrun-usable 步驟 5「AI 能補全缺的部分(不必寫 code)」——
缺件分型指路已會說「這是計算原語→投稿零件 PR」,但該有的原語本身要補齊
否則 AI 照指示投稿的成本遠高於直接寫 code ⇒ 實務上仍會退回腹語術。


[總管] 08-01 盤點產出。分項原票:#75(send_email)/#54(Extract)不關,各自追蹤。

# 🧩 零件需求總表(08-01 盤點 42 張 open issue 整合) > 放這裡的理由:#76 是**最新、最完整、且已含 n8n 對照表**的零件需求票(leo 08-01 剛開), > 本身就長得像總表的雛形。另開新票會讓 leo 多一個要追的號碼,且會與 #76 內容重疊 ⇒ > **就地擴充成總表**,各分項仍保留自己的原票(#75/#54 不關),此處只當索引 + 判準對照。 ## 判準(先分型再排優先度) - **計算原語 → 零件走 PR**(`add_new_wasm_component` skill):純 stdin→stdout、無網路、無 token - **外部 API → recipe**(URL+認證+參數映射),不鑄零件 - **平台 binding → 零件但形狀特殊**:無 endpoint/無 token,零件直接吃 binding(recipe 那套無東西可映射) ## 現有 20 顆(prod `/cypher/search` 實測,08-01) `array_ops・auth_oauth2・auth_service_account・auth_static_key・claude_api・code・cron・date_ops・filter・foreach_control・http_request・if_control・merge・number_ops・set・string_ops・switch・try_catch・validate_json・wait` > 註:main 的 `registry/components/` 另有 `kbdb_upsert_block`/`km_writer` 兩顆未出現在 prod 查詢結果,屬 domain 零件,非本表範圍。 ## 總表 | # | 能力 | 分型 | 對應 n8n 節點 | Workers 可行性 | 現有替代方案 | 優先度 | |---|---|---|---|---|---|---| | **#76** | **crypto 家族**:`hash`/`hmac`/`uuid`/`random`/`sign` | 計算原語 → **零件 PR** | Crypto | ✅ WebCrypto 全支援(`subtle.digest`/`subtle.sign`/`randomUUID`/`getRandomValues`) | ❌ 無。只能退回 `code` 手寫(=腹語術入口) | **P0** | | **#75** | **send_email**(CF 原生寄信 binding) | 平台 binding → **零件**(非 recipe) | Send Email/Gmail | ✅ `cloudflare:email` binding;⚠️ 手組 MIME 必含 `Message-ID`+`Date`,否則靜默被判 spam(`send()` 不拋錯) | ❌ 無。繞道自建 worker=不在零件體系內,工作流用不到 | **P0** | | **#54** | **Extract 轉檔**:docx/pptx/xlsx/pdf/md/csv/xml 自動辨識副檔名 | 計算原語(但**歸屬待裁**:TinyGo 零件 vs 平台 worker) | Extract From File(**無 docx/pptx**) | ⚠️ OOXML=zip+XML,TinyGo `archive/zip`+`encoding/xml` 可行性待 spike;**pdf 在 Go 生態弱** | 現用 markitdown **Python 容器**(arcrun-rag 要拔掉的最後依賴) | **P1**(需先出 SDD 裁歸屬) | | ~~#10~~ | ~~通用 `code` 零件~~ | — | Code | — | — | ✅ **已完成**(本日關閉,main 有 `registry/components/code/`,含 sandbox_limits) | ## 本次盤點在 42 張裡找到的**其他**零件類需求 | 來源 | 能力 | 分型判定 | 說明 | |---|---|---|---| | #44 | **embeddings/向量檢索 provider 接縫**(Workers AI→Ollama、Vectorize→sqlite-vec) | ❌ **不是零件**——是 `embed.ts` 的 **provider seam**(config 可切換) | 地端版上游依賴,已請出 SDD。列此避免被誤當「Ollama 零件」 | | #55 | **Arcrun Local Daemon** | ❌ **不是零件**——issue 明寫「**雲端側零新零件**」,用既有 `http_request`+一份 daemon **recipe** | 守「外部 API 只有一條路」鐵律。列此避免誤鑄零件 | | #58 | vector delete(`deleteByIds`) | ❌ 不是零件——KBDB base 能力 | 硬刪已接(本日複核),deprecate 分支+purge 端點仍缺 | > ⚠️ **反例提醒**:#44/#55/#58 三件都「看起來像缺零件」,實際分別是 seam/recipe/base API。 > 這正是判準要先跑的原因——**別把 recipe 需求誤列成零件**。 ## 🕳️ 待 leo 補:n8n 節點清單 leo 08-01 提到「查了一輪 n8n 清單要貼過來」但訊息沒帶到。**此處預留**: - [ ] leo 貼上 n8n 節點清單 - [ ] 逐項對照現有 20 顆 → 標「已有/缺(計算原語→零件)/缺(外部 API→recipe)/不適用(CF 無對應能力)」 - [ ] 缺口併入上表排優先度 目前上表僅涵蓋**本次 42 張 issue 內查得到的**零件需求,**尚未**做 n8n 全節點清單的系統性 gap 分析。 ## 服務哪條 CP 頂層 CP `arcrun-usable` 步驟 5「AI 能補全缺的部分(不必寫 code)」—— 缺件分型指路已會說「這是計算原語→投稿零件 PR」,但**該有的原語本身要補齊**, 否則 AI 照指示投稿的成本遠高於直接寫 code ⇒ 實務上仍會退回腹語術。 --- _[總管] 08-01 盤點產出。分項原票:#75(send_email)/#54(Extract)不關,各自追蹤。_
Leo added the
s
backlog
label 2026-08-09 13:13:09 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Leo/Arcrun#76