42cb1d7aa9
leo 2026-08-08:「已經發生過一次這個錯誤,把舊版界面上到 prod, 你要確定不可再犯。」 實測(repo 對線上,純文字資產比對): repo portal/index.html 343,969 bytes 線上 mira.uncle6.me 82,911 bytes(Songti 12 處,舊金色 serif 品牌) 線上 pages.dev 82,911 bytes(同上) 而e730b3f那版 verify-live 對這兩站**三項檢查全過**——因為它驗的是 組態(apiBase、profile 的 views/home),不是世代。 ⇒ 一個網址可以組態完全正確、卻對外展示一套早就被淘汰的介面, 而所有機械檢查都說它是綠的。這就是要消滅的狀態。 本次落地: 一、世代指紋(targets.mjs) 逐一取線上/產物的資產(index / portal / console / favicon.svg), 遮掉本來就該隨部署目標不同的那兩行(VIEWS/HOME),其餘按位元組比對。 刻意不用關鍵字清單——清單要人維護,而舊世代能無聲上線正是因為沒人記得維護它。 誠實 trade-off 寫在檔內:repo 改了沒部署就會判紅,那是正確的(那時線上確實不當代)。 二、宣告值真的寫進產物(收掉e730b3f標的 WIP) deploy.mjs 改為由 targets.mjs 產出 .staging/<目標> 再推: config.js 由宣告值即時產生、console 的 VIEWS/HOME 依 profile 覆寫, **覆寫沒命中就中止部署**;推之前回頭讀磁碟上那份驗一次(不看腳本印了什麼)。 public/config.js 刪除——它是產物不是原始碼。 三、修好一道從 08-03 起就在誤判的閘 t160 的世代閘比對 portal 全文含「登記新庫」即拒部,而 66f1b59(08-03) 加了一則**說明「已經把它拿掉了」的 HTML 註解** ⇒ 該閘自那天起每次誤判, npm run deploy:personal 連續五天推不出去。改成剝掉註解後只看可見內容, 並降級為輔助(主判準是指紋)。這正是「手工關鍵字閘會腐爛」的實例。 四、讓它在該跑的時候真的被跑到(不再生出沒人記得執行的腳本) · deploy.mjs 推完自動回頭驗線上,不過就算本次部署失敗 · .deploy-state.json 只在線上實測通過後才寫,且不進版控 (新 checkout 沒紀錄=狀態未知=該被提醒,而不是繼承別人的綠燈) · Stop hook 每回合離線比對「手上這一代 vs 最後一次驗過的部署」, 在要說「做完了」的那一刻出聲(實測 0.096s,不連網) 五、uncle6 邊界寫進工具本身(leo 08-08:「要看範例只在 youlin 網站,不要去碰 uncle6」) deploy.targets.json 的 enterprise 標 frozen:deploy 拒絕部署、verify 連抓都不抓。 目標本身保留不刪——刪掉就變成下一個 AI 眼中「從來沒有過這個站」的失憶。 同源清掉兩處還活著的舊記錄:README 的線上 demo 連結、public/index.html 的註解。 驗收證據見 commit 後的實測輸出(舊世代樣本取自 git 歷史 ad367e4,本機起站餵判準, 未碰任何線上資源)。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
95 lines
5.8 KiB
JSON
95 lines
5.8 KiB
JSON
{
|
||
"_readme": [
|
||
"部署目標定義檔(leo 2026-07-22 立)。一個目標=一組『帳號+profile+apiBase+專案名+對外網址』。",
|
||
"",
|
||
"為什麼要這個檔:5a16484 把 UI 搬 CF Pages 後,這些值從 worker 環境變數變成部署期參數。",
|
||
"誰部署誰要記得帶 → 帶漏了就退回預設,而預設值對兩邊都不對。實際踩過的:",
|
||
" · demo 站漏 CONSOLE_PROFILE=rag → 顯示個人版 7 頁駕駛艙(leo 看到『Mira 介面』的真因)",
|
||
" · 兩站都漏 ARCRUN_API_BASE → apiBase 空字串 → 前端打自己回 405 → 登不進去",
|
||
" · 兩個帳號有同名 arcrun-console-ui 專案,wrangler 又登入在 uncle6",
|
||
" → 不指定帳號直接 deploy 會部到 demo 站上(差點蓋掉)",
|
||
"",
|
||
"🔴 第四次(2026-08-08 發現,同一種病換了形式):",
|
||
" 上面三次的『解』是 deploy.targets.json + build.mjs 在 build 時把 profile/apiBase",
|
||
" 烤進產物。但 t160(e744ad1)為了清世代債把 build.mjs 整支刪掉、改成直接託管 public/,",
|
||
" **沒有人把『把宣告值寫進產物』這件事接手過去** ⇒ deploy.mjs 照樣在終端機印",
|
||
" 『profile:full / apiBase:…leo21c…』,推上去的卻是 public/config.js 裡凍住的",
|
||
" cypher.arcrun.dev + 凍在 4 頁的 VIEWS。也就是說:",
|
||
" **`npm run deploy:personal` 會把個人站的 API 打到企業 demo 的後端、頁面砍成 4 頁**,",
|
||
" 而終端機從頭到尾顯示『成功』。(第三次的 accountId 是靠 env 傳的,倖存;前兩次的解等於被還原。)",
|
||
"",
|
||
" → 現在的規矩:**產物由 deploy.mjs 依本檔即時產生(.staging/<目標>),",
|
||
" 推之前驗產物、推之後驗線上網址**。public/ 裡不再放任何跟目標有關的值。",
|
||
" · public/config.js 已刪除——它是產物不是原始碼(自架站的 /config.js 由",
|
||
" arcrun-rag 的 build-ui-bundle 動態產生,不吃這個檔)",
|
||
" · public/console/index.html 的 VIEWS/HOME 只是本機 preview 的預設值,",
|
||
" 部署時一律被 _profiles 覆寫,覆寫沒命中就中止部署",
|
||
"",
|
||
"🔴 第五次(2026-08-08 同日,leo:「已經發生過一次這個錯誤,把舊版界面上到 prod,",
|
||
" 你要確定不可再犯」):**組態對 ≠ 世代對**。",
|
||
" 當天實測:三個對外網址的 apiBase/views/home **三項全過**,",
|
||
" 但它們跑的是 07-22 那一代的 portal(82,911 bytes、舊金色 serif 品牌、Songti 12 處),",
|
||
" repo 已是 343,969 bytes 的新品牌世代。**組態全綠、介面落後半個月,沒有任何檢查會叫。**",
|
||
" → 故 verify-live 加第二層「世代指紋」:逐一抓線上資產、遮掉本來就該隨目標不同的",
|
||
" 那兩行(VIEWS/HOME),其餘按位元組比對 repo public/。",
|
||
" 不用關鍵字清單——清單要人維護,而舊世代能無聲上線正是因為沒人記得維護它。",
|
||
"",
|
||
"版本差異(leo 2026-07-22 定調):頁面都存在,由 profile 決定顯示哪些。",
|
||
" personal(full) 個人版:7 頁全開,落地駕駛艙",
|
||
" enterprise(rag) 企業版:只留 搜尋/工作流/設定/card,落地搜尋頁",
|
||
" 未來擴充:個人版新用戶上限 1、知識庫權限不可用 → 加在對應目標的欄位裡,別再散進部署指令。",
|
||
"",
|
||
"🧊 frozen 欄位(2026-08-08 leo 立):標了 frozen 的目標=**這個帳號的資源不歸我們動**。",
|
||
" deploy 拒絕部署它,verify 連抓都不抓(不 curl、不探測)。",
|
||
" 它不是「壞掉所以跳過」,是刻意的邊界;要解凍是人的決定(拿掉欄位並說明理由)。",
|
||
" 目標本身**保留不刪**——刪掉就變成下一個 AI 眼中「從來沒有過這個站」的失憶。",
|
||
"",
|
||
"用法:npm run deploy:personal",
|
||
" npm run deploy:personal -- --dry-run (只產出並驗產物,不推)",
|
||
" npm run verify (不部署,只驗線上:組態=宣告值、世代=當代)",
|
||
" npm run verify -- --url <網址> (只問某個網址:它跑的是不是當代的)"
|
||
],
|
||
|
||
"_profiles": {
|
||
"full": {
|
||
"description": "個人版:7 頁全開,落地駕駛艙",
|
||
"views": ["cockpit", "search", "card", "workflows", "creds", "inbox", "settings"],
|
||
"home": "cockpit"
|
||
},
|
||
"rag": {
|
||
"description": "企業版:搜尋/card/工作流/設定,落地搜尋頁",
|
||
"views": ["search", "card", "workflows", "settings"],
|
||
"home": "search"
|
||
}
|
||
},
|
||
|
||
"personal": {
|
||
"description": "leo 私人實例(原 Mira)。入口 mira.uncle6.me → leo21c worker。",
|
||
"accountId": "51a01bfa2665bd7bc3fd080dc40cf3e1",
|
||
"projectName": "arcrun-console-ui",
|
||
"profile": "full",
|
||
"brand": "Arcrun",
|
||
"apiBase": "https://arcrun-cypher-executor.leo21c.workers.dev",
|
||
"verifyUrls": ["https://mira.uncle6.me", "https://arcrun-console-ui.pages.dev"],
|
||
"limits": {
|
||
"maxUsers": 1,
|
||
"libraryPermissions": false
|
||
}
|
||
},
|
||
|
||
"enterprise": {
|
||
"frozen": "leo 2026-08-08:「要看範例只在 youlin 網站,不要去碰 uncle6」——這站是 uncle6 帳號的資源,已廢。不更新、不下架、不探測。要動它是 leo 的閘。",
|
||
"description": "【已凍結・沿革】企業版 demo 站(uncle6 帳號)。保留紀錄用,不是現行部署對象。",
|
||
"accountId": "58309bb90fd93ad6d0fe0aae99170e9d",
|
||
"projectName": "arcrun-console-ui",
|
||
"profile": "rag",
|
||
"brand": "Arcrun",
|
||
"apiBase": "https://cypher.arcrun.dev",
|
||
"verifyUrls": ["https://rag-demo.arcrun.dev"],
|
||
"limits": {
|
||
"maxUsers": null,
|
||
"libraryPermissions": true
|
||
}
|
||
}
|
||
}
|