畢業一個 Labs 功能
畢業儀式會移除功能的 Labs 開關,使其成為一個正常功能。在開始任何程式碼之前,由功能負責人做出兩個獨立的決定:
- 離開 Labs: 功能獲得一個永久家園(自己的設定或外掛頁面),並移除 Labs 相關字眼。
- 預設: 預設開啟,或預設仍關閉。
這兩個決定是獨立的。#197029 最初嘗試兩者皆做,但最終只發布了第一個:Advisor 離開了 Labs,但預設保持關閉。請詢問需要哪一個;不要假設「畢業」就等於「預設開啟」。
先例:Swarm 預設開啟 (#136514)、Tool Search 預設開啟 (#154068)、原生外掛 UI 無需 Labs 選擇加入 (de50262a1f96)、Labs 功能移至設定 (#145460)、Advisor 離開 Labs 但仍關 (#197029)。
PR 之前
- 在真實路徑上衡量成本或風險,如果功能會花費金錢或 tokens,或改變從未選擇加入的用戶的行為。來自模擬或單元測試的今日數據不是證明。#197074 合併了一個來自模擬的快取成本主張,但被實際提供者駁回,並在 #197175 中被還原。請使用功能自己的 PR 已建立的實際測量方法,並將數據放在 PR 正文中。
- 先解決已知的缺陷。 Advisor 的畢業等待其 fork 快取修復 (#197203, #197223, #197224, #197226),因為預設開啟會讓每個用戶都承擔未快取的成本。
- 找到仍存在的啟用路徑。 在 Labs 行消失後,用戶必須仍能從 UI 打開該功能。一個捆綁的外掛使用 設定 → 外掛 → <名稱> → 啟用;一個核心功能需要其設定頁面。只有在沒有開關時才添加一個。
變更
- 預設。 只有在負責人選擇預設開啟時才更改:捆綁外掛的
openclaw.plugin.json中的enabledByDefault,或核心配置預設值。任何現有的明確false(或功能的選擇退出值)必須繼續運作,且現有的true必須保持開啟。永遠不要添加一個會改寫已儲存配置以改變某人選擇的遷移。 - Labs。 從
ui/src/pages/labs/labs-registry.ts中移除該條目,以及所有只有它使用的東西:labs-page.tsx行或插槽、labs-feature-state.ts條目、字串和測試。 - 文件。 將文件片段從
docs/concepts/experimental-features.md移至其自己的參考頁面。在該處留下一段帶有舊錨點的說明,表示它已畢業、其預設值以及在哪裡開啟它。更新「Labs 包含...」列表和「目前有紀錄的標誌」表格。 - 用詞。 從 manifest 描述、套件描述、README、外掛摘要,以及任何面向用戶或模型的文字(如提示前綴)中移除「Experimental」和「OpenClaw Labs」。
- 產生的檔案。 重新產生,永遠不要手動合併:
pnpm config:docs:gen、pnpm plugins:inventory:gen。根據ui/AGENTS.md,Control UI 在地化產出物(*.meta.json、*.tm.jsonl、catalog-fallbacks.json)不應包含在 PR 中;在地化更新工作流程會處理它們。pnpm ui:i18n:verify必須通過。 - 升級驗證。 僅針對預設變更:證明在真實升級過程中,沒有已儲存的條目獲得新預設值,明確的關閉保持關閉,明確的開啟保持開啟。如果預設值保持不變,則不需要升級案例;#197029 放棄了它為預設開啟建立的那個案例。
PR 中的證明
- Control UI 截圖,上傳前檢查是否含有私人數據:Labs 的前後對比,以及在真實 Gateway 上運作的啟用路徑。使用
gh pr comment <n> --attach '<file>#<alt text>'附加它們。 - 啟用路徑已進行端到端測試:開關儲存了預期的配置,且無需重啟即可生效。
- 該功能的測試和 Labs 頁面測試通過;測試行數不增加。
- 文件的主張與程式碼相符。ClawSweeper 捕捉到了 Advisor 的「每個
everyMinutes最多一次審查」,這在啟用everyToolCalls時是不正確的。
合併之後
新位置僅出現在包含該合併的 build 中。告訴用戶確切的路徑,以及舊版 build 仍會顯示 Labs 開關。