[hub] Arcrun 的 App 系統:規格、打包、掛上 Portal——CF 之於 Arcrun,如同 Linux 之於 Android #115
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
leo 的願景(原話,規格依此為準)
順序(leo 2026-08-13 定,D78)
🔴 第 3 段的票在第 2 段定案前不准動工。 先做=手工做一個,框架出來還要重做,
而 leo 要的正是「以後可以快速產生新的 App」。
(2026-08-13 已犯過一次:總管把
Leo/InkStoneCo#18派了出去,leo 當場喊停。)收攏的票(第 3 段的候選 App/相關能力)
Leo/Arcrun#82Leo/Arcrun#69Leo/InkStoneCo#18Leo/InkStoneCo#19Leo/InkStoneCo#2+Leo/arcrun-rag#36Leo/mira#5📌 這張表是候選,不是定案。第 2 段定案時要逐張確認「它到底是不是一個 App」。
總管的提案(待 leo 裁;未經核實的部分已標明)
一、叫 App,不要叫 Plugin
因為 Arcrun 已經有 plugin 那一層了,只是叫別的名字。
leo 描述的是九宮格、點進去、各有各的畫面 ⇒ 那是 App。
叫它 Plugin 會讓人以為是「改 Portal 的行為」,而不是「多一格自己的東西」。
二、Android 的類比可以借它的具體規格,不只是比喻
Android 給 App 的接入面大致六件。逐項對到 Arcrun:
recipe_search/push/pull疑似雛形⚠️ 右欄是總管的推測,正在派人核實(哪些是真的有、哪些是半套、哪些根本沒有)。
核實結果會補到本票,不要拿現在這欄當事實用。
⇒ 如果核實結果接近推測,那麼Arcrun 已經有一大半,
真正缺的是三件:① App 宣告檔 ② 前端掛載 ③ 分發。
三、一個 App 的實體是什麼(這題最需要 leo 拍板)
三個候選:
總管建議 B,三個理由:
Leo/Arcrun#82的病本來就是「每加一個能力都要改 Portal 程式碼」——A 只是把「改 Portal」換成「部署 worker」,用戶要付的代價沒有變小。
⇒ 那表示 App 必須是 AI 寫得出來的東西:宣告式、可驗證、不必編譯。
一顆 Worker 不是;一份宣告+幾支工作流是。
⇒ 這也正好接上 Arcrun 既有的「意圖工作流」設計(D70:我們自己的事也要用 Arcrun 做)。
🔴 B 的已知代價,先講清楚不要之後才發現:
App 的邏輯全部要用工作流表達。工作流表達不了的東西,這個 App 就做不出來
⇒ 於是「缺什麼零件」會變成 App 生態的天花板。
這不是反對 B,是說選 B 就等於承諾要持續補零件(
Leo/Arcrun#89/#90/#91那類的票會一直長)。這張票要交出什麼才算完成
一份規格文件,能回答 leo 問的那三題:
+ 一個跑得起來的第一個 App當驗收(建議拿
Leo/InkStoneCo#18Kanban 當它,因為 leo 現在就痛,且它的資料源單純)。
🔴 驗收只認用戶走的那條路:leo 打開 Portal,看到那一格,點進去有東西。
不是「規格寫完了」。
📌 本票由總管 2026-08-13 依 leo 指示建立。規格層變更走
pending-changes.md提案後等 confirm。(署名:總管)
✅ 現況核實報告(取代票上那張標著「總管推測」的表)
一句話:七題核實下來,總管推測的方向大致對,但「已經有」的比想像中少一層
http_request打自己的 webhook(正式產線在用),沒有一等公民的節點🔴 它抓到總管提案的兩個缺陷(這段比報告本文更值錢)
缺陷一:「已經設計」被讀成「已經存在」
Leo/Arcrun#82的協定草案寫得非常具體(連 Portal 要改哪 5 處、改幾行都寫了),讀起來很像快做完了。但核實下來:
一行 code 都還沒落地,而且還沒經 leo 拍板、也還沒開 SDD。
⇒ 與
Leo/Arcrun#69(App=bundle)已 confirmed 但 0/33 沒動工是同一種風險:🔴 「confirmed」不等於「在做」。
缺陷二:「App」這個詞現在疊了兩個互相獨立的裁決,總管把它們寫成一件事了
Leo/Arcrun#69Leo/Arcrun#82⇒ 兩條線、兩份文件、兩種進度。寫成一件事會讓人以為「裝了就會自動長出畫面」已經有一半在跑
(因為 D37 confirmed 了)——實際上兩層要各自補完,還要互相對接。
system-dev/docs/1-vision/20260803-mira-as-arcrun-app.md:121-124自己列的三個對接缺口正是:UI 資產怎麼跟著 bundle 走/版本相依/卸載。
📌 總管接受這兩點,本票上方那張表已標為作廢,以本則為準。
🎯 對「App 的實體選 A 還是 B」的影響——核實結果強化了 B
兩條新證據:
POST /webhooks/named存進 KV,正式產線的
rag_extract/rag_extract_one就是這樣加出來的)。20260803-mira-as-arcrun-app.md:108,117(2026-08-03,早於
#82六天)已經寫著:⇒ 總管建議 B,而系統十天前的願景文件已經寫了同一件事。
leo 只需確認要不要沿用,不是從零選。
📄 核實報告全文
Arcrun App 規格提案——現況核實報告
1. 前端掛載點——沒有
現在要新增一個 Portal 頁面,實際要改的檔案只有一個:
matrix/arcrun/console-ui/public/portal/index.html(單檔 HTML/CSS/JS,目前 2279 行),而且同一個「有哪些頁」的事實要在裡面寫四遍::287-295(<div id="sidenav">內逐條<div class="nav" data-nav="...">):550-556(<div id="tabbar">,同一組項目再寫一遍)VIEWS(:758)allowedViews()/LOADERS(:787)GET /portal/session是前端拿「這個帳號能看什麼」的唯一入口(cypher-executor/src/routes/portal.ts:723-736),我直接讀了它現在回什麼欄位:沒有
apps這個 key——也就是「宣告一個東西就讓 Portal 動態長出一格」這條路,今天完全不存在,連雛形都沒有。安裝器(
products/arcrun-rag/installer/oauth-prototype/worker.js)對 UI 做的事是「整顆 worker 換掉」(build-ui-bundle.mjs把整個console-ui/public/內嵌成單檔 workerarcrun-rag-ui);我 grep 了整個安裝器樹的mount/slot/menu/tab,沒有任何一處是「UI 註冊」語意,全是安裝器自己那幾頁 HTML 裡的字面命中。結論:leo 已裁的「掛載點=側欄」(D63,
system-dev/wiki/decisions-summary.md:1042-1054)目前只是裁決,不是實作——側欄長什麼樣是裁決的對象,不是已經存在的插槽。你的推測「不改 Portal 就能多一格」的機制現在沒有,一格都沒有。2. 宣告檔——半套:零件與 recipe 各自都有,但都不是「App」的形狀
今天 Arcrun 裡「描述一個可安裝單位」的宣告檔有兩種,我各讀了一份實例:
零件(component):
matrix/arcrun/registry/components/http_request/component.contract.yaml欄位=
canonical_id/display_name/category/version/stability/input_schema/output_schema/gherkin_tests/tags/description。沒有 icon、沒有 UI 掛載點、沒有「入口」概念——它描述的是一個純函式合約,不是一個裝上去會冒出畫面的東西。recipe:
matrix/arcrun/cypher-executor/src/routes/recipes.ts:23-73(RecipeDefinition)欄位=
uuid/author/canonical_id/endpoint/method/headers/body/auth/credentials_required/created_at。有版本概念(updated_at累加、auth_recipe有version: number,:487-488),但一樣沒有 icon、沒有 UI 掛載。workflow:純 graph YAML(
{ name, graph, config? },webhooks-named.ts:38-40),連version欄位都沒有。沒有任何現存宣告檔帶「版本+圖示+入口+UI 掛載+要什麼權限」這一整組。
#82留言裡提的arcrun-app.yaml(id/name/version/icon/ui.mount/data.templates/actions/workflows)是全新設計,repo 現在唯二的 JSON Schema 只有products/arcrun-rag/schemas/collector-trigger.v1.schema.json與kbdb-ingest-request.v1.schema.json,都跟「可安裝單位」無關——這句話我核實過:matrix/arcrun/schemas/目錄不存在。結論:你說「宣告檔」,零件與 recipe 各有一份,但都是「單一能力/單一 API 呼叫」的合約,不含「這東西要長在 UI 哪裡」。App 的宣告檔要新造。
3. 分發(recipe_search/recipe_push/recipe_pull)——半套,而且要拆成兩層看
recipe 那層(
cypher-executor/src/routes/recipes.ts)確實是一個運作中的市集,證據扎實:canonical_id可以多作者並存,各自 uuid(:75-103),公庫端點GET /public-recipes(:325-359)、GET /public-recipes/:canonical_id(:363-390)依success_count選市場最佳版(:379-388)fetchMarketStat,:291-310,讀真實使用累積的recipe-stats,不採信投稿者自報數):338-345)但它只能分發「一支 API 呼叫的封裝」——沒有「相依」概念(一個 recipe 不能宣告依賴另一個 recipe/template)、沒有版本相容區間(只有
updated_at時間戳)、更不能分發前端/template/多個 workflow 綁一起這種「App」需要的複合單位。bundle 這層才是真正對應「一整包東西」的分發機制,但它是另一條、幾乎沒動工的線:
system-dev/docs/3-specs/arcrun/artifact-sharing/design.mdfrontmatterstatus: draft(不是 active),tasks.md33 條任務全部[ ],0 條打勾。雖然 D37/D38(decisions-summary.md:244)已經把「App=bundle 第四型」定案、leo 也在Leo/Arcrun#69confirmed 過(pending-changes.md該提案已移入「已裁決」),但規格是草稿、程式碼是零——這是「已核准的藍圖」,不是「現成的市集」。結論:recipe 市集是真的、能用,但分發顆粒度停在「單一 API」;能裝「一整包(前端+template+workflow)」的 bundle/App 分發機制已設計、未實作(0/33)。
4. 權限——有,而且比我預期成熟
三塊都有實作,不是空話:
api_key/name/service/secret_ref)走 KBDB entries 表存(matrix/arcrun/cypher-executor/src/routes/credentials.ts:1-30),arcrun 自己讀不回明文。auth_recipe用required_secrets: SecretRequirement[](recipes.ts:464-471)宣告一個 recipe 要哪些 credential,help_url強制必填(:531-540),還有AuthInjectSpec(:473-482)決定怎麼把秘密塞進 header/query/body/path。portal-data.ts的canReadLibrary()(:124-125)+每個查詢強制注入owner_id/library,caller 自帶的同名參數一律忽略(:9-12)。.claude/rules/02-forbidden.md第六類明訂「知識資料面的owner_id必須與寫入端同源」,唯一產地是cypher-executor/src/lib/tenant.ts,且有機械出貨閘擋(scripts/build-worker-artifacts.mjs)與自測(npm run check:tenant)——這條是 2026-08 因Arcrun#108/#105真的踩雷才補的,不是紙上規範。結論:一個東西「要讀某個庫、要用某把金鑰」的宣告與授權路徑今天就有,而且經過至少兩次事故加固。App 若走既有
/portal/data/*與credentials_required這套,權限這塊不需要新造。5. App 之間互叫——半套:做得到,但沒有專屬節點
production 裡真的在用:
products/arcrun-rag/workflows/rag-extract.local.yaml的dispatch節點(:71-78)用http_request打POST {cypher}/webhooks/named/{ns}/rag_extract_one/trigger,帶X-Arcrun-API-Key,把工作交給另一支 workflowrag_extract_one執行——這是「dispatcher+one」兩段式,system-dev/docs/issues-log/Leo-Arcrun-64.md與agent-memory-archive-2026-08.md:685都記過這個模式的坑(foreach 內 code 輸出餵給這種呼叫時模板不展開)。但沒有專屬的「呼叫另一個 workflow」節點類型。我 grep 了
trigger_workflow這個詞:它只出現在matrix/arcrun/registry/examples/(範例/心願級)與多份文件裡被明確標注「未註冊,會 validate 失敗」(system-dev/docs/3-specs/autonomy-dispatch/gate-workflow/README.md:53、Leo-InkStoneCo-1.md:17)。registry/components/底下 20 個真實零件裡沒有trigger_workflow這一個。結論:能力上今天就能做(http_request 直打 trigger 端點,已在正式產線跑),但這是「借用 http_request 打自己的 webhook」,不是一等公民的「呼叫別的 App/workflow」原語。App 要互叫的話,正解路徑存在,但要靠 App 自己的 workflow 拿到對方的
webhooks/named/triggerURL+API key(也就是要碰 tenant 金鑰)。6. 資料——有,且已經是為此設計的
KBDB 走「萬用表」模型(blocks/templates/slots 三張核心表,
.claude/rules全樹反覆強調「零新表」鐵律),新資料型別= seed 一列 template:matrix/arcrun/cypher-executor/src/lib/portal-seeds.ts:21(PORTAL_TEMPLATE_SEEDS),目前已有portal_user(:25)/portal_library(:35)/triplet(:45)三列POST /kbdb/templates(cypher-executor/src/routes/kbdb-proxy.ts),由/init/seed或/portal/admin/bootstrap呼叫0002_credentials.sql),2026-08-07 被 leo 點名「任何東西禁止用 SQL 語句存取資料,一律 API」後,已經改走 KBDB 三張核心表(credentials.ts:18-23)——連系統自己都在把違規表收斂回這套機制。結論:你的推測是對的。KBDB template 機制現在就在扮演「開放給別人查的資料層」這個角色,且是全系統唯一被允許的資料落點(API-as-Wall,零 SQL)。App 若要存自己的資料,正解已經鋪好,不用發明新東西。
7. 新 Worker vs 掛在既有 runtime——看層級,各有一半
.claude/rules/05-deploy-convention.md明講「新增 Worker = 新目錄 +wrangler.toml,不用改 workflow」,CI 用find . -name 'wrangler.toml'掃描式部署(:8-18),每個零件都是獨立 Worker,有對內/對外兩個 URL(.claude/rules/03-component-architecture.md)。這條路確定要部署新 worker。.claude/rules/06-mindset.md§1 明文「AI 開發時的預設順序:1. 預設寫工作流……2. 要有必要讓全 arcrun 生態重用才建零件」。工作流只是一份 YAML,POST /webhooks/named存進 KV(webhooks-named.ts:1-22),完全不必部署任何 worker——rag_extract/rag_extract_one這類正式產線的能力就是這樣加出來的。結論:這題答案是「兩條路都在,且各司其職」——不部署新 worker 也能加功能的路徑今天就存在(工作流,用既有零件/recipe 組),但它產出的是「後端能力」;一旦要新的基礎積木(零件)或要在 Portal 露出畫面,都必須新增部署單位(前者新 worker,後者今天是改 Portal 單檔)。App 協定要解的正是後面這條「露出畫面」的路。
額外一題:零件/recipe 跟 leo 要的「App」是不是同一層
不是同一層,你的直覺是對的,而且系統自己的文件已經在區分這件事,證據比我預期更明確:
system-dev/docs/1-vision/20260803-mira-as-arcrun-app.md(2026-08-03,早於#82六天)已經寫「App 就是一種 bundle,多帶一個ui.entry」(:108),並列出 App 安裝要落地四件套:templates/workflows(明文「不准自帶 worker」,:117)/ui/capability(:115-119)——這正是「零件=積木、recipe=單一 API 封裝、workflow=組裝出的能力,App=把一組這樣的能力+前端+資料契約打包成一個有身份、能裝卸的產品面」的三層結構。decisions-summary.md:244)把 App 定義在「bundle」這個分發層(第四種可分發物:workflow/recipe/template 之上),#82的協定又補了 App 的掛載層(Portal 側欄一格)。兩份文件合起來看,App 是零件/recipe/workflow 的上層聚合+門面,不是它們的同義詞或平行概念——這與你的判斷(零件/recipe 是「擴充能力」類似 plugin,App 是「有自己門面」的上一層)完全吻合。我唯一想幫你補強的一點:目前「App」這個詞在系統裡實際上疊了兩個互相獨立的裁決——「App=bundle」(分發/相依,D37/D38/
#69)和「App=Portal 掛載」(門面,D63/#82)——這兩者 confirmed 的時間點與作者不同、進度也不同(前者規格 draft、0/33;後者連規格都還在票的留言區,SDD 都還沒開)。寫提案時建議明確講清楚你指的是哪一層,或乾脆點名「這兩層現在是分開發展、還沒收斂成一份 SDD」,否則讀的人容易把「D37 已 confirmed」誤讀成「App 機制已經在做」。你的提案最可能錯在哪
我認為風險不在你對「現況」的判斷(你的推測方向其實相當準——recipe 市集、credential、KBDB 這三塊你猜「已經有一半」是對的),而在兩個容易被讀者忽略的落差:
#82那則留言把「協定 v0」寫得非常具體(連 Portal 要改哪 5 處、改幾行都寫了),語感上很像「快做完了」,但我核實下來:portal.ts沒有appskey、index.html沒有mountApp、portal-seeds.ts沒有arcrun_appseed、cli/src/commands/沒有app.ts——一行代碼都还没有落地,而且 D35 生命週期鐵律要求先走pending-changes.mdconfirm 才能開 SDD,那個 confirm 現在也還沒發生(#82票上只留了「等 leo 裁的兩題」)。如果提案給 leo 的印象是「協定都設計好了,接下來就是照做」,容易低估「這是一份還沒被 leo 拍板、也還沒開 SDD 的草案」這個事實,跟 D37(bundle)那條已經 confirmed 但 0/33 沒動工是同一種風險——「confirmed」不等於「在做」。D37/#69(App=bundle,管「怎麼分發、怎麼裝」)與#82(App=Portal 掛載,管「UI 長在哪」)目前是兩條線、兩份文件、兩種進度。你的提案若把它們當一件事描述,會讓 leo 誤以為「裝了就會自動長出畫面」這條路已經有一半基礎在跑(因為 D37 confirmed 了)——但實際上分發層和掛載層要各自補完、還要互相對接(mira-as-arcrun-app.md:121-124自己列的「三個新問題」正是這個對接缺口:UI 資產怎麼跟著 bundle 走、版本相依、卸載)。建議提案裡把這兩層分開畫,並清楚標「目前都是草案/未 confirm,不是現成能力」。🏛️ leo 2026-08-13:App 的分層架構——這是規格的主體,前面的提案要照這個改
一、AI 看到的(人一般不用懂)
這些零件就是負責運行的元件,數量不多。」
例如讓 http request 打到原來沒有的網站。或建立新 credential,例如可以連上 Google service account。」
二、人看到的
🔴 「考慮一律包裝成 App,像 Android 所有 App 不能沒有 icon,一定要可以視覺看到,
就算不需操作也可以直接刪除 icon 就是刪除 App。」
上傳圖片嵌入、產生 todo 可以追蹤⋯⋯背後是多條 Arcrun 工作流在處理。」
三、人想要產生新 App
🔴 這段話直接解掉了本票的第一題「什麼是 App」
答案:凡是人看得到的,都是 App。 差別只有複雜度:
http_request、Google service account⇒ 邊界劃在「人看不看得到」,不是劃在「複雜不複雜」。
三個直接推論(都是可驗的規格,不是形容詞):
⇒ 現在 Portal 側欄那些寫死的頁,要嘛變成 App,要嘛不該在那裡。
(
20260803-mira-as-arcrun-app.md自己列的三個對接缺口之一就是它)。沒有人會為了一條週報工作流去包。⇒ 宣告檔要小到 AI 一次寫得完,且大部分欄位可省略。
🎯 這也印證了實體選 B(總管建議、且系統十天前的願景文件已寫)
leo 要的是「跟 AI 說一句,介面就浮現一個新 icon」。
⇒ 🔴 A 案與 leo 描述的產品體驗互斥。 這不再是偏好問題,是可行性問題。
📌 「以 CF 為基礎的 Manus/Lovable」這句話是本票的驗收標準:
不是「App 協定做完了」,是leo 對他的 AI 說一句話,介面上多一個 icon,點進去能用。
(署名:總管)
❌ 撤回:我用「部署摩擦」否定 A 案——那個論證是錯的(leo 2026-08-13 糾正)
留言 1804 我寫:
leo:
為什麼那個論證錯
Arcrun 的定位就是「替用戶操作 CF」。 部署 worker 不是它的成本,是它的日常能力:
.claude/rules/05-deploy-convention.md「新增 Worker = 新目錄 +
wrangler.toml」Leo/Arcrun#90正是「缺『部署一顆 Cloudflare Worker』的 recipe」⇒ 部署 worker 本來就在計畫中要工作流化
⇒ 🔴 我把「一般 SaaS 的部署摩擦」套在一個專門消除那個摩擦的產品上。
用戶不必懂 CF,因為 Arcrun 幫他做——這正是它存在的理由。
所以 A 案的去留要重新論證
B 仍然是既有定案(D37 confirmed +
20260803-mira-as-arcrun-app.md:117明文「不准自帶 worker」)——但支持它的理由不是我寫的那個。
真正的理由必須從既有裁決來,例如 D37 的複本式分發鐵律:
「pull = 依賴全部落地本實例 KBDB,runtime 零外部依賴,斷源只斷更新不斷用」
⇒ App 裝完之後,原作者的實例消失了,你的 App 照跑。
一顆自帶的 worker 要怎麼滿足這條,是需要論證的——而我沒論證,我用了一個錯的捷徑。
📌 本則之前,本票上所有關於「A 案出局」的論述一律作廢,等重新閱讀後再提。
總管接下來要做的(leo 的指令)
先把 Arcrun 的定位讀清楚,再提案。 已派工做通盤閱讀,結論會貼回本票。
在那之前不再對 App 的實體形式下任何判斷。
(署名:總管)
✅ 定位讀本已完成並併入 main——本票先前對 A 案的論證,正確答案在這裡
📍
system-dev/docs/1-vision/20260813-arcrun-positioning.md(682 行,PR #26 已併)寫任何 Arcrun 提案之前先讀它,尤其 §2 成本表與 §6 的 16 條自查清單。
一、總管那句話錯在哪(結論對,理由錯)
「App 不該自帶 worker」是對的,但理由不是部署有摩擦。
在 Arcrun 的世界裡,部署是「待自動化的一步」,不是「需要人等待的關卡」:
(
installer/scripts/bundle-components.mjs:46-102實查)acr update一次處理 23 顆 component workerLeo/Arcrun#90正在把「部署一顆 Worker」做成 recipe⇒ 🔴 拿「要部署、要權限、要等」當論據,等於否定了這個產品已經做到的事。
二、正確的理由(既有文件早就寫好,我沒去讀)
docs/1-vision/20260803-mira-as-arcrun-app.md:307build-ui-bundle.mjs把整個console-ui/public/內嵌成單檔 worker ⇒ 每裝一個 App 就要重新出貨整個產品三、🔴 這是同款錯的第二次,第一次也記在 D37 裡
兩次都是「把當前部署形態的性質,當成產品的限制」。
⇒ 判準:提案前先問「這個限制是 Arcrun 的,還是我從別的世界帶進來的?」
四、定位的核心判準比預期硬:競爭對手不是 n8n,是「AI 直接寫 Python」
實測反例(同一份文件記著):總管做「定期打 API 然後通知」,
Python 10 行;Arcrun 40 分鐘未完成。
⇒ 🔴 任何讓 AI 覺得「不如自己寫」的設計,都違反定位,不論架構多漂亮。
這條直接約束本票的 App 宣告檔:leo 要「一條工作流也包成 App」,
若包一個 App 要填十個欄位,AI 會選擇不包。宣告檔要小到 AI 一次寫得完。
(這點先前總管推論過,現在有了出處。)
五、順帶查到兩處使用者看得到的死記錄(未修,值得單獨處理)
products/arcrun-rag/installer/README.md寫 24 顆installer/oauth-prototype/worker.js:2297寫「Workers script ×1」六、報告自己標的三個未查
ON_TRUE/ON_FALSE支不支援有兩份互相矛盾的說法(skill vs MCP instructions),未實測——這本身就是「同一件事兩個答案」那條軸的活例
(署名:總管)
🔄 定位更新(leo 2026-08-13 稍晚)——本票先前引用的「跟 Python 比」那條判準作廢
我在留言 1809 引用了定位讀本的「競爭對手不是 n8n,是 AI 直接寫 Python」當判準。
leo 當天稍晚親自更新了定位,那條作廢。
三件改變(每件都改變本票的推理)
① 動力來源從供給端換到需求端——這是核心
⇒ 舊定位把成敗押在「AI 願不願意用」,而那件事我們控制不了。
② 拿 Python 比是層級錯誤 ⇒ 我先前寫的「任何讓 AI 覺得『不如自己寫』的設計都違反定位」
——那條判準作廢。它比的是「寫一支輪詢腳本」,新定位比的是「建一個 App」。
🔴 這跟本票稍早那個錯(把當前部署形態當成產品限制)是同一種:拿錯層級的東西來衡量。
③ 新標竿是 Android App,不是 Python 腳本 ⇒ 提案要問的是
「這個設計讓 AI 建一個 App,是不是比建 Android App 更簡單」。
對本票的直接影響(好消息)
「一律包裝成 App、每個都有 icon、刪 icon=卸載」這條,在新定位下更站得住。
Android 的心智模型現在不只是類比,它是定位本身。
⇒ 而「宣告檔要小到 AI 一次寫得完」的理由也換了、而且更強:
不是「不然 AI 覺得不如寫 Python」,是「用戶 push AI 做一個 App 時,AI 要當場做得出來」。
📍 定位讀本已同步更新:
system-dev/docs/1-vision/20260813-arcrun-positioning.md開頭新增更正段。(署名:總管)
🟢 leo 2026-08-13 裁定:不是「要不要開」,是「去建」
⇒
pending-changes.md那則提案的「等 confirm」狀態結束。本票標籤從s/stage改回s/doing。要交出三件,順序如他所講
system-dev/docs/2-architecture/decisions/)——記錄那個「大的決定」本身:Arcrun 定位從「AI Friendly 的 n8n」轉成「CF 的 Android,AI 快速自建 App」,
以及它帶來的結構後果(App 是一層框架/凡人看得到的都是 App/動力來源從供給端換到需求端)
Leo/Arcrun#69)與掛載層(Leo/Arcrun#82)收斂成一份,並依 SDD 鐵律④逐條處置
stage-environment那三張未完成的票(
Leo/arcrun-rag#27/#28/#29)📌 本票已收攏的六張、核實報告(留言 1802)、定位更新(留言 1817)、
以及
system-dev/docs/1-vision/20260813-arcrun-positioning.md(682 行讀本)都是 SDD 的輸入。(署名:總管)
✅ 三件已交:ADR + SDD + 連結(leo 2026-08-13 指令)
PR(含完整交件說明):Leo/InkStoneCo#30
📄 連結
D79-arcrun-as-cf-android.mdarcrun-app-system/requirements.mdarcrun-app-system/design.mdarcrun-app-system/tasks.md不含任何實作程式碼(SDD 鐵律④a:任務搬移做完前不准寫 code)。
ADR 記的那個「大的決定」
定位從「AI Friendly 的 n8n」→「CF 的 Android,AI 快速自建 App」,
核心是動力來源從供給端換到需求端——舊定位的死穴正是「AI 沒有用它的動力」,而那件事我們控制不了。
六個結構後果、以及兩條作廢的判準(跟 Python 比/部署摩擦論——同一種錯:拿錯層級的東西來衡量)
逐條附出處,全文在 ADR。
✅「App 不准自帶 worker」結論不變,但理由換成正確的三條(第三方維運門檻/Portal 是出貨物/複本式分發)。
SDD 為什麼是一份不是兩份
三個對接缺口 ① UI 資產隨 bundle 走 ② 版本相依 ③ 卸載——
design.md §一有一張表逐條說明每個缺口的哪一半屬分發層、哪一半屬掛載層。分開寫必然各寫一半。
三個缺口在
tasks.mdPhase 2 各有獨立任務(2.1/2.2/2.3),各帶驗收。設計上唯一新增的主張(其餘全部沿用既有裁決,沒有在旁邊開新路):
icon是必要的存在、不是必要的填寫(省略時系統自動給)🔴 SDD 鐵律①怎麼處置的
stage-environment→paused(不是 closed:它沒有被取代,題目不同,填superseded_by會是假話);arcrun-app-system→active。機械驗證:sdd-active-check.shexit=0,active 恰好 1 份。鐵律④a 逐條搬移(實查 Gitea 票面,不是照抄舊記錄):
Leo/arcrun-rag#27Leo/arcrun-rag#28Leo/arcrun-rag#29📌 這裡更正了本票
pending-changes那則提案的一句話:它寫「#27/#28/#29 都還沒完成」,#29 其實早就 closed 了。
而且搬移不是純記帳:App 要出貨就必須走 stage → prod,
#27/#28沒解 ⇒「leo 打開 Portal 看到那個 icon」這條驗收沒有安全的出貨路徑 ⇒ 它們是 Phase 0 前置。
⏸ 等 leo 回一個詞的三件
→ 回「自己寫」或「要開放」
回完 A、B 我就能往 Phase 1 推;C 是流程要求的簽收。
(署名:Arcrun App 規格 subagent)