Skip to content

Audit Report — VTRC Knowledge Manual v2 (Corpus Pass)

วันที่ตรวจ: 2026-07-13 ขอบเขต: ทั้ง 21 volume (Vol 0-20), 213 ไฟล์ markdown, ครอบคลุม 30 repo ที่มีโค้ด + 8 placeholder repo สถานะ: CORPUS PASS (ผ่านเงื่อนไข พร้อมข้อสังเกตที่แก้ไขแล้วระหว่างตรวจ)

1. Build verification (automated, ครอบคลุมทุกไฟล์)

รัน npx vitepress build กับทั้ง corpus (213 ไฟล์) 2 รอบ (ก่อน/หลังแก้ไข):

รอบผลลัพธ์Dead linkSyntax highlight warning
รอบที่ 1 (ก่อนแก้)สำเร็จ (exit 0)0141 (fenced code block ใช้ citation เป็น "language")
รอบที่ 2 (หลังแก้)สำเร็จ (exit 0)00

สรุป — ไม่มี dead link ในทั้ง 213 ไฟล์ (VitePress build จะ fail ทันทีถ้ามี link เสีย เพราะ config ไม่ได้ตั้ง ignoreDeadLinks) ยืนยันว่า cross-reference ระหว่าง volume ทั้งหมด (citation แบบ [text](../volume-X/)) ถูกต้อง

2. ข้อบกพร่องที่พบและแก้ไขแล้วระหว่างตรวจ

2.1 Citation format ผิด — แก้แล้ว 141 จุดใน 29 ไฟล์ (Critical — แก้แล้ว)

