# 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.

**Author**: Tien Dang (Đặng Hồng Tiên), Founder of OKG and AIC, Vietnam
**Published**: 2026-04-30
**Pillar**: journey
**Tags**: JARVIS, BOQ, vision-AI, sprint-retro, founder, pivot
**Canonical URL**: https://danghongtien.com/posts/2026-04-30-jarvis-pivot-vision-pipeline/
**AI assistance disclosed**: yes (structure draft)

---

## TL;DR
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.

## Key claims
- Sprint 6 substantial done từ 29/04 nhưng còn 5 carry-over chưa close — tôi quên, em (Claude) cũng quên
- 14 commits trong ngày 30/04: project control playbook + 3-layer 'tiền bạc rule' + Sheet folder fix (3-layer defense) + plan vision pipeline
- AI bốc Tủ giày 2400×400×2700 thay vì thực 650×2500 (sai gấp 4×) — vì chỉ đọc text, không xem mặt cắt C của bản vẽ
- Template BOQ tôi design từ 2019 — hôm nay rebuild thành 3-tab workbook brand AIC pro, đồng đội AIC khen 'quá đẹp', 'chuyên nghiệp ghê'
- Mac đọc được file AutoCAD (sau VPS hôm trước) — coverage DWG/DXF/PDF, tương lai R&D SketchUp .skp
- Root cause: AI text-only extract → mất context spatial. Fix: 4-layer vision pipeline (3D-first → 2D paired → BOQ)
- AI còn siêu ngu — phải theo sát từng output + design system thinking + tương tác structured (không free-text mơ hồ)

# 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."

import { Image } from 'astro:assets';
import visionPipelineDiagram from '../../assets/posts/2026-04-30-jarvis-pivot-vision-pipeline/01-text-only-vs-vision-first.svg';

<figure>
  <Image src={visionPipelineDiagram} alt="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" loading="lazy" />
  <figcaption>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.</figcaption>
</figure>

## 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.

---

Source: https://danghongtien.com/posts/2026-04-30-jarvis-pivot-vision-pipeline/
Markdown export of canonical HTML article. License: CC BY 4.0 with attribution.
