---
status: paused
superseded_by: ""
---

# Design: 用戶 CC harness（acr install-harness）

> 2026-06-03。richblack 已授權建此 SDD（白名單已加）。**待 review design 後動 code。**
> 背景：richblack 釐清「arcrun 是給 CC 的 harness」的真正意思（§0）。

---

## 0. 問題（richblack 原話）

> 「叫 CC 用 Arcrun 開發，它說『好，我先用 Python 測試』，因為它熟悉的還是 Python。
>  harness 要：先提醒 CC 要用、它要用時知道去哪取得資源、做錯時被糾正，
>  讓用戶的 CC 不會再問這個笨問題。」

**核心區分（richblack 2026-06-03）**：
- **開發 arcrun**（richblack + 他的 CC）：用本 repo 本機 `.claude/CLAUDE.md`（SDD 協議、禁令）。
  **不給用戶、不進公開 repo**（已 git rm --cached，本機保留供開發）。
- **使用 arcrun**（外部工程師 + 他的 CC）：在自己的專案用 arcrun。需要**另一套** harness，
  透過「安裝」裝進他自己的專案。

用戶不 clone arcrun 來改，他在自己專案工作 → harness 必須裝在**用戶專案目錄**，
他的 CC 才會自動載入（Claude Code 只自動讀「當前工作目錄樹」的 CLAUDE.md / .claude）。

---

## 0.5 設計鐵則：guardrail 擋下時必須指出正路（從內部 harness 的慘痛教訓來）

> 2026-06-03 教訓：內部開發 harness 的 `pre-write-guard.sh` 規則 4.3 擋 CC 建新 SDD 目錄，
> 但 block 訊息只說「先與 richblack 確認」，**沒說「確認後要更新白名單才能往下」** →
> 開發 CC 被自己的 guardrail 卡死、不知正路、動不了。

**用戶 harness 的每個 guardrail（hook / 提醒）擋下時，必須在訊息裡給「具體怎麼做才能合法通過」的下一步。**
- 只說「不行」= 把 CC 卡死。
- 要說「不行，因為 X；正確做法是 Y（具體指令 / 檔案 / 步驟）」。
- 這是 DECISIONS §7「會回嘴的 CLI——exit 2 + **指回正路**」的「+指回正路」那半，內部版漏做，用戶版必須做足。

**驗收新增一條**：每個 guardrail 的 block/提醒訊息都含可執行的下一步（§7.6）。

---

## 0.6 骨架：一張前置清單，兩種人同走，必做的事白癡化（richblack 2026-06-03 收斂）

> richblack：「我有一系列必要做的前置環境設定，把它列出。技術好的一一完成；技術不好的只是許願，
>  讓他做盡量少，要做的所有事情白癡化。」

**整份 design 的核心模型**：不是「兩套不同流程」，是**同一張前置清單、差別只在誰執行**。

### 前置環境設定清單（PREREQ，權威清單）
| # | 項目 | 只能用戶做？ | 技術好的 | 技術不好的（許願型）|
|---|---|---|---|---|
| P1 | 裝 Node + `npm i -g arcrun` | 否 | 自己跑 | CC 代跑 |
| P2 | 裝 `npm i -g wrangler`（CF CLI）| 否 | 自己跑 | CC 代跑 |
| P3 | `acr install-harness`（裝防護）| 否 | 自己跑 | CC 代跑（CC 讀 llms.txt 第一步就做）|
| P4 | **建 CF 帳號 + 拿 Account ID + API Token** | **是**（憑證在用戶手上）| 自己建 | **CC 白癡化手把手帶**（§1.0 步驟2）|
| P5 | `acr init --self-hosted`（貼 token，自動建 KV/部署/seed）| 否 | 自己跑 | CC 代跑（用 P4 拿到的兩串）|
| P6 | `wrangler secret put CF_SECRETS_API_TOKEN` | 否 | 自己跑 | CC 代跑 |
| P7 | 連 arcrun MCP（`claude mcp add`，CC 偏好的工具）| 否 | 自己跑 | CC 代跑（install-harness 順便）|

