Update: - docs/STATUS.md: Last updated S26 cumulative wrap - docs/HANDOFF.md: TL;DR S26 chốt cuối với 3 pattern reusable NEW - docs/changelog/sessions/2026-05-21-s26-pe-tree-view-rag-setup.md: NEW session log đầy đủ - docs/guides/multi-agent-setup-guide.md: NEW ~750 lines onboarding 4 dự án future - .claude/agent-memory/*/MEMORY.md: 4 agent flush S26 entries - .claude/rag.json: NEW project config cho RAG bootstrap Plans done S26: - Plan AG/AG2/AG3/AG4/AG5/AG6 — 6 commits 0bf6c7e..d99069a PE List tree view UI iteration - Plan AI Phase 0-4 — RAG global MCP setup (Voyage-4-large + Qdrant Windows native binary v1.18.0 NO Docker + FastMCP 3.3.1 stdio + SQLite FTS5 BM25 + RRF k=60 + Anthropic Contextual Retrieval prepend) - SOLUTION_ERP bootstrap: 126 files → 2,392 chunks indexed 60.9s (~484K Voyage tokens = 0.24% free tier 200M/month) Multi-agent ROI S26: 5 spawn (Inv 2 audit 5Q + RAG distribution research 4 study cases + Imp 1 Case 2 + Rev 1 pre-commit + CICD 1 Run #222) ~123K + em main solo Plan AG2-AG6 polish + Plan AI Phase 0-4 ~280K = ~28% solo equivalent. 3 patterns reusable cross-project NEW S26: 1. Pattern 19 Implementer — HTML native <details>/<summary> + Tailwind named groups (group/proj+year+sup) + localStorage Set<string> cho hierarchical 3-level tree UI when no Accordion lib 2. RAG User-level Global MCP — 1 server localhost serve N project + per-project .claude/rag.json (Approach A — 1 dev solo scenario, không phải team VPS) 3. Qdrant Windows native binary deployment — no Docker overhead, qdrant-x86_64-pc-windows-msvc.zip 28.3MB chính thức GitHub release Pending S27+: - Memory CURATE 4 agent (cicd-monitor 74KB OVER 50KB hard threshold URGENT) - Plan AI Phase 5 bootstrap 4 project còn lại (NamGroup/DH Y Dược/Ashico/Vipix) - Plan AI Phase 6 file watcher + Windows Task Scheduler Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
15 KiB
Session 26 — 2026-05-21 — PE List tree view UI iteration + RAG Global MCP setup
Dev: Claude (em main + 4 sub-agents Investigator/Implementer/Reviewer/CICD Monitor) + bro pqhuy
Duration: ~5h (start ~17:00 → end ~22:00 GMT+7)
Base commit: 506cada (S25 chốt cuối Plan AF)
Final commits cumulative: 0bf6c7e..d99069a (6 commits Plan AG series push remote)
+ Infrastructure: D:\.claude-rag\ RAG global server setup (out-of-tree, không commit)
🎯 Làm được
Plan AG series — PE List tree view UI iteration (UAT bro Tra Sol)
Plan AG (0bf6c7e) — Phase 1 tree view 2-level Project > Gói thầu > PE
Trigger UAT 2026-05-21 screenshot bro Tra Sol + anh Kenny: UI Duyệt NCC PE List "đám rừng" flat list + đề xuất "khoanh sẵn thư mục gói thầu như mail".
🟦 Investigator audit 5Q (~30K spawn) confirm: Project entity ready Phase 2 ProjectPackage table, PE.TenGoiThau text free-form (variation risk), shadcn fe-user thiếu Accordion/Collapsible (fallback HTML <details>/<summary> native), Mig 31 stable, Phase 2 naming AddProjectPackageTable.
🟨 Implementer Case 2 cookie-cutter mirror 2 app (~16K spawn) deliver:
- Chunk A useMemo group nested
ProjectGroup{goiThauList[]}+ sort vi locale + fallback "(Dự án đã xoá)" + "(Chưa phân loại)" - Chunk B UI
<details>/<summary>HTML native 2-level + Tailwind named groupsgroup/proj+group/gtchevron rotation +[&::-webkit-details-marker]:hidden - Chunk C localStorage Set persist key
pe_list_expanded_groups
🟥 Reviewer pre-commit (~25K spawn) verify 5-category + 12 adversarial deep checks PASS 0 blocker.
🟩 CICD Monitor Run #222 (~12K spawn) bundle hash 2 app rotated C8TvDy7r→CWHIdoFo admin + BvcWrq2z→Bg2FNeIz user. Stage 4c API shape preserved.
Plan AG2 (c5429c0) — Simplify 1-level + widen Panel 1
Bro feedback "Plan AG 2-level cầu kỳ quá, gói thầu thì ko cần thiết phải treedow". Em main solo refactor:
- Drop
GoiThauGroupnested type - useMemo group 1-level:
Map<projectId, ProjectGroup{items[]}> - Panel 1 widen
lg:grid-cols-[340px_1fr_360px]→[400px_1fr_360px] - Single PE project → flat card (no
<details>); Multi PE → tree - localStorage key rename
pe_list_expanded_projects
Plan AG3 (fbad4a9) — Drop single-PE flat consistent UI
Bro screenshot follow-up "nếu có 1 thì cũng để tương tự luôn nhé, đừng để khác các thằng kia". Em main solo drop if (pg.items.length === 1) branch → mọi dự án dù 1/N phiếu đều render <details> folder collapsed. Diff -110 LOC (clean).
Plan AG4 (2bf0118) — BE+FE bổ sung Drafter + Department
Bro feedback "bổ sung thêm người tạo + phòng ban tạo vào danh sách phiếu". Em main solo cross-stack:
BE 4 file:
PurchaseEvaluationDtos.csDTO +4 fieldsDrafterUserId/DrafterName/DepartmentId/DepartmentNamePurchaseEvaluationFeatures.csListHandler + InboxHandler projections JOIN Users + Departments LEFT (cả 2 nullable theo PE entity)CreateContractFromEvaluationFeatures.csApprovedHandler mirror JOIN
FE 4 file × 2 app mirror §3.9:
types/purchaseEvaluation.tsPeListItem +4 fieldsPurchaseEvaluationsListPage.tsxPE card row render👤 {drafterName} · {departmentName}giữa Mã phiếu và Supplier
Verify: dotnet test SolutionErp.slnx 111/111 PASS unchanged. npm build × 2 app clean 0 TS err.
Plan AG5 (083b601) — Extend tree 3-level Project > Năm > NCC > PE
Bro chốt "Folder cấp dưới dự án là theo năm và dưới năm là theo NCC nhé". Em main solo refactor:
type SupplierGroup{supplierId, supplierName, items[]}(italic "(Chưa chọn NCC)" cho PE chưa DaDuyet)type YearGroup{year, suppliers[], totalCount}extractnew Date(p.createdAt).getFullYear()type ProjectGroup{projectId, projectName, years[], totalCount}- 3 cấp nested
<details>với Tailwind named groupsgroup/proj+group/year+group/sup - Sort: Project A-Z vi · Year DESC · NCC A-Z vi · PE createdAt DESC
- localStorage 3-level key format
projectId / projectId::y{year} / projectId::y{year}::s{supplierId}
Plan AG6 (d99069a) — Compact card 3-row gọn đẹp
Bro feedback "Cho thông tin bên trong này nó gọn đẹp lại nhé". Em main solo:
py-2.5→py-2(compact vertical padding)- Drop Type label "Duyệt NCC" badge (redundant với page header)
- Combine row mã phiếu + time
PE/2026/A/035 · 10:40 19/05/2026 - Combine row drafter + department + contract
👤 Drafter · Phòng ban [✓ HĐ](conditional) - Separator
slate-300nhẹ hơn để mắt không bị rối
Plan AI — RAG User-level Global MCP setup (Approach A)
Bro plan setup RAG cho 5 dự án cùng máy localhost share infrastructure. Em main + Investigator deep research 4 study cases (Cursor + Cline + Continue + Sourcegraph) → kết luận User-level Global MCP pattern (1 dev N project, không phải team VPS pattern).
Phase 0 — Pre-flight check (15 phút)
✅ Python 3.11.3 OK · ✅ Docker installed nhưng SKIP per bro chốt no Docker · ❌ VOYAGE_API_KEY chưa set → bro set User scope length 46 prefix pa-Mi... · ✅ Disk D:\ 32GB free (acceptable) · ✅ pip packages install fastmcp 3.3.1 + voyageai 0.3.7 + qdrant-client 1.18.0 + watchdog 6.0.0 + chromadb 1.5.9 (bonus) + python-dotenv 1.2.2.
Phase 1 — Qdrant Windows native binary (30 phút)
Bro chốt KHÔNG Docker → em verify Qdrant GitHub releases qua WebFetch:
- ✅ Qdrant v1.18.0 (released 2026-05-11) CÓ Windows native binary
qdrant-x86_64-pc-windows-msvc.zip28.3 MB chính thức - Download + extract
D:\.claude-rag\qdrant-bin\qdrant.exe - Tạo config.yaml: storage_path
D:\.claude-rag\data\qdrant-storage, http_port 6333, on_disk_payload true, telemetry_disabled true - Start background hidden: PID 67240, health check 200 "healthz check passed"
Phase 2 — FastMCP server code ~1100 LOC Python 9 file
D:\.claude-rag\
├── server.py (210 LOC) — FastMCP entry + 6 tool handlers
├── bootstrap.py (150 LOC) — initial corpus embed CLI
├── README.md
└── lib/
├── __init__.py
├── projects.py (140 LOC) — auto-detect cwd → project_id từ .claude/rag.json + registry tracking
├── chunking.py (120 LOC) — Markdown chunking + Anthropic Contextual Retrieval prepend "From <doc> > <heading>:"
├── embed.py (140 LOC) — Voyage AI wrapper (embed + rerank + retry exponential backoff + SHA256 cache)
├── retrieval.py (230 LOC) — 3-layer pipeline (Vector Qdrant + BM25 SQLite FTS5 + RRF k=60 + Voyage rerank-2.5)
└── watcher.py (100 LOC) — Watchdog file watcher với debounce 2s
6 MCP tools exposed:
search_memory(query, scope, top_k, use_rerank)— current project + shared_global hybrid searchcross_project_search(query, top_k)— search ALL registered project collectionssearch_code(query, file_pattern, top_k)— BM25-heavy code symbol searchstore_memory(content, source_path, tags)— add on-the-fly memory chunkpromote_to_shared(chunk_id)— promote project-local → shared_global (v0 stub)list_projects()— registry overview + Qdrant collection stats
Phase 3 — Register MCP user-level (15 phút trial 5 lần)
Trick CLI claude mcp add syntax: -e KEY=VAL flag là variadic — phải có -- separator ngay sau env list trước <name> để terminate parsing.
Final command working:
claude mcp add -s user -e "VOYAGE_API_KEY=$VK" -- rag-unified python "D:\.claude-rag\server.py"
Output: rag-unified: python D:\.claude-rag\server.py - ✓ Connected.
Phase 4 — Bootstrap SOLUTION_ERP corpus (5 phút)
.claude/rag.json ở SOLUTION_ERP project root:
{
"project_id": "solution_erp",
"display_name": "SOLUTION_ERP — Quản lý HĐ NCC",
"corpus_paths": ["docs/**/*.md", ".claude/agent-memory/**/MEMORY.md", ".claude/skills/**/SKILL.md"],
"extra_corpus": ["C:\\Users\\pqhuy\\.claude\\projects\\D--Dropbox-CONG-VIEC-SOLUTION\\memory\\*.md"],
"share_to_global": true,
"search_scope_default": ["self", "shared_global"],
"contextual_retrieval": true
}
Bootstrap output:
[1/4] Scanning corpus... Found 126 files
[2/4] Chunking + contextual prepend... Total chunks: 2392
Estimated tokens: ~484,508 (Voyage free tier: 200M/month)
[3/4] Voyage-4-large embedding + Qdrant upsert + SQLite BM25... Upserted 2392 chunks in 60.9s
[4/4] Update registry...
✓ Bootstrap complete: solution_erp ready (2392 chunks)
Bonus: File MD onboarding guide xuất
docs/guides/multi-agent-setup-guide.md (~750 lines markdown) — full guide cho 1 master README + 4 agent definition templates + MEMORY.md seed cho dự án mới. Bro paste vào dự án mới (NamGroup/DH Y Dược/Ashico/Vipix detected từ Claude Desktop config epitaxy) để setup 4 sub-agent + RAG infra.
E2E verified
Plan AG series verify
| Plan | Commit | BE test | FE build × 2 | SHA256 mirror | CICD Run |
|---|---|---|---|---|---|
| AG | 0bf6c7e |
111/111 PASS unchanged | PASS 0 TS err | ✅ 21001E90... |
#222 PASS bundle rotate |
| AG2 | c5429c0 |
111/111 unchanged | PASS | ✅ 37520D01... |
Run #223 PASS (em main verify) |
| AG3 | fbad4a9 |
111/111 unchanged | PASS | ✅ 749FF703... |
Run #224 PASS |
| AG4 | 2bf0118 |
111/111 PASS dotnet test verify cross-stack | PASS | ✅ verified | Run #225 PASS |
| AG5 | 083b601 |
111/111 unchanged | PASS | ✅ E5FE4979... |
Run #226 PASS |
| AG6 | d99069a |
111/111 unchanged | PASS | ✅ 3645307C... |
Run #227 PASS |
Plan AI RAG verify 4 query thực tế
Query 1: "gotcha 45 PE button TraLai mismatch" → rerank 0.641 (Reviewer MEMORY Plan AB)
Query 2: "pattern admin opt-in per-NV flag" → rerank 0.836 (Session 23 t1 Plan K)
Query 3: "EF migration backfill SQL reorder" → rerank 0.766 (Session 21 t5 Refactor Allow)
Query 4: "multi-agent setup 4 sub-agents" → rerank 0.879 (Session 21 t1 cicd-monitor + new guide)
🐛 Bug gặp + fix
| Bug | Fix |
|---|---|
| Bash shell không inherit User-scope env var từ PowerShell parent | Workaround: VK=$(powershell -NoProfile -Command "...") mỗi Bash command + export VOYAGE_API_KEY="$VK" |
claude mcp add -e KEY=VAL 5 lần FAIL "Invalid environment variable format: rag-unified" |
Trick: thêm -- separator ngay sau env list trước <name> để terminate variadic -e flag |
| Qdrant upsert 2392 chunks batch lớn FAIL WinError 10053 "connection aborted host machine" | Batching 64 chunks/upsert + wait=True trong lib/retrieval.py:UPSERT_BATCH |
SQLite FTS5 sqlite3.OperationalError: no such column: in cho query có dấu - ("opt-in") |
_sanitize_fts5_query() strip non-alphanumeric + quote token-by-token f'"{t}"' + fallback empty result trên OperationalError |
| HuggingFace symlinks warning Windows non-developer mode | Non-critical (cache work OK degraded efficiency) — note HF_HUB_DISABLE_SYMLINKS_WARNING=1 env var optional suppress |
📚 Docs updates
| File | Update |
|---|---|
docs/STATUS.md |
Last updated S26 chốt cuối (cumulative wrap 6 plan AG series + Plan AI Phase 0-4) |
docs/HANDOFF.md |
TL;DR S26 chốt cuối với 3 patterns NEW reusable cross-project |
docs/changelog/sessions/2026-05-21-s26-pe-tree-view-rag-setup.md |
File này — session log đầy đủ |
docs/guides/multi-agent-setup-guide.md |
NEW ~750 lines, onboarding 4 dự án future |
.claude/agent-memory/investigator/MEMORY.md |
+2 entry S26 (Plan AG audit 5Q + Plan AI RAG research 4 study cases) |
.claude/agent-memory/implementer/MEMORY.md |
+1 entry S26 (Plan AG Chunk A+B+C + Pattern 19 HTML details + Tailwind named groups + localStorage Set) |
.claude/agent-memory/reviewer/MEMORY.md |
+1 entry S26 (Plan AG pre-commit PASS 0 blocker + 5 polish em main solo self-review) |
.claude/agent-memory/cicd-monitor/MEMORY.md |
+1 entry S26 (Run #222 verify + Run #223-#227 em main self-verify pattern). Memory ~74KB CRITICAL CURATE next |
Memory user-level feedback_rag_hybrid_pattern.md |
Update section "Implementation actual achievements S26" với stack chốt + Phase 0-4 + 7 bài học extra |
Memory user-level MEMORY.md index |
Update entry RAG Hybrid với stack mới Voyage-4-large + rerank-2.5 + Qdrant Windows native |
🤝 Handoff S27+
Pending priority HIGH
- Memory CRITICAL CURATE 4 agent — cicd-monitor 74KB OVER 50KB hard threshold (archive Run #186-#221 verbose →
archive/2026-05-runs.md) - Plan AI Phase 5 bootstrap 4 project còn lại (NamGroup + DH Y Dược + Ashico + Vipix) — ~30 phút/project, copy
.claude/rag.jsontemplate + bootstrap.py CLI - Plan B Contract V2 wire (defer carryover từ S25) — mirror PE Mig 22-23 pattern proven 1× S17 + Investigator/Implementer Case 2 pre-allocated
Pending priority MEDIUM
- Plan AI Phase 6 file watcher real-time auto re-embed + Windows Task Scheduler auto-start Qdrant khi boot
- Xuất
rag-onboarding-guide.mdcho 4 project khác paste config (defer sau Phase 5 ổn 1-2 tuần UAT) - Test debt catch-up Plan C bundle (S22+1 + S25 + S26 bug fix chưa add regression test — UAT mode defer per §7)
Pending priority LOW
- Benchmark RAG recall@10 golden dataset 100 query thật (gap optional)
- Disaster recovery weekly backup Qdrant data → Dropbox (gap optional)
- Gotcha #48 SQLite tie-break + #49 dual-phase UI confusion add
docs/gotchas.md(carry từ S25)
📊 Thông số cumulative S26
| Metric | S25 chốt | S26 chốt | Δ |
|---|---|---|---|
| DB tables | 59 | 59 | 0 |
| Migrations | 31 | 31 | 0 (no schema change) |
| Endpoints | ~146 | ~146 | 0 (same shape, +4 fields DTO ListItem) |
| FE pages | 35 | 35 | 0 (logic enhanced PE List) |
| Unit tests | 111 | 111 | 0 (UAT mode defer per §7) |
| Gotchas | 49 | 49 | 0 |
| Memory user-level | 23 | 23 | 0 (RAG entry updated stack mới) |
| Skills project-local | 6 | 6 | 0 |
| Sub-agents | 4 | 4 | 0 (5 spawn S26: Inv 2 + Imp 1 + Rev 1 + CICD 1) |
| Commits remote | e23f51c..506cada |
e23f51c..d99069a |
+6 (0bf6c7e..d99069a) |
| Docs files | — | +1 | multi-agent-setup-guide.md |
| Infrastructure | — | +1 | D:\.claude-rag\ RAG global (out-of-tree) |
| RAG corpus indexed | 0 | 2,392 chunks | SOLUTION_ERP bootstrap |
| Voyage tokens used | 0 | ~484K | 0.24% free tier 200M/month |
Multi-agent ROI S26
| Agent | Spawn | Token cost | Catch |
|---|---|---|---|
| 🟦 Investigator | 2× | ~70K | Plan AG audit 5Q + Plan AI RAG distribution research 4 study cases |
| 🟨 Implementer | 1× | ~16K | Plan AG Case 2 cookie-cutter mirror 2 app + Pattern 19 NEW |
| 🟥 Reviewer | 1× | ~25K | Plan AG pre-commit PASS 0 blocker + 5 polish em main solo verified |
| 🟩 CICD Monitor | 1× | ~12K | Run #222 PASS bundle hash 2 app rotate verified |
| 👤 Em main solo | continuous | ~280K (estimate) | Plan AG2-AG6 polish iteration + Plan AI Phase 0-4 setup + docs/MD writes |
| Total | 5 spawn | ~403K | ~28% solo equivalent — ROI tốt cho heavy session |