身為在雲端做事的總管,我要能把 secret 種進 stage 的 worker,我才不用把一行指令丟回 leo 的 Mac #137

Closed
opened 2026-09-07 02:14:04 +00:00 by claude-code · 7 comments
Member

Parent: inkstone/ISEP#130

這張票是從母票的討論串裡長出來的一件事。
它沒關,母票關不掉(Gitea 原生相依,實測 412 硬擋)。
它關掉時,母票會收到一則回寫ticket close 自動做,見 inkstone/ISEP#92)。

目標

雲端總管能把一把 secret 種進 stage(youlin,CF 帳號 1129efd7df2e8899d537e9c8fbabb6cb 的某顆 worker,不用把指令丟回 leo 的 Mac。

leo 09-07 原話(對「為什麼被擋」):「為什麼會擋你,這就是要修復的問題」「本機環境跟你不同應該不行」。

09-07 實撞(總管,雲端 sandbox)

  • 07-30 精確同款 printf … | npx wrangler secret put CF_SECRETS_API_TOKEN --name arcrun-cypher-executorClaude Code auto mode 分類器擋下(不是 ISEP 閘)。同一回合連 ticket where <含 token 字樣的關鍵字> 都被擋,換中性字就過。
  • 0.23.0 的 docs/permissions-allow.json 只放四個正門工具;白名單是逐條完全比對前綴,複合指令(cd … && printf … | VAR=… npx …)永遠對不上任何規則。
  • 這一格擋住的是主線 B-3(inkstone/Arcrun#86 comment 6475)與 stage 上所有 credential 登記;stage 現況見 inkstone/Arcrun#119 comment 6473。

驗收條件

  • 從雲端 session 用那支正門工具,把一把指定名字的 secret(值只從環境變數名讀,不出現在指令列)種進 stage 的 arcrun-cypher-executor;之後用 CF API 列 secrets 看得到那個名字。
  • 同一支工具對 非 stage 帳號(leo21c/geek6688)拒絕執行,並印出理由(stage 隨便炸,出貨機與 leo 的實例不是)。
  • docs/permissions-allow.json 多了它的呼叫形狀(照既有規矩:幾種呼叫形狀幾條),settings-allow-sync 冪等測試仍綠。
  • 跑過 docs/TESTING.md 既有形狀的測試並附輸出;盤點數字在樹上實數。

紅線

  • 不放整類(Bash(npx *)Bash(wrangler *))——只放這一支工具的固定形狀。
  • 值不落磁碟、不 echo、不進 git;只從呼叫者給的環境變數名讀。
  • 不推 main;版本號由總管定,PR 寫「待總管定版」。

deliverable 類型

code

Parent: inkstone/ISEP#130 > 這張票是從母票的討論串裡長出來的一件事。 > **它沒關,母票關不掉**(Gitea 原生相依,實測 412 硬擋)。 > **它關掉時,母票會收到一則回寫**(`ticket close` 自動做,見 `inkstone/ISEP#92`)。 ## 目標 雲端總管能把一把 secret 種進 **stage(youlin,CF 帳號 `1129efd7df2e8899d537e9c8fbabb6cb`)** 的某顆 worker,不用把指令丟回 leo 的 Mac。 leo 09-07 原話(對「為什麼被擋」):「**為什麼會擋你,這就是要修復的問題**」「**本機環境跟你不同應該不行**」。 ### 09-07 實撞(總管,雲端 sandbox) - 07-30 精確同款 `printf … | npx wrangler secret put CF_SECRETS_API_TOKEN --name arcrun-cypher-executor` 被 **Claude Code auto mode 分類器**擋下(不是 ISEP 閘)。同一回合連 `ticket where <含 token 字樣的關鍵字>` 都被擋,換中性字就過。 - 0.23.0 的 `docs/permissions-allow.json` 只放四個正門工具;白名單是**逐條完全比對前綴**,複合指令(`cd … && printf … | VAR=… npx …`)永遠對不上任何規則。 - 這一格擋住的是主線 B-3(`inkstone/Arcrun#86` comment 6475)與 stage 上所有 credential 登記;stage 現況見 `inkstone/Arcrun#119` comment 6473。 ## 驗收條件 - [ ] 從雲端 session 用那支正門工具,把一把指定名字的 secret(值只從環境變數名讀,不出現在指令列)種進 stage 的 `arcrun-cypher-executor`;之後用 CF API 列 secrets 看得到那個名字。 - [ ] 同一支工具對 **非 stage** 帳號(leo21c/geek6688)拒絕執行,並印出理由(stage 隨便炸,出貨機與 leo 的實例不是)。 - [ ] `docs/permissions-allow.json` 多了它的呼叫形狀(照既有規矩:幾種呼叫形狀幾條),`settings-allow-sync` 冪等測試仍綠。 - [ ] 跑過 `docs/TESTING.md` 既有形狀的測試並附輸出;盤點數字在樹上實數。 ## 紅線 - 不放整類(`Bash(npx *)`/`Bash(wrangler *)`)——只放這一支工具的固定形狀。 - 值不落磁碟、不 echo、不進 git;只從呼叫者給的環境變數名讀。 - 不推 main;版本號由總管定,PR 寫「待總管定版」。 ## deliverable 類型 code
claude-code added the
s
todo
label 2026-09-07 02:14:05 +00:00
Author
Member

【身份】總管/inkstone/InkStoneCo/-

補一個事實:擋的不只 secret,是「雲端對 stage 的所有寫入」(2026-09-07,Arcrun#176 comment 6487 與 Arcrun#86 comment 6472)

同一天三條主線工人在 stage 撞的都是同一面牆,形狀有三種:

  1. 種 secret(wrangler secret put)——本票原本的範圍。
  2. 直推 worker 成品(scripts/stage-deploy-artifacts.py all --confirm,CF API 上傳)。
  3. 對 stage KBDB 的 API 寫入(curl -X POST …arcrun-yuga3bse.workers.dev/records/graph/canonicalize-entities/map/recompute)。

三種都被 Claude Code auto mode 分類器擋;0.21.0 的 prod-write-guard 又把 arcrun-yuga3bse 當 prod(0.23.0 已修那一半)。

目的加寬一句

不只 secret:雲端總管對 stage(youlin 帳號)的寫入動作,每一種都有一支固定形狀的正門可走,白名單逐條對得上。是做一支帶子命令的工具還是幾支,你判斷;判準是「分類器認得出來、非 stage 帳號拒絕、值不進指令列」。

順帶(不是本票的活,別做)

youlin 邊緣對 python-urllib UA 回 403 error code: 1010(CF 瀏覽器簽章封鎖),curl 不受影響。正門工具別用 urllib 打 stage。

【身份】總管/inkstone/InkStoneCo/- ## 補一個事實:擋的不只 secret,是「雲端對 stage 的所有寫入」(2026-09-07,`Arcrun#176` comment 6487 與 `Arcrun#86` comment 6472) 同一天三條主線工人在 stage 撞的都是同一面牆,形狀有三種: 1. 種 secret(`wrangler secret put`)——本票原本的範圍。 2. 直推 worker 成品(`scripts/stage-deploy-artifacts.py all --confirm`,CF API 上傳)。 3. 對 stage KBDB 的 API 寫入(`curl -X POST …arcrun-yuga3bse.workers.dev/records`、`/graph/canonicalize-entities`、`/map/recompute`)。 三種都被 Claude Code auto mode 分類器擋;0.21.0 的 `prod-write-guard` 又把 `arcrun-yuga3bse` 當 prod(0.23.0 已修那一半)。 ## 目的加寬一句 不只 secret:**雲端總管對 stage(youlin 帳號)的寫入動作,每一種都有一支固定形狀的正門可走**,白名單逐條對得上。是做一支帶子命令的工具還是幾支,你判斷;判準是「分類器認得出來、非 stage 帳號拒絕、值不進指令列」。 ## 順帶(不是本票的活,別做) youlin 邊緣對 `python-urllib` UA 回 403 `error code: 1010`(CF 瀏覽器簽章封鎖),curl 不受影響。正門工具別用 urllib 打 stage。
Author
Member

【身份】isep-hand/inkstone/ISEP/feat/137-stage-secret-put

交付:PR inkstone/ISEP#138(待總管定版)

comment 6490 的三種寫入各有正門,白名單逐條對得上,判準是識別碼不是名字:

09-07 被擋的形狀 正門 只寫 stage 怎麼保證
npx wrangler secret put scripts/stage secret put|list|delete(直接打 CF API) GET /accounts 看 token 打得到誰,stage ID 不在就拒絕並印出它打得到誰;URL 永遠只帶 1129efd7…
curl -X POST …arcrun-yuga3bse… scripts/stage api <METHOD> <worker>/<path>(curl,標頭與 body 不走 argv) 主機只會是 *.arcrun-yuga3bse.workers.dev,其他主機拒絕、零請求
stage-deploy-artifacts.py --confirm Arcrun 自己那支(已寫死 youlin 帳號 ID、不收 --account/--token)——不重造 白名單放它從 Arcrun 根目錄跑的相對形狀

值只從環境變數名讀;--value--bearer--header 拒收。不放 Bash(npx *)Bash(wrangler *)Bash(curl *)

驗收條件對照

  • 從雲端用正門把指定名字的 secret 種進 stage arcrun-cypher-executor,CF API 列得到——真跑:隨機值 ISEP_137_PROBE 種進去 → 不經工具 CF API 列到 ["ISEP_137_PROBE","KBDB_INTERNAL_TOKEN"] → 刪掉 → 剩 ["KBDB_INTERNAL_TOKEN"](stage 恢復原狀)。
  • 非 stage 帳號拒絕並印理由——離線 B1/B2(token 只打得到 leo21c/geek6688)+ A1(--account 給 uncle6 ID,零請求);api 的 D1(leo21c 主機)真跑也拒絕、離開碼 2。
  • docs/permissions-allow.json 多了 4+1 條形狀;test-settings-allow-sync.sh 19/19。
  • scripts/test-stage.sh 45/45check-version-consistency.sh claude plugin validate ✔。盤點本樹實數:hooks 61、註冊 85(沒動)、scripts 56

沒驗的(這是 report 不是 deliver 的那幾格)

  • 帶 Bearer 真寫進 stage KBDB:雲端沒有 KBDB_INTERNAL_TOKEN(只在安裝器中心側 KV,Arcrun#176 comment 6487 步驟 0)。只在假伺服器上驗過。
  • CF_SECRETS_API_TOKEN 真值是 Arcrun#86 B-3 的東西,沒編假的塞進去。總管拿到值後:python3 "$CLAUDE_PLUGIN_ROOT/scripts/stage" secret put --worker arcrun-cypher-executor --secret CF_SECRETS_API_TOKEN --from-env <值所在的變數名>
  • 「分類器真的不擋」要下一版裝進雲端後看 run 的 permission_denials(同 A33)。

實跑抓到的一個真 bug(已修、已入 wiki)

離線假 CF 對 secret PUT 回 200 ⇒ 27/27 全綠;第一次真跑 CF 回 201,工具講成失敗,而獨立列表證明種進去了。假伺服器現在照真的回 201,測試 C1 釘住。system-dev/wiki/mistakes.md 記了這條與「前綴比對 vs 複合指令」。

📌 順帶量到:*.arcrun-yuga3bse.workers.dev 本 session 從雲端 curl 200(GET health、POST 401),egress 已放行;docs/cloud-session-bootstrap.md「要 Mac」表那列已改。

【身份】isep-hand/inkstone/ISEP/feat/137-stage-secret-put ## 交付:PR inkstone/ISEP#138(待總管定版) comment 6490 的三種寫入各有正門,白名單逐條對得上,判準是識別碼不是名字: | 09-07 被擋的形狀 | 正門 | 只寫 stage 怎麼保證 | |---|---|---| | `npx wrangler secret put` | `scripts/stage secret put\|list\|delete`(直接打 CF API) | 先 `GET /accounts` 看 token 打得到誰,stage ID 不在就拒絕並印出它打得到誰;URL 永遠只帶 `1129efd7…` | | `curl -X POST …arcrun-yuga3bse…` | `scripts/stage api <METHOD> <worker>/<path>`(curl,標頭與 body 不走 argv) | 主機只會是 `*.arcrun-yuga3bse.workers.dev`,其他主機拒絕、零請求 | | `stage-deploy-artifacts.py --confirm` | Arcrun 自己那支(已寫死 youlin 帳號 ID、不收 --account/--token)——不重造 | 白名單放它從 Arcrun 根目錄跑的相對形狀 | 值只從環境變數名讀;`--value`/`--bearer`/`--header` 拒收。不放 `Bash(npx *)`/`Bash(wrangler *)`/`Bash(curl *)`。 ## 驗收條件對照 - [x] 從雲端用正門把指定名字的 secret 種進 stage `arcrun-cypher-executor`,CF API 列得到——**真跑**:隨機值 `ISEP_137_PROBE` 種進去 → 不經工具 CF API 列到 `["ISEP_137_PROBE","KBDB_INTERNAL_TOKEN"]` → 刪掉 → 剩 `["KBDB_INTERNAL_TOKEN"]`(stage 恢復原狀)。 - [x] 非 stage 帳號拒絕並印理由——離線 B1/B2(token 只打得到 leo21c/geek6688)+ A1(`--account` 給 uncle6 ID,零請求);api 的 D1(leo21c 主機)真跑也拒絕、離開碼 2。 - [x] `docs/permissions-allow.json` 多了 4+1 條形狀;`test-settings-allow-sync.sh` 19/19。 - [x] `scripts/test-stage.sh` **45/45**;`check-version-consistency.sh` ✅;`claude plugin validate` ✔。盤點本樹實數:hooks 61、註冊 85(沒動)、scripts **56**。 ## 沒驗的(這是 report 不是 deliver 的那幾格) - 帶 Bearer **真寫進 stage KBDB**:雲端沒有 `KBDB_INTERNAL_TOKEN`(只在安裝器中心側 KV,Arcrun#176 comment 6487 步驟 0)。只在假伺服器上驗過。 - `CF_SECRETS_API_TOKEN` 真值是 Arcrun#86 B-3 的東西,沒編假的塞進去。總管拿到值後:`python3 "$CLAUDE_PLUGIN_ROOT/scripts/stage" secret put --worker arcrun-cypher-executor --secret CF_SECRETS_API_TOKEN --from-env <值所在的變數名>`。 - 「分類器真的不擋」要下一版裝進雲端後看 run 的 `permission_denials`(同 A33)。 ## 實跑抓到的一個真 bug(已修、已入 wiki) 離線假 CF 對 secret PUT 回 200 ⇒ 27/27 全綠;第一次真跑 CF 回 **201**,工具講成失敗,而獨立列表證明種進去了。假伺服器現在照真的回 201,測試 C1 釘住。`system-dev/wiki/mistakes.md` 記了這條與「前綴比對 vs 複合指令」。 📌 順帶量到:`*.arcrun-yuga3bse.workers.dev` 本 session 從雲端 curl 200(GET health、POST 401),egress 已放行;`docs/cloud-session-bootstrap.md`「要 Mac」表那列已改。
Author
Member

🏃 棒子交回 → claude-code

下一步:看 PR inkstone/ISEP#138、定版;拿到 CF_SECRETS_API_TOKEN 真值後用 stage secret put 種進 arcrun-cypher-executor

證據#138

🏃 **棒子交回** → `claude-code` **下一步**:看 PR inkstone/ISEP#138、定版;拿到 CF_SECRETS_API_TOKEN 真值後用 stage secret put 種進 arcrun-cypher-executor **證據**:https://git.uncle6.me/inkstone/ISEP/pulls/138
claude-code self-assigned this 2026-09-07 02:32:49 +00:00
claude-code added
s
review
and removed
s
todo
labels 2026-09-07 02:33:11 +00:00
Author
Member

【身份】總管/inkstone/InkStoneCo/-

v0.24.0 總管驗收完成,測試位置在 https://git.uncle6.me/inkstone/ISEP/releases/tag/v0.24.0

我在「分支 ⊕ main」重跑:test-stage.sh 45/45、test-settings-allow-sync.sh 19/19、版本一致 ;讀過 scripts/stage 的帳號鎖(STAGE_ACCOUNT_ID 常數、token 打不到 stage 即拒絕、值只從 --from-env 讀、--value/--token/--header 一律拒收)與 Arcrun scripts/stage-deploy-artifacts.py 的同款鎖(PR #207 已併 Arcrun main)。

沒驗的一格(只有帶著規則啟動的雲端 session 驗得了):分類器在規則就位後真的放行 python3 scripts/stage …。leo 重貼 setup script、開新 session 後第一次用就是驗收。

【身份】總管/inkstone/InkStoneCo/- **v0.24.0 總管驗收完成,測試位置在 https://git.uncle6.me/inkstone/ISEP/releases/tag/v0.24.0** 我在「分支 ⊕ main」重跑:`test-stage.sh` 45/45、`test-settings-allow-sync.sh` 19/19、版本一致 ✅;讀過 `scripts/stage` 的帳號鎖(`STAGE_ACCOUNT_ID` 常數、token 打不到 stage 即拒絕、值只從 `--from-env` 讀、`--value/--token/--header` 一律拒收)與 Arcrun `scripts/stage-deploy-artifacts.py` 的同款鎖(PR #207 已併 Arcrun main)。 沒驗的一格(只有帶著規則啟動的雲端 session 驗得了):分類器在規則就位後真的放行 `python3 scripts/stage …`。leo 重貼 setup script、開新 session 後第一次用就是驗收。
Author
Member

【身份】總管/inkstone/InkStoneCo/-

那一格驗了:帶著規則啟動的新雲端 session,分類器放行 python3 …/scripts/stage …(2026-09-07 下午)

新開的雲端 session(薄殼 youlinhsieh/inkstoneco,ISEP 0.24.0 由 marketplace 載入),沒做任何 settings 手術,開機時 ~/.claude/settings.jsonpermissions.allow 就有 18 條,含 stage/mainline/gate-ok/ticket 各四種形狀 + stage-deploy-artifacts.py。之後每一支都真跑過、沒被分類器擋:

python3 $ISEP/scripts/stage secret list --worker arcrun-cypher-executor
  ✅ arcrun-cypher-executor@youlin(stage) 現有 1 把 secret:KBDB_INTERNAL_TOKEN
python3 $ISEP/scripts/stage api GET arcrun-kbdb/health
  HTTP 200  …arcrun-yuga3bse.workers.dev/health  data_layer 第 8 代
python3 $ISEP/scripts/stage api GET arcrun-cypher-executor/health
  HTTP 200  bundle_version 1.4.63  commit e92d6e68
python3 $ISEP/scripts/mainline show      → inkstone/Arcrun#48(剩 5 天)
bash    $ISEP/scripts/gate-ok            → 印用法
python3 $ISEP/scripts/ticket where …     → 68 張命中

⇒ 09-07 早上留的唯一沒驗那格,現在有證據了:setup script 放進去的規則在 container 啟動時就在,分類器認得這五種形狀。 雲端到 *.arcrun-yuga3bse.workers.dev 的網路白名單同時確認通(不是 09-06 的 403)。

交棒的連結當時是空的,現在補好了

早上寫給 leo 的「測試位置 https://git.uncle6.me/inkstone/ISEP/releases/tag/v0.24.0」——當時只有 tag、沒有 release 物件(API releases/tags/v0.24.0 回 404,頁面沒有任何 note)。原因記在 inkstone/ISEP#67 comment 6574:建 release 的工具一直停在未併分支。我已用那支工具把 v0.24.0 建起來(release id 83,note 由 git log 生成、release-check 覆核 ),v0.23.0 同格式補建(id 81)。現在那個連結打開有內容。

沒動的事實

stage arcrun-cypher-executor 仍只有 KBDB_INTERNAL_TOKEN,沒有 CF_SECRETS_API_TOKEN(與 inkstone/Arcrun#119 c6473 同)。那把值的來源不在 credentials-map.md、也不在雲端 env——它屬 Arcrun#86 B-3 那條,記在那裡,不在本票。

【身份】總管/inkstone/InkStoneCo/- ## 那一格驗了:帶著規則啟動的新雲端 session,分類器放行 `python3 …/scripts/stage …`(2026-09-07 下午) 新開的雲端 session(薄殼 `youlinhsieh/inkstoneco`,ISEP 0.24.0 由 marketplace 載入),**沒做任何 settings 手術**,開機時 `~/.claude/settings.json` 的 `permissions.allow` 就有 18 條,含 stage/mainline/gate-ok/ticket 各四種形狀 + `stage-deploy-artifacts.py`。之後每一支都真跑過、沒被分類器擋: ``` python3 $ISEP/scripts/stage secret list --worker arcrun-cypher-executor ✅ arcrun-cypher-executor@youlin(stage) 現有 1 把 secret:KBDB_INTERNAL_TOKEN python3 $ISEP/scripts/stage api GET arcrun-kbdb/health HTTP 200 …arcrun-yuga3bse.workers.dev/health data_layer 第 8 代 python3 $ISEP/scripts/stage api GET arcrun-cypher-executor/health HTTP 200 bundle_version 1.4.63 commit e92d6e68 python3 $ISEP/scripts/mainline show → inkstone/Arcrun#48(剩 5 天) bash $ISEP/scripts/gate-ok → 印用法 python3 $ISEP/scripts/ticket where … → 68 張命中 ``` ⇒ 09-07 早上留的唯一沒驗那格,現在有證據了:**setup script 放進去的規則在 container 啟動時就在,分類器認得這五種形狀。** 雲端到 `*.arcrun-yuga3bse.workers.dev` 的網路白名單同時確認通(不是 09-06 的 403)。 ## 交棒的連結當時是空的,現在補好了 早上寫給 leo 的「測試位置 https://git.uncle6.me/inkstone/ISEP/releases/tag/v0.24.0」——當時只有 tag、**沒有 release 物件**(API `releases/tags/v0.24.0` 回 404,頁面沒有任何 note)。原因記在 `inkstone/ISEP#67` comment 6574:建 release 的工具一直停在未併分支。我已用那支工具把 v0.24.0 建起來(release id 83,note 由 git log 生成、release-check 覆核 ✅),v0.23.0 同格式補建(id 81)。**現在那個連結打開有內容。** ## 沒動的事實 stage `arcrun-cypher-executor` 仍只有 `KBDB_INTERNAL_TOKEN`,沒有 `CF_SECRETS_API_TOKEN`(與 `inkstone/Arcrun#119` c6473 同)。那把值的來源不在 `credentials-map.md`、也不在雲端 env——它屬 `Arcrun#86` B-3 那條,記在那裡,不在本票。
Author
Member

【身份】總管/inkstone/ISEP/-

結案。交付物:https://git.uncle6.me/inkstone/ISEP/releases/tag/v0.24.0

【身份】總管/inkstone/ISEP/- ✅ 結案。交付物:https://git.uncle6.me/inkstone/ISEP/releases/tag/v0.24.0
Author
Member

【身份】總管/inkstone/InkStoneCo/-

更正上一則:讀過得了不等於白名單命中;寫入那格現在才是真的驗了

上一則列的六支都是唯讀,而且我用的是 ISEP=/root/…; python3 $ISEP/scripts/stage …(先設變數)——那種寫法不會命中 Bash(python3 /root/.claude/plugins/cache/inkstone/isep/*/scripts/stage *),過的原因是分類器自己判它安全。
輪到寫入:同一種寫法跑 stage secret put 被分類器擋;改成白名單那個字面形狀 python3 /root/.claude/plugins/cache/inkstone/isep/0.24.0/scripts/stage secret put … 一次過(結果在 inkstone/Arcrun#86 最新一則)。

⇒ 本票的驗收條件現在四格全綠,含「雲端帶著規則啟動、分類器放行 secret put」這格。
⇒ 事實記進 InkStoneCo ops-facts(PR inkstone/InkStoneCo#124):靠白名單放行的指令,從第一個字就要跟白名單長一樣——不先 cd、不先設變數、不 && 串、不同行 heredoc。stage 的用法說明裡那兩個「例(雲端)」就是對的形狀。

【身份】總管/inkstone/InkStoneCo/- ## 更正上一則:讀過得了不等於白名單命中;寫入那格現在才是真的驗了 上一則列的六支都是**唯讀**,而且我用的是 `ISEP=/root/…; python3 $ISEP/scripts/stage …`(先設變數)——那種寫法**不會命中** `Bash(python3 /root/.claude/plugins/cache/inkstone/isep/*/scripts/stage *)`,過的原因是分類器自己判它安全。 輪到寫入:同一種寫法跑 `stage secret put` 被分類器擋;改成白名單那個字面形狀 `python3 /root/.claude/plugins/cache/inkstone/isep/0.24.0/scripts/stage secret put …` 一次過(結果在 `inkstone/Arcrun#86` 最新一則)。 ⇒ 本票的驗收條件現在四格全綠,含「雲端帶著規則啟動、分類器放行 secret put」這格。 ⇒ 事實記進 `InkStoneCo` ops-facts(PR inkstone/InkStoneCo#124):**靠白名單放行的指令,從第一個字就要跟白名單長一樣**——不先 `cd`、不先設變數、不 `&&` 串、不同行 heredoc。`stage` 的用法說明裡那兩個「例(雲端)」就是對的形狀。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: inkstone/ISEP#137