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 link | Syntax highlight warning |
|---|---|---|---|
| รอบที่ 1 (ก่อนแก้) | สำเร็จ (exit 0) | 0 | 141 (fenced code block ใช้ citation เป็น "language") |
| รอบที่ 2 (หลังแก้) | สำเร็จ (exit 0) | 0 | 0 |
สรุป — ไม่มี 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:8200 | Vol 5 / Vol 13 | ตรง — พบ 2 จุดจริงที่ line.service.ts:76,86 |
benefit-api port 9320 | Vol 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-nest | Vol 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