### 兩種執行者
- **技術好**：拿這張清單，一一完成。清單清楚就夠（README / llms.txt 列出即可）。
- **技術不好（許願型，主要用戶）**：他只說「我要用 arcrun 做 X」=許願。CC 拿同一張清單，
  **能代勞的全代勞（P1/P2/P3/P5/P6），唯一只能他做的 P4 白癡化成笨到不會錯的手把手步驟。**

### 用戶畫像（richblack 2026-06-03 鎖定第一版）
- **會開 terminal / vscode、會用 CC** → 跑指令、貼 token **不是**障礙（不用把跑指令白癡化）。
- **但 CF 概念對他們太抽象**（richblack 實測：很多人聽不懂 CF）→ **白癡化焦點 = CF 那段**。

### 設計要求：白癡化「焦點在 CF」，不是全面白癡化
- **P4（CF）必須白癡化到「不用懂 CF 概念也能完成」**：CC 對用戶**絕不講** KV namespace / Workers /
  R2 bucket / zone 這些 CF 術語 → 只講「開這個網址、點這個鈕、複製這串、貼回來」。把 CF 的抽象**藏起來**。
- 其餘 CC 能代勞的（P1/P2/P3/P5/P6）→ CC 代跑，用戶會跑指令但不必自己想。
- 目標：**用戶不需要懂 CF 是什麼，照著做就裝好。** 用戶做的事 → 許願 + 跟著 CF 步驟點幾下 + 貼兩串。

→ 後面 §1.0（llms.txt 入口）、§2（install-harness）、§4（hook）都是「讓 CC 能拿著這張清單替用戶跑完」的手段。

---

## 1. harness 三層（對應三需求 + Claude Code 載入機制）

依 claude-code-guide 查證（2026-06-03）：

| 需求 | 機制 | 強制力 | 裝進用戶專案 |
|---|---|---|---|
| **事前提醒**「用 arcrun 別自寫 Python」| CLAUDE.md（session 必載入）| 弱（可能遺忘）| 用戶 `CLAUDE.md` append arcrun 區塊 |
| **資源去哪取** | Skill（按需觸發）+ CLAUDE.md 指令 | 中 | `.claude/skills/arcrun/SKILL.md` |
| **做錯被糾正** | PreToolUse hook（exit 2）| 強（需 workspace trust）| `.claude/hooks/arcrun-guard.sh` + settings.json |

三層互補：CLAUDE.md 會被 compaction 丟、Skill 可能不觸發、hook 最強但需 trust。事前+事中+事後，缺一不可。

---

## 1.0 第一接觸點：用戶只會聊天，CC 讀入口檔自己啟動（richblack 2026-06-03 鎖定用戶畫像）

> richblack：「用戶只會跟 CC 聊天，不裝不打指令、連 slash command 都不會用。
>  路2 = 把 arcrun 網站/GitHub 連結丟給 CC + 一句『我要用 arcrun 做這個專案，怎麼做』，然後兩手一攤。」

**用戶全部操作 = 丟連結 + 一句話。** 其餘全 CC 做。所以 harness 的「第一接觸點」必須是
**CC 在用戶還沒裝任何東西時就讀得到的入口檔**，且讀了就知道正確啟動順序。

### 雞生蛋問題 + 解法
- slash command / hook / skill 都要**先裝進用戶專案**才存在 → 但用戶還沒裝任何東西 → CC 看不到它們。
- 解：用「裝之前就讀得到的入口檔」叫 CC 去裝。兩個入口（CC 丟網站或丟 GitHub 都涵蓋）：
  - **`arcrun.dev/llms.txt`**（網站根目錄，給 LLM 的標準入口檔）—— 用戶丟網站連結時 CC 會讀。
  - **README 開頭一段「給 AI 操盤手」**—— 用戶丟 GitHub 連結時 CC 讀 README。
- 兩者內容一致，核心是：**「第一步：跑 `npm i -g arcrun && acr install-harness`，裝完你就有完整防護」**
  + 裝前先記的鐵則（別寫 Python、用戶只聊天你來操作 CLI）。

