Skip to content

fix(audit): เลิกรายงานว่า private repo มี branch protection ทั้งที่ตั้งไม่ได้ - #4

Merged
monthop-gmail merged 1 commit into
mainfrom
fix/audit-false-positive
Aug 26, 2026
Merged

fix(audit): เลิกรายงานว่า private repo มี branch protection ทั้งที่ตั้งไม่ได้#4
monthop-gmail merged 1 commit into
mainfrom
fix/audit-false-positive

Conversation

@monthop-gmail

Copy link
Copy Markdown
Owner

ทำไมต้องเปลี่ยน

เจอตอน audit org จริง — 5 จาก 8 repo รายงานผิด

บน private repo ของแผนฟรี GitHub ตอบ 403 พร้อม body เป็น JSON object:

{"message":"Upgrade to GitHub Pro or make this repository public to enable this feature.", ...}

audit-repos.sh เอา body นั้นไปนับตรง ๆ ว่าเป็นรายการกฎ → คอลัมน์ branch protection ขึ้น yes

raw=$(gh api "repos/O/R/rules/branches/main" --jq '[.[].type]|unique|join(",")' 2>/dev/null || true)
[ -n "$raw" ] && has_rules=1      # ← raw คือ error JSON แต่ไม่ว่าง เลยนับเป็น "มี"

พลาดไปในทิศที่อันตรายที่สุด: ตารางบอกว่า repo ปลอดภัย คนเลยไม่ไปตรวจซ้ำ ทั้งที่ไม่มีอะไรกัน push ตรงเข้า main เลย

เปลี่ยนอะไร

1. เพิ่มสถานะที่สาม n/a — "แผนไม่รองรับ" ต่างจาก "ยังไม่ได้ตั้ง" เพราะแก้คนละวิธี (no = ไปตั้งซะ · n/a = ต้องอัปเกรดแผนหรือเปลี่ยนเป็น public) และ n/a ไม่ถูกนับเป็น "ขาด" ในยอดรวม

2. อย่าต่อ pipe ตรงจาก gh เมื่อมันอาจ exit non-zero — พลาดตรงนี้ตอนแก้รอบแรก:

gh api ... 2>&1 | grep -q 'Upgrade to GitHub'   # ← pipefail ทำให้ล้มตาม gh ก่อน grep ทำงาน

ต้องเก็บ output ก่อนแล้วค่อยตรวจ

3. ตรวจ tree ว่ามี key tree จริง ไม่ใช่ error object ที่บังเอิญ parse เป็น JSON ได้ — บั๊กคลาสเดียวกัน ต่างกันแค่พลาดไปในทิศที่ปลอดภัยกว่า (รายงานว่าขาดทั้งที่มี)

4. docs/04 — ตารางฟีเจอร์ที่ใช้ได้/ไม่ได้ตามแผนและ visibility

ก่อน / หลัง

ก่อน:  | pstack-twin | ... | yes  |   ← ผิด ไม่มีอะไรกันเลย
หลัง:  | pstack-twin | ... | n/a  |   ← ตั้งไม่ได้บนแผนนี้

ทดสอบยังไง

./scripts/validate.sh                              # ผ่านทั้งหมด (shellcheck + pyyaml ครบ)
./scripts/audit-repos.sh willpower-institute       # private 5 อันขึ้น n/a, public ขึ้น yes/no ตามจริง

ตรวจตรงกับความจริงทีละ repo ด้วย gh api repos/O/R/rules/branches/main แล้ว

ผลกระทบ

  • เป็น breaking change — ตารางที่เคยออกก่อนหน้านี้เชื่อไม่ได้ ต้อง audit ใหม่
  • ต้องรัน migration
  • ต้องเพิ่ม/แก้ env var หรือ secret
  • กระทบ repo อื่น

ใครที่เคยรัน audit-repos.sh แล้วเห็น yes ในคอลัมน์ branch protection ของ private repo — ค่านั้นผิด ให้รันใหม่

…้งไม่ได้

บน private repo ของแผนฟรี GitHub ตอบ 403 พร้อม body เป็น JSON object
"Upgrade to GitHub Pro or make this repository public to enable this
feature." — script เดิมเอา body นั้นไปนับว่าเป็นรายการกฎ ทำให้ขึ้น
"yes" ในคอลัมน์ branch protection ทั้งที่ไม่มีอะไรกันเลยสักอย่าง

พลาดไปในทิศที่อันตรายที่สุด: ตารางบอกว่าปลอดภัย คนเลยไม่ไปตรวจซ้ำ
เจอตอน audit org จริง — 5 จาก 8 repo รายงานผิด

- แยกสถานะที่สามออกมาเป็น n/a (แผนไม่รองรับ) ต่างจาก no (ยังไม่ได้ตั้ง)
  เพราะสองอย่างนี้แก้คนละวิธี และ n/a ไม่ควรถูกนับว่า "ขาด"
- อย่าต่อ pipe ตรงจาก gh เมื่อ gh อาจ exit non-zero — pipefail จะทำให้
  pipeline ล้มก่อน grep ได้ทำงาน (พลาดตรงนี้ตอนแก้รอบแรก)
- ตรวจ tree ว่ามี key "tree" จริง ไม่ใช่ error object ที่บังเอิญ parse ได้
- docs/04: เพิ่มตารางฟีเจอร์ที่ใช้ได้/ไม่ได้ตามแผนและ visibility

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Dru5ECsrJrqhTfUhUvDsqw
@monthop-gmail
monthop-gmail merged commit a6ff6b0 into main Aug 26, 2026
4 checks passed
@monthop-gmail
monthop-gmail deleted the fix/audit-false-positive branch August 26, 2026 18:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant