Skip to content
Tien Dang
Hành trình JARVIS · Sự kiện · Publish · 10 phút đọc · 2.032 từ

Một ngày fix JARVIS — từ text-only đến vision-first

30/04/2026, một session ~10 tiếng. AI bốc tủ giày sai 4 lần kích thước thật vì chỉ đọc text PDF, không xem hình. Pivot vision-first. Bonus: rebuild template BOQ 2019 cũ xì thành 3-tab pro, đồng đội AIC khen quá đẹp.

TD

Đặng Hồng Tiên

Founder OKG · AIC · JARVIS

AI-assisted draft
Mục lục · 9 mục
  1. Sáng — tôi tưởng Sprint 6 done rồi
  2. Trưa — cơ chế project control + JARVIS ngáo
  3. Chiều — Estella test fail tinh vi
  4. Tối — bug đọc bản vẽ cơ bản
  5. Pivot 21h — vision-first 4-layer pipeline
  6. Niềm vui xen kẽ — template BOQ 2019 cuối cùng cũng được upgrade
  7. Bug nhỏ nhưng đáng tiền — Sheet rơi sai folder lặp 3 lần
  8. Lesson cho founder build AI agent solo
  9. Khép lại ngày

30/04 tôi định close Sprint 6 BOQ Pipeline. 10 tiếng sau mới biết: chưa done. AI bốc kích thước Tủ giày sai gấp 4 lần thực vì chỉ đọc text PDF, không xem hình. Pivot 21h: vision-first 4-layer pipeline. Phụ thêm: rebuild template BOQ từ 2019 cũ xì → mới đẹp pro, đồng đội AIC khen quá đẹp. Mac đọc được AutoCAD. AI còn siêu ngu — phải design system thinking + tương tác chuẩn mới ra output tạm tạm được.

Một ngày fix JARVIS — từ text-only đến vision-first

Sáng — tôi tưởng Sprint 6 done rồi

29/04 tôi và em Claude burst 13 tiếng để substantial done Sprint 6 BOQ Pipeline — 6 yêu cầu R1-R6 (workflow Mac↔VPS, polish base price, 3-source pricing, drawing reader smart, multi-template, M2 extrapolator). 28 commits. Tag sprint-6-substantial.

Sáng 30/04 tôi mở session mới định bắt đầu Sprint 7. Em đề xuất:

“Sprint 7 theo phases.md là Phase 1.4b — BCP + Goose fallback + Compliance + Finance daemon CRITICAL”

Tôi nói OK. Em bắt đầu list task. Nhưng có gì đó cấn cấn — tôi nhớ Sprint 6 còn vài thứ chưa làm (Bilingual EN-VN, M2 eval LIVE, workshop verify base price).

Tôi hỏi: “Sprint 6 đã done all chưa?”

Em report. 5 carry-over còn pending. Tôi nói:

“Vậy Sprint 6 chưa done được đúng không? Lỡ thêm bonus 30/04 thì cộng vào Sprint 6 luôn, chưa close — và cần làm cho xong.”

Em ack. Plot twist 1: cơ chế project control của tôi quá yếu — substantial done ≠ DONE_ALL, em (và tôi) đang treat như close sprint.

Trưa — cơ chế project control + JARVIS ngáo

Tôi yêu cầu em thiết kế state machine sprint sống:

KICKOFF → ACTIVE → [EXTENDED ⟲ nếu add bonus]
  → SUBSTANTIAL → DONE_ALL → CLOSED (retro + tag)

    BLOCKED (chờ async)

Em viết playbook project_control.md: 3 layer (tracking + monitoring + controlling), 5 trigger event (anh add bonus / anh pivot / carry-over > 3 / 80% done / side initiative), 6 monitoring signal (scope creep ratio, velocity drift, task_board stale, etc).

Cùng lúc tôi raise 1 vấn đề khác: “JARVIS ngáo”. Em (session khác hôm trước) bảo “không tải link Drive được” — trong khi repo có 3 skill xử Drive (aic-gdrive-automation, aic-drive-ingest, aic-boq-pipeline Drive Watcher). AI agent của tôi không tự nhớ mình có gì.

Em build:

  1. CAPABILITY_MAP.md ở root — routing table 18 skill (Drive → skill X, BOQ → skill Y, Lương → account-agent…)
  2. MASTER_AGENT.md §60 Luật Capability Audit — TRƯỚC khi reply “không làm được”, PHẢI scan map + search ChromaDB
  3. gen_capability_snapshot.sh — auto-gen map từ SKILL.md frontmatter, cron daily

10 commits trong sáng/trưa. Sprint 6 EXTENDED Block B bonus.

Chiều — Estella test fail tinh vi

Tôi đề xuất E2E test 1 dự án thật. Em chọn căn hộ Estella — đã ký HĐ thi công, BOQ làm tay rồi để dùng làm ground truth.

