[總管交辦] Arcrun ingest workflow:.claude/wiki → KBDB(機械、分批不撞頂 / SDD T2-T4) #8

Open
opened 2026-07-06 02:31:22 +00:00 by Leo · 8 comments
Owner

[總管交辦] 知識一庫 ingest 的機械寫入端(頂層 SDD system-dev/docs/3-specs/kb-ingest-architecture/)。

背景

知識一庫 ingest 職責分工:AI(Routine)只做萃+跨庫串;Arcrun workflow 包所有 KBDB 寫入。來源(各 repo .claude/wiki + 頂層 cross-links 文檔)都是 git 裡的卡片+wikilink,Arcrun 機械映射寫 KBDB。

要做

  1. Arcrun ingest workflow:讀 repo 的 .claude/wiki → 卡片映射 entry(標 metadata.embed=true)、[[wikilink]] 映射 triplet(走 base API / graph plugin /triplets/ingest;守 KBDB 鐵律:零建表、零直接 SQL、全走 base API)。
  2. Phase 0 限速模式:每個 workflow tick 只寫一小批(壓在 CF subrequest 上限下),排程反覆跑 drain;content_hash 冪等=可續傳。
    • 根因:昨天 ingest 撞 CF「Too many subrequests by single Worker invocation」——單一 /triplets/ingest 吞整檔 nodes(07_01:11 triplets+10 nodes,三元組落地、persistNodes 炸=半殘)。改「多次小寫」根治。
  3. 穩態模式Gitea push → webhook → workflow,只處理 delta。⚠️Gitea→Cloudflare(非 GitHub Actions),不觸 GitHub flag 紅線(D4/D20 針對 GitHub abuse-detect)。
  4. 不撞頂驗證:確認 leo21c 現役版(A1 gloss-bridge v03e3854e)下「小批+delta」不再重演 07_01;若超大單檔仍可能爆,加「以 source_uri anchor 分段」(各段獨立冪等,繞開 per-source content_hash skip)。

明確不做

不走 gap-1 bulk 端點、不碰 D28 owner_id 必填(arcrun-8-bulk-owner 分支,另案未定)。本架構靠「小批+delta」已不撞頂,不需 bulk 上 critical path。