### 啟動流程（CC 讀入口檔後照做）
```
1. acr install-harness            ← 裝防護（mindset Skill / arcrun-guard hook / /arcrun command / CLAUDE.md 區塊）
2. 手把手帶用戶建 CF 帳號、拿 token ← 唯一用戶親手做的事，CC 用內建話術一步步帶（見下）
3. acr init --self-hosted          ← CC 幫跑，貼用戶 token
4. 把用戶需求拆 workflow → acr push ← CC 在 harness 防護下做事
```

→ llms.txt / README「叫 CC 去裝」（裝前就讀得到）；install-harness 提供「裝後的完整防護」。
→ 用戶從頭到尾只說人話。

### 步驟 2 細化：CC 手把手帶用戶拿 CF 憑證（richblack 2026-06-03）

> richblack：「連 CF 他都不會。但 CC 可以說：你現在去申請 CF 帳號，方法是…，完成後把 xxx 和 ooo 貼給我。」

**這是唯一用戶必須親手做的事**（憑證在用戶手上，CC 拿不到），所以 CC 的引導必須**手把手、零技術假設**。
這套話術要**內建在 llms.txt / harness 指引裡**，讓每個用戶的 CC 都用同一套清楚步驟帶，不自己亂講、不假設用戶懂。

CC 該給用戶的（**不講 CF 術語**，照抄式；用戶不用懂「Workers/KV/R2」是什麼，照著勾就好）：
```
我需要你去一個叫 Cloudflare 的免費服務拿「兩串文字」給我（你不用懂它是什麼，照做就好）。
做完把兩串貼回來：

【第一串：帳號代碼】
1. 開 https://dash.cloudflare.com/sign-up 用 email 註冊（免費）。
2. 登入後，畫面右邊有一塊寫 "Account ID"，點它旁邊的複製小圖示 → 這是第一串。

【第二串：金鑰】
3. 開 https://dash.cloudflare.com/profile/api-tokens
4. 點藍色 "Create Token" → 找 "Create Custom Token" 那欄點 "Get started"。
5. 在 "Permissions" 區照抄勾三組（不用懂意思，照填，按 "+ Add more" 加組）：
      Account / Workers Scripts / Edit
      Account / Workers KV Storage / Edit
      Account / Workers R2 Storage / Edit
6. 一直按 Continue / Create Token，最後會顯示一串長文字 → 立刻複製（只出現這一次）→ 這是第二串。
7. 把兩串貼給我，我幫你裝好，你不用再碰 Cloudflare。
```

**白癡化要點**：CC 全程**不解釋**「什麼是 KV / Worker / token」——用戶聽不懂也不需要懂，
CF 術語當「照抄的咒語」。用戶卡住（找不到鈕）時，CC 用更白話描述位置，**不丟術語**。

CC 拿到兩串 → 跑 `acr init --self-hosted`（貼進去）→ 後續全自動。
**誠實/安全**：token 是用戶的、貼給 CC 用於部署到他自己的 CF；CC 不外傳、用完寫進用戶本機 config（init 已處理）。

---

## 1.5 第四層：slash command `/arcrun`（裝好後的主動入口，可選）

> richblack：「我的使用者技術不好，應該做很少的事，其他交給 CC。harness 一部分寫在 slash command 裡。」

> 定位（richblack 2026-06-03 鎖定用戶畫像後）：用戶**只會聊天、不一定會打 slash command**。
> 所以 `/arcrun` **不是主要路徑**——主要路徑是 §1.0（丟連結給 CC，CC 讀 llms.txt/README 自己啟動）。
> `/arcrun` 是 install-harness 裝好後的**可選**入口，給「願意打指令的用戶」或「CC 自己引用」用。不強求用戶會用。

**用戶實際路徑（重申，§1.0）**：丟連結 + 一句話 → CC 讀入口檔 → CC 跑 install-harness → CC 引導。
用戶不需要知道 `/arcrun` 存在。它存在是錦上添花（裝好後若用戶想要更明確的入口可打），不是必經。

