Files
Arcrun/registry/components/hash/component.contract.yaml
T
uncle6me-web 4aacd79e00 feat(component): 新增 hash 零件——出貨線版本號機制不必再用 code 腹語術(Arcrun#91)
出貨線的版本號由內容指紋算出(內容一變版本必變),build 站核對官方成品指紋
也要它。此前 registry 裡只有 code 節點提到 hash,沒有專門零件——純計算本該是
一顆零件,不是一段腳本(D70)。

- registry/components/hash/:TinyGo 實作,sha256/sha1/md5,hex/base64 輸出
- .component-builds/hash/:部署包(component.wasm 已 commit,比照 rule 05)
- cypher-executor/src/lib/component-loader.ts:WASM_HTTP_RUNNER_IDS 白名單加
  'hash',否則 `component: hash` 在任何實例上都會落到 step 8「找不到零件」
  (與 #29 的 code 缺口同形狀);對應單元測試
  cypher-executor/tests/component-loader-hash.test.ts
- pending-human-gate/README.md:hash 部分已落地移除,#89 維持原狀

驗證(見 PR 說明附完整輸出):
- wasmtime 本地跑六種 gherkin 情境,結果與系統 shasum/md5 逐位元一致
- 部署到 youlin 測試場(arcrun-hash.youlin-hsieh-dev.workers.dev),POST 直打
  六種情境同樣一致
- 在真實工作流(hash-e2e-test-91,youlin 測試場觸發)跑過,含 component-loader
  白名單修法的單元測試(vitest + cloudflare:test,本地綠燈)

查證「零件投稿要人工互動解閘」一事:scripts/component-arm.sh、
.claude/hooks/component-guard.sh 均不存在;pre-write-guard.sh 對
registry/components/ 的限制只擋 TS 檔與 auth_* 命名放錯目錄,不擋本次改動。
沒有那個「只有人做得到」的具體物件,故未卡關直接走完。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 13:22:08 +08:00

75 lines
2.5 KiB
YAML

canonical_id: "hash"
display_name: "計算雜湊"
category: "logic"
version: "v1"
wasi_target: "preview1"
stability: "floating"
runtime_compat:
- "cf-workers"
- "workerd"
- "wazero"
constraints:
max_size_kb: 2048
max_cold_start_ms: 50
no_network_syscall: true
no_filesystem_syscall: true
io_model: "stdin_stdout_json"
input_schema:
type: object
required: [input]
properties:
algorithm:
type: string
enum: [sha256, sha1, md5]
description: 雜湊演算法,預設 sha256
input:
type: string
description: 要算雜湊的內容
encoding:
type: string
enum: [hex, base64]
description: 輸出編碼,預設 hex
output_schema:
type: object
properties:
success:
type: boolean
data:
type: object
properties:
result:
type: string
algorithm:
type: string
encoding:
type: string
gherkin_tests:
- scenario: "sha256 hex(預設)"
given: '{"algorithm":"sha256","input":"hello"}'
then_contains: '"result":"2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"'
- scenario: "sha1"
given: '{"algorithm":"sha1","input":"hello"}'
then_contains: '"result":"aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d"'
- scenario: "md5"
given: '{"algorithm":"md5","input":"hello"}'
then_contains: '"result":"5d41402abc4b2a76b9719d911017c592"'
- scenario: "base64 編碼"
given: '{"algorithm":"sha256","input":"hello","encoding":"base64"}'
then_contains: '"result":"LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ="'
- scenario: "預設 algorithm=sha256"
given: '{"input":"hello"}'
then_contains: '"algorithm":"sha256"'
- scenario: "不支援的 algorithm"
given: '{"algorithm":"crc32","input":"hello"}'
then_contains: '{"success":false'
tags: [builtin, logic, hash, checksum, versioning]
description: >-
計算內容雜湊(sha256/sha1/md5,輸出 hex 或 base64)。純計算,無網路/檔案 syscall。
用途:出貨線版本號機制(Leo/Arcrun#91)——內容一變雜湊必變,是「改了東西版本沒動」在結構上
不可能發生的機制來源;build 站核對官方成品指紋也用它。
config_example: |
compute_hash: # 節點名稱(可自訂)
algorithm: "sha256" # 演算法(選填,預設 sha256),可選值:sha256/sha1/md5
input: "{{ctx.bundle_content}}" # 要算雜湊的內容(必填)
encoding: "hex" # 輸出編碼(選填,預設 hex),可選值:hex/base64