PLHĐ ký thật: 29 items, scope chỉ nội thất gắn tường (tủ + kệ + ốp + lavabo + vách kính bồn tắm).

Em chạy pipeline. Output: 72 items, gấp gần 3 lần PLHĐ ký về cả số item lẫn tổng giá.

Em audit per-item. Phát hiện:

  • AI tự thêm trần thạch cao 6 items, sơn 280m², sàn gỗ 4 sections, đồ rời (sofa/giường/nệm/rèm/ga gối/bàn ăn) 11 items, đèn trang trí, gạch WC…
  • Tổng over-scope: 79.5% giá AI

Nguyên nhân: file _project_meta.json của tôi sáng nay ghi scope_focus text mơ hồ “Tủ + đồ rời + sàn + sơn + đèn”. AI làm theo text → over-scope. AI không bịa, tôi ghi meta sai.

Fix: thêm --scope flag structured (fit-tuong / full-finish / shell / full), priority cứng hơn scope_focus text. Em re-run pipeline.

Output Run 2: 40 items. Vẫn gấp ~2× PLHĐ về tổng giá. Vẫn chưa đạt.

Tối — bug đọc bản vẽ cơ bản

Tôi mở Sheet output Run 2 xem từng item. Vừa nhìn vào 3 cái đầu đã thấy sai:

AI bốc:  Tủ giày kịch trần — Foyer
         kích thước 2400 × 400 × 2700

Bản vẽ thực:  Tủ giày = đầu chặn của hệ tủ lạnh-tủ kho
              Trên MẶT ĐỨNG C, ngang 650mm × cao 2500mm

AI bốc sai cả về kích thước (gấp ~4 lần thực), sai về vị trí (Foyer thay vì cuối hệ tủ lạnh), kéo theo giá cũng sai gấp nhiều lần.

Tôi tiếp:

AI bốc:  Tủ bếp dưới = 5.5 md
Bản vẽ thực:  3780mm = 3.78md (rõ trên hình 1 và hình 3)

AI tự cộng 2 dimensions rời (3.78md tủ bếp + 1.6md đảo bếp = 5.38md, làm tròn 5.5md) thành 1 cái tủ.

Tôi gửi em 3 ảnh bản vẽ kèm note:

“Hình 1 có mặt cắt A/B/C và layout từng tủ. Hình 2 thể hiện tủ lạnh-tủ kho-tủ giày qua MẶT ĐỨNG B + C. Tủ giày là đầu chặn ngang 650 cao 2500. Hình 3 thấy rõ tủ bếp dưới chỉ 3780mm. Em xem hình mà bốc — chứ chỉ extract text PDF thì không hiểu hết context.”

Đó là moment. Em hiểu ra:

“Em chỉ đọc text dimensions từ PDF/DWG. Không xem hình. Mất context spatial — không phân biệt được số nào thuộc tủ nào, mặt cắt nào tương ứng view nào.”

Sơ đồ pivot: bên trái pipeline cũ text-only fail bốc Tủ giày 2400×400×2700 sai gấp 4 lần; bên phải pipeline mới vision-first 4 layer render PNG, đọc 3D concept trước, đọc 2D paired sau, output có view_ref
Pipeline cũ (text-only) vs pipeline mới (vision-first). Tủ giày thực 650×2500 — AI bốc thành 2400×400×2700 vì ghép số rời, không xem hình.

Pivot 21h — vision-first 4-layer pipeline

Tôi đưa pattern industry tôi observe từ vài dự án Claude CLI khác:

“Một số pipeline khác load từng tấm 3D PDF trước → hiểu context không gian + style + materials → SAU đó load 2D mặt bằng + mặt đứng cùng nhóm → extract text → BOQ. Chất lượng cao hơn rõ rệt.”

Em design:

LAYER 1: Pre-processing (script, no AI)
  Render PNG mỗi page bản vẽ + classify (floor_plan / elevation / section / 3d_concept)
  Output: 01_drawings_index.json

LAYER 2: 3D-first context (Claude vision)
  Đọc 5-10 page concept 3D trước
  Output: 02_3d_context.md (mô tả không gian, style, materials, edge cases)

LAYER 3: 2D extraction with 3D context (Claude vision)
  Paired floor plan + section A/B/C + 3D context
  Output: 02_spaces.json (dimensions chuẩn + view_ref chứng minh)

LAYER 4: BOQ builder (existing)
  Dùng dimensions vision-derived → BOQ ≥ 90% accuracy

Plan mode 3 questions để chốt architecture. Tôi chọn:

  1. 3D-first → 2D context (4-layer, không skip 3D)
  2. Claude Max via VPS CLI — không tốn API budget, page-split + downsample dưới 32MB request limit
  3. 3 fixture test — apartment Estella + 1 F&B + 1 office (cần tôi share 2 ground truth)

