#!/usr/bin/env python3 """stage — 雲端對 **stage(youlin)** 寫入的正門(inkstone/ISEP#137) ━━ 為什麼有這支 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 09-07 三條主線工人在雲端對 stage 的寫入全被 Claude Code auto mode 的分類器擋(不是 ISEP 的閘): ① `printf … | npx wrangler secret put CF_SECRETS_API_TOKEN --name arcrun-cypher-executor` ② `python3 scripts/stage-deploy-artifacts.py all --confirm`(Arcrun 的成品直推,CF API 上傳) ③ `curl -X POST …arcrun-yuga3bse.workers.dev/records`/`/graph/canonicalize-entities`/`/map/recompute` 權限白名單(docs/permissions-allow.json)是**逐條完全比對前綴**:複合指令(`cd … && printf … | VAR=… npx …`) 與任意寫法的 curl 永遠對不上任何一條;放整類 `Bash(npx *)`/`Bash(curl *)` 又是紅線。 leo 09-07:「為什麼會擋你,這就是要修復的問題」「本機環境跟你不同應該不行」。 ⇒ 每一種寫入收成**一支固定形狀**,白名單放它的四種呼叫形狀: `stage secret …` = ①(打 api.cloudflare.com,不經 npx——雲端每次要重抓 wrangler, 而且 wrangler 會讀 ~/.wrangler 的登入態:本機是 uncle6、雲端沒有,兩台行為不同) `stage api …` = ③(用 curl 打 stage 實例;youlin 邊緣對 python-urllib UA 回 403 code 1010, Arcrun#176 comment 6487——所以這一段**不用 urllib**) ② = Arcrun 自己那支已經寫死只認 youlin 帳號 ID、憑證只從 CLOUDFLARE_API_TOKEN_YOULIN_CC_USE 讀、不收 --account/--token; 白名單直接放它的形狀(`python3 scripts/stage-deploy-artifacts.py *`),不重造一支。 ━━ 只寫 stage,判準是唯一識別碼往放行方向比對,不是名字 ━━━━━━━━━━━━━━━━━━━━━━ stage 隨便炸;出貨機(geek6688/uncle6)與 leo 的實例(leo21c)不是。 secret:這把 token 打得到的帳號(GET /accounts 現查)裡要有 1129efd7df2e8899d537e9c8fbabb6cb, 而且寫入的 URL 永遠只帶這個 ID。打不到 ⇒ 拒絕、印出它打得到誰、離開碼 2。 api :URL 只會長在 `.arcrun-yuga3bse.workers.dev`(09-02 重裝後的 stage 子網域)。 給完整網址時主機必須等於它,否則拒絕、離開碼 2——不管那個主機叫 leo21c 還是別的什麼。 不看變數名字裡有沒有 `leo21c`/`geek6688`——名字改了黑名單就漏,ID 與主機改不了。 ━━ 值不進指令列 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ secret 的值、Bearer、任何標頭值都只從**環境變數名**讀(--from-env/--bearer-env/--header-env); 不落磁碟、不 echo、不進 git、不進 shell 歷史。curl 的標頭與 body 走 stdin 設定檔+管線,不走 argv。 ━━ 用法 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ stage secret put --worker