ปัญหา — subagent ที่ทำ Phase B (port legacy) และ Phase C (frontends/domain/meeting) บางส่วนใช้ syntax ```startLine:endLine:filepath (รูปแบบที่ใช้เฉพาะตอน AI ตอบแชทกับผู้ใช้ใน Cursor UI เพื่อ render code reference ที่คลิกได้) เป็น literal fenced-code-block syntax ในไฟล์ markdown จริง — syntax นี้ไม่มีความหมายพิเศษใน VitePress/Shiki จึงถูกตีความเป็นชื่อภาษา (language identifier) ที่ไม่มีจริง แล้ว fallback เป็น plain text ไม่มี syntax highlighting

ขัดกับdocs/_style/style-guide.md § Citation convention ที่กำหนดชัดว่า citation ต้องเป็น inline single-backtick text เช่น `cu-central-api/main-api/src/config.js:20` ไม่ใช่ fenced code block

ไฟล์ที่กระทบ — 29 ไฟล์ ส่วนใหญ่อยู่ใน Volume 3 (vtrc-api, cu-central-api, centralize-api — 74 จุด), Volume 4 (vtrc-backoffice, vtrc-backoffice-new, vtrc-rc-backoffice, vtrc-web — 44 จุด), Volume 6 (benefit-api, ai-recruitment-api — 2 จุด), Volume 7 (meeting-vtrc-api, meeting-backoffice, meeting-backoffice-new — 5 จุด)

วิธีแก้ — เขียน script (/tmp/fix_code_refs.py, /tmp/fix_single_line_refs.py) แปลง ```N:M:path และ ```N:path เป็น citation แบบ inline (`path:N-M`) วางไว้ก่อน fenced code block ที่เปลี่ยน "language" เป็นภาษาที่ถูกต้องจริงตามนามสกุลไฟล์ (javascript/typescript/yaml/bash/etc.) — เนื้อหาโค้ดภายใน block ไม่ถูกแก้ไข มีแค่ fence header กับตำแหน่ง citation

ยืนยันผล — รัน build ซ้ำหลังแก้ ไม่มี warning เรื่อง language เหลือเลย (grep -c ยืนยัน 0 จุดที่เหลือรูปแบบเดิม)

2.2 Volume 6 index.md severity miscount — แก้แล้ว (Low)

benefit-api scorecard มี Critical จริง 2 รายการ (SEC-BENEFIT-01, SEC-BENEFIT-02) ไม่ใช่ 3 ตามที่ volume index สรุปไว้ครั้งแรก (SEC-BENEFIT-03 เป็น High) — พบระหว่าง cross-check กับ Volume 12 §3 (Critical findings summary) แก้ไขตัวเลขในตารางสรุปของ Volume 6 แล้ว (15 Critical ไม่ใช่ 16)

2.3 Shared-JWT-secret blast radius เพิ่ม vtrc-api — บันทึกเพิ่มแล้ว (Medium, ข้อมูลไม่ครบ ไม่ใช่ข้อมูลผิด)

Volume 11 §4 พบว่า token ที่ vtrc-api (Legacy Core) ออกให้ verify ผ่าน recruitment-api's SECRET_KEY ได้จริง — เดิมมีการบันทึกว่า secret cluster นี้ครอบคลุมเฉพาะ 4 domain microservice จริง ๆ คือ 5 service รวม vtrc-api ด้วย เพิ่มหมายเหตุนี้ใน Volume 6 index แล้ว

3. ข้อสังเกตที่ตรวจแล้วไม่ต้องแก้ (checked, non-issue)

3.1 Inline code <word> gotcha — 138 จุดที่ grep เจอ แต่ build ไม่ error

Style guide เตือนว่า <word> ใน single-backtick inline code ทำให้ Vue compiler error แต่การ build จริง (รวม SSR render ทุกหน้า) ผ่านโดยไม่มี compile error เลยแม้แต่จุดเดียว จาก 138 จุดที่ grep พบ (เช่น `<Form ref={formRef}>`, `<ErrorBoundary>` ในเนื้อหา Volume 4) — สันนิษฐานว่า VitePress 1.5 + markdown-it เวอร์ชันที่ใช้ escape HTML ภายใน inline-code span อัตโนมัติโดยไม่ throw compile error (ต่างจากเคสที่ style guide อาจอ้างอิงมาจาก VitePress เวอร์ชันเก่าหรือ syntax ที่ต่างออกไป) ไม่แก้ไขเนื้อหา 138 จุดนี้ เพราะการแก้จะเป็นการเปลี่ยนเนื้อหาทางเทคนิคที่ถูกต้องอยู่แล้วโดยไม่มีประโยชน์จริง — แนะนำอัปเดต style guide ให้สะท้อนพฤติกรรมจริงที่ยืนยันแล้วจากการ build

3.2 Placeholder repos (8 ตัว) — ไม่มี stub เอกสารหลงเหลือ

ตรวจ grep -rl "สถานะ: stub" ทั้ง corpus ไม่พบ stub marker เหลืออยู่เลย — ทุก volume จาก 0-20 มีเนื้อหาเต็มแล้ว

4. Spot-check citation accuracy (sampling 6 จุดข้าม 5 volume)

Citation ที่ตรวจVolumeผลตรวจกับโค้ดจริง
vtrc-api/api/src/index.js:33-38 (apiKey gate)Vol 3ตรงทุกตัวอักษร
2way-api เรียก 2way-line-service ผ่าน hardcoded IP 20.212.116.206:8200Vol 5 / Vol 13ตรง — พบ 2 จุดจริงที่ line.service.ts:76,86
benefit-api port 9320Vol 6 / Vol 15ตรง — Dockerfile:28
pms-api endpoint budget มี @Public() (SEC-PMS-01)Vol 6 / Vol 18ตรง — พบ @Public() 3 จุดใน budget.controller.ts
workflow-api package name จริงคือ ai-pms-nestVol 6ตรง — package.json:2
meeting-vtrc-api ใช้ Sequelize+MSSQL ไม่ใช่ Mongoose (mongoose เป็น dead dependency)Vol 7 / canonical-truthsตรง — package.json มีทั้ง sequelize และ mongoose แต่ evidence ใน Vol 7 ยืนยันว่ามีแค่ sequelize connection ที่ใช้จริง

สรุป spot-check — 6/6 ตรงกับโค้ดจริง 100% ไม่พบ fabricated fact ในตัวอย่างที่สุ่มตรวจ

5. สรุปตัวเลข corpus

  • 21 volume (Vol 0-20), 213 ไฟล์ markdown
  • 30 repo ที่มีโค้ดจริง documented ที่ v1-depth เทียบเท่ากันทุกตัว + 8 placeholder repo documented ใน Vol 10
  • 275 debt items จาก 29 scorecard file (16.7% Critical, 25.1% High, 54.2% Medium, 4.0% Low)
  • 34 inter-service network call relationships + 7 database-level coupling จุดยืนยันแล้ว
  • Build สำเร็จ 0 dead link, 0 syntax warning (หลังแก้)

6. ข้อเสนอสำหรับรอบตรวจถัดไป (ไม่บล็อก CORPUS PASS)

  • Spot-check เพิ่มเติมแบบสุ่มในสัดส่วนที่มากขึ้น (เช่น 5% ของ citation ทั้งหมด) หากต้องการความมั่นใจระดับสูงกว่านี้ก่อนเผยแพร่ให้ทีมนอก
  • อัปเดต style-guide.md § VitePress gotcha ให้สะท้อนผลตรวจจริงจาก §3.1
  • ทีม docs ควรทำ pass ตรวจ docs/index.md เทียบกับ canonical-truths.md อีกครั้งหลัง Volume 0-2 เขียนเสร็จ เพื่อให้แน่ใจว่าไม่มี stale claim เหลือ (ตรวจแล้วครั้งหนึ่งโดย agent ที่เขียน Vol 0-2 แต่ยังไม่มี second-pass independent review)

7. RE-AUDIT

Re-run npx vitepress build วันที่ 2026-07-13 หลังแก้ไขทุกจุดใน §2 — PASS, 0 error, 0 warning