Task breakdown ~27h plan, ~7-10h actual.

Niềm vui xen kẽ — template BOQ 2019 cuối cùng cũng được upgrade

Một việc khác làm tôi vui hôm nay: rebuild template BOQ.

Template BOQ tôi design từ năm 2019. Word + Excel layout cứng, cũ xì. Mỗi lần làm BOQ phải copy paste header, footer, mục lục — mất 15-20 phút trước khi vào nội dung. Suốt 7 năm tôi không dám động vào — vì sợ phá flow team đang quen.

Hôm nay em (Claude) build helper push 3-tab workbook (Proposal + Detail + Appendix) trên Google Sheets — full API, brand AIC navy, footer signature, page break đều, layout pro. Tôi gửi vài đồng đội ở AIC xem.

Phản hồi: “Quá đẹp”, “chuyên nghiệp ghê”, “đẹp hơn cả file mình làm tay”.

Trước đây tôi nghĩ template BOQ 2019 đủ dùng vì khách không complaint. Nhưng “đủ dùng” và “đẹp + pro” khác xa — và phản hồi đồng đội cho thấy tôi đã xử lý vấn đề mà mọi người ngại nói ra suốt 7 năm.

Một bonus khác: hôm nay JARVIS đọc được file AutoCAD trên Macbook (sau khi đã làm trên VPS hôm trước). Thêm 1 platform được cover — sau này anh em có thể bóc tách BOQ ngay tại Mac, không phải ssh lên VPS. Tương lai R&D thêm SketchUp .skp (đang defer Sprint 7+) thì coverage gần đủ — DWG/DXF/PDF/SKP/JPG/PNG, AI hiểu hết.

Hy vọng vision pipeline ship xong sẽ giúp bóc tách BOQ chuẩn đến từng mm. Đó là target.

Bug nhỏ nhưng đáng tiền — Sheet rơi sai folder lặp 3 lần

Một bug khác lặp suốt buổi:

“Sao cứ lưu BOQ ra folder AIC2026 - PROJECTS vậy, phải lưu vào đúng 02. Bao gia & BOQ chứ — bị cái này hoài luôn, nói không biết bao nhiêu lần.”

Root cause: step BOQ builder của tôi ask AI tự tạo Sheet — AI quên/nhầm pass folder ID từ meta → fallback sang DRIVE_ROOT (folder root chứa tất cả dự án).

Em fix 3-layer defense:

  1. Script underlying (create_fresh_sheet.js) hard-validate forbidden folder list (DRIVE_ROOT + 4 lifecycle) → exit error
  2. Wrapper deterministic (create_boq_sheet.py) — đọc meta + validate + call CLI với args đúng
  3. AI prompt không còn ask AI tạo Sheet → chỉ output JSON, để wrapper script xử lý folder

Plus: tôi yêu cầu mỗi run pipeline tạo sub-folder JARVIS-YYYYMMDD-HHMM để phân loại các lần chạy. Sheet vào sub-folder đó, không bỏ chung 1 đống.

Lesson cho founder build AI agent solo

1. Substantial done ≠ DONE_ALL. Cần state machine rõ ràng. Cơ chế project control quan trọng không kém code.

2. AI agent cần biết mình có gì. 18 skill nhưng AI quên dùng = chỉ là 0 skill. CAPABILITY_MAP + Luật scan trước khi reply “không làm được” là tier-1 fix.

3. Plan là estimate, reality ngắt liên tục. 30/04 tôi định close Sprint 6, kết quả là EXTENDED + pivot architecture lớn nhất sprint. Cần file plan LIVING (bump version v2/v3 mỗi pivot), không stale.

4. Bug lặp = bug architecture, không phải bug code. Sheet rơi sai folder lặp 3 lần khi 1-line fix không giải quyết. Cần 3-layer defense: script + wrapper + prompt.

5. AI vision đọc bản vẽ là khâu khó nhất pipeline BOQ. Pricing dễ (canonical match + 3-source + scalar markup). Scope dễ (filter flag). Vision đọc bản vẽ → bảng khối lượng phải ≥ 90% accuracy mới production-grade. Industry SOTA 13-65% (Bluebeam, PlanSwift, Togal AI). Manual QS vẫn gold standard.

6. Khi mệt — đừng push code mới. 21h tôi pause thay vì cố ship architecture mới trong đêm. Mai làm là right call. Memory + plan đã preserve context — start lại không mất.

7. AI còn siêu ngu — phải design system thinking + tương tác chuẩn mới ra output tạm tạm được. Một ngày như hôm nay làm tôi thấy rõ: từ design template BOQ đến bóc tách bản vẽ, AI còn rất nhiều điểm hổng. Không thể quẳng 1 task vào AI mà mong nó tự làm 90%.