**為何 command 而非只靠 Skill**（claude-code-guide）：
- Skill = Claude **自己判斷**要不要觸發（可能不觸發 → 用戶以為在用 arcrun，CC 卻自己寫 Python）。
- Command = 用戶**主動打 `/arcrun`** = 明確宣告「進入 arcrun 模式」→ CC 照 command 流程走，最可靠把用戶帶進正軌。
- **坑（claude-code-guide 警告）**：`/arcrun` 不要同時做成 command 又做成 skill（觸發邏輯衝突）。
  → **`/arcrun` 做成 command（用戶主動入口）；mindset 做成 Skill（被動世界觀，名字不同避免撞）。**

**command 檔機制**（claude-code-guide 查證）：
- 放 `.claude/commands/arcrun.md` → 自動成為 `/arcrun`，clone/放檔即可用，無需安裝/信任。
- 用戶打 `/arcrun <需求>`，`<需求>` 字串自動串進 prompt（無 $ARGUMENTS 變數，純文字追加）。
- command 檔是 prompt 模板，可指示 CC「讀 arcrun Skill、跑 `acr parts`、輸出 yaml、別寫 Python」。
- ⚠️ command 檔**不可用相對路徑引用 arcrun repo**（用戶專案沒有）→ 指令裡只提「跑 `acr xxx`」「讀你專案的 CLAUDE.md」。

---

## 2. 安裝指令（兩狀況、一指令）

richblack：用戶兩種狀況都「一個指令完成」——已有執行中專案、或新啟動專案。

- `acr install-harness`（主指令，獨立）：當前目錄安裝。新舊專案皆可。
- `acr init` 末尾呼叫同一套邏輯（兩者皆裝）。

### install-harness 行為（冪等）

```
acr install-harness   （用戶專案根目錄）
  1. CLAUDE.md：無→建；有→append arcrun 區塊（<!-- arcrun-harness:start/end --> 包夾，重裝取代區塊不重複）
  2. .claude/skills/arcrun-mindset/SKILL.md：複製世界觀 Skill（覆蓋舊版；名 arcrun-mindset，避免與 /arcrun command 撞）
  3. .claude/commands/arcrun.md：複製 /arcrun slash command（技術不好用戶的主動入口，§5.1）
  4. .claude/hooks/arcrun-guard.sh：複製用戶版 guard（§4）
  5. .claude/settings.json：無→建並註冊 hook；有→合併（不覆蓋用戶既有 hooks/設定）
  6. （P7，optional）claude mcp add arcrun MCP —— CC 偏好工具；MCP 對齊未完成前可跳過（§2.5）
  7. 印提示：首次開 Claude Code 要 trust 工作區 hook 才生效；技術不好的話直接打 /arcrun 描述需求
```

冪等：重裝不重複、不破壞用戶既有 CLAUDE.md / settings。

**技術不好用戶連 `acr install-harness` 都不用自己跑**：跟 CC 說「幫我把這專案設定成用 arcrun」→
CC 跑 `acr install-harness` → 裝好後用戶打 `/arcrun <需求>` 即可。用戶全程只說人話。

### 2.5 MCP（P7）：CC 偏好的工具，納入安裝 + update（richblack 2026-06-03）

> richblack：「先前有 MCP，因為是 CC 比較喜歡的工具，也要排入讓它 update。」

- arcrun MCP（`@inkstone/arcrun-mcp`）是 **Cloudflare Workers 上的 Remote MCP Server**，CC 用 `claude mcp add <url>` 連。
- **install-harness 順便連 MCP**（P7）：跑 `claude mcp add` 把 arcrun MCP 加進用戶的 Claude Code。
  CC 偏好 MCP 工具 → 有 MCP，CC 操作 arcrun 更順（直接呼叫 MCP 工具，不用記 acr 指令細節）。
