# Source Control Canonical Repo 判定表 | 項目 | 內容 | |------|------| | 日期 | 2026-05-12 | | 狀態 | 第一版,read-only evidence | | 上游 evidence | `docs/security/GITEA-PUBLIC-REPO-SEARCH-SNAPSHOT.md`、`docs/security/LOCAL-GIT-REMOTE-INVENTORY-SNAPSHOT.md`、`docs/security/GITHUB-TARGET-PROBE-SNAPSHOT.md`、`docs/security/GITHUB-TARGET-VISIBILITY-DECISION-TABLE.md`、`docs/security/LOCAL-REPO-CANONICAL-EWOOOC-MOMO-SNAPSHOT.md` | | 原則 | 只判定風險與下一步,不合併、不同步、不刪除、不切 primary | ## 0. 核心結論 目前不能假設「本機資料夾名稱相近」就代表同一個 canonical repo。 尤其 `momo-pro-system`、`momo_pro_system`、`wooo/ewoooc`、`root/momo-pro-system` 看起來高度相關,但來源 remote、repo host、HEAD 都不同。第一輪本機 lineage probe 顯示三個 working tree 在最近 100 個 commits sample 內沒有共同 commit,因此這一組必須先人工判定 canonical 關係,否則 GitHub 遷移時可能發生錯誤合併、漏轉、或把舊版覆蓋新版。 ## 1. Server-side public search 結果 未提供 token 的 Gitea `users/wooo/repos` 與 public repo search 可見: | Gitea repo | default branch | GitHub candidate | 狀態 | |------------|----------------|------------------|------| | `wooo/awoooi` | `main` | `owenhytsai/awoooi` | 已有 GitHub,但 refs blocked | | `wooo/ewoooc` | `main` | `owenhytsai/ewoooc` | GitHub candidate 未建立或不可見 | 此結果只代表 public-only 可見範圍,private/internal repos 仍需只讀 token 或管理匯出。操作契約見 `docs/security/GITEA-SERVER-SIDE-INVENTORY-RUNBOOK.md`。 ## 2. P0 canonical 判定 | 群組 | Evidence | 目前判定 | 風險 | 下一步 | |------|----------|----------|------|--------| | `ewoooc` / `momo-pro-system` | `wooo/ewoooc` public Gitea repo;`/Users/ogt/momo-pro-system` 與 iCloud `momo-pro-system` 都指向 Gitea;lineage probe 顯示兩份 working tree `no_shared_history` | 待人工判定,禁止自動視為複本 | 同名資料夾不同 HEAD,且近期 sample 無共同 commit;GitHub target 未確認 | 確認部署真相、完整 refs / ancestry 後再決定 GitHub target | | `momo_pro_system` / GitLab 110 | `/Users/ogt/momo_pro_system` 指向 `root/momo-pro-system` GitLab 類 remote;lineage probe 顯示與 Gitea 兩份 working tree `no_shared_history` | 待人工判定,禁止自動合併 | 可能是同產品不同歷史、舊版重建、或完全不同 repo | 確認是否仍 active、不得自動合併 | | `bitan-pharmacy` | 指向 110 SSH 類 remote;110 remote `main` 與本機 `main` 對齊;GitHub `owenhytsai/bitan-pharmacy` 未授權 probe 看不到 | 待建立 target | GitHub target 未確認 | 確認是否 active、建立或指定 GitHub target | | `tsenyang-website` | 指向 110 SSH 類 remote;110 remote `main` 與本機 `main` 對齊;GitHub `owenhytsai/tsenyang-website` 未授權 probe 看不到 | 待建立 target | GitHub target 未確認 | 確認是否仍 active、建立或指定 GitHub target | | `wooo-infra-config` | GitHub remote 存在且 `main` 與本機對齊;110 internal remote 因 SSH 權限不足或不可讀 | 待判定 110 remote 用途 | 可能是舊 remote、mirror、或權限未配置 | 確認 110 remote 用途;若為舊 remote,降級或移除 | ## 2.1 GitHub target probe | GitHub repo | probe status | heads | 判定 | |-------------|--------------|-------|------| | `owenhytsai/awoooi` | `exists` | `2` | 可見但 refs blocked | | `owenhytsai/clawbot-v5` | `exists` | `1` | 可見但 refs blocked | | `owenhytsai/wooo-aiops` | `exists` | `3` | 可見但 refs blocked | | `owenhytsai/wooo-infra-config` | `exists` | `1` | 可見,需判斷 110 internal remote | | `owenhytsai/ewoooc` | `not_found_or_private` | `0` | 未建立或為 private 且未授權,不能當作已轉移 | | `owenhytsai/bitan-pharmacy` | `not_found_or_private` | `0` | 未建立或為 private 且未授權,不能當作已轉移 | | `owenhytsai/tsenyang-website` | `not_found_or_private` | `0` | 未建立或為 private 且未授權,不能當作已轉移 | | `nexu-io/open-design` | `exists` | `186` | 外部/設計 repo,需 scope 判定 | ## 2.1.1 GitHub target 決策 `docs/security/GITHUB-TARGET-VISIBILITY-DECISION-TABLE.md` 顯示: | 類型 | Repos | 判定 | |------|-------|------| | refs blocked | `awoooi`、`clawbot-v5`、`wooo-aiops` | 不得切 primary,需 refs reconcile approval | | create / grant access after approval | `ewoooc`、`bitan-pharmacy`、`tsenyang-website` | 不得自動建立或修改 visibility | | internal remote purpose pending | `wooo-infra-config` | 需確認 110 internal remote 用途 | | external scope | `nexu-io/open-design` | 先做 scope review | 此決策只補足 target owner / visibility 的下一步,不取代 canonical 判定與 server-side refs diff。 ## 2.2 Internal 110 refs probe `docs/security/GIT-REMOTE-REFS-BITAN-TSENYANG-SNAPSHOT.md` 顯示: | Repo | Relation | Heads | Tags | 判定 | |------|----------|-------|------|------| | `bitan-pharmacy` | `aligned_current_branch` | `1` | `0` | 110 remote 可作為 source candidate,但 GitHub target 未確認 | | `tsenyang-website` | `aligned_current_branch` | `1` | `0` | 110 remote 可作為 source candidate,但 GitHub target 未確認 | | `wooo-infra-config` GitHub | `aligned_current_branch` | `1` | `0` | GitHub target 可讀且與本機 main 對齊 | | `wooo-infra-config` 110 internal | `unreachable` | `0` | `0` | 110 internal remote 用途與權限待判定 | ## 3. 本機 lineage evidence `docs/security/LOCAL-REPO-CANONICAL-EWOOOC-MOMO-SNAPSHOT.md` 顯示: | 比對 | Relation | Common commits | |------|----------|----------------| | `local-momo-gitea` vs `icloud-momo-gitea` | `no_shared_history` | `0` | | `local-momo-gitea` vs `local-momo-gitlab` | `no_shared_history` | `0` | | `icloud-momo-gitea` vs `local-momo-gitlab` | `no_shared_history` | `0` | 此結果仍只代表本機 sample,未 fetch 遠端;但足以阻止自動把這三者當成同一個 repo 複本處理。 ## 4. 本機 HEAD evidence | Working tree | Remote 類型 | 短 SHA | 判定 | |--------------|-------------|--------|------| | `/Users/ogt/momo-pro-system` | Gitea `wooo/ewoooc` | `61a9c4c` | 不可直接視為 iCloud 複本 | | `/Users/ogt/Library/Mobile Documents/com~apple~CloudDocs/momo-pro-system` | Gitea `wooo/ewoooc` | `fe6180b` | 與本機 momo-pro-system 不同 HEAD | | `/Users/ogt/momo_pro_system` | GitLab 類 110 remote | `5a4294e` | 與 `wooo/ewoooc` 關係待判定 | | `/Users/ogt/bitan-pharmacy` | 110 SSH 類 remote | `7423a08` | GitHub target 未確認 | | `/Users/ogt/tsenyang-website` | 110 SSH 類 remote | `b103112` | GitHub target 未確認 | 上述短 SHA 只用於人工辨識,不代表 server-side 最新狀態。 ## 5. Credential hygiene 本輪 read-only 檢查發現,部分本機 remote URL 仍含 embedded credential 或個人 token 形式。文件只記錄風險,不記錄任何值。 後續處理 gate: 1. 先完成 repo inventory 與 canonical 判定。 2. 以 credential helper、只讀 token 或 secret store 取代 embedded credential。 3. 對既有 token 做 rotation。 4. 在 AwoooP / AWOOOI audit 中只記錄「已輪替」與 evidence ref,不記錄 token value。 ## 6. 下一步 1. 用只讀 token 或管理匯出取得 Gitea server 全量 repo list。 2. 對 `wooo/ewoooc` 與 `root/momo-pro-system` 做 server-side refs diff。 3. 確認三個 momo/ewoooc working tree 的產品關係與部署真相。 4. 確認 `bitan-pharmacy`、`tsenyang-website` 是否仍 active。 5. 依 GitHub target 決策表完成 repo / owner / visibility approval。 6. 完成 canonical 判定前,不建立自動 mirror、不刪除任何 remote、不切 GitHub primary。