สิ่งที่คาดไม่ถึงซึ่งพบแล้ว
ไฟล์นี้รวบรวมจุดที่สร้างความสับสนเฉพาะของ repo นี้ ซึ่งเคยทำให้เอเจนต์ทำงานผิดพลาด
เกณฑ์การเพิ่มรายการ
เพิ่มรายการก็ต่อเมื่อเงื่อนไขต่อไปนี้เป็นจริงทั้งหมด:
- เป็นเรื่องเฉพาะของ repo นี้ ไม่ใช่คำแนะนำทั่วไป
- มีแนวโน้มจะเกิดซ้ำกับเอเจนต์ในอนาคต
- มีวิธีรับมือที่ชัดเจนและปฏิบัติตามได้จริง
หากไม่แน่ใจ ให้ถามนักพัฒนาก่อนเพิ่มรายการ
เทมเพลตของรายการ
### [Short title]
- **Date:** YYYY-MM-DD
- **Observed by:** agent name or contributor
- **Context:** where/when it happened
- **What was surprising:** concrete unexpected behavior
- **Impact:** what went wrong or could go wrong
- **Mitigation:** exact step future agents should take
- **Status:** confirmed | superseded
รายการ
โดเมนโปรดักชันของแอปบน Vercel อาจย้อนกลับไปใช้ดีพลอยจาก Git master
- วันที่: 2026-04-28
- ผู้สังเกต: Tommaso + Codex
- บริบท: การตรวจสอบมิเรอร์ของแอป Seedit และ 5chan ในไดเรกทอรีแอปของ Bitsocial Web
- สิ่งที่คาดไม่ถึง: โปรเจกต์
seeditและ5chanบน Vercel ตั้งค่าgitProviderOptions.createDeployments = "enabled"ไว้ การ push เข้าmasterบน GitHub จึงถูกโปรโมตขึ้นโดเมนโปรดักชัน ทั้งที่นโยบายของ repo กำหนดให้มิเรอร์แอปโปรดักชันเสิร์ฟเฉพาะไฟล์จากรีลีสเท่านั้น - ผลกระทบ: ป้ายยืนยันมิเรอร์ในไดเรกทอรีแอปอาจกลายเป็นข้อมูลเท็จ เพราะโดเมนโปรดักชันเสิร์ฟคอมมิตล่าสุดของสายพัฒนาแทนไฟล์ ZIP ของรีลีสบน GitHub ที่ค่าแฮชของ
index.htmlถูกบันทึกไว้ในabout/src/lib/apps-data.ts - วิธีรับมือ: ก่อนเพิ่มหรืออัปเดตข้อมูลยืนยันมิเรอร์ ให้ตรวจโปรเจกต์บน Vercel ด้วย
vercel api /v9/projects/<project-id>และยืนยันว่าgitProviderOptions.createDeployments = "disabled"ดีพลอยเนื้อหาจาก ZIP ของรีลีสด้วยvercel deploy --prebuilt --prodและใช้seedit-omega.vercel.appหรือ5chan-omega.vercel.appสำหรับดีพลอยของสายพัฒนา - สถานะ: ยืนยันแล้ว
Portless 0.11 นำสถานะพร็อกซีเดิมกลับมาใช้ หากตัวเรียกใช้ไม่บังคับ HTTPS
- วันที่: 2026-04-28
- ผู้สังเกต: Tommaso + Codex
- บริบท: การอัปเกรดโฟลว์
yarn startตามปกติ จาก URL พร็อกซีเดิมhttp://bitsocial.localhost:1355ไปเป็นhttps://bitsocial.localhost. - สิ่งที่คาดไม่ถึง: แม้ติดตั้ง
portless@0.11.1แล้ว Portless ก็ยังใช้พร็อกซี HTTP เดิมที่~/.portless/proxy.port = 1355ต่อไป และพิมพ์ URL แบบเก่าที่ลงท้ายด้วย:1355 - ผลกระทบ: การอัปเดตเวอร์ชันแพ็กเกจและเอกสารอย่างเดียวไม่พอ
yarn startยังประกาศและใช้ URL เก่าได้ เมื่อเครื่องของผู้ร่วมพัฒนายังมีสถานะ Portless เดิมทำงานอยู่ - วิธีรับมือ: ให้สคริปต์เริ่มระบบสั่งเปิดพร็อกซี HTTPS ของ Portless บนพอร์ต
443อย่างชัดเจนก่อนลงทะเบียนเส้นทางของแอป เพื่อให้โฟลว์รันไทม์ย้ายออกจากสถานะ1355ที่ค้างอยู่ แทนที่จะสืบทอดมันมา - สถานะ: ยืนยันแล้ว
Portless เปลี่ยน URL มาตรฐานของแอปในเครื่อง
- วันที่: 2026-03-18
- ผู้สังเกต: Codex
- บริบท: การตรวจสอบผ่านเบราว์เซอร์และโฟลว์ smoke test
- สิ่งที่คาดไม่ถึง: URL ในเครื่องที่เป็นค่าเริ่มต้นไม่ใช่พอร์ต Vite ตามปกติ repo นี้คาดหวัง
https://bitsocial.localhostผ่าน Portless การเปิดlocalhost:3000หรือlocalhost:5173จึงอาจไปเจอแอปผิดตัวหรือไม่เจออะไรเลย - ผลกระทบ: การตรวจสอบผ่านเบราว์เซอร์อาจล้มเหลวหรือไปยืนยันเป้าหมายผิดตัว แม้เซิร์ฟเวอร์ dev จะทำงานปกติดี
- วิธีรับมือ: ใช้
https://bitsocial.localhostก่อนเสมอ ข้ามไปใช้PORTLESS=0 corepack yarn startเฉพาะเมื่อจำเป็นต้องเข้าพอร์ต Vite โดยตรงจริง ๆ - สถานะ: ยืนยันแล้ว
Commitizen hooks ขวางการคอมมิตแบบไม่โต้ตอบ
- วันที่: 2026-03-18
- ผู้สังเกต: Codex
- บริบท: เวิร์กโฟลว์การคอมมิตที่ขับเคลื่อนด้วยเอเจนต์
- สิ่งที่คาดไม่ถึง:
git commitจะเรียก Commitizen ผ่าน Husky แล้วรออินพุตจาก TTY แบบโต้ตอบ ทำให้เชลล์ของเอเจนต์ที่ไม่มีการโต้ตอบค้าง - ผลกระทบ: เอเจนต์อาจค้างไม่มีกำหนดระหว่างขั้นตอนที่ควรจะเป็นการคอมมิตธรรมดา
- วิธีรับมือ: ใช้
git commit --no-verify -m "message"สำหรับคอมมิตที่เอเจนต์สร้างขึ้น ส่วนคนยังใช้corepack yarn commitหรือcorepack yarn exec czได้ตามปกติ - สถานะ: ยืนยันแล้ว
ต้องใช้ Corepack เพื่อไม่ให้ไปโดน Yarn classic
- วันที่: 2026-03-19
- ผู้สังเกต: Codex
- บริบท: การย้ายตัวจัดการแพ็กเกจไปเป็น Yarn 4
- สิ่งที่คาดไม่ถึง: เครื่องยังมี Yarn classic ติดตั้งแบบ global อยู่ใน
PATHการรันyarnเปล่า ๆ จึงอาจไปเรียก v1 แทนเวอร์ชัน Yarn 4 ที่ปักหมุดไว้ - ผลกระทบ: นักพัฒนาอาจข้ามการปักหมุดตัวจัดการแพ็กเกจของ repo โดยไม่ตั้งใจ แล้วได้พฤติกรรมการติดตั้งหรือผลลัพธ์ในไฟล์ล็อกที่ต่างออกไป
- วิธีรับมือ: ใช้
corepack yarn ...ในคำสั่งเชลล์ หรือรันcorepack enableก่อน เพื่อให้yarnเปล่า ๆ ชี้ไปที่ Yarn 4 เวอร์ชันที่ปักหมุดไว้ - สถานะ: ยืนยันแล้ว
ชื่อแอป Portless แบบตายตัวชนกันระหว่าง worktree ของ Bitsocial Web
- วันที่: 2026-03-30
- ผู้สังเกต: Codex
- บริบท: การรัน
yarn startใน worktree หนึ่งของ Bitsocial Web ขณะที่อีก worktree หนึ่งเสิร์ฟผ่าน Portless อยู่แล้ว - สิ่งที่คาดไม่ถึง: การใช้ชื่อแอป Portless ตรงตัวว่า
bitsocialในทุก worktree ทำให้ตัวเส้นทางเองชนกัน แม้พอร์ตเบื้องหลังจะต่างกัน โปรเซสที่สองจึงล้มเหลวเพราะbitsocial.localhostถูกลงทะเบียนไปแล้ว - ผลกระทบ: สาขาของ Bitsocial Web ที่ทำงานคู่ขนานกันอาจบล็อกกันเอง ทั้งที่ Portless ควรทำให้อยู่ร่วมกันได้อย่างปลอดภัย
- วิธีรับมือ: ให้การเริ่ม Portless อยู่หลัง
scripts/start-dev.mjsซึ่งตอนนี้ใช้เส้นทาง*.bitsocial.localhostที่ผูกกับชื่อสาขาเมื่ออยู่นอกกรณีมาตรฐาน และถอยไปใช้เส้นทางแบบผูกกับสาขาเมื่อชื่อbitsocial.localhostเปล่า ๆ ถูกใช้งานอยู่แล้ว - สถานะ: ยืนยันแล้ว
พรีวิวเอกสารเคยฮาร์ดโค้ดพอร์ต 3001 ไว้
- วันที่: 2026-03-30
- ผู้สังเกต: Codex
- บริบท: การรัน
yarn startพร้อมกับ repo และเอเจนต์อื่นในเครื่อง - สิ่งที่คาดไม่ถึง: คำสั่ง dev ที่ระดับ root รันเวิร์กสเปซของเอกสารด้วย
docusaurus start --port 3001เซสชัน dev ทั้งเซสชันจึงล้มทันทีที่มีโปรเซสอื่นครอง3001อยู่ ทั้งที่แอปหลักใช้ Portless อยู่แล้ว - ผลกระทบ:
yarn startอาจปิดโปรเซสของเว็บทิ้งทันทีหลังบูตขึ้นมา ทำให้งานอื่นในเครื่องที่ไม่เกี่ยวข้องกันสะดุด เพียงเพราะพอร์ตของเอกสารชนกัน - วิธีรับมือ: ให้การเริ่มเอกสารอยู่หลัง
yarn start:docsซึ่งตอนนี้ใช้ Portless ร่วมกับscripts/start-docs.mjsเพื่อรับพอร์ตว่างที่ถูกส่งเข้ามา หรือถอยไปใช้พอร์ตว่างถัดไปเมื่อถูกเรียกโดยตรง - สถานะ: ยืนยันแล้ว
ชื่อโฮสต์ Portless ของเอกสารเคยถูกฮาร์ดโค้ดไว้
- วันที่: 2026-04-03
- ผู้สังเกต: Codex
- บริบท: การรัน
yarn startใน worktree รองของ Bitsocial Web ขณะที่อีก worktree หนึ่งเสิร์ฟเอกสารผ่าน Portless อยู่แล้ว - สิ่งที่คาดไม่ถึง:
start:docsยังลงทะเบียนชื่อโฮสต์ตรงตัวว่าdocs.bitsocial.localhostyarn startจึงล้มได้ ทั้งที่แอป about รู้วิธีเลี่ยงการชนกันของเส้นทาง Portless สำหรับชื่อโฮสต์ของตัวเองแล้ว - ผลกระทบ: worktree ที่ทำงานคู่ขนานกันใช้คำสั่ง dev ระดับ root ได้ไม่แน่นอน เพราะโปรเซสของเอกสารออกก่อน แล้ว
concurrentlyก็ปิดเซสชันที่เหลือทิ้ง - วิธีรับมือ: ให้การเริ่มเอกสารอยู่หลัง
scripts/start-docs.mjsซึ่งตอนนี้สร้างชื่อโฮสต์ Portless ที่ผูกกับสาขาแบบเดียวกับแอป about และฉีด URL สาธารณะร่วมนั้นเข้าไปเป็นเป้าหมายของพร็อกซี dev ที่/docs - สถานะ: ยืนยันแล้ว
เชลล์ใน worktree อาจพลาดเวอร์ชัน Node ที่ repo ปักหมุดไว้
- วันที่: 2026-04-03
- ผู้สังเกต: Codex
- บริบท: การรัน
yarn startใน worktree ของ Git เช่น.claude/worktrees/*หรือ worktree ที่เช็กเอาต์ไว้ข้าง ๆ กัน - สิ่งที่คาดไม่ถึง: เชลล์ของบาง worktree แปลง
nodeและyarn nodeไปเป็น Homebrew Node25.2.1ทั้งที่ repo ปักหมุด22.12.0ไว้ใน.nvmrcyarn startจึงอาจรันตัวเรียกใช้ dev ด้วยรันไทม์ผิดเวอร์ชันแบบเงียบ ๆ - ผลกระทบ: พฤติกรรมของ dev server อาจต่างกันระหว่างเช็กเอาต์หลักกับ worktree ทำให้ทำซ้ำบั๊กได้ยาก และขัดกับ toolchain Node 22 ที่ repo กำหนดไว้
- วิธีรับมือ: ให้ตัวเรียกใช้ dev อยู่หลัง
scripts/start-dev.mjsและscripts/start-docs.mjsซึ่งตอนนี้จะ re-exec ด้วยไบนารี Node ตาม.nvmrcเมื่อเชลล์ปัจจุบันใช้เวอร์ชันผิด ส่วนการตั้งค่าเชลล์ก็ยังควรใช้nvm useอยู่ดี - สถานะ: ยืนยันแล้ว
ไฟล์ตกค้างใน docs-site/ อาจบังไม่ให้เห็นว่าซอร์สของเอกสารหายไปหลังรีแฟกเตอร์
- วันที่: 2026-04-01
- ผู้สังเกต: Codex
- บริบท: การเก็บกวาด monorepo หลังการรวมโค้ด เมื่อย้ายโปรเจกต์ Docusaurus จาก
docs-site/ไปที่docs/ - สิ่งที่คาดไม่ถึง: โฟลเดอร์
docs-site/เดิมอาจยังค้างอยู่บนดิสก์พร้อมไฟล์เก่าแต่สำคัญอย่างi18n/แม้ repo ที่ติดตามไว้จะย้ายไปdocs/แล้ว ทำให้การรีแฟกเตอร์ดูเหมือนซ้ำซ้อนในเครื่อง และอาจบังข้อเท็จจริงที่ว่างานแปลเอกสารซึ่งถูกติดตามไว้ยังไม่ได้ถูกย้ายเข้าdocs/จริง ๆ - ผลกระทบ: เอเจนต์อาจลบโฟลเดอร์เก่าทิ้งเพราะคิดว่าเป็น "junk" แล้วทำให้สำเนางานแปลเอกสารชุดเดียวที่มีในเครื่องหายไป หรือแก้สคริปต์ที่ยังชี้ไปยังพาธ
docs-site/ที่ตายแล้วต่อไป - วิธีรับมือ: ถือว่า
docs/เป็นโปรเจกต์เอกสารเพียงชุดเดียวที่ถูกต้อง ก่อนลบไฟล์ตกค้างของdocs-site/ในเครื่อง ให้กู้ซอร์สที่ติดตามไว้อย่างdocs/i18n/กลับมาก่อน แล้วอัปเดตสคริปต์และ hook ให้เลิกอ้างถึงdocs-site - สถานะ: ยืนยันแล้ว
พรีวิวเอกสารหลายภาษาอาจทำให้ RAM พุ่งสูงระหว่างการตรวจสอบ
- วันที่: 2026-04-01
- ผู้สังเกต: Codex
- บริบท: การแก้ i18n ของเอกสาร การจัดเส้นทางตามภาษา และพฤติกรรมของ Pagefind ด้วย
yarn start:docsร่วมกับ Playwright - สิ่งที่คาดไม่ถึง: โหมดพรีวิวเอกสารแบบเริ่มต้นตอนนี้จะบิลด์เอกสารครบทุกภาษาพร้อมทำดัชนี Pagefind ก่อนเสิร์ฟ และการปล่อยให้โปรเซสนั้นทำงานคู่กับเซสชัน Playwright หรือ Chrome หลายตัวอาจกิน RAM มากกว่าลูป dev ของ Vite หรือ Docusaurus ภาษาเดียวอย่างมาก
- ผลกระทบ: เครื่องอาจเหลือหน่วยความจำไม่พอ เซสชันเบราว์เซอร์อาจแครช และการรันที่ถูกขัดจังหวะอาจทิ้งเซิร์ฟเวอร์เอกสารหรือเบราว์เซอร์ headless ค้างไว้กินหน่วยความจำต่อ
- วิธีรับมือ: สำหรับงานเอกสารที่ไม่ต้องตรวจเส้นทางตามภาษาหรือ Pagefind ให้ใช้
DOCS_START_MODE=live yarn start:docsใช้พรีวิวหลายภาษาแบบเริ่มต้นเฉพาะเมื่อต้องตรวจเส้นทางที่แปลแล้วหรือ Pagefind จริง ๆ เปิดเซสชัน Playwright ไว้เพียงเซสชันเดียว ปิดเซสชันเบราว์เซอร์เก่าก่อนเปิดเซสชันใหม่ และหยุดเซิร์ฟเวอร์เอกสารหลังตรวจสอบเสร็จหากไม่ได้ใช้งานต่อ - สถานะ: ยืนยันแล้ว
translate-docs.py อาจทิ้งภาษาของเอกสารไว้แปลไม่ครบ หรือทำให้ปลายทางของลิงก์พัง
- วันที่: 2026-04-06
- ผู้สังเกต: Codex
- บริบท: การแก้เส้นทางและเนื้อหาเอกสารตามภาษา หลังจาก
yarn start:docsเสิร์ฟหน้ารายละเอียดเป็นภาษาอังกฤษ หรือบิลด์เอาต์พุตของภาษานั้นไม่สำเร็จ - สิ่งที่คาดไม่ถึง: ไปป์ไลน์แปลเอกสารมีจุดพังเฉพาะของ repo นี้พร้อมกันสองจุด
scripts/translate-docs.pyดึงข้อความของDocsHomeออกมาได้เพียงส่วนน้อยเมื่อการเรียกtr(...)อยู่ในรูปแบบที่มันแยกวิเคราะห์ไม่ได้ และมาร์กดาวน์ที่แปลแล้วใต้docs/i18n/**อาจมี slug ที่ถูกแปลด้วยเครื่องหรือเศษZXQPLACEHOLDERติดอยู่ในปลายทางของลิงก์ - ผลกระทบ: หน้าแรกตามภาษาอาจถอยกลับไปเป็นภาษาอังกฤษแบบเงียบ ๆ หน้ารายละเอียดตามภาษาอาจดูเหมือนไม่ได้แปล และ
yarn docs:buildแบบเต็มอาจล้มเพราะลิงก์ของภาษานั้นพัง ทั้งที่เอกสารต้นทางถูกต้องดี - วิธีรับมือ: หลังแก้งานแปลเอกสารหรือสร้างไฟล์ภาษาใหม่ ให้รัน
yarn docs:buildจาก root ของ repo เสมอ สแกนมาร์กดาวน์ในdocs/i18n/**เพื่อหาZXQPLACEHOLDERและตรวจว่าลิงก์ที่แปลแล้วยังชี้ไปยัง slug มาตรฐานของเอกสาร เช่น/apps/5chan/ไม่ใช่พาธ URL ที่ถูกแปล หากข้อความของDocsHomeเปลี่ยนไป ให้ยืนยันว่าscripts/translate-docs.pyยังดึงข้อความdocs.home.*ได้ครบทุกตัว - สถานะ: ยืนยันแล้ว
การตรวจแบบไม่มี JS ของเว็บ about ต้องใช้เส้นทาง Portless ไม่ใช่พรีวิว SSR แยกต่างหาก
- วันที่: 2026-04-12
- ผู้สังเกต: Codex
- บริบท: การตรวจสอบการรองรับการทำงานแบบไม่มี JS ของเว็บ
about/จาก worktree ของสาขาหนึ่ง - สิ่งที่คาดไม่ถึง: พรีวิว SSR แบบแยกต่างหากอาจดูเหมือนทำงานปกติ ขณะที่เส้นทาง Portless ที่ผูกกับสาขาจริง ๆ ยังเสิร์ฟ app shell ผิดตัวหรือโปรเซสเก่าอยู่ ใน repo นี้ สัญญาที่แท้จริงในเครื่องคือชื่อโฮสต์ Portless จาก
yarn startไม่ใช่เซิร์ฟเวอร์พรีวิวที่ตั้งขึ้นเฉพาะกิจ - ผลกระทบ: เอเจนต์อาจสรุปผิดว่าการรองรับแบบไม่มี JS ใช้งานได้ หรือมองข้ามการถดถอยที่ปรากฏเฉพาะบน
*.bitsocial.localhost - วิธีรับมือ: สำหรับการตรวจสอบ
about/ผ่านเบราว์เซอร์ ให้เริ่มเซิร์ฟเวอร์จริงในเครื่องด้วยyarn startหรือyarn start:aboutแล้วทดสอบ URL ของ Portless ที่ผูกกับสาขาก่อนเสมอ หากชื่อโฮสต์ Portless ดูเหมือนค้างอยู่ ให้ตรวจและหยุดโปรเซสเก่าก่อนแล้วค่อยทดสอบใหม่ - สถานะ: ยืนยันแล้ว
chain/ มองไม่เห็นโดย yarn build:verify และ yarn doctor
- วันที่: 2026-07-05
- ผู้สังเกต: Codex
- บริบท: การตรวจสอบ diff ที่แตะเฉพาะ chain/ หลังจากเวิร์กสเปซ
chain/(แอป Vite แบบสแตนด์อโลนสำหรับchain.bitsocial.net) ถูกเพิ่มเข้ามาใน monorepo - สิ่งที่คาดไม่ถึง:
scripts/verify-build.mjsรู้จักเฉพาะพาธที่ขึ้นต้นด้วยabout/,docs/และstats/เท่านั้น diff ที่แตะเฉพาะ chain/ จึงพิมพ์ "No targeted build checks matched the current diff" แล้วไม่รันบิลด์ใด ๆ เลย ทั้งที่build:chainมีอยู่ในpackage.jsonระดับ root อยู่แล้ว อีกเรื่องหนึ่งคือyarn doctorถูกฮาร์ดโค้ดไว้เป็นreact-doctor about -yการเปลี่ยนแปลง React ใต้chain/srcจึงไม่ได้รับการตรวจจาก React Doctor เลย - ผลกระทบ: เอเจนต์ที่ตรวจสอบการเปลี่ยนแปลงของ chain ต้องรู้เองว่าให้เรียก
yarn build:chainตรง ๆ แทนที่จะเชื่อyarn build:verifyและปัญหา React ในchain/src(effect, hook, โค้ดที่ตายแล้ว) ก็หลุดรอดสายตาyarn doctorไป - วิธีรับมือ: ตอนนี้
scripts/verify-build.mjsมีสาขาสำหรับchain/ที่สะท้อนสาขาของabout/แล้ว และdoctorกับdoctor:verboseก็รันreact-doctor --project about,chain -yในการเรียกครั้งเดียว ส่วนdoctor:scoreยังครอบคลุมเฉพาะaboutเพราะ--scoreจะไม่พิมพ์อะไรเลยแบบเงียบ ๆ เมื่อใช้ร่วมกับ--projectที่ระบุมากกว่าหนึ่งโปรเจกต์ หากต้องการคะแนนของ chain ให้ใช้yarn react-doctor --project about,chain --verbose -y(หรือ--json) - สถานะ: ยืนยันแล้ว
P2P ในเบราว์เซอร์ทำงานบน WebSockets แบบปลอดภัย ส่วน pkc-js ปฏิเสธ WebRTC และ WebTransport โดยค่าเริ่มต้น
- วันที่: 2026-08-02
- ผู้สังเกต: Claude
- บริบท: การเขียนข้อความบนหน้า landing และในเอกสารเกี่ยวกับวิธีทำงานของ P2P ในเบราว์เซอร์ของ Bitsocial
- สิ่งที่คาดไม่ถึง:
@pkcprotocol/pkc-jsมาพร้อม connection gater ที่เป็นค่าเริ่มต้น ซึ่งปฏิเสธการ dial ผ่าน WebRTC และ WebTransport ในเบราว์เซอร์ โดยdist/browser/helia/dial-transport-filter.jsส่งออกDENIED_DIAL_TRANSPORTS_BY_DEFAULT = ["webrtc", "webrtc-direct", "webtransport"]คอมเมนต์ในซอร์สให้เหตุผลไว้ว่า ในเบราว์เซอร์ ทรานสปอร์ตเหล่านั้นเพิ่มเส้นทางการสร้างการเชื่อมต่อที่ยาวและมักล้มเหลว (STUN/ICE การหมุนเวียน certhash) ซึ่งทำให้โหลดช้าลง ขณะที่ WebSocket ตรงไปตรงมาและเชื่อถือได้ พีร์ที่ออนไลน์อยู่ทุกตัวในแผง "P2P status" ของบล็อกแสดงว่า "Secure WebSocket" ทั้งหมด ตัว gater อยู่ในnode_modulesจึงไม่มีอะไรใน repo ที่บอกใบ้ถึงมันเลย - ผลกระทบ: การเขียนข้อความสาธารณะที่ฟังดูสมเหตุสมผลทางเทคนิคแต่ผิดนั้นเกิดขึ้นง่ายมาก เช่น การยกเครดิตให้ WebTransport ที่เข้าสถานะ Baseline ของเบราว์เซอร์ในเดือนมีนาคม 2026 ว่าเป็นตัวทำให้ P2P ในเบราว์เซอร์ของ Bitsocial เป็นไปได้ ข้อความนั้นถูกปล่อยขึ้นหน้า landing ตารางเปรียบเทียบ และเอกสารอีกสองหน้า ก่อนที่นักพัฒนาจะจับได้ ข้อความที่อ้างสถาปัตยกรรมผิดบนหน้าสาธารณะจะถูกตรวจสอบโดยกลุ่มนักพัฒนาที่เว็บนี้ตั้งใจสื่อสารด้วยพอดี
- วิธีรับมือ: อย่าอนุมานว่า Bitsocial ใช้ทรานสปอร์ตใดจากสิ่งที่ libp2p หรือแพลตฟอร์มเบราว์เซอร์รองรับในทางทฤษฎี ให้ตรวจ
node_modules/@pkcprotocol/pkc-js/dist/browser/helia/dial-transport-filter.jsเพื่อดูรายการปฏิเสธล่าสุด ยืนยันว่าไม่มีการ overrideconnectionGaterใต้about/src/และอ่านป้ายทรานสปอร์ตจริงในแผง "P2P status" ของบล็อกก่อนกล่าวอ้างอะไรต่อสาธารณะ การเปลี่ยนแปลงจากต้นน้ำที่ปลดล็อกการเผยแพร่จากเบราว์เซอร์ได้จริงคือการแก้ seqno แบบ monotonic ของ gossipsub ใน@libp2p/gossipsub15.0.21 (พฤษภาคม 2026) ส่วน pkc-js ปัจจุบันมาพร้อม 16.0.4 - สถานะ: ยืนยันแล้ว
ลิงก์แบบสัมพัทธ์ ./page.md จากหน้าเอกสารที่ยังไม่ได้แปล ทำให้บิลด์ของทุกภาษาพัง
- วันที่: 2026-08-02
- ผู้สังเกต: Claude
- บริบท: การเพิ่มหน้าใหม่ที่มีเฉพาะภาษาอังกฤษ
docs/browser-p2p.mdซึ่งลิงก์ไปยังเอกสารที่มีอยู่แล้วด้วย./peer-to-peer-protocol.mdและ./apps/5chan.md - สิ่งที่คาดไม่ถึง: แต่ละภาษาใต้
docs/i18n/<lang>/docusaurus-plugin-content-docs/current/จะสะท้อนโครงสร้างของ docs หน้าใหม่ที่ยังไม่มีในมิเรอร์เหล่านั้นยังแสดงผลได้ในทุกภาษาผ่านการถอยกลับไปใช้ภาษาอังกฤษ แต่ลิงก์มาร์กดาวน์แบบสัมพัทธ์ของมันจะแปลงปลายทางไม่ได้อีกต่อไป Docusaurus จะสร้าง/ar/browser-p2p/peer-to-peer-protocol.md/แล้วทำให้บิลด์ล้มด้วยข้อความ "Docusaurus found broken links!" ที่สำคัญคือyarn build:verifyและyarn docs:build:verifyบิลด์เฉพาะenและผ่านฉลุย มีเพียงyarn docs:buildแบบเต็มเท่านั้นที่เผยปัญหานี้ออกมา และมันจะหยุดที่ภาษาแรกตามลำดับตัวอักษร (ar) - ผลกระทบ: การเปลี่ยนแปลงเอกสารอาจผ่านการตรวจสอบเร็ว ๆ ในเครื่องได้ทุกอย่าง แต่ยังทำให้บิลด์หลายภาษาบนโปรดักชันพัง ความล้มเหลวนี้ยังดูเหมือนไม่เกี่ยวกับการเปลี่ยนแปลงที่ทำ เพราะข้อความข้อผิดพลาดอ้างถึงพาธของภาษาที่ผู้เขียนไม่เคยแตะ
- วิธีรับมือ: ในหน้าเอกสารใดก็ตามที่ไม่ได้ถูกมิเรอร์เข้าไปใน
docs/i18n/**ให้ใช้ลิงก์ที่อิงจาก root (/peer-to-peer-protocol/,/apps/5chan/) แทนลิงก์.mdแบบสัมพัทธ์ เพราะ Docusaurus จะเติมรหัสภาษาไว้ข้างหน้าให้เองdocs/build-your-own-client.mdเป็นตัวอย่างที่มีอยู่แล้ว รันyarn docs:buildแบบเต็ม ไม่ใช่แค่build:verifyก่อนส่งมอบการเปลี่ยนแปลงใดก็ตามที่เพิ่มหน้าเอกสารหรือลิงก์ไปยังหน้าเอกสาร - สถานะ: ยืนยันแล้ว
update-translations.js ต้องรันจาก about/ และการรันพร้อมกันทำให้คีย์หายแบบเงียบ ๆ
- วันที่: 2026-08-02
- ผู้สังเกต: Claude
- บริบท: การนำคีย์ i18next ที่แปลแล้ว 26 คีย์ไปใส่ครบทั้ง 36 ภาษาผ่านสกิล
translate - สิ่งที่คาดไม่ถึง: สคริปต์เดียวมีกับดักสองแบบ แบบแรก
scripts/update-translations.jsแปลงเป้าหมายของตัวเองเป็นpath.join(process.cwd(), "public", "translations")แต่ repo นี้เก็บงานแปลไว้ที่about/public/translationsการรันคำสั่งตามที่เอกสารระบุจาก root ของ repo จึงล้มเหลวทุกครั้งด้วยข้อความ "Translations directory not found" เพราะdocs/agent-playbooks/translations.mdแสดงคำสั่งว่าnode scripts/update-translations.js ...ซึ่งอ่านแล้วเหมือนคำสั่งที่รันจาก root ของ repo แบบที่สอง การเรียกแต่ละครั้งคือการอ่าน-แก้ไข-เขียนทับไฟล์ภาษาทั้ง 36 ไฟล์ การเรียกสองครั้งพร้อมกันจึงเขียนทับกันเอง แล้วคีย์หนึ่งจะหายไปโดยไม่มีข้อผิดพลาดใด ๆ ส่วนสกิลtranslateก็สั่งอย่างชัดเจนให้แตกซับเอเจนต์พร้อมกันได้ถึง 4 ตัว ซึ่งแต่ละตัวจะเรียกสคริปต์นี้ - ผลกระทบ: การรันจาก root ของ repo ล้มเหลวแบบเห็นชัดและเสียเวลาไปหนึ่งรอบเต็ม ส่วนปัญหาการรันพร้อมกันล้มเหลวแบบเงียบ ๆ คือคีย์หายไปจากภาษาแบบสุ่ม แต่ diff ยังดูสมเหตุสมผล
- วิธีรับมือ: ให้รันเป็น
cd about && node ../scripts/update-translations.js --key <key> --map <abs-path> --writeอย่าปล่อยให้ซับเอเจนต์นักแปลเขียนไฟล์ภาษาพร้อมกันเด็ดขาด ให้แต่ละตัวสร้างเฉพาะไฟล์ JSON พจนานุกรม แล้วนำทุกคีย์ไปใส่ทีละตัวจากเอเจนต์แม่ หลังใส่เสร็จ ให้ตรวจด้วยโปรแกรมว่าทุกคีย์มีอยู่ครบในภาษาที่ไม่ใช่ภาษาอังกฤษทั้ง 35 ภาษา และไม่มีค่าใดที่เหมือนต้นฉบับภาษาอังกฤษทุกไบต์ - สถานะ: ยืนยันแล้ว