- **`acr update` 納入 MCP**：update 時確保 MCP 連線指向最新（URL / 版本對齊）。
- ⚠️ **誠實前置（BACKLOG 既有待辦）**：arcrun MCP 本身**尚待對齊**（`u6u_*`→arcrun 命名、`finally.click`→
  arcrun.dev、移除 GUIDE.md 教 `api_config` 的反模式、確認薄殼）。**MCP 對齊是另一條 BACKLOG 線**；
  本 SDD 只負責「把 MCP 納入 install-harness / update 的接點」。MCP 對齊未完成前，install-harness 的
  MCP 步驟可先標 optional（用戶可跳過），對齊後再設為預設。self-host 用戶連哪個 MCP（公共 vs 自部署）待 §8 釐清。

---

## 3. harness 素材從哪來（內嵌 npm 套件）

用戶的 `acr` 是 `npm i -g arcrun` 裝的，不能假設用戶有 arcrun repo
→ harness 素材內嵌 npm 套件：放 `cli/harness/`，build 進 `dist/`，`files` 帶上。
install-harness 從已安裝套件目錄（`import.meta.url` 解析）複製到用戶 cwd。
SSOT = `cli/harness/`，與本 repo 開發版 `.claude` **不共用**（對象不同）。

---

## 4. 用戶版 hook 擋什麼（與開發版完全不同）

開發版擋「registry/components 寫 TS / 建 auth worker」——對用戶無意義。
用戶版 `arcrun-guard.sh`（每條都依 §0.5 給正路）：

| 偵測 | 動作 | block/提醒訊息含的正路 |
|---|---|---|
| arcrun 專案裡跑 `python *.py`/`node` 寫一次性自動化（典型「我先用 Python」）| **提醒**（不硬擋，避免誤殺正常 python）| 「這專案用 arcrun。串服務/自動化請寫 workflow：先跑 `acr parts` 看零件，寫 .yaml，`acr run`。確定要自刻請說明為何 workflow 做不到。」|
| 自寫「打某 API 的 script」而非 recipe | 提醒 | 「打固定 endpoint → 寫 recipe：`acr recipe push`。見 arcrun-mindset Skill §1。」|
| 暴露動作（部署 webhook）非 TTY 自動確認 | **exit 2**（明確越界）| 「暴露資料需人類在終端機確認。請把這動作交給人類執行。」|

**誠實限制（mindset §7）**：「跑 python」不絕對錯 → 多用「提醒 + 要 CC 自證」而非硬擋。
硬擋（exit 2）只留給「暴露資料未經人類同意」。把關依風險分級，不一刀切誤殺。

---

## 5. CLAUDE.md arcrun 區塊（事前提醒，精簡對外）

```markdown
<!-- arcrun-harness:start -->
## 這個專案用 arcrun 做自動化

需要「串服務 / 排程 / 打 API / 資料自動化」時：
- 用 arcrun 工作流，**不要自己寫 Python/Node 一次性腳本**。工作流是純文字、可複用、跑在你的 Cloudflare。
- 打外部 API → 寫 recipe（`acr recipe push`），不自刻 HTTP client。
- 先查能力：`acr parts`（零件）、`acr auth-recipe list`（認證）。
- **不要自製零件**（WASM）——零件由 arcrun 維護走 PR；你能擴充的是 recipe + 工作流。
- 開始前讀 arcrun-mindset Skill。
<!-- arcrun-harness:end -->
```

---

## 5.1 `/arcrun` slash command 內容（技術不好用戶的入口）

`.claude/commands/arcrun.md`（裝進用戶專案後，用戶打 `/arcrun <需求>` 觸發）：

```markdown
# 用 arcrun 完成這個自動化需求

用戶（可能技術不好）想做一個自動化。你的任務：用 arcrun 把它做出來，全程不要讓用戶寫程式。

## 鐵則
- **用 arcrun 工作流 / recipe，絕不自己寫 Python/Node 腳本。** 用戶選 arcrun 就是不想要一次性腳本。
- 需要打外部 API → 寫 recipe（`acr recipe push`），不自刻 HTTP client。
- 不自製零件（WASM）—— 零件由 arcrun 維護。你能用的是現有零件 + recipe + 工作流。

## 步驟
1. 先讀 arcrun-mindset Skill（世界觀）。
2. 跑 `acr parts` 看有哪些零件、`acr auth-recipe list` 看支援的認證。
3. 把用戶需求拆成工作流（哪些零件、什麼順序、什麼條件），寫成 .yaml。
4. 需要 credential（API key / token）→ 明確告訴用戶要去哪取得、怎麼 `acr creds push`。
5. `acr validate` 通過後，`acr push` 部署，告訴用戶 webhook URL / 怎麼 `acr run`。
6. 完成後給客觀證據（HTTP 2xx / trace），不要只說「做好了」。

## 遇到要暴露資料（對外 webhook）
停下來，明確告訴用戶「這會讓 X 可被外部呼叫」，要他同意。不要替他決定公開。

## 用戶的需求
（用戶打在 /arcrun 後面的文字會接在這裡）
```