部署 / 閘

  • wrangler 直推 leo21c(acr update——codeload 綁 GitHub 會假綠,見 Arcrun#4);CLOUDFLARE_ACCOUNT_ID=leo21c,別讓 repo .env 官方 58309b id 污染。
  • ⚠️ 對 live leo21c 實際 ingest(寫 production KBDB)前,總管會先與 leo 確認寫入閘;本 issue 先做 workflow 實作 + dry/小樣驗。

驗收

Leo/notes 全庫 ingest 不撞 CF、冪等跳過;push 一變更→只寫 delta;三模式(關鍵字/語意/圖)curl 驗。

對齊

頂層 SDD R1/R3(兩階段)/R4(不撞頂)/R6(off-path);D6 KBDB 鐵律。完整脈絡見頂層 kb-ingest-architecture/(tasks T2/T3/T4)。

[總管] 2026-07-06

[總管交辦] 知識一庫 ingest 的機械寫入端(頂層 SDD `system-dev/docs/3-specs/kb-ingest-architecture/`)。 ## 背景 知識一庫 ingest 職責分工:**AI(Routine)只做萃+跨庫串;Arcrun workflow 包所有 KBDB 寫入**。來源(各 repo `.claude/wiki` + 頂層 cross-links 文檔)都是 git 裡的卡片+wikilink,Arcrun 機械映射寫 KBDB。 ## 要做 1. **Arcrun ingest workflow**:讀 repo 的 `.claude/wiki` → 卡片映射 **entry**(標 `metadata.embed=true`)、`[[wikilink]]` 映射 **triplet**(走 base API / graph plugin `/triplets/ingest`;守 **KBDB 鐵律**:零建表、零直接 SQL、全走 base API)。 2. **Phase 0 限速模式**:每個 workflow tick 只寫**一小批**(壓在 CF subrequest 上限下),排程反覆跑 drain;`content_hash` 冪等=可續傳。 - 根因:昨天 ingest 撞 CF「Too many subrequests by single Worker invocation」——單一 `/triplets/ingest` 吞整檔 nodes(07_01:11 triplets+10 nodes,三元組落地、persistNodes 炸=半殘)。改「多次小寫」根治。 3. **穩態模式**:**Gitea push → webhook → workflow**,只處理 delta。⚠️ 是 **Gitea→Cloudflare**(非 GitHub Actions),**不觸 GitHub flag 紅線**(D4/D20 針對 GitHub abuse-detect)。 4. **不撞頂驗證**:確認 leo21c 現役版(A1 gloss-bridge v03e3854e)下「小批+delta」不再重演 07_01;若超大單檔仍可能爆,加「以 `source_uri` anchor 分段」(各段獨立冪等,繞開 per-source content_hash skip)。 ## 明確不做 **不走** gap-1 bulk 端點、**不碰** D28 owner_id 必填(`arcrun-8-bulk-owner` 分支,另案未定)。本架構靠「小批+delta」已不撞頂,不需 bulk 上 critical path。 ## 部署 / 閘 - wrangler 直推 leo21c(**禁 `acr update`**——codeload 綁 GitHub 會假綠,見 Arcrun#4);`CLOUDFLARE_ACCOUNT_ID`=leo21c,別讓 repo `.env` 官方 58309b id 污染。 - ⚠️ **對 live leo21c 實際 ingest(寫 production KBDB)前,總管會先與 leo 確認寫入閘**;本 issue 先做 workflow 實作 + dry/小樣驗。 ## 驗收 `Leo/notes` 全庫 ingest 不撞 CF、冪等跳過;push 一變更→只寫 delta;三模式(關鍵字/語意/圖)curl 驗。 ## 對齊 頂層 SDD R1/R3(兩階段)/R4(不撞頂)/R6(off-path);D6 KBDB 鐵律。完整脈絡見頂層 `kb-ingest-architecture/`(tasks T2/T3/T4)。 _[總管] 2026-07-06_
Author
Owner

[總管 路徑校正] 本 issue body 寫的 .claude/wiki 是舊簡稱——實際來源路徑是 system-dev/wiki/(template 1.9.x 已把 wiki 遷出 .claude//wiki-extract 產出落 system-dev/wiki/cards/**)。ingest 請讀 system-dev/wiki/cards/**/*.md(卡片)+ 其 [[wikilink]]## 關聯 typed-edge。notes repo 現已有 system-dev/wiki/cards/notes/*.md(template#5 /wiki-extract 已跑、已 merge main),可直接當測試來源。頂層 SDD 已同步校正。

**[總管 路徑校正]** 本 issue body 寫的 `.claude/wiki` 是舊簡稱——**實際來源路徑是 `system-dev/wiki/`**(template 1.9.x 已把 wiki 遷出 `.claude/`;`/wiki-extract` 產出落 `system-dev/wiki/cards/**`)。ingest 請讀 `system-dev/wiki/cards/**/*.md`(卡片)+ 其 `[[wikilink]]` 與 `## 關聯` typed-edge。notes repo 現已有 `system-dev/wiki/cards/notes/*.md`(template#5 `/wiki-extract` 已跑、已 merge main),可直接當測試來源。頂層 SDD 已同步校正。
Author
Owner

[總管] Phase A 完成(實作+dry-run,未寫 live)

形式:Arcrun workflow(YAML)+新自訂零件 km_wiki_card_parse(決定性純解析:卡片→envelope,no_network/no_filesystem)+現成零件(cron 限速 / http_request 讀 Gitea raw / foreach 小批 / 冪等 upsert)。合「workflow 慢慢做」哲學。

診斷(精確 fan-out):一次 /triplets/ingest subrequest = 7 + 4·N_triplets + M_nodes + D_deprecated;放大器=createTriplet 每條邊重呼 ensurePluginTemplates(3 GET)。07_01 還原:N=11,M=10 → 61 > 50(CF bundled)。改「一卡一 envelope、超大卡 anchor 分段」壓到 7+4N+M ≤ 40

  • 附帶優化建議(非本 issue):graph 端把 ensurePluginTemplates 提到入口只跑一次,單卡可省 3·(N+1)

分支feat/issue-8-mechanical-wiki-ingest(未碰 main)。registry/examples/km-wiki-ingest/(card-to-envelope.mjs 純核心 / dry-run.mjs / workflow.yaml / component-contract.yaml / dry-run-evidence.json)。

dry-run 證據(notes 3 卡):3 entries(embed=true)+15 triplets+16 nodes;單次 graph 呼叫上限 33 < 50,無破頂。映射對(## 實體→node、## 關聯 typed-edge+[[wikilink]]→triplet)。超大卡 self-test:est 114→自動分 4 段各 ≤38 全綠。冪等:entry=page_name+content_hash、triplet=source.uri+content_hash、分段各段獨立 uri。

Live 基線(唯讀)wiki_card entries=0、embed enabled、pending=0、embedded=37。乾淨。

下一步=Phase B(部署 leo21c + 寫 live)=leo 寫入閘,待明示放行。

**[總管] Phase A 完成(實作+dry-run,未寫 live)** **形式**:Arcrun workflow(YAML)+新自訂零件 `km_wiki_card_parse`(決定性純解析:卡片→envelope,`no_network/no_filesystem`)+現成零件(cron 限速 / http_request 讀 Gitea raw / foreach 小批 / 冪等 upsert)。合「workflow 慢慢做」哲學。 **診斷(精確 fan-out)**:一次 `/triplets/ingest` subrequest = `7 + 4·N_triplets + M_nodes + D_deprecated`;放大器=`createTriplet` 每條邊重呼 `ensurePluginTemplates`(3 GET)。07_01 還原:N=11,M=10 → **61 > 50**(CF bundled)。改「一卡一 envelope、超大卡 anchor 分段」壓到 `7+4N+M ≤ 40`。 - 附帶優化建議(非本 issue):graph 端把 `ensurePluginTemplates` 提到入口只跑一次,單卡可省 `3·(N+1)`。 **分支**:`feat/issue-8-mechanical-wiki-ingest`(未碰 main)。`registry/examples/km-wiki-ingest/`(card-to-envelope.mjs 純核心 / dry-run.mjs / workflow.yaml / component-contract.yaml / dry-run-evidence.json)。 **dry-run 證據**(notes 3 卡):3 entries(embed=true)+15 triplets+16 nodes;**單次 graph 呼叫上限 33 < 50,無破頂**。映射對(`## 實體`→node、`## 關聯` typed-edge+`[[wikilink]]`→triplet)。超大卡 self-test:est 114→自動分 4 段各 ≤38 全綠。冪等:entry=`page_name`+`content_hash`、triplet=`source.uri`+`content_hash`、分段各段獨立 uri。 **Live 基線(唯讀)**:`wiki_card` entries=0、embed enabled、pending=0、embedded=37。乾淨。 **下一步=Phase B(部署 leo21c + 寫 live)=leo 寫入閘**,待明示放行。
Author
Owner

[總管 設計訂正] leo 否決 km_wiki_card_parse domain 零件——一次性解析邏輯不該鑄成共用零件。改為:新增通用 code 零件(n8n Code node 式 sandbox inline JS,見 Arcrun#10),card→envelope 解析變成 code 節點的內聯程式(沿用 subagent 已寫的 card-to-envelope.mjs 邏輯,不浪費)。

⟹ 本 issue(Arcrun#8)ingest workflow 重做為:現成零件(cron/webhook/http_request/foreach)+ code 節點,丟掉 domain 零件。依賴 Arcrun#10 先落地。 dry-run 的診斷/批次/冪等設計全數保留有效。

**[總管 設計訂正]** leo 否決 `km_wiki_card_parse` domain 零件——一次性解析邏輯不該鑄成共用零件。改為:**新增通用 `code` 零件**(n8n Code node 式 sandbox inline JS,見 **Arcrun#10**),card→envelope 解析變成 `code` 節點的內聯程式(沿用 subagent 已寫的 `card-to-envelope.mjs` 邏輯,不浪費)。 ⟹ 本 issue(Arcrun#8)ingest workflow 重做為:**現成零件(cron/webhook/http_request/foreach)+ `code` 節點**,丟掉 domain 零件。**依賴 Arcrun#10 先落地。** dry-run 的診斷/批次/冪等設計全數保留有效。
Author
Owner

[總管] workflow 改用 code 節點、deploy-ready(未部署) — 分支 feat/issue-8-mechanical-wiki-ingest(HEAD d93dc4e)。

  • parse_card 由 domain 零件 → component: code(config.code 內聯 card→envelope planCall 邏輯),下游 refs 改 parse_card.data.* km_wiki_card_parse 契約檔。端到端驗:workflow 解出的 code 字串 eval 輸出與原 planCard 逐欄全等(含 content_hash)。
  • 一次過閘部署清單:① 部署 code 零件(code.arcrun.dev,零 secret)→ register → ② 部署 workflow km_wiki_ingest_drain(wrangler 直推 leo21c,禁 acr update)→ ③ 冒煙 curl。
  • env(部署注入不入 repo):repo=Leo/notes ref=main gitea_token kbdb_url kbdb_api_key graph_url graph_api_key=leoCLOUDFLARE_ACCOUNT_ID=leo21c
  • 寫入量(notes 3 卡):3 entries+15 triplets+16 nodes,分 3 次 graph 呼叫(各 ≤33<50)+3 次 entry 寫。
  • entry 寫入路徑:總管裁 http_request 直打 base /entriesmetadata_json(保 embed=true+content_hash),除非 kbdb_upsert_block 確認透傳 metadata。
  • 待 live=leo 部署/寫入閘。
**[總管] workflow 改用 code 節點、deploy-ready(未部署)** — 分支 `feat/issue-8-mechanical-wiki-ingest`(HEAD `d93dc4e`)。 - `parse_card` 由 domain 零件 → **`component: code`**(config.code 內聯 card→envelope planCall 邏輯),下游 refs 改 `parse_card.data.*`;**刪** `km_wiki_card_parse` 契約檔。端到端驗:workflow 解出的 code 字串 eval 輸出與原 planCard 逐欄全等(含 content_hash)。 - **一次過閘部署清單**:① 部署 code 零件(`code.arcrun.dev`,零 secret)→ register → ② 部署 workflow `km_wiki_ingest_drain`(wrangler 直推 leo21c,禁 acr update)→ ③ 冒煙 curl。 - **env**(部署注入不入 repo):`repo=Leo/notes ref=main gitea_token kbdb_url kbdb_api_key graph_url graph_api_key=leo`、`CLOUDFLARE_ACCOUNT_ID=leo21c`。 - **寫入量**(notes 3 卡):3 entries+15 triplets+16 nodes,分 3 次 graph 呼叫(各 ≤33<50)+3 次 entry 寫。 - entry 寫入路徑:總管裁 `http_request` 直打 base `/entries` 帶 `metadata_json`(保 embed=true+content_hash),除非 `kbdb_upsert_block` 確認透傳 metadata。 - **待 live=leo 部署/寫入閘。**
Author
Owner

[總管] Phase B 完成——真部署+真寫 live KBDB+一手驗收(禁假綠)
寫入Leo/notes 3 卡 → 3 wiki_card entries(owner=leo,embed=true) + 15 triplets + 16 node records;graph 3 次呼叫全 200、est 33/32/32(≤50)、無 500/1102。
驗收(curl 實證):① embed pending=0, embedded 37→45 ② 關鍵字 Gitea/拆解/系統動力學 皆命中對應卡 ③ 語意 3 卡概念皆中 ④ 圖 Gitea節點→3邊 ⑤ 不撞 CF ⑥ 冪等重跑全 skip、embedded 45→45 零新寫。
實 ingest 又抓一個真 bug:graph /triplets/ingest strict schema 422 拒診斷鍵 _estSubrequests → 剝 _-鍵後成功,耐久修落內聯碼。commit b87c18d
待辦:workflow.yaml 的 pick_next_card 是 skeleton 佔位(本次直接驅動同資料流達成 live 寫入);真跑 cron/webhook 穩態 drain 需補實游標/過濾節點(T4)。分支就緒。

**[總管] ✅ Phase B 完成——真部署+真寫 live KBDB+一手驗收(禁假綠)** **寫入**:`Leo/notes` 3 卡 → **3 wiki_card entries(owner=leo,embed=true) + 15 triplets + 16 node records**;graph 3 次呼叫全 200、est 33/32/32(≤50)、無 500/1102。 **驗收(curl 實證)**:① embed `pending=0, embedded 37→45` ② 關鍵字 `Gitea/拆解/系統動力學` 皆命中對應卡 ③ 語意 3 卡概念皆中 ④ 圖 `Gitea`節點→3邊 ⑤ 不撞 CF ⑥ **冪等**重跑全 skip、embedded 45→45 零新寫。 **實 ingest 又抓一個真 bug**:graph `/triplets/ingest` strict schema **422 拒診斷鍵 `_estSubrequests`** → 剝 `_`-鍵後成功,耐久修落內聯碼。commit `b87c18d`。 **待辦**:workflow.yaml 的 `pick_next_card` 是 skeleton 佔位(本次直接驅動同資料流達成 live 寫入);真跑 cron/webhook 穩態 drain 需補實游標/過濾節點(T4)。分支就緒。
Author
Owner

[總管] Phase b(穩態無人值守 drainer)——建好+部署+驗(禁假綠)

arcrun-km-wiki-drainer(live arcrun-km-wiki-drainer.leo21c.workers.dev,Version 56b8deed,分支 feat/km-wiki-drainer 88b7fbf)——復用 arcrun-code/kbdb/graph,不動 cypher。

  • cursor:存 KBDB ingest_cursor entry(走 API 零建表)。
  • (A) cron drain:Gitea git/trees?recursive 列卡→游標後取 BATCH→逐卡處理→進游標→到底回捲。撐 5,083 檔(小批+truncated 分頁點)。
  • (B) webhook deltaPOST /webhook 吃 Gitea push→只處理本 commit 動到的卡(Gitea→CF 非 GitHub Actions)。
  • 驗收(wrangler dev 本地 token 對接 LIVE 服務):cron 冪等全 skip ✓;加測試卡→只挑那張寫、其餘 skip、游標前進 ✓;webhook delta 只寫 delta ✓;三模式對新卡命中 ✓;不撞 CF ✓。測試卡已加已清(殘 2 triplet,見下 gap issue)。

🔴 差 2 個 leo 手動步驟才真自走(classifier 擋 secret 寫入+cron 部署):① 給 drainer 設 GITEA_TOKEN secret(讀 private Leo/notes;現無 token→/drain 回 401)② 開 cron trigger(wrangler.toml [triggers] crons 已註解、scheduled handler 已在 code)。之後總管接 Gitea webhook + 最終自走驗。

**[總管] ✅ Phase b(穩態無人值守 drainer)——建好+部署+驗(禁假綠)** **`arcrun-km-wiki-drainer`**(live `arcrun-km-wiki-drainer.leo21c.workers.dev`,Version `56b8deed`,分支 `feat/km-wiki-drainer` `88b7fbf`)——復用 arcrun-code/kbdb/graph,不動 cypher。 - **cursor**:存 KBDB `ingest_cursor` entry(走 API 零建表)。 - **(A) cron drain**:Gitea `git/trees?recursive` 列卡→游標後取 BATCH→逐卡處理→進游標→到底回捲。撐 5,083 檔(小批+truncated 分頁點)。 - **(B) webhook delta**:`POST /webhook` 吃 Gitea push→只處理本 commit 動到的卡(Gitea→CF 非 GitHub Actions)。 - **驗收**(wrangler dev 本地 token 對接 LIVE 服務):cron 冪等全 skip ✓;加測試卡→只挑那張寫、其餘 skip、游標前進 ✓;webhook delta 只寫 delta ✓;三模式對新卡命中 ✓;不撞 CF ✓。測試卡已加已清(殘 2 triplet,見下 gap issue)。 **🔴 差 2 個 leo 手動步驟才真自走**(classifier 擋 secret 寫入+cron 部署):① 給 drainer 設 `GITEA_TOKEN` secret(讀 private Leo/notes;現無 token→`/drain` 回 401)② 開 cron trigger(wrangler.toml `[triggers] crons` 已註解、scheduled handler 已在 code)。之後總管接 Gitea webhook + 最終自走驗。
Author
Owner

[總管] b 真收尾(1042 修 + webhook 接上,全對部署後真端點驗)

1042 兇手:部署後 drainer 對同帳號 *.leo21c.workers.dev(arcrun-kbdb/code/graph)做 HTTP fetch(url) → CF worker-to-worker 限制 1042(首爆點 getCursor→arcrun-kbdb)。上輪本地 miniflare 測不出(測試≠執行路徑)。
:Service Bindings(比照 cypher-executor)——[[services]] SVC_CODE/SVC_KBDB/SVC_GRAPH + env.SVC_X.fetch();Gitea(非CF)維持 plain fetch。commit c6bd0d7,deploy Version 95562b3e
真端點驗收(禁 miniflare/假綠)/drain 冪等 skip 無 1042;/webhook delta 真寫 live KBDB;三模式命中測試卡(owner_id 語意過濾 live 確認生效,即 Arcrun#11 修);測試卡已清。
webhook 接線:Gitea Leo/notes hook#1(push→drainer /webhook),測試投遞 204、ping→pong。⟹ notes 卡片穩態自走:Routine 萃出/改卡 push→webhook→drainer 增量 ingest。
殘留:cron trigger 仍註解(notes 靠 webhook 自走、cron 對 notes 是 no-op poll,留給 kb backfill);2 test triplet 清不掉(Arcrun#12 graph 無刪除 API)。

**[總管] ✅ b 真收尾(1042 修 + webhook 接上,全對部署後真端點驗)** **1042 兇手**:部署後 drainer 對同帳號 `*.leo21c.workers.dev`(arcrun-kbdb/code/graph)做 HTTP `fetch(url)` → CF worker-to-worker 限制 1042(首爆點 getCursor→arcrun-kbdb)。上輪本地 miniflare 測不出(測試≠執行路徑)。 **修**:Service Bindings(比照 cypher-executor)——`[[services]] SVC_CODE/SVC_KBDB/SVC_GRAPH` + `env.SVC_X.fetch()`;Gitea(非CF)維持 plain fetch。commit `c6bd0d7`,deploy Version `95562b3e`。 **真端點驗收(禁 miniflare/假綠)**:`/drain` 冪等 skip 無 1042;`/webhook` delta 真寫 live KBDB;三模式命中測試卡(**owner_id 語意過濾 live 確認生效**,即 Arcrun#11 修);測試卡已清。 **webhook 接線**:Gitea `Leo/notes` hook#1(push→drainer `/webhook`),測試投遞 204、ping→pong。**⟹ notes 卡片穩態自走:Routine 萃出/改卡 push→webhook→drainer 增量 ingest。** **殘留**:cron trigger 仍註解(notes 靠 webhook 自走、cron 對 notes 是 no-op poll,留給 kb backfill);2 test triplet 清不掉(Arcrun#12 graph 無刪除 API)。
Leo added the
s
pending
label 2026-08-09 13:13:16 +00:00
Author
Owner

[總管·票務複驗 2026-08-09 晚] s/pending——效果達成了,但形態不符票面要求,這是方向題不是工程題。

實查:真正在跑的是 kbdb-ingest-plugin/scripts/ingest-cli.mjs——一支獨立的 Node.js CLI 腳本(用 execFileSync 開子行程、直接 fetch --graph-url 打 graph plugin),完全不經過 Arcrun 引擎
找不到 Phase 0 限速 tick 模式,也找不到 Gitea push webhook 觸發 workflow 的實作痕跡。

⇒ 「wiki 進得了 KBDB」這個效果達成了。
⇒ 但票要的是「Arcrun workflow⋯⋯守 KBDB 鐵律」,而現況繞過了 Arcrun 本身

👤 兩條路,都不是我能單方決定的:

  • 照原票重做成真 workflow(吃自己的狗糧,順帶壓測引擎)
  • 承認 CLI 路線並改票(把票面改成現況,關掉這條要求)
[總管·票務複驗 2026-08-09 晚] **標 `s/pending`——效果達成了,但形態不符票面要求,這是方向題不是工程題。** 實查:真正在跑的是 `kbdb-ingest-plugin/scripts/ingest-cli.mjs`——**一支獨立的 Node.js CLI 腳本**(用 `execFileSync` 開子行程、直接 `fetch --graph-url` 打 graph plugin),**完全不經過 Arcrun 引擎**。 找不到 Phase 0 限速 tick 模式,也找不到 Gitea push webhook 觸發 workflow 的實作痕跡。 ⇒ 「wiki 進得了 KBDB」這個**效果**達成了。 ⇒ 但票要的是「**Arcrun workflow**⋯⋯守 KBDB 鐵律」,而現況**繞過了 Arcrun 本身**。 👤 兩條路,都不是我能單方決定的: - **照原票重做成真 workflow**(吃自己的狗糧,順帶壓測引擎) - **承認 CLI 路線並改票**(把票面改成現況,關掉這條要求)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: Leo/Arcrun#8