Tôi phải theo sát từng output — chỉ ra Tủ giày sai, AI mới biết sai. Tôi không thể fix bug đơn lẻ, mà phải fix architecture: vision-first 4-layer, 3-layer Sheet folder defense, state machine sprint sống. Tương tác cũng phải chuẩn — meta JSON viết “scope_focus: tủ + đồ rời” mơ hồ thì AI bay theo cái mơ hồ đó, phải structured scope: fit-tuong enum cứng.

JARVIS ngáo vì không có CAPABILITY_MAP. Sprint drift vì không có project_control playbook. Mỗi cơ chế thiếu là 1 lỗ AI rớt vào — và rớt là tôi mất tiền (BOQ sai gửi khách, deal mất uy tín).

Tôi đang nghĩ đến brainstorm một bộ “operating principles” cho founder build AI agent solo — 7-10 nguyên tắc system thinking, interaction design, capability awareness. Có lẽ là post tiếp theo trong pillar này — đáng brainstorm.

Khép lại ngày

Một ngày dài hơn dự kiến. Tôi định close Sprint 6, kết quả là pivot architecture lớn nhất sprint. Nhưng pivot này đáng — vì không pivot thì ngày mai tôi vẫn gửi BOQ sai cho khách, mất uy tín deal.

AI agent solo của tôi vẫn còn ngu nhiều. Nhưng mỗi ngày như hôm nay là 1 lớp cơ chế mới — project control playbook, capability map, vision pipeline plan. Cộng dồn lại, JARVIS hôm sau biết hơn JARVIS hôm trước. Đó là điểm khác biệt giữa “build AI agent” và “dùng AI tool”.

Mai làm tiếp.

FAQ

Tại sao Sprint 6 substantial từ 29/04 mà chưa close được?

Tôi tag substantial done sau 13h burst một ngày. Hôm sau (30/04) khi test thật trên 1 dự án căn hộ Estella với BOQ ký rồi làm ground truth, mới phát hiện AI gen 79.5% over-scope (tự thêm trần thạch cao, sàn gỗ, đồ rời mà BOQ ký không có). Fix scope filter xong vẫn fail vì AI bốc kích thước sai. Substantial done ≠ DONE_ALL — bài học về sprint state machine.

Bug Tủ giày 2400×400×2700 vs thực 650×2500 cụ thể là gì?

Bản vẽ căn hộ Estella có 3 mặt cắt A/B/C. Trên MẶT ĐỨNG C có 1 cái tủ giày — thực ra là đầu chặn của hệ tủ lạnh-tủ kho, ngang 650mm cao 2500mm. AI đọc text dimensions từ PDF được số nhưng không hiểu 'số 2400 là chiều dài của hệ tủ khác', 'số 400 là chiều sâu của tủ kho', 'số 2700 là chiều cao trần'. AI ghép 3 số rời thành 1 cái tủ giày 2400×400×2700 không có thật.

Vision-first 4-layer pipeline khác gì cách cũ?

Cách cũ: extract text từ PDF/DWG (pdfplumber, ezdxf) → JSON dimensions vô context → AI gen BOQ. Vision-first: render PNG mọi page bản vẽ → Claude vision đọc 3D PDF concept trước (hiểu không gian + style) → Claude vision đọc 2D paired (mặt bằng + 3 mặt cắt cùng nhóm) với 3D context → output dimensions với view_ref chứng minh → BOQ. Như cách kiến trúc sư nhìn bản vẽ chứ không phải đọc số rời.

Anh Tiên rút ra lesson gì sau ngày này?

Plan là estimate, reality ngắt liên tục. Tôi cần cơ chế project control sống — state machine + 5 trigger event update plan mỗi pivot. Tôi cũng nhận ra AI agent của mình bị 'ngáo' — có 18 skill nhưng quên không dùng đúng skill. Phải có CAPABILITY_MAP để AI tự index mình có gì. Cuối cùng: bảng khối lượng từ bản vẽ là khâu khó nhất pipeline BOQ — pricing dễ, scope dễ, vision đọc bản vẽ phải đạt 90%+ accuracy mới production-grade.

TD

Đặng Hồng Tiên

Founder của AIC (kiến trúc + nội thất + xây dựng — 10+ năm vận hành), OKG (công ty công nghệ mới mở), và 1 công ty thương mại đang R&D (sẽ thương mại vật liệu ngành cho AIC + partners). Building JARVIS — personal agent cho founder VN đa entity. Mix Abhidhamma + AI architecture + 10 năm vận hành B2B.

AI disclosure

Bài này tôi (Tien Dang) viết, có hỗ trợ AI structure draft từ session work với Claude. Experience, opinion, và rewrite cuối cùng là của tôi. [voice match: 95/100]

Xem bản markdown thô →