> 注意：command 檔不可引用 arcrun repo 的相對路徑（用戶專案沒有）。只提「跑 `acr xxx`」「讀 arcrun-mindset Skill」。

---

## 6. 動到的檔（review 後）

| 檔 | 動作 |
|---|---|
| 新增 `llms.txt`（網站根 + repo 根）| **第一接觸點**（§1.0）：給 CC 的啟動指南（叫 CC 跑 install-harness + 裝前鐵則）。網站部署到 arcrun.dev/llms.txt；repo 也放一份 |
| README 開頭加「給 AI 操盤手」段 | 用戶丟 GitHub 連結時 CC 讀 README → 同樣導向「第一步 install-harness」（§1.0）|
| 新增 `cli/harness/CLAUDE.block.md` | CLAUDE.md 區塊模板（§5）|
| 新增 `cli/harness/skills/arcrun-mindset/SKILL.md` | 用戶版 mindset + 資源指引（複用 skills/arcrun-mindset，加「資源去哪取」、去 DECISIONS 引用）|
| 新增 `cli/harness/commands/arcrun.md` | `/arcrun` slash command（§5.1，技術不好用戶入口）|
| 新增 `cli/harness/hooks/arcrun-guard.sh` | 用戶版 guard（§4，每條訊息含正路）|
| 新增 `cli/harness/settings.fragment.json` | hook 註冊片段 |
| 新增 `cli/src/commands/install-harness.ts` | 指令（§2 冪等，複製上述 harness 素材進用戶專案）|
| `cli/src/commands/init.ts` | init 末尾呼叫 install-harness |
| `cli/src/index.ts` | 註冊 `acr install-harness` |
| `cli/package.json` | `files` 帶 `harness/` 素材（確保 npm 發布帶上）|

不動：本 repo 開發版 `.claude`（對象不同，本機保留）。
命名：Skill 叫 `arcrun-mindset`、command 叫 `/arcrun`（不同名，避免 claude-code-guide 警告的 command/skill 觸發衝突）。

---

## 7. 驗收（客觀證據）

1. 空目錄 `acr install-harness` → 產生 CLAUDE.md + .claude/skills/arcrun + hooks + settings.json。
2. 已有 CLAUDE.md → append 區塊（標記包夾）不破壞既有；重跑不重複。
3. 已有 settings.json（用戶自己 hooks）→ arcrun hook 合併，用戶 hook 不丟。
4. 裝完開 Claude Code → trust → 試「寫 python 自動化」→ 收到提醒指回 arcrun。
5. `npm pack` tarball 含 harness/ 素材。
6. **（§0.5 鐵則）每個 guard 的 block/提醒訊息都含可執行的下一步**——故意觸發每條，確認訊息有正路，不是只說「不行」。
7. 裝完後 `.claude/commands/arcrun.md` 存在 → 用戶打 `/arcrun 每天抓 RSS 存 Sheets` → CC 走 command 流程（讀 Skill、跑 acr parts、產 yaml），不自寫 Python。
8. 技術不好情境：對 CC 說「幫我把專案設定成用 arcrun」→ CC 跑 `acr install-harness` → 用戶全程沒碰指令。

---

## 8. 開放問題（review 拍板）

1. **python 提醒強度**：§4 傾向「提醒 + 要 CC 自證」而非硬擋（避免誤殺正常 python）。要更硬還是分級？
2. **CLAUDE.md append vs 獨立檔**：傾向 append + 標記包夾（CLAUDE.md 必載入、可乾淨移除）。動到用戶的檔可接受？
3. **是否放靜態零件清單**：傾向 CLAUDE.md 只指「跑 acr parts」（動態），不放會過時的靜態清單。
4. **MCP（P7）self-host 連哪個**：用戶連你的公共 arcrun MCP，還是連他自部署的？（MCP 是 CF Worker，self-host 要不要也部署一份 MCP？）+ MCP 對齊（BACKLOG）何時做完才設 P7 為預設。

5. **暴露動作的同意機制：要不要支援「選③ AI 代跑」+「以後不要問我」+ 同意記錄？**（壓測 §9，待 richblack 拍板）

   > 來源：壓測報告階段 9（`test_arcrun/docs/壓測報告.md` §9.1–9.8）。壓測者立的設計原則：
   > **需同意的動作要依使用者技術能力分級提供路徑，最低能力者也要能用；我們的義務是提醒 + 記錄同意，不是刁難。**

   壓測者的「一問三路」模型（使用者選哪種走哪條）：
   - 選①（專家）：使用者自己改 settings.json 加允許清單。
   - 選②（中等）：**AI 給可複製貼上的完整指令，使用者貼到終端機跑**（真 TTY → guard 自動放行）。→ **A6 已修字串比對 bug，這條現在做得到（hook 能印出含 push 的指令而不自擋）。**
   - 選③（最低）：**使用者對話中口頭同意 → AI 代跑 → 同意記錄下來（用於法律效益）**，且第一次同意可選「以後同類動作不要再問我」。

   **🔴 關鍵安全約束（壓測 §9.5/§9.6 實證，不可違反）**：
   - 「人類已同意」的同意訊號**絕不能由 AI 自己產生**（AI 自寫 consent.log / env 旗標 / wrapper script 偷渡都已被安全分類器正確擋下）。否則 guard 形同虛設——AI 想公開時先自寫一筆假同意即可繞過。
   - 結論（壓測 §9.6）：**現行架構下「選③ AI 代跑」沒有正當實現路徑。** guard hook 只認 TTY / env 旗標，這兩者 AI 都無法在「人類同意」語意下合法提供。
   - 正解方向（需**上游/harness** 支援，arcrun 控不了 Claude Code harness）：同意訊號從「人類產生、AI 控制不了、但 AI 能觸發詢問」的管道進入 hook——例如 `AskUserQuestion` 的人類點擊結果 → 由 **harness（非 AI）** 寫一個 hook 能驗證的同意 token（含動作、時效、簽章）→ hook 驗 token 放行。**寫 token 的是 harness 不是 AI** 是整個機制的安全前提。

   **待拍板的選項**（richblack 決定）：
   - (a) **維持現狀，只支援選①/②**：選③在 arcrun 端做不到（跨 harness），`acr push` 被擋時誠實告知「選③目前不支援，請選①或②」+ 附選②可貼指令。**不在本地削弱 hook 去假裝支援選③**（壓測 §9.6 結論：要靠繞才能做＝設計錯，那就不該繞、該回報）。← 壓測者+本次討論傾向此，A6 已落地選②那條。
   - (b) **arcrun 端預留「hook 驗同意 token」那半**：實作 guard 驗證一個帶簽章/時效/動作範圍的同意 token 的能力，token 由未來 harness（非 AI）寫入；harness 那半未到位前選③仍不能用。
   - (c) **「以後不要問我」+ 法律記錄**：第一次人類同意（透過合法管道，非 AI 自產）時可選記住，之後同類動作免問；同意記錄含時間戳/動作/同意人，作為**法律歸責 + 軌跡可審**（mindset §7：機制價值是法律憑證，不是技術防偽）。此項依賴 (b) 的「harness 寫、hook 驗」管道才安全成立。

   > 已透過 `arcrun_report_feedback` 回報上游（block_id `6284b2ca-d453-4078-85ca-3f50c3507a13`）。
   > **本次（2026-06-06）只修了 A6（選②的字串比對 bug）；(a)/(b)/(c) 待 richblack 拍板，